fdk-aac-0.1.3/0000755000175000017500000000000012372262444013411 5ustar00tootstoots00000000000000fdk-aac-0.1.3/autogen.sh0000755000175000017500000000003212372261464015406 0ustar00tootstoots00000000000000#!/bin/sh autoreconf -fiv fdk-aac-0.1.3/ltmain.sh0000644000175000017500000105202612372262345015237 0ustar00tootstoots00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.7 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.7" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 fdk-aac-0.1.3/NOTICE0000644000175000017500000001054012144411136014304 0ustar00tootstoots00000000000000Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2012 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de fdk-aac-0.1.3/libMpegTPDec/0000755000175000017500000000000012372262442015646 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPDec/include/0000755000175000017500000000000012372262446017275 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPDec/include/tpdec_lib.h0000644000175000017500000005503512372261464021402 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** MPEG-4 Transport Decoder *********************** Author(s): Manuel Jander Description: MPEG Transport decoder ******************************************************************************/ #ifndef __TPDEC_LIB_H__ #define __TPDEC_LIB_H__ #include "tp_data.h" #include "FDK_bitstream.h" #define TRANSPORTDEC_INBUF_SIZE ( 8192 ) /*!< Size is in bytes. Set the transport input buffer size carefully and assure that it fulfills the requirements of the supported transport format(s). */ typedef enum { TRANSPORTDEC_OK = 0, /*!< All fine. */ /* Synchronization errors. Wait for new input data and try again. */ tpdec_sync_error_start = 0x100, TRANSPORTDEC_NOT_ENOUGH_BITS, /*!< Out of bits. Provide more bits and try again. */ TRANSPORTDEC_SYNC_ERROR, /*!< No sync was found or sync got lost. Keep trying. */ tpdec_sync_error_end, /* Decode errors. Mostly caused due to bit errors. */ tpdec_decode_error_start = 0x400, TRANSPORTDEC_PARSE_ERROR, /*!< Bitstream data showed inconsistencies (wrong syntax). */ TRANSPORTDEC_UNSUPPORTED_FORMAT, /*!< Unsupported format or feature found in the bitstream data. */ TRANSPORTDEC_CRC_ERROR, /*!< CRC error encountered in bitstream data. */ tpdec_decode_error_end, /* Fatal errors. Stop immediately on one of these errors! */ tpdec_fatal_error_start = 0x200, TRANSPORTDEC_UNKOWN_ERROR, /*!< An unknown error occured. */ TRANSPORTDEC_INVALID_PARAMETER, /*!< An invalid parameter was passed to a function. */ TRANSPORTDEC_NEED_TO_RESTART, /*!< The decoder needs to be restarted, since the requiered configuration change cannot be performed. */ tpdec_fatal_error_end } TRANSPORTDEC_ERROR; /** Macro to identify decode errors. */ #define TPDEC_IS_DECODE_ERROR(err) ( ((err>=tpdec_decode_error_start) && (err<=tpdec_decode_error_end)) ? 1 : 0) /** Macro to identify fatal errors. */ #define TPDEC_IS_FATAL_ERROR(err) ( ((err>=tpdec_fatal_error_start) && (err<=tpdec_fatal_error_end)) ? 1 : 0) /** * \brief Parameter identifiers for transportDec_SetParam() */ typedef enum { TPDEC_PARAM_MINIMIZE_DELAY = 1, /** Delay minimization strategy. 0: none, 1: discard as many frames as possible. */ TPDEC_PARAM_EARLY_CONFIG, /** Enable early config discovery. */ TPDEC_PARAM_IGNORE_BUFFERFULLNESS, /** Ignore buffer fullness. */ TPDEC_PARAM_SET_BITRATE, /** Set average bit rate for bit stream interruption frame misses estimation. */ TPDEC_PARAM_RESET, /** Reset transport decoder instance status. */ TPDEC_PARAM_BURST_PERIOD /** Set data reception burst period in mili seconds. */ } TPDEC_PARAM; /* ISO/IEC 14496-3 4.4.1.1 Table 4.2 Program config element */ #define PC_FSB_CHANNELS_MAX 16 /* Front/Side/Back channels */ #define PC_LFE_CHANNELS_MAX 4 #define PC_ASSOCDATA_MAX 8 #define PC_CCEL_MAX 16 /* CC elements */ #define PC_COMMENTLENGTH 256 /*! \brief Reset Program Config Element. \param pPce Program Config Element structure. \return void */ void CProgramConfig_Reset ( CProgramConfig *pPce ); /*! \brief Initialize Program Config Element. \param pPce Program Config Element structure. \return void */ void CProgramConfig_Init ( CProgramConfig *pPce ); /*! \brief Inquire state of present Program Config Element structure. \param pPce Program Config Element structure. \return 1 if the PCE structure is filled correct, 0 if no valid PCE present. */ int CProgramConfig_IsValid ( const CProgramConfig *pPce ); #ifdef TP_PCE_ENABLE /*! \brief Read Program Config Element. \param pPce Program Config Element structure. \param bs Bitstream buffer to read from. \param alignAnchor Align bitstream to alignAnchor bits after all read operations. \return void */ void CProgramConfig_Read ( CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs, UINT alignAnchor ); /*! \brief Compare two Program Config Elements. \param pPce1 Pointer to first Program Config Element structure. \param pPce2 Pointer to second Program Config Element structure. \return -1 if PCEs are completely different, 0 if PCEs are completely equal, 1 if PCEs are different but have the same channel config, 2 if PCEs have different channel config but same number of channels. */ int CProgramConfig_Compare ( const CProgramConfig * const pPce1, const CProgramConfig * const pPce2 ); /*! \brief Get a Program Config Element that matches the predefined MPEG-4 channel configurations 1-14. \param pPce Program Config Element structure. \param channelConfig MPEG-4 channel configuration. \return void */ void CProgramConfig_GetDefault ( CProgramConfig *pPce, const UINT channelConfig ); #endif /* TP_PCE_ENABLE */ /** * \brief Lookup and verify a given element. The decoder calls this * method with every new element ID found in the bitstream. * * \param pPce A valid Program config structure. * \param tag Tag of the current element to be looked up. * \param channelIdx The current channel count of the decoder parser. * \param chMapping Array to store the canonical channel mapping indexes. * \param chType Array to store the audio channel type. * \param chIndex Array to store the individual audio channel type index. * \param elMapping Pointer where the canonical element index is stored. * \param elType The element id of the current element to be looked up. * * \return Non-zero if the element belongs to the current program, zero * if it does not. */ int CProgramConfig_LookupElement( CProgramConfig *pPce, UINT channelConfig, const UINT tag, const UINT channelIdx, UCHAR chMapping[], AUDIO_CHANNEL_TYPE chType[], UCHAR chIndex[], UCHAR *elMapping, MP4_ELEMENT_ID elList[], MP4_ELEMENT_ID elType ); /** * \brief Get table of elements in canonical order. * \param pPce A valid program config structure. * \param table An array where the element IDs are stored. * \return Total element count including all SCE, CPE and LFE. */ int CProgramConfig_GetElementTable( const CProgramConfig *pPce, MP4_ELEMENT_ID table[], const INT elListSize ); /** * \brief Initialize a given AudioSpecificConfig structure. * \param pAsc A pointer to an allocated CSAudioSpecificConfig struct. * \return void */ void AudioSpecificConfig_Init(CSAudioSpecificConfig *pAsc); /** * \brief Parse a AudioSpecificConfig from a given bitstream handle. * * \param pAsc A pointer to an allocated CSAudioSpecificConfig struct. * \param hBs Bitstream handle. * \param fExplicitBackwardCompatible Do explicit backward compatibility parsing if set (flag). * \param cb pointer to structure holding callback information * * \return Total element count including all SCE, CPE and LFE. */ TRANSPORTDEC_ERROR AudioSpecificConfig_Parse( CSAudioSpecificConfig *pAsc, HANDLE_FDK_BITSTREAM hBs, int fExplicitBackwardCompatible, CSTpCallBacks *cb ); /* CELP stuff */ enum { MPE = 0, RPE = 1, fs8KHz = 0, fs16KHz = 1 }; /* Defintion of flags that can be passed to transportDecOpen() */ #define TP_FLAG_MPEG4 1 /* Capability flags */ #define CAPF_TPDEC_ADIF 0x00001000 /**< Flag indicating support for ADIF transport format. */ #define CAPF_TPDEC_ADTS 0x00002000 /**< Flag indicating support for ADTS transport format. */ #define CAPF_TPDEC_LOAS 0x00004000 /**< Flag indicating support for LOAS transport format. */ #define CAPF_TPDEC_LATM 0x00008000 /**< Flag indicating support for LATM transport format. */ #define CAPF_TPDEC_RAWPACKETS 0x00010000 /**< Flag indicating support for raw packets transport format. */ typedef struct TRANSPORTDEC *HANDLE_TRANSPORTDEC; /** * \brief Configure Transport Decoder via a binary coded AudioSpecificConfig or StreamMuxConfig. * The previously requested configuration callback will be called as well. The buffer conf * must containt a SMC in case of LOAS/LATM transport format, and an ASC elseways. * * \param hTp Handle of a transport decoder. * \param conf UCHAR buffer of the binary coded config (ASC or SMC). * \param length The length in bytes of the conf buffer. * * \return Error code. */ TRANSPORTDEC_ERROR transportDec_OutOfBandConfig( const HANDLE_TRANSPORTDEC hTp, UCHAR *conf, const UINT length, const UINT layer ); /** * \brief Open Transport medium for reading. * * \param transportDecFmt Format of the transport decoder medium to be accessed. * \param flags Transport decoder flags. Currently only TP_FLAG_MPEG4, which signals a * MPEG4 capable decoder (relevant for ADTS only). * * \return A pointer to a valid and allocated HANDLE_TRANSPORTDEC or a null pointer on failure. */ HANDLE_TRANSPORTDEC transportDec_Open( TRANSPORT_TYPE transportDecFmt, const UINT flags ); /** * \brief Register configuration change callback. * \param hTp Handle of transport decoder. * \param cbUpdateConfig Pointer to a callback function to handle audio config changes. * \param user_data void pointer for user data passed to the callback as first parameter. * \return 0 on success. */ int transportDec_RegisterAscCallback ( HANDLE_TRANSPORTDEC hTp, const cbUpdateConfig_t cbUpdateConfig, void* user_data ); /** * \brief Register SSC parser callback. * \param hTp Handle of transport decoder. * \param cbUpdateConfig Pointer to a callback function to handle SSC parsing. * \param user_data void pointer for user data passed to the callback as first parameter. * \return 0 on success. */ int transportDec_RegisterSscCallback ( HANDLE_TRANSPORTDEC hTp, const cbSsc_t cbSscParse, void* user_data ); /** * \brief Register SBR header parser callback. * \param hTp Handle of transport decoder. * \param cbUpdateConfig Pointer to a callback function to handle SBR header parsing. * \param user_data void pointer for user data passed to the callback as first parameter. * \return 0 on success. */ int transportDec_RegisterSbrCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSbr_t cbSbr, void* user_data); /** * \brief Fill internal input buffer with bitstream data from the external input buffer. * The function only copies such data as long as the decoder-internal input buffer is not full. * So it grabs whatever it can from pBuffer and returns information (bytesValid) so that at a * subsequent call of %transportDec_FillData(), the right position in pBuffer can be determined to * grab the next data. * * \param hTp Handle of transportDec. * \param pBuffer Pointer to external input buffer. * \param bufferSize Size of external input buffer. This argument is required because decoder-internally * we need the information to calculate the offset to pBuffer, where the next * available data is, which is then fed into the decoder-internal buffer (as much * as possible). Our example framework implementation fills the buffer at pBuffer * again, once it contains no available valid bytes anymore (meaning bytesValid equal 0). * \param bytesValid Number of bitstream bytes in the external bitstream buffer that have not yet been * copied into the decoder's internal bitstream buffer by calling this function. * The value is updated according to the amount of newly copied bytes. * \param layer The layer the bitstream belongs to. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_FillData( const HANDLE_TRANSPORTDEC hTp, UCHAR *pBuffer, const UINT bufferSize, UINT *pBytesValid, const INT layer ); /** * \brief Get transportDec bitstream handle. * \param hTp Pointer to a transport decoder handle. * \return HANDLE_FDK_BITSTREAM bitstream handle. */ HANDLE_FDK_BITSTREAM transportDec_GetBitstream ( const HANDLE_TRANSPORTDEC hTp, const UINT layer ); /** * \brief Get transport format. * \param hTp Pointer to a transport decoder handle. * \return The transport format. */ TRANSPORT_TYPE transportDec_GetFormat ( const HANDLE_TRANSPORTDEC hTp ); /** * \brief Get the current buffer fullness value. * * \param hTp Handle of a transport decoder. * * \return Buffer fullness */ INT transportDec_GetBufferFullness( const HANDLE_TRANSPORTDEC hTp ); /** * \brief Close and deallocate transportDec. * \param phTp Pointer to a previously allocated transport decoder handle. * \return void */ void transportDec_Close ( HANDLE_TRANSPORTDEC *phTp ); /** * \brief Read one access unit from the transportDec medium. * \param hTp Handle of transportDec. * \param length On return, this value is overwritten with the actual access unit length in bits. * Set to -1 if length is unknown. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_ReadAccessUnit ( const HANDLE_TRANSPORTDEC hTp, const UINT layer ); /** * \brief Get the remaining amount of bits of the current access unit. The result * can be below zero, meaning that too many bits have been read. * \param hTp Handle of transportDec. * \return amount of remaining bits. */ INT transportDec_GetAuBitsRemaining( const HANDLE_TRANSPORTDEC hTp, const UINT layer ); /** * \brief Get the total amount of bits of the current access unit. * \param hTp Handle of transportDec. * \return amount of total bits. */ INT transportDec_GetAuBitsTotal( const HANDLE_TRANSPORTDEC hTp, const UINT layer ); /** * \brief This function is required to be called when the decoder has finished parsing * one Access Unit for bitstream housekeeping. * \param hTp Transport Handle. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_EndAccessUnit ( const HANDLE_TRANSPORTDEC hTp ); /** * \brief Obtain the amount of missing access units if applicable in case of * a bit stream synchronization error. Each time transportDec_ReadAccessUnit() * returns TRANSPORTDEC_SYNC_ERROR this function can be called to retrieve an estimate * of the amount of missing access units. This works only in case of constant average * bit rate (has to be known) and if the parameter TPDEC_PARAM_SET_BITRATE has been set * accordingly. * \param hTp Transport Handle. * \param pNAccessUnits pointer to a memory location where the estimated lost frame count will be stored into. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_GetMissingAccessUnitCount ( INT *pNAccessUnits, HANDLE_TRANSPORTDEC hTp ); /** * \brief Set a given setting. * \param hTp Transport Handle. * \param param Identifier of the parameter to be changed. * \param value Value for the parameter to be changed. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_SetParam ( const HANDLE_TRANSPORTDEC hTp, const TPDEC_PARAM param, const INT value ); /** * \brief Get number of subframes (for LATM or ADTS) * \param hTp Transport Handle. * \return Number of ADTS/LATM subframes (return 1 for all other transport types). */ UINT transportDec_GetNrOfSubFrames(HANDLE_TRANSPORTDEC hTp); /** * \brief Get info structure of transport decoder library. * \param info A pointer to an allocated LIB_INFO struct. * \return Error code. */ TRANSPORTDEC_ERROR transportDec_GetLibInfo( LIB_INFO *info ); /* ADTS CRC support */ /** * \brief Set current bitstream position as start of a new data region. * \param hTp Transport handle. * \param mBits Size in bits of the data region. Set to 0 if it should not be of a fixed size. * \return Data region ID, which should be used when calling transportDec_CrcEndReg(). */ int transportDec_CrcStartReg ( const HANDLE_TRANSPORTDEC hTp, const INT mBits ); /** * \brief Set end of data region. * \param hTp Transport handle. * \param reg Data region ID, opbtained from transportDec_CrcStartReg(). * \return void */ void transportDec_CrcEndReg ( const HANDLE_TRANSPORTDEC hTp, const INT reg ); /** * \brief Calculate ADTS crc and check if it is correct. The ADTS checksum is held internally. * \param hTp Transport handle. * \return Return TRANSPORTDEC_OK if the CRC is ok, or error if CRC is not correct. */ TRANSPORTDEC_ERROR transportDec_CrcCheck ( const HANDLE_TRANSPORTDEC hTp ); #endif /* #ifndef __TPDEC_LIB_H__ */ fdk-aac-0.1.3/libMpegTPDec/include/tp_data.h0000644000175000017500000003057312372261464021071 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander Description: MPEG Transport data tables ******************************************************************************/ #ifndef __TP_DATA_H__ #define __TP_DATA_H__ #include "machine_type.h" #include "FDK_audio.h" #include "FDK_bitstream.h" /* * Configuration */ #define TP_GA_ENABLE /* #define TP_CELP_ENABLE */ /* #define TP_HVXC_ENABLE */ /* #define TP_SLS_ENABLE */ #define TP_ELD_ENABLE /* #define TP_USAC_ENABLE */ /* #define TP_RSVD50_ENABLE */ #if defined(TP_GA_ENABLE) || defined(TP_SLS_ENABLE) #define TP_PCE_ENABLE /**< Enable full PCE support */ #endif /** * ProgramConfig struct. */ /* ISO/IEC 14496-3 4.4.1.1 Table 4.2 Program config element */ #define PC_FSB_CHANNELS_MAX 16 /* Front/Side/Back channels */ #define PC_LFE_CHANNELS_MAX 4 #define PC_ASSOCDATA_MAX 8 #define PC_CCEL_MAX 16 /* CC elements */ #define PC_COMMENTLENGTH 256 typedef struct { #ifdef TP_PCE_ENABLE /* PCE bitstream elements: */ UCHAR ElementInstanceTag; UCHAR Profile; UCHAR SamplingFrequencyIndex; UCHAR NumFrontChannelElements; UCHAR NumSideChannelElements; UCHAR NumBackChannelElements; UCHAR NumLfeChannelElements; UCHAR NumAssocDataElements; UCHAR NumValidCcElements; UCHAR MonoMixdownPresent; UCHAR MonoMixdownElementNumber; UCHAR StereoMixdownPresent; UCHAR StereoMixdownElementNumber; UCHAR MatrixMixdownIndexPresent; UCHAR MatrixMixdownIndex; UCHAR PseudoSurroundEnable; UCHAR FrontElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR FrontElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR SideElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR SideElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR BackElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR BackElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR LfeElementTagSelect[PC_LFE_CHANNELS_MAX]; UCHAR AssocDataElementTagSelect[PC_ASSOCDATA_MAX]; UCHAR CcElementIsIndSw[PC_CCEL_MAX]; UCHAR ValidCcElementTagSelect[PC_CCEL_MAX]; UCHAR CommentFieldBytes; UCHAR Comment[PC_COMMENTLENGTH]; #endif /* TP_PCE_ENABLE */ /* Helper variables for administration: */ UCHAR isValid; /*!< Flag showing if PCE has been read successfully. */ UCHAR NumChannels; /*!< Amount of audio channels summing all channel elements including LFEs */ UCHAR NumEffectiveChannels; /*!< Amount of audio channels summing only SCEs and CPEs */ UCHAR elCounter; } CProgramConfig; typedef enum { ASCEXT_UNKOWN = -1, ASCEXT_SBR = 0x2b7, ASCEXT_PS = 0x548, ASCEXT_MPS = 0x76a, ASCEXT_SAOC = 0x7cb, ASCEXT_LDMPS = 0x7cc } TP_ASC_EXTENSION_ID; #ifdef TP_GA_ENABLE /** * GaSpecificConfig struct */ typedef struct { UINT m_frameLengthFlag ; UINT m_dependsOnCoreCoder ; UINT m_coreCoderDelay ; UINT m_extensionFlag ; UINT m_extensionFlag3 ; UINT m_layer; UINT m_numOfSubFrame; UINT m_layerLength; } CSGaSpecificConfig; #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE typedef enum { ELDEXT_TERM = 0x0, /* Termination tag */ ELDEXT_SAOC = 0x1, /* SAOC config */ ELDEXT_LDSAC = 0x2 /* LD MPEG Surround config */ /* reserved */ } ASC_ELD_EXT_TYPE; typedef struct { UCHAR m_frameLengthFlag; UCHAR m_sbrPresentFlag; UCHAR m_useLdQmfTimeAlign; /* Use LD-MPS QMF in SBR to achive time alignment */ UCHAR m_sbrSamplingRate; UCHAR m_sbrCrcFlag; } CSEldSpecificConfig; #endif /* TP_ELD_ENABLE */ /** * Audio configuration struct, suitable for encoder and decoder configuration. */ typedef struct { /* XYZ Specific Data */ union { #ifdef TP_GA_ENABLE CSGaSpecificConfig m_gaSpecificConfig; /**< General audio specific configuration. */ #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE CSEldSpecificConfig m_eldSpecificConfig; /**< ELD specific configuration. */ #endif /* TP_ELD_ENABLE */ } m_sc; /* Common ASC parameters */ #ifdef TP_PCE_ENABLE CProgramConfig m_progrConfigElement; /**< Program configuration. */ #endif /* TP_PCE_ENABLE */ AUDIO_OBJECT_TYPE m_aot; /**< Audio Object Type. */ UINT m_samplingFrequency; /**< Samplerate. */ UINT m_samplesPerFrame; /**< Amount of samples per frame. */ UINT m_directMapping; /**< Document this please !! */ AUDIO_OBJECT_TYPE m_extensionAudioObjectType; /**< Audio object type */ UINT m_extensionSamplingFrequency; /**< Samplerate */ SCHAR m_channelConfiguration; /**< Channel configuration index */ SCHAR m_epConfig; /**< Error protection index */ SCHAR m_vcb11Flag; /**< aacSectionDataResilienceFlag */ SCHAR m_rvlcFlag; /**< aacScalefactorDataResilienceFlag */ SCHAR m_hcrFlag; /**< aacSpectralDataResilienceFlag */ SCHAR m_sbrPresentFlag; /**< Flag indicating the presence of SBR data in the bitstream */ SCHAR m_psPresentFlag; /**< Flag indicating the presence of parametric stereo data in the bitstream */ UCHAR m_samplingFrequencyIndex; /**< Samplerate index */ UCHAR m_extensionSamplingFrequencyIndex; /**< Samplerate index */ SCHAR m_extensionChannelConfiguration; /**< Channel configuration index */ } CSAudioSpecificConfig; typedef INT (*cbUpdateConfig_t)(void*, const CSAudioSpecificConfig*); typedef INT (*cbSsc_t)( void*, HANDLE_FDK_BITSTREAM, const AUDIO_OBJECT_TYPE coreCodec, const INT samplingFrequency, const INT muxMode, const INT configBytes ); typedef INT (*cbSbr_t)( void * self, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, const INT sampleRateOut, const INT samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const INT elementIndex ); typedef struct { cbUpdateConfig_t cbUpdateConfig; /*!< Function pointer for Config change notify callback. */ void *cbUpdateConfigData; /*!< User data pointer for Config change notify callback. */ cbSsc_t cbSsc; /*!< Function pointer for SSC parser callback. */ void *cbSscData; /*!< User data pointer for SSC parser callback. */ cbSbr_t cbSbr; /*!< Function pointer for SBR header parser callback. */ void *cbSbrData; /*!< User data pointer for SBR header parser callback. */ } CSTpCallBacks; static const UINT SamplingRateTable[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 }; static inline int getSamplingRateIndex( UINT samplingRate ) { UINT sf_index, tableSize=sizeof(SamplingRateTable)/sizeof(UINT); for (sf_index=0; sf_indextableSize-1) { return tableSize-1; } return sf_index; } /* * Get Channel count from channel configuration */ static inline int getNumberOfTotalChannels(int channelConfig) { if (channelConfig > 0 && channelConfig < 8) return (channelConfig == 7)?8:channelConfig; else return 0; } static inline int getNumberOfEffectiveChannels(const int channelConfig) { const int n[] = {0,1,2,3,4,5,5,7}; return n[channelConfig]; } #endif /* __TP_DATA_H__ */ fdk-aac-0.1.3/libMpegTPDec/include/mpegFileRead.h0000644000175000017500000002132012372261464021767 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander Description: Bitstream data provider for MP4 decoders ******************************************************************************/ #include "machine_type.h" #include "FDK_audio.h" #define MPFREAD_MP4FF_DISABLE #ifndef MPFREAD_MP4FF_DISABLE /*!< If MPFREAD_MP4FF_ENABLE is set, include support for MPEG ISO fileformat. If not set, no .mp4, .m4a and .3gp files can be used for input. */ #define MPFREAD_MP4FF_ENABLE #endif /* maximum number of layers which can be read */ /* shall equal max number of layers read by iisisoff */ #define FILEREAD_MAX_LAYERS (2) typedef struct STRUCT_FILEREAD *HANDLE_FILEREAD; #ifdef __cplusplus extern "C" { #endif /** * \brief Open an MPEG audio file and try to detect its format. * \param filename String of the filename to be opened. * \param fileFormat Skip file format detection and use given format if fileFormat != FF_UNKNOWN. Else store detected format into *fileFmt. * \param transportType Skip transport type detection and use given format if transportType != TT_UNKNOWN. Else store detected format into *fileFmt. * \param conf Pointer to unsigned char to hold the AudioSpecificConfig of the input file, if any (MPEG 4 file format). In case of RAW LATM it holds the StreamMuxConfig. * \param confSize Pointer to an integer, where the length of the ASC or SMC (in case of RAW LATM) is stored to. * \return MPEG file read handle. */ HANDLE_FILEREAD mpegFileRead_Open( const char *filename, FILE_FORMAT fileFormat, TRANSPORT_TYPE transportType, UCHAR *conf[], UINT confSize[], INT *noOfLayers ); /** * \brief Get the file format of the input file. * \param hDataSrc MPEG file read handle. * \return File format of the input file. */ FILE_FORMAT mpegFileRead_GetFileFormat(HANDLE_FILEREAD hDataSrc); /** * \brief Get the transport type of the input file. * \param hDataSrc MPEG file read handle. * \return Transport type of the input file. */ TRANSPORT_TYPE mpegFileRead_GetTransportType(HANDLE_FILEREAD hDataSrc); /** * \brief Read data from MPEG file. In case of packet file, read one packet, in case * of streaming file with embedded synchronisation layer (LOAS/ADTS...), just * fill the buffer. * * \param hMpegFile MPEG file read handle. * \param inBuffer Pointer to input buffer. * \param bufferSize Size of input buffer. * \param bytesValid Number of bytes that were read. * \return 0 on success, -1 if unsupported file format or file read error. */ int mpegFileRead_Read( HANDLE_FILEREAD hMpegFile, UCHAR *inBuffer[], UINT bufferSize, UINT *bytesValid ); /** * \brief Seek in file from origin by given offset in frames. * \param hMpegFile MPEG file read handle. * \param origin If 0, the origin is the file beginning (absolute seek). * If 1, the origin is the current position (relative seek). * \param offset The amount of frames to seek from the given origin. * \return 0 on sucess, -1 if offset < 0 or file read error. */ int mpegFileRead_seek( HANDLE_FILEREAD hMpegFile, INT origin, INT offset ); /** * \brief Get file position in percent. * \param hMpegFile MPEG file read handle. * \return File position in percent. */ int mpegFileRead_getPercent(HANDLE_FILEREAD hMpegFile); /** * \brief Close MPEG audio file. * \param hMpegFile Mpeg file read handle. * \return 0 on sucess. */ int mpegFileRead_Close(HANDLE_FILEREAD *hMpegFile); #ifdef __cplusplus } #endif fdk-aac-0.1.3/libMpegTPDec/src/0000755000175000017500000000000012372262446016441 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPDec/src/tpdec_latm.h0000644000175000017500000001616012372261464020731 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Daniel Homm Description: ******************************************************************************/ #ifndef LATM_DEMUX_H #define LATM_DEMUX_H #include "tpdec_lib.h" #include "FDK_bitstream.h" #define MIN_LATM_HEADERLENGTH 9 #define MIN_LOAS_HEADERLENGTH MIN_LATM_HEADERLENGTH + 24 /* both in bits */ #define MIN_TP_BUF_SIZE_LOAS ( 8194 ) enum { LATM_MAX_PROG = 1, LATM_MAX_LAYER = 2, LATM_MAX_VAR_CHUNKS=16, LATM_MAX_ID=16 }; typedef struct { UINT m_frameLengthType; UINT m_bufferFullness; UINT m_streamID; UINT m_frameLengthInBits; } LATM_LAYER_INFO; typedef struct { LATM_LAYER_INFO m_linfo[LATM_MAX_PROG][LATM_MAX_LAYER]; UINT m_taraBufferFullness; UINT m_otherDataLength; UINT m_audioMuxLengthBytes; /* Length of LOAS payload */ UCHAR m_useSameStreamMux; UCHAR m_AudioMuxVersion; UCHAR m_AudioMuxVersionA; UCHAR m_allStreamsSameTimeFraming; UCHAR m_noSubFrames; UCHAR m_numProgram; UCHAR m_numLayer; UCHAR m_useSameConfig; UCHAR m_otherDataPresent; UCHAR m_crcCheckPresent; UCHAR m_crcCheckSum; SCHAR BufferFullnessAchieved; } CLatmDemux; int CLatmDemux_ReadAuChunkLengthInfo(HANDLE_FDK_BITSTREAM bs); TRANSPORTDEC_ERROR CLatmDemux_Read( HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux, TRANSPORT_TYPE tt, CSTpCallBacks *pTpDecCallbacks, CSAudioSpecificConfig *pAsc, int *pfConfigFound, const INT ignoreBufferFullness ); /** * \brief Read StreamMuxConfig * \param bs bit stream handle as data source * \param pLatmDemux pointer to CLatmDemux struct of current LATM context * \param pTpDecCallbacks Call back structure for configuration callbacks * \param pAsc pointer to a ASC for configuration storage * \param pfConfigFound pointer to a flag which is set to 1 if a configuration was found and processed successfully * \return error code */ TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig( HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux, CSTpCallBacks *pTpDecCallbacks, CSAudioSpecificConfig *pAsc, int * pfConfigFound ); TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux); int CLatmDemux_GetFrameLengthInBits(CLatmDemux *pLatmDemux); int CLatmDemux_GetOtherDataPresentFlag(CLatmDemux *pLatmDemux); int CLatmDemux_GetOtherDataLength(CLatmDemux *pLatmDemux); UINT CLatmDemux_GetNrOfSubFrames(CLatmDemux *pLatmDemux); #endif /* LATM_DEMUX_H */ fdk-aac-0.1.3/libMpegTPDec/src/tpdec_asc.cpp0000644000175000017500000010026712372261464021077 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Daniel Homm Description: ******************************************************************************/ #include "tpdec_lib.h" #include "tp_data.h" void CProgramConfig_Reset(CProgramConfig *pPce) { pPce->elCounter = 0; } void CProgramConfig_Init(CProgramConfig *pPce) { FDKmemclear(pPce, sizeof(CProgramConfig)); #ifdef TP_PCE_ENABLE pPce->SamplingFrequencyIndex = 0xf; #endif } int CProgramConfig_IsValid ( const CProgramConfig *pPce ) { return ( (pPce->isValid) ? 1 : 0); } #ifdef TP_PCE_ENABLE void CProgramConfig_Read( CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs, UINT alignmentAnchor ) { int i; pPce->NumEffectiveChannels = 0; pPce->NumChannels = 0; pPce->ElementInstanceTag = (UCHAR) FDKreadBits(bs,4); pPce->Profile = (UCHAR) FDKreadBits(bs,2); pPce->SamplingFrequencyIndex = (UCHAR) FDKreadBits(bs,4); pPce->NumFrontChannelElements = (UCHAR) FDKreadBits(bs,4); pPce->NumSideChannelElements = (UCHAR) FDKreadBits(bs,4); pPce->NumBackChannelElements = (UCHAR) FDKreadBits(bs,4); pPce->NumLfeChannelElements = (UCHAR) FDKreadBits(bs,2); pPce->NumAssocDataElements = (UCHAR) FDKreadBits(bs,3); pPce->NumValidCcElements = (UCHAR) FDKreadBits(bs,4); if ((pPce->MonoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0) { pPce->MonoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4); } if ((pPce->StereoMixdownPresent = (UCHAR) FDKreadBits(bs,1)) != 0) { pPce->StereoMixdownElementNumber = (UCHAR) FDKreadBits(bs,4); } if ((pPce->MatrixMixdownIndexPresent = (UCHAR) FDKreadBits(bs,1)) != 0) { pPce->MatrixMixdownIndex = (UCHAR) FDKreadBits(bs,2); pPce->PseudoSurroundEnable = (UCHAR) FDKreadBits(bs,1); } for (i=0; i < pPce->NumFrontChannelElements; i++) { pPce->FrontElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); pPce->FrontElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); pPce->NumChannels += pPce->FrontElementIsCpe[i] ? 2 : 1; } for (i=0; i < pPce->NumSideChannelElements; i++) { pPce->SideElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); pPce->SideElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); pPce->NumChannels += pPce->SideElementIsCpe[i] ? 2 : 1; } for (i=0; i < pPce->NumBackChannelElements; i++) { pPce->BackElementIsCpe[i] = (UCHAR) FDKreadBits(bs,1); pPce->BackElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); pPce->NumChannels += pPce->BackElementIsCpe[i] ? 2 : 1; } pPce->NumEffectiveChannels = pPce->NumChannels; for (i=0; i < pPce->NumLfeChannelElements; i++) { pPce->LfeElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); pPce->NumChannels += 1; } for (i=0; i < pPce->NumAssocDataElements; i++) { pPce->AssocDataElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); } for (i=0; i < pPce->NumValidCcElements; i++) { pPce->CcElementIsIndSw[i] = (UCHAR) FDKreadBits(bs,1); pPce->ValidCcElementTagSelect[i] = (UCHAR) FDKreadBits(bs,4); } FDKbyteAlign(bs, alignmentAnchor); pPce->CommentFieldBytes = (UCHAR) FDKreadBits(bs,8); for (i=0; i < pPce->CommentFieldBytes; i++) { UCHAR text; text = (UCHAR)FDKreadBits(bs,8); if (i < PC_COMMENTLENGTH) { pPce->Comment[i] = text; } } pPce->isValid = 1; } /* * Compare two program configurations. * Returns the result of the comparison: * -1 - completely different * 0 - completely equal * 1 - different but same channel configuration * 2 - different channel configuration but same number of channels */ int CProgramConfig_Compare ( const CProgramConfig * const pPce1, const CProgramConfig * const pPce2 ) { int result = 0; /* Innocent until proven false. */ if (FDKmemcmp(pPce1, pPce2, sizeof(CProgramConfig)) != 0) { /* Configurations are not completely different. So look into details and analyse the channel configurations: */ result = -1; if (pPce1->NumChannels == pPce2->NumChannels) { /* Now the logic changes. We first assume to have the same channel configuration and then prove if this assumption is true. */ result = 1; /* Front channels */ if (pPce1->NumFrontChannelElements != pPce2->NumFrontChannelElements) { result = 2; /* different number of front channel elements */ } else { int el, numCh1 = 0, numCh2 = 0; for (el = 0; el < pPce1->NumFrontChannelElements; el += 1) { numCh1 += pPce1->FrontElementIsCpe[el] ? 2 : 1; numCh2 += pPce2->FrontElementIsCpe[el] ? 2 : 1; } if (numCh1 != numCh2) { result = 2; /* different number of front channels */ } } /* Side channels */ if (pPce1->NumSideChannelElements != pPce2->NumSideChannelElements) { result = 2; /* different number of side channel elements */ } else { int el, numCh1 = 0, numCh2 = 0; for (el = 0; el < pPce1->NumSideChannelElements; el += 1) { numCh1 += pPce1->SideElementIsCpe[el] ? 2 : 1; numCh2 += pPce2->SideElementIsCpe[el] ? 2 : 1; } if (numCh1 != numCh2) { result = 2; /* different number of side channels */ } } /* Back channels */ if (pPce1->NumBackChannelElements != pPce2->NumBackChannelElements) { result = 2; /* different number of back channel elements */ } else { int el, numCh1 = 0, numCh2 = 0; for (el = 0; el < pPce1->NumBackChannelElements; el += 1) { numCh1 += pPce1->BackElementIsCpe[el] ? 2 : 1; numCh2 += pPce2->BackElementIsCpe[el] ? 2 : 1; } if (numCh1 != numCh2) { result = 2; /* different number of back channels */ } } /* LFE channels */ if (pPce1->NumLfeChannelElements != pPce2->NumLfeChannelElements) { result = 2; /* different number of lfe channels */ } /* LFEs are always SCEs so we don't need to count the channels. */ } } return result; } void CProgramConfig_GetDefault( CProgramConfig *pPce, const UINT channelConfig ) { FDK_ASSERT(pPce != NULL); /* Init PCE */ CProgramConfig_Init(pPce); pPce->Profile = 1; /* Set AAC LC because it is the only supported object type. */ switch (channelConfig) { /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case 6: /* 3/0/2.1ch */ pPce->NumLfeChannelElements += 1; pPce->NumChannels += 1; case 5: /* 3/0/2.0ch */ case 4: /* 3/0/1.0ch */ pPce->NumBackChannelElements += 1; pPce->BackElementIsCpe[0] = (channelConfig>4) ? 1 : 0; pPce->NumChannels += (channelConfig>4) ? 2 : 1; pPce->NumEffectiveChannels += (channelConfig>4) ? 2 : 1; case 3: /* 3/0/0.0ch */ pPce->NumFrontChannelElements += 1; pPce->FrontElementIsCpe[1] = 1; pPce->NumChannels += 2; pPce->NumEffectiveChannels += 2; case 1: /* 1/0/0.0ch */ pPce->NumFrontChannelElements += 1; pPce->FrontElementIsCpe[0] = 0; pPce->NumChannels += 1; pPce->NumEffectiveChannels += 1; pPce->isValid = 1; break; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ case 2: /* 2/0/0.ch */ pPce->NumFrontChannelElements = 1; pPce->FrontElementIsCpe[0] = 1; pPce->NumChannels += 2; pPce->NumEffectiveChannels += 2; pPce->isValid = 1; break; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ default: pPce->isValid = 0; /* To be explicit! */ break; } if (pPce->isValid) { /* Create valid element instance tags */ int el, elTagSce = 0, elTagCpe = 0; for (el = 0; el < pPce->NumFrontChannelElements; el += 1) { pPce->FrontElementTagSelect[el] = (pPce->FrontElementIsCpe) ? elTagCpe++ : elTagSce++; } for (el = 0; el < pPce->NumSideChannelElements; el += 1) { pPce->SideElementTagSelect[el] = (pPce->SideElementIsCpe) ? elTagCpe++ : elTagSce++; } for (el = 0; el < pPce->NumBackChannelElements; el += 1) { pPce->BackElementTagSelect[el] = (pPce->BackElementIsCpe) ? elTagCpe++ : elTagSce++; } elTagSce = 0; for (el = 0; el < pPce->NumLfeChannelElements; el += 1) { pPce->LfeElementTagSelect[el] = elTagSce++; } } } #endif /* TP_PCE_ENABLE */ /** * \brief get implicit audio channel type for given channelConfig and MPEG ordered channel index * \param channelConfig MPEG channelConfiguration from 1 upto 7 * \param index MPEG channel order index * \return audio channel type. */ void getImplicitAudioChannelTypeAndIndex( AUDIO_CHANNEL_TYPE *chType, UCHAR *chIndex, UINT channelConfig, UINT index ) { if (index < 3) { *chType = ACT_FRONT; *chIndex = index; } else { switch (channelConfig) { case MODE_1_2_1: case MODE_1_2_2: case MODE_1_2_2_1: switch (index) { case 3: case 4: *chType = ACT_BACK; *chIndex = index - 3; break; case 5: *chType = ACT_LFE; *chIndex = 0; break; } break; case MODE_1_2_2_2_1: switch (index) { case 3: case 4: *chType = ACT_SIDE; *chIndex = index - 3; break; case 5: case 6: *chType = ACT_BACK; *chIndex = index - 5; break; case 7: *chType = ACT_LFE; *chIndex = 0; break; } break; default: *chType = ACT_NONE; break; } } } int CProgramConfig_LookupElement( CProgramConfig *pPce, UINT channelConfig, const UINT tag, const UINT channelIdx, UCHAR chMapping[], AUDIO_CHANNEL_TYPE chType[], UCHAR chIndex[], UCHAR *elMapping, MP4_ELEMENT_ID elList[], MP4_ELEMENT_ID elType ) { if (channelConfig > 0) { /* Constant channel mapping must have been set during initialization. */ if ( elType == ID_SCE || elType == ID_CPE || elType == ID_LFE ) { *elMapping = pPce->elCounter; if (elList[pPce->elCounter] != elType) { /* Not in the list */ if ( (channelConfig == 2) && (elType == ID_SCE) ) { /* This scenario occurs with HE-AAC v2 streams of buggy encoders. Due to other decoder implementations decoding of these kind of streams is desired. */ channelConfig = 1; } else { return 0; } } /* Assume all front channels */ getImplicitAudioChannelTypeAndIndex(&chType[channelIdx], &chIndex[channelIdx], channelConfig, channelIdx); if (elType == ID_CPE) { chType[channelIdx+1] = chType[channelIdx]; chIndex[channelIdx+1] = chIndex[channelIdx]+1; } pPce->elCounter++; } /* Accept all non-channel elements, too. */ return 1; } else { #ifdef TP_PCE_ENABLE if (!pPce->isValid) #endif /* TP_PCE_ENABLE */ { /* Implicit channel mapping. */ if ( elType == ID_SCE || elType == ID_CPE || elType == ID_LFE ) { /* Store all channel element IDs */ elList[pPce->elCounter] = elType; *elMapping = pPce->elCounter++; } } #ifdef TP_PCE_ENABLE else { /* Accept the additional channel(s), only if the tag is in the lists */ int isCpe = 0, i; int cc = 0, fc = 0, sc = 0, bc = 0, lc = 0, ec = 0; /* Channel and element counters */ switch (elType) { case ID_CPE: isCpe = 1; case ID_SCE: /* search in front channels */ for (i = 0; i < pPce->NumFrontChannelElements; i++) { if (isCpe == pPce->FrontElementIsCpe[i] && pPce->FrontElementTagSelect[i] == tag) { chMapping[cc] = channelIdx; chType[cc] = ACT_FRONT; chIndex[cc] = fc; if (isCpe) { chMapping[cc+1] = channelIdx+1; chType[cc+1] = ACT_FRONT; chIndex[cc+1] = fc+1; } *elMapping = ec; return 1; } ec++; if (pPce->FrontElementIsCpe[i]) { cc+=2; fc+=2; } else { cc++; fc++; } } /* search in side channels */ for (i = 0; i < pPce->NumSideChannelElements; i++) { if (isCpe == pPce->SideElementIsCpe[i] && pPce->SideElementTagSelect[i] == tag) { chMapping[cc] = channelIdx; chType[cc] = ACT_SIDE; chIndex[cc] = sc; if (isCpe) { chMapping[cc+1] = channelIdx+1; chType[cc+1] = ACT_SIDE; chIndex[cc+1] = sc+1; } *elMapping = ec; return 1; } ec++; if (pPce->SideElementIsCpe[i]) { cc+=2; sc+=2; } else { cc++; sc++; } } /* search in back channels */ for (i = 0; i < pPce->NumBackChannelElements; i++) { if (isCpe == pPce->BackElementIsCpe[i] && pPce->BackElementTagSelect[i] == tag) { chMapping[cc] = channelIdx; chType[cc] = ACT_BACK; chIndex[cc] = bc; if (isCpe) { chMapping[cc+1] = channelIdx+1; chType[cc+1] = ACT_BACK; chIndex[cc+1] = bc+1; } *elMapping = ec; return 1; } ec++; if (pPce->BackElementIsCpe[i]) { cc+=2; bc+=2; } else { cc++; bc++; } } break; case ID_LFE: /* Initialize channel counter and element counter */ cc = pPce->NumEffectiveChannels; ec = pPce->NumFrontChannelElements+ pPce->NumSideChannelElements + pPce->NumBackChannelElements; /* search in lfe channels */ for (i = 0; i < pPce->NumLfeChannelElements; i++) { if ( pPce->LfeElementTagSelect[i] == tag ) { chMapping[cc] = channelIdx; *elMapping = ec; chType[cc] = ACT_LFE; chIndex[cc] = lc; return 1; } ec++; cc++; lc++; } break; /* Non audio elements */ case ID_CCE: /* search in cce channels */ for (i = 0; i < pPce->NumValidCcElements; i++) { if (pPce->ValidCcElementTagSelect[i] == tag) { return 1; } } break; case ID_DSE: /* search associated data elements */ for (i = 0; i < pPce->NumAssocDataElements; i++) { if (pPce->AssocDataElementTagSelect[i] == tag) { return 1; } } break; default: return 0; } return 0; /* not found in any list */ } #endif /* TP_PCE_ENABLE */ } return 1; } #ifdef TP_PCE_ENABLE int CProgramConfig_GetElementTable( const CProgramConfig *pPce, MP4_ELEMENT_ID elList[], const INT elListSize ) { int i, el = 0; if ( elListSize < pPce->NumFrontChannelElements + pPce->NumSideChannelElements + pPce->NumBackChannelElements + pPce->NumLfeChannelElements ) { return 0; } for (i=0; i < pPce->NumFrontChannelElements; i++) { elList[el++] = (pPce->FrontElementIsCpe[i]) ? ID_CPE : ID_SCE; } for (i=0; i < pPce->NumSideChannelElements; i++) { elList[el++] = (pPce->SideElementIsCpe[i]) ? ID_CPE : ID_SCE; } for (i=0; i < pPce->NumBackChannelElements; i++) { elList[el++] = (pPce->BackElementIsCpe[i]) ? ID_CPE : ID_SCE; } for (i=0; i < pPce->NumLfeChannelElements; i++) { elList[el++] = ID_LFE; } return el; } #endif static AUDIO_OBJECT_TYPE getAOT(HANDLE_FDK_BITSTREAM bs) { int tmp = 0; tmp = FDKreadBits(bs,5); if (tmp == AOT_ESCAPE) { int tmp2 = FDKreadBits(bs,6); tmp = 32 + tmp2; } return (AUDIO_OBJECT_TYPE)tmp; } static INT getSampleRate(HANDLE_FDK_BITSTREAM bs, UCHAR *index, int nBits) { INT sampleRate; int idx; idx = FDKreadBits(bs, nBits); if( idx == (1<m_frameLengthFlag = FDKreadBits(bs,1); self->m_dependsOnCoreCoder = FDKreadBits(bs,1); if( self->m_dependsOnCoreCoder ) self->m_coreCoderDelay = FDKreadBits(bs,14); self->m_extensionFlag = FDKreadBits(bs,1); if( asc->m_channelConfiguration == 0 ) { CProgramConfig_Read(&asc->m_progrConfigElement, bs, ascStartAnchor); } if ((asc->m_aot == AOT_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_SCAL)) { self->m_layer = FDKreadBits(bs,3); } if (self->m_extensionFlag) { if (asc->m_aot == AOT_ER_BSAC) { self->m_numOfSubFrame = FDKreadBits(bs,5); self->m_layerLength = FDKreadBits(bs,11); } if ((asc->m_aot == AOT_ER_AAC_LC) || (asc->m_aot == AOT_ER_AAC_LTP) || (asc->m_aot == AOT_ER_AAC_SCAL) || (asc->m_aot == AOT_ER_AAC_LD)) { asc->m_vcb11Flag = FDKreadBits(bs,1); /* aacSectionDataResilienceFlag */ asc->m_rvlcFlag = FDKreadBits(bs,1); /* aacScalefactorDataResilienceFlag */ asc->m_hcrFlag = FDKreadBits(bs,1); /* aacSpectralDataResilienceFlag */ } self->m_extensionFlag3 = FDKreadBits(bs,1); } return (ErrorStatus); } #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE static INT ld_sbr_header( const CSAudioSpecificConfig *asc, HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb ) { const int channelConfiguration = asc->m_channelConfiguration; int i = 0; INT error = 0; if (channelConfiguration == 2) { error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); } else { error = cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++); } switch ( channelConfiguration ) { case 7: error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); case 6: case 5: error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); case 3: error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); break; case 4: error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_CPE, i++); error |= cb->cbSbr(cb->cbSbrData, hBs, asc->m_samplingFrequency, asc->m_extensionSamplingFrequency, asc->m_samplesPerFrame, AOT_ER_AAC_ELD, ID_SCE, i++); break; } return error; } static TRANSPORTDEC_ERROR EldSpecificConfig_Parse( CSAudioSpecificConfig *asc, HANDLE_FDK_BITSTREAM hBs, CSTpCallBacks *cb ) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig; ASC_ELD_EXT_TYPE eldExtType; int eldExtLen, len, cnt; FDKmemclear(esc, sizeof(CSEldSpecificConfig)); esc->m_frameLengthFlag = FDKreadBits(hBs, 1 ); if (esc->m_frameLengthFlag) { asc->m_samplesPerFrame = 480; } else { asc->m_samplesPerFrame = 512; } asc->m_vcb11Flag = FDKreadBits(hBs, 1 ); asc->m_rvlcFlag = FDKreadBits(hBs, 1 ); asc->m_hcrFlag = FDKreadBits(hBs, 1 ); esc->m_sbrPresentFlag = FDKreadBits(hBs, 1 ); if (esc->m_sbrPresentFlag == 1) { esc->m_sbrSamplingRate = FDKreadBits(hBs, 1 ); /* 0: single rate, 1: dual rate */ esc->m_sbrCrcFlag = FDKreadBits(hBs, 1 ); asc->m_extensionSamplingFrequency = asc->m_samplingFrequency << esc->m_sbrSamplingRate; if (cb->cbSbr != NULL){ if ( 0 != ld_sbr_header(asc, hBs, cb) ) { return TRANSPORTDEC_PARSE_ERROR; } } } esc->m_useLdQmfTimeAlign = 0; /* new ELD syntax */ /* parse ExtTypeConfigData */ while ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4 )) != ELDEXT_TERM) { eldExtLen = len = FDKreadBits(hBs, 4 ); if ( len == 0xf ) { len = FDKreadBits(hBs, 8 ); eldExtLen += len; if ( len == 0xff ) { len = FDKreadBits(hBs, 16 ); eldExtLen += len; } } switch (eldExtType) { case ELDEXT_LDSAC: esc->m_useLdQmfTimeAlign = 1; if (cb->cbSsc != NULL) { ErrorStatus = (TRANSPORTDEC_ERROR)cb->cbSsc( cb->cbSscData, hBs, asc->m_aot, asc->m_samplingFrequency, 1, /* muxMode */ len ); } else { ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; } if (ErrorStatus != TRANSPORTDEC_OK) { goto bail; } break; default: for(cnt=0; cnt= 11) { lastAscExt = ascExtId; ascExtId = (TP_ASC_EXTENSION_ID)FDKreadBits(bs, 11); bitsAvailable -= 11; switch (ascExtId) { case ASCEXT_SBR: /* 0x2b7 */ if ( (self->m_extensionAudioObjectType != AOT_SBR) && (bitsAvailable >= 5) ) { self->m_extensionAudioObjectType = getAOT(bs); if ( (self->m_extensionAudioObjectType == AOT_SBR) || (self->m_extensionAudioObjectType == AOT_ER_BSAC) ) { /* Get SBR extension configuration */ self->m_sbrPresentFlag = FDKreadBits(bs, 1); bitsAvailable -= 1; if ( self->m_sbrPresentFlag == 1 ) { self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4); if ((INT)self->m_extensionSamplingFrequency <= 0) { return TRANSPORTDEC_PARSE_ERROR; } } if ( self->m_extensionAudioObjectType == AOT_ER_BSAC ) { self->m_extensionChannelConfiguration = FDKreadBits(bs, 4); bitsAvailable -= 4; } } /* Update counter because of variable length fields (AOT and sampling rate) */ bitsAvailable = (INT)FDKgetValidBits(bs); } break; case ASCEXT_PS: /* 0x548 */ if ( (lastAscExt == ASCEXT_SBR) && (self->m_extensionAudioObjectType == AOT_SBR) && (bitsAvailable > 0) ) { /* Get PS extension configuration */ self->m_psPresentFlag = FDKreadBits(bs, 1); bitsAvailable -= 1; } break; default: /* Just ignore anything. */ return TRANSPORTDEC_OK; } } return TRANSPORTDEC_OK; } /* * API Functions */ void AudioSpecificConfig_Init(CSAudioSpecificConfig *asc) { FDKmemclear(asc, sizeof(CSAudioSpecificConfig)); /* Init all values that should not be zero. */ asc->m_aot = AOT_NONE; asc->m_samplingFrequencyIndex = 0xf; asc->m_epConfig = -1; asc->m_extensionAudioObjectType = AOT_NULL_OBJECT; #ifdef TP_PCE_ENABLE CProgramConfig_Init(&asc->m_progrConfigElement); #endif } TRANSPORTDEC_ERROR AudioSpecificConfig_Parse( CSAudioSpecificConfig *self, HANDLE_FDK_BITSTREAM bs, int fExplicitBackwardCompatible, CSTpCallBacks *cb ) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; UINT ascStartAnchor = FDKgetValidBits(bs); int frameLengthFlag = -1; AudioSpecificConfig_Init(self); self->m_aot = getAOT(bs); self->m_samplingFrequency = getSampleRate(bs, &self->m_samplingFrequencyIndex, 4); if (self->m_samplingFrequency <= 0) { return TRANSPORTDEC_PARSE_ERROR; } self->m_channelConfiguration = FDKreadBits(bs,4); /* SBR extension ( explicit non-backwards compatible mode ) */ self->m_sbrPresentFlag = 0; self->m_psPresentFlag = 0; if ( self->m_aot == AOT_SBR || self->m_aot == AOT_PS ) { self->m_extensionAudioObjectType = AOT_SBR; self->m_sbrPresentFlag = 1; if ( self->m_aot == AOT_PS ) { self->m_psPresentFlag = 1; } self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4); self->m_aot = getAOT(bs); } else { self->m_extensionAudioObjectType = AOT_NULL_OBJECT; } /* Parse whatever specific configs */ switch (self->m_aot) { #ifdef TP_GA_ENABLE case AOT_AAC_LC: case AOT_ER_AAC_LC: case AOT_ER_AAC_LD: case AOT_ER_AAC_SCAL: case AOT_ER_BSAC: if ((ErrorStatus = GaSpecificConfig_Parse(&self->m_sc.m_gaSpecificConfig, self, bs, ascStartAnchor)) != TRANSPORTDEC_OK ) { return (ErrorStatus); } frameLengthFlag = self->m_sc.m_gaSpecificConfig.m_frameLengthFlag; break; #endif /* TP_GA_ENABLE */ case AOT_MPEGS: if (cb->cbSsc != NULL) { cb->cbSsc( cb->cbSscData, bs, self->m_aot, self->m_samplingFrequency, 1, 0 /* don't know the length */ ); } else { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } break; #ifdef TP_ELD_ENABLE case AOT_ER_AAC_ELD: if ((ErrorStatus = EldSpecificConfig_Parse(self, bs, cb)) != TRANSPORTDEC_OK ) { return (ErrorStatus); } frameLengthFlag = self->m_sc.m_eldSpecificConfig.m_frameLengthFlag; self->m_sbrPresentFlag = self->m_sc.m_eldSpecificConfig.m_sbrPresentFlag; self->m_extensionSamplingFrequency = (self->m_sc.m_eldSpecificConfig.m_sbrSamplingRate+1) * self->m_samplingFrequency; break; #endif /* TP_ELD_ENABLE */ default: return TRANSPORTDEC_UNSUPPORTED_FORMAT; break; } /* Frame length */ switch (self->m_aot) { #if defined(TP_GA_ENABLE) || defined(TP_USAC_ENABLE) case AOT_AAC_LC: case AOT_ER_AAC_LC: case AOT_ER_AAC_SCAL: case AOT_ER_BSAC: /*case AOT_USAC:*/ if (!frameLengthFlag) self->m_samplesPerFrame = 1024; else self->m_samplesPerFrame = 960; break; #endif /* TP_GA_ENABLE */ #if defined(TP_GA_ENABLE) case AOT_ER_AAC_LD: if (!frameLengthFlag) self->m_samplesPerFrame = 512; else self->m_samplesPerFrame = 480; break; #endif /* defined(TP_GA_ENABLE) */ default: break; } switch (self->m_aot) { case AOT_ER_AAC_LC: case AOT_ER_AAC_LD: case AOT_ER_AAC_ELD: case AOT_ER_AAC_SCAL: case AOT_ER_CELP: case AOT_ER_HVXC: case AOT_ER_BSAC: self->m_epConfig = FDKreadBits(bs,2); if (self->m_epConfig > 1) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; // EPCONFIG; } break; default: break; } if (fExplicitBackwardCompatible) { ErrorStatus = AudioSpecificConfig_ExtensionParse(self, bs, cb); } return (ErrorStatus); } fdk-aac-0.1.3/libMpegTPDec/src/mpegFileFormat.h0000644000175000017500000001340212372261464021512 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Oliver Moser Description: bitstream format detection routines ******************************************************************************/ #if !defined(__BITSTREAM_FORMAT_H__) #define __BITSTREAM_FORMAT_H__ #include "machine_type.h" #include "FDK_audio.h" /** * \brief Try to find out the format of a file, given the few first bytes. * \param fileData pointer to a buffer holding the first bytes of a file. * \param pAu pointer to UCHAR*, returns the address of the first AU found or NULL. * \param length pointer to the length of the buffer fileData. Return length of first AU. * \return the detected file format, or FF_UNKNOWN in case of failure. */ FILE_FORMAT GetFileFormat(UCHAR *fileData, UCHAR **pAu, UINT *length); /** * \brief Try to find out the transport type contained in a given file. * \param filename name of the file to be analysed. * \param fileFormat pointer to a variable where the detected file format is stored into. * \return the detected transport type or TT_UNKNOWN in case of failure. */ TRANSPORT_TYPE GetTransportType(const char* filename, FILE_FORMAT *fileFormat); #endif fdk-aac-0.1.3/libMpegTPDec/src/tpdec_latm.cpp0000644000175000017500000003430712372261464021267 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Daniel Homm Description: ******************************************************************************/ #include "tpdec_latm.h" #include "FDK_bitstream.h" #define TPDEC_TRACKINDEX(p,l) (2*(p) + (l)) static UINT CLatmDemux_GetValue(HANDLE_FDK_BITSTREAM bs) { UCHAR bytesForValue = 0, tmp = 0; int value = 0; bytesForValue = (UCHAR) FDKreadBits(bs,2); for (UINT i=0; i<=bytesForValue; i++) { value <<= 8; tmp = (UCHAR) FDKreadBits(bs,8); value += tmp; } return value; } static TRANSPORTDEC_ERROR CLatmDemux_ReadAudioMuxElement( HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux, int m_muxConfigPresent, CSTpCallBacks *pTpDecCallbacks, CSAudioSpecificConfig *pAsc, int *pfConfigFound ) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; if (m_muxConfigPresent) { pLatmDemux->m_useSameStreamMux = FDKreadBits(bs,1); if (!pLatmDemux->m_useSameStreamMux) { if ((ErrorStatus = CLatmDemux_ReadStreamMuxConfig(bs, pLatmDemux, pTpDecCallbacks, pAsc, pfConfigFound))) { return (ErrorStatus); } } } /* If there was no configuration read, its not possible to parse PayloadLengthInfo below. */ if (! *pfConfigFound) { return TRANSPORTDEC_SYNC_ERROR; } if (pLatmDemux->m_AudioMuxVersionA == 0) { /* Do only once per call, because parsing and decoding is done in-line. */ if ((ErrorStatus = CLatmDemux_ReadPayloadLengthInfo(bs,pLatmDemux))) { return (ErrorStatus); } } else { /* audioMuxVersionA > 0 is reserved for future extensions */ ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; } return (ErrorStatus); } TRANSPORTDEC_ERROR CLatmDemux_Read( HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux, TRANSPORT_TYPE tt, CSTpCallBacks *pTpDecCallbacks, CSAudioSpecificConfig *pAsc, int *pfConfigFound, const INT ignoreBufferFullness ) { UINT cntBits; UINT cmpBufferFullness; UINT audioMuxLengthBytesLast = 0; TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; cntBits = FDKgetValidBits(bs); if ((INT)cntBits < MIN_LATM_HEADERLENGTH) { return TRANSPORTDEC_NOT_ENOUGH_BITS; } if ((ErrorStatus = CLatmDemux_ReadAudioMuxElement(bs, pLatmDemux, (tt != TT_MP4_LATM_MCP0), pTpDecCallbacks, pAsc, pfConfigFound))) return (ErrorStatus); if (!ignoreBufferFullness) { cmpBufferFullness = 24+audioMuxLengthBytesLast*8 + pLatmDemux->m_linfo[0][0].m_bufferFullness* pAsc[TPDEC_TRACKINDEX(0,0)].m_channelConfiguration*32; /* evaluate buffer fullness */ if (pLatmDemux->m_linfo[0][0].m_bufferFullness != 0xFF) { if (!pLatmDemux->BufferFullnessAchieved) { if (cntBits < cmpBufferFullness) { /* condition for start of decoding is not fulfilled */ /* the current frame will not be decoded */ return TRANSPORTDEC_NOT_ENOUGH_BITS; } else { pLatmDemux->BufferFullnessAchieved = 1; } } } } return (ErrorStatus); } TRANSPORTDEC_ERROR CLatmDemux_ReadStreamMuxConfig( HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux, CSTpCallBacks *pTpDecCallbacks, CSAudioSpecificConfig *pAsc, int * pfConfigFound ) { LATM_LAYER_INFO *p_linfo = NULL; TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; pLatmDemux->m_AudioMuxVersion = FDKreadBits(bs,1); if (pLatmDemux->m_AudioMuxVersion == 0) { pLatmDemux->m_AudioMuxVersionA = 0; } else { pLatmDemux->m_AudioMuxVersionA = FDKreadBits(bs,1); } if (pLatmDemux->m_AudioMuxVersionA == 0) { if (pLatmDemux->m_AudioMuxVersion == 1) { pLatmDemux->m_taraBufferFullness = CLatmDemux_GetValue(bs); } pLatmDemux->m_allStreamsSameTimeFraming = FDKreadBits(bs,1); pLatmDemux->m_noSubFrames = FDKreadBits(bs,6) + 1; pLatmDemux->m_numProgram = FDKreadBits(bs,4) + 1; if (pLatmDemux->m_numProgram > 1) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } int idCnt = 0; for (UINT prog = 0; prog < pLatmDemux->m_numProgram; prog++) { pLatmDemux->m_numLayer = FDKreadBits(bs,3) + 1; if (pLatmDemux->m_numLayer > 2) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } for (UINT lay = 0; lay < pLatmDemux->m_numLayer; lay++) { p_linfo = &pLatmDemux->m_linfo[prog][lay]; p_linfo->m_streamID = idCnt++; p_linfo->m_frameLengthInBits = 0; if( (prog == 0) && (lay == 0) ) { pLatmDemux->m_useSameConfig = 0; } else { pLatmDemux->m_useSameConfig = FDKreadBits(bs,1); } if (pLatmDemux->m_useSameConfig) { if (lay > 1) { FDKmemcpy(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &pAsc[TPDEC_TRACKINDEX(prog,lay-1)], sizeof(CSAudioSpecificConfig)); } else { return TRANSPORTDEC_PARSE_ERROR; } } else { if (pLatmDemux->m_AudioMuxVersion == 1) { FDK_BITSTREAM tmpBs; UINT ascStartPos, ascLen=0; ascLen = CLatmDemux_GetValue(bs); ascStartPos = FDKgetValidBits(bs); tmpBs = *bs; FDKsyncCache(&tmpBs); tmpBs.hBitBuf.ValidBits = ascLen; /* Read ASC */ if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], &tmpBs, 1, pTpDecCallbacks))) { return (ErrorStatus); } *pfConfigFound = 1; /* The field p_linfo->m_ascLen could be wrong, so check if */ if ( 0 > (INT)FDKgetValidBits(&tmpBs)) { return TRANSPORTDEC_PARSE_ERROR; } FDKpushFor(bs, ascLen); /* position bitstream after ASC */ } else { /* Read ASC */ if ((ErrorStatus = AudioSpecificConfig_Parse(&pAsc[TPDEC_TRACKINDEX(prog,lay)], bs, 0, pTpDecCallbacks))) { return (ErrorStatus); } } { int cbError; cbError = pTpDecCallbacks->cbUpdateConfig(pTpDecCallbacks->cbUpdateConfigData, &pAsc[TPDEC_TRACKINDEX(prog,lay)]); if (cbError != 0) { return TRANSPORTDEC_UNKOWN_ERROR; } *pfConfigFound = 1; } } p_linfo->m_frameLengthType = FDKreadBits(bs,3); switch( p_linfo->m_frameLengthType ) { case 0: p_linfo->m_bufferFullness = FDKreadBits(bs,8); if (!pLatmDemux->m_allStreamsSameTimeFraming) { if ((lay > 0) && (pAsc[TPDEC_TRACKINDEX(prog,lay)].m_aot == AOT_AAC_SCAL || pAsc[TPDEC_TRACKINDEX(prog,lay)].m_aot == AOT_ER_AAC_SCAL)) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } } break; case 1: /* frameLength = FDKreadBits(bs,9); */ case 3: case 4: case 5: /* CELP */ case 6: case 7: /* HVXC */ default: return TRANSPORTDEC_PARSE_ERROR; //_LATM_INVALIDFRAMELENGTHTYPE; } /* switch framelengthtype*/ } /* layer loop */ } /* prog loop */ pLatmDemux->m_otherDataPresent = FDKreadBits(bs,1); pLatmDemux->m_otherDataLength = 0; if (pLatmDemux->m_otherDataPresent) { int otherDataLenEsc = 0; do { pLatmDemux->m_otherDataLength <<= 8; // *= 256 otherDataLenEsc = FDKreadBits(bs,1); pLatmDemux->m_otherDataLength += FDKreadBits(bs,8); } while (otherDataLenEsc); } pLatmDemux->m_crcCheckPresent = FDKreadBits(bs,1); pLatmDemux->m_crcCheckSum = 0; if (pLatmDemux->m_crcCheckPresent) { pLatmDemux->m_crcCheckSum = FDKreadBits(bs,8); } } else { /* audioMuxVersionA > 0 is reserved for future extensions */ ErrorStatus = TRANSPORTDEC_UNSUPPORTED_FORMAT; } return (ErrorStatus); } TRANSPORTDEC_ERROR CLatmDemux_ReadPayloadLengthInfo(HANDLE_FDK_BITSTREAM bs, CLatmDemux *pLatmDemux) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; int totalPayloadBits = 0; if( pLatmDemux->m_allStreamsSameTimeFraming == 1 ) { for (UINT prog=0; progm_numProgram; prog++ ) { for (UINT lay=0; laym_numLayer; lay++ ) { LATM_LAYER_INFO *p_linfo = &pLatmDemux->m_linfo[prog][lay]; switch (p_linfo->m_frameLengthType ) { case 0: p_linfo->m_frameLengthInBits = CLatmDemux_ReadAuChunkLengthInfo(bs); totalPayloadBits += p_linfo->m_frameLengthInBits; break; case 3: case 5: case 7: default: return TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_INVALIDFRAMELENGTHTYPE; } } } } else { ErrorStatus = TRANSPORTDEC_PARSE_ERROR; //AAC_DEC_LATM_TIMEFRAMING; } if (pLatmDemux->m_audioMuxLengthBytes > (UINT)0 && totalPayloadBits > (int)pLatmDemux->m_audioMuxLengthBytes*8) { return TRANSPORTDEC_PARSE_ERROR; } return (ErrorStatus); } int CLatmDemux_ReadAuChunkLengthInfo(HANDLE_FDK_BITSTREAM bs) { UCHAR endFlag; int len = 0; do { UCHAR tmp = (UCHAR) FDKreadBits(bs,8); endFlag = (tmp < 255); len += tmp; } while( endFlag == 0 ); len <<= 3; /* convert from bytes to bits */ return len; } int CLatmDemux_GetFrameLengthInBits(CLatmDemux *pLatmDemux) { return pLatmDemux->m_linfo[0][0].m_frameLengthInBits; } int CLatmDemux_GetOtherDataPresentFlag(CLatmDemux *pLatmDemux) { return pLatmDemux->m_otherDataPresent ? 1 : 0; } int CLatmDemux_GetOtherDataLength(CLatmDemux *pLatmDemux) { return pLatmDemux->m_otherDataLength; } UINT CLatmDemux_GetNrOfSubFrames(CLatmDemux *pLatmDemux) { return pLatmDemux->m_noSubFrames; } fdk-aac-0.1.3/libMpegTPDec/src/tpdec_lib.cpp0000644000175000017500000012170312372261464021075 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** MPEG-4 Transport Decoder ************************ Author(s): Manuel Jander Description: MPEG Transport decoder ******************************************************************************/ #include "tpdec_lib.h" /* library version */ #include "version" #include "tp_data.h" #include "tpdec_adts.h" #include "tpdec_adif.h" #include "tpdec_latm.h" #define MODULE_NAME "transportDec" typedef union { STRUCT_ADTS adts; CAdifHeader adif; CLatmDemux latm; } transportdec_parser_t; struct TRANSPORTDEC { TRANSPORT_TYPE transportFmt; /*!< MPEG4 transportDec type. */ CSTpCallBacks callbacks; /*!< Struct holding callback and its data */ FDK_BITSTREAM bitStream[2]; /* Bitstream reader */ UCHAR *bsBuffer; /* Internal bitstreamd data buffer (unallocated in case of TT_MP4_RAWPACKETS) */ transportdec_parser_t parser; /* Format specific parser structs. */ CSAudioSpecificConfig asc[(1*2)]; /* Audio specific config from the last config found. */ UINT globalFramePos; /* Global transport frame reference bit position. */ UINT accessUnitAnchor[2]; /* Current access unit start bit position. */ INT auLength[2]; /* Length of current access unit. */ INT numberOfRawDataBlocks; /* Current number of raw data blocks contained remaining from the current transport frame. */ UINT avgBitRate; /* Average bit rate used for frame loss estimation. */ UINT lastValidBufferFullness; /* Last valid buffer fullness value for frame loss estimation */ INT remainder; /* Reminder in division during lost access unit estimation. */ INT missingAccessUnits; /* Estimated missing access units. */ UINT burstPeriod; /* Data burst period in mili seconds. */ UINT holdOffFrames; /* Amount of frames that were already hold off due to buffer fullness condition not being met. */ UINT flags; /* Flags. */ }; /* Flag bitmasks for "flags" member of struct TRANSPORTDEC */ #define TPDEC_SYNCOK 1 #define TPDEC_MINIMIZE_DELAY 2 #define TPDEC_IGNORE_BUFFERFULLNESS 4 #define TPDEC_EARLY_CONFIG 8 #define TPDEC_LOST_FRAMES_PENDING 16 #define TPDEC_CONFIG_FOUND 32 C_ALLOC_MEM(Ram_TransportDecoder, TRANSPORTDEC, 1) C_ALLOC_MEM(Ram_TransportDecoderBuffer, UCHAR, TRANSPORTDEC_INBUF_SIZE) HANDLE_TRANSPORTDEC transportDec_Open( const TRANSPORT_TYPE transportFmt, const UINT flags) { HANDLE_TRANSPORTDEC hInput; hInput = GetRam_TransportDecoder(0); if ( hInput == NULL ) { return NULL; } /* Init transportDec struct. */ hInput->transportFmt = transportFmt; switch (transportFmt) { case TT_MP4_ADIF: break; case TT_MP4_ADTS: if (flags & TP_FLAG_MPEG4) hInput->parser.adts.decoderCanDoMpeg4 = 1; else hInput->parser.adts.decoderCanDoMpeg4 = 0; adtsRead_CrcInit(&hInput->parser.adts); hInput->parser.adts.BufferFullnesStartFlag = 1; hInput->numberOfRawDataBlocks = 0; break; case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: case TT_MP4_LOAS: case TT_MP4_RAW: break; default: FreeRam_TransportDecoder(&hInput); hInput = NULL; break; } if (hInput != NULL) { /* Create bitstream */ if ( TT_IS_PACKET(transportFmt) ) { hInput->bsBuffer = NULL; } else { hInput->bsBuffer = GetRam_TransportDecoderBuffer(0); if (hInput->bsBuffer == NULL) { transportDec_Close( &hInput ); return NULL; } FDKinitBitStream(&hInput->bitStream[0], hInput->bsBuffer, TRANSPORTDEC_INBUF_SIZE, 0, BS_READER); } hInput->burstPeriod = 0; } return hInput; } TRANSPORTDEC_ERROR transportDec_OutOfBandConfig(HANDLE_TRANSPORTDEC hTp, UCHAR *conf, const UINT length, UINT layer ) { TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; FDK_BITSTREAM bs; HANDLE_FDK_BITSTREAM hBs = &bs; FDKinitBitStream(hBs, conf, 0x10000000, length<<3, BS_READER); int fConfigFound = 0; /* config transport decoder */ switch (hTp->transportFmt) { case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: case TT_MP4_LOAS: { if (layer != 0) { return TRANSPORTDEC_INVALID_PARAMETER; } CLatmDemux *pLatmDemux = &hTp->parser.latm; err = CLatmDemux_ReadStreamMuxConfig(hBs, pLatmDemux, &hTp->callbacks, hTp->asc, &fConfigFound); if (err != TRANSPORTDEC_OK) { return err; } } break; default: fConfigFound = 1; err = AudioSpecificConfig_Parse(&hTp->asc[layer], hBs, 1, &hTp->callbacks); if (err == TRANSPORTDEC_OK) { int errC; errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[layer]); if (errC != 0) { err = TRANSPORTDEC_PARSE_ERROR; } } break; } if (err == TRANSPORTDEC_OK && fConfigFound) { hTp->flags |= TPDEC_CONFIG_FOUND; } return err; } int transportDec_RegisterAscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbUpdateConfig_t cbUpdateConfig, void* user_data) { if (hTpDec == NULL) { return -1; } hTpDec->callbacks.cbUpdateConfig = cbUpdateConfig; hTpDec->callbacks.cbUpdateConfigData = user_data; return 0; } int transportDec_RegisterSscCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSsc_t cbSsc, void* user_data) { if (hTpDec == NULL) { return -1; } hTpDec->callbacks.cbSsc = cbSsc; hTpDec->callbacks.cbSscData = user_data; return 0; } int transportDec_RegisterSbrCallback( HANDLE_TRANSPORTDEC hTpDec, const cbSbr_t cbSbr, void* user_data) { if (hTpDec == NULL) { return -1; } hTpDec->callbacks.cbSbr = cbSbr; hTpDec->callbacks.cbSbrData = user_data; return 0; } TRANSPORTDEC_ERROR transportDec_FillData( const HANDLE_TRANSPORTDEC hTp, UCHAR *pBuffer, const UINT bufferSize, UINT *pBytesValid, const INT layer ) { HANDLE_FDK_BITSTREAM hBs; if ( (hTp == NULL) || (layer >= 2) ) { return TRANSPORTDEC_INVALID_PARAMETER; } if (*pBytesValid == 0) { /* nothing to do */ return TRANSPORTDEC_OK; } /* set bitbuffer shortcut */ hBs = &hTp->bitStream[layer]; if ( TT_IS_PACKET(hTp->transportFmt) ) { if (hTp->numberOfRawDataBlocks == 0) { /* For packet based transport, pass input buffer to bitbuffer without copying the data. Unfortunately we do not know the actual buffer size. And the FDK bit buffer implementation needs a number 2^x. So we assume the maximum of 48 channels with 6144 bits per channel and round it up to the next power of 2 => 65536 bytes */ FDKinitBitStream(hBs, pBuffer, 0x10000, (*pBytesValid)<<3, BS_READER); *pBytesValid = 0; } } else { /* ... else feed bitbuffer with new stream data (append). */ if (hTp->numberOfRawDataBlocks <= 0) { FDKfeedBuffer (hBs, pBuffer, bufferSize, pBytesValid) ; } } return TRANSPORTDEC_OK; } HANDLE_FDK_BITSTREAM transportDec_GetBitstream( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) { return &hTp->bitStream[layer]; } TRANSPORT_TYPE transportDec_GetFormat( const HANDLE_TRANSPORTDEC hTp ) { return hTp->transportFmt; } INT transportDec_GetBufferFullness( const HANDLE_TRANSPORTDEC hTp ) { INT bufferFullness = -1; switch (hTp->transportFmt) { case TT_MP4_ADTS: if (hTp->parser.adts.bs.adts_fullness != 0x7ff) { bufferFullness = hTp->parser.adts.bs.frame_length*8 + hTp->parser.adts.bs.adts_fullness * 32 * getNumberOfEffectiveChannels(hTp->parser.adts.bs.channel_config); } break; case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: if (hTp->parser.latm.m_linfo[0][0].m_bufferFullness != 0xff) { bufferFullness = hTp->parser.latm.m_linfo[0][0].m_bufferFullness; } break; default: break; } return bufferFullness; } /** * \brief adjust bit stream position and the end of an access unit. * \param hTp transport decoder handle. * \return error code. */ static TRANSPORTDEC_ERROR transportDec_AdjustEndOfAccessUnit(HANDLE_TRANSPORTDEC hTp) { HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; switch (hTp->transportFmt) { case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: if ( hTp->numberOfRawDataBlocks == 0 ) { /* Do byte align at the end of AudioMuxElement. */ FDKbyteAlign(hBs, hTp->globalFramePos); /* Check global frame length */ if (hTp->transportFmt == TT_MP4_LOAS && hTp->parser.latm.m_audioMuxLengthBytes > 0) { int loasOffset; loasOffset = (hTp->parser.latm.m_audioMuxLengthBytes*8 + FDKgetValidBits(hBs)) - hTp->globalFramePos; if (loasOffset != 0) { FDKpushBiDirectional(hBs, loasOffset); /* For ELD and other payloads there is an unknown amount of padding, so ignore unread bits, but throw an error only if too many bits where read. */ if (loasOffset < 0) { err = TRANSPORTDEC_PARSE_ERROR; } } } } break; case TT_MP4_ADTS: if (hTp->parser.adts.bs.protection_absent == 0) { int offset; /* Calculate offset to end of AU */ offset = hTp->parser.adts.rawDataBlockDist[hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks]<<3; /* CAUTION: The PCE (if available) is declared to be a part of the header! */ offset -= hTp->accessUnitAnchor[0] - FDKgetValidBits(hBs) + 16 + hTp->parser.adts.bs.num_pce_bits; FDKpushBiDirectional(hBs, offset); } if (hTp->parser.adts.bs.num_raw_blocks > 0 && hTp->parser.adts.bs.protection_absent == 0) { /* Note this CRC read currently happens twice because of transportDec_CrcCheck() */ hTp->parser.adts.crcReadValue = FDKreadBits(hBs, 16); } if ( hTp->numberOfRawDataBlocks == 0 ) { /* Check global frame length */ if (hTp->parser.adts.bs.protection_absent == 0) { int offset; offset = (hTp->parser.adts.bs.frame_length*8 - ADTS_SYNCLENGTH + FDKgetValidBits(hBs)) - hTp->globalFramePos; if (offset != 0) { FDKpushBiDirectional(hBs, offset); } } } break; default: break; } return err; } /** * \brief Determine additional buffer fullness contraint due to burst data reception. * The parameter TPDEC_PARAM_BURSTPERIOD must have been set as a precondition. * \param hTp transport decoder handle. * \param bufferFullness the buffer fullness value of the first frame to be decoded. * \param bitsAvail the amount of available bits at the end of the first frame to be decoded. * \return error code */ static TRANSPORTDEC_ERROR additionalHoldOffNeeded( HANDLE_TRANSPORTDEC hTp, INT bufferFullness, INT bitsAvail ) { INT checkLengthBits, avgBitsPerFrame; INT maxAU; /* maximum number of frames per Master Frame */ INT samplesPerFrame = hTp->asc->m_samplesPerFrame; INT samplingFrequency = (INT)hTp->asc->m_samplingFrequency; if ( (hTp->avgBitRate == 0) || (hTp->burstPeriod == 0) ) { return TRANSPORTDEC_OK; } if ( (samplesPerFrame == 0 ) || (samplingFrequency == 0) ) { return TRANSPORTDEC_NOT_ENOUGH_BITS; } /* One Master Frame is sent every hTp->burstPeriod ms */ maxAU = hTp->burstPeriod * samplingFrequency + (samplesPerFrame*1000 - 1); maxAU = maxAU / (samplesPerFrame*1000); /* Subtract number of frames which were already held off. */ maxAU -= hTp->holdOffFrames; avgBitsPerFrame = hTp->avgBitRate * samplesPerFrame + (samplingFrequency-1); avgBitsPerFrame = avgBitsPerFrame / samplingFrequency; /* Consider worst case of bufferFullness quantization. */ switch (hTp->transportFmt) { case TT_MP4_ADIF: case TT_MP4_ADTS: case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: bufferFullness += 31; break; default: break; } checkLengthBits = bufferFullness + (maxAU-1)*avgBitsPerFrame; /* Check if buffer is big enough to fullfill buffer fullness condition */ if ( (checkLengthBits /*+headerBits*/) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { return TRANSPORTDEC_SYNC_ERROR; } if ( bitsAvail < checkLengthBits ) { return TRANSPORTDEC_NOT_ENOUGH_BITS; } else { return TRANSPORTDEC_OK; } } static TRANSPORTDEC_ERROR transportDec_readHeader( HANDLE_TRANSPORTDEC hTp, HANDLE_FDK_BITSTREAM hBs, int syncLength, int ignoreBufferFullness, int *pRawDataBlockLength, int *pfTraverseMoreFrames, int *pSyncLayerFrameBits, int *pfConfigFound, int *pHeaderBits ) { TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; int rawDataBlockLength = *pRawDataBlockLength; int fTraverseMoreFrames = (pfTraverseMoreFrames != NULL) ? *pfTraverseMoreFrames : 0; int syncLayerFrameBits = (pSyncLayerFrameBits != NULL) ? *pSyncLayerFrameBits : 0; int fConfigFound = (pfConfigFound != NULL) ? *pfConfigFound : 0; int startPos; startPos = FDKgetValidBits(hBs); switch (hTp->transportFmt) { case TT_MP4_ADTS: if (hTp->numberOfRawDataBlocks <= 0) { int errC; hTp->globalFramePos = FDKgetValidBits(hBs); /* Parse ADTS header */ err = adtsRead_DecodeHeader( &hTp->parser.adts, &hTp->asc[0], hBs, ignoreBufferFullness ); if (err != TRANSPORTDEC_OK) { if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { err = TRANSPORTDEC_SYNC_ERROR; } } else { errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); if (errC != 0) { if (errC == TRANSPORTDEC_NEED_TO_RESTART) { err = TRANSPORTDEC_NEED_TO_RESTART; goto bail; } else { err = TRANSPORTDEC_SYNC_ERROR; } } else { fConfigFound = 1; hTp->numberOfRawDataBlocks = hTp->parser.adts.bs.num_raw_blocks+1; } } } else { /* Reset CRC because the next bits are the beginning of a raw_data_block() */ FDKcrcReset(&hTp->parser.adts.crcInfo); hTp->parser.adts.bs.num_pce_bits = 0; } if (err == TRANSPORTDEC_OK) { hTp->numberOfRawDataBlocks--; rawDataBlockLength = adtsRead_GetRawDataBlockLength(&hTp->parser.adts, (hTp->parser.adts.bs.num_raw_blocks-hTp->numberOfRawDataBlocks)); if (rawDataBlockLength <= 0) { /* No further frame traversal possible. */ fTraverseMoreFrames = 0; } syncLayerFrameBits = (hTp->parser.adts.bs.frame_length<<3) - (startPos - FDKgetValidBits(hBs)) - syncLength; if (syncLayerFrameBits <= 0) { err = TRANSPORTDEC_SYNC_ERROR; } } else { hTp->numberOfRawDataBlocks = 0; } break; case TT_MP4_LOAS: if (hTp->numberOfRawDataBlocks <= 0) { syncLayerFrameBits = FDKreadBits(hBs, 13); hTp->parser.latm.m_audioMuxLengthBytes = syncLayerFrameBits; syncLayerFrameBits <<= 3; } case TT_MP4_LATM_MCP1: case TT_MP4_LATM_MCP0: if (hTp->numberOfRawDataBlocks <= 0) { hTp->globalFramePos = FDKgetValidBits(hBs); err = CLatmDemux_Read( hBs, &hTp->parser.latm, hTp->transportFmt, &hTp->callbacks, hTp->asc, &fConfigFound, ignoreBufferFullness); if (err != TRANSPORTDEC_OK) { if (err != TRANSPORTDEC_NOT_ENOUGH_BITS) { err = TRANSPORTDEC_SYNC_ERROR; } } else { hTp->numberOfRawDataBlocks = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); if (hTp->transportFmt == TT_MP4_LOAS) { syncLayerFrameBits -= startPos - FDKgetValidBits(hBs) - (13); } } } else { err = CLatmDemux_ReadPayloadLengthInfo(hBs, &hTp->parser.latm); if (err != TRANSPORTDEC_OK) { err = TRANSPORTDEC_SYNC_ERROR; } } if (err == TRANSPORTDEC_OK) { rawDataBlockLength = CLatmDemux_GetFrameLengthInBits(&hTp->parser.latm); hTp->numberOfRawDataBlocks--; } else { hTp->numberOfRawDataBlocks = 0; } break; default: { syncLayerFrameBits = 0; } break; } bail: *pRawDataBlockLength = rawDataBlockLength; if (pHeaderBits != NULL) { *pHeaderBits += startPos - (INT)FDKgetValidBits(hBs); } if (pfConfigFound != NULL) { *pfConfigFound = fConfigFound; } if (pfTraverseMoreFrames != NULL) { *pfTraverseMoreFrames = fTraverseMoreFrames; } if (pSyncLayerFrameBits != NULL) { *pSyncLayerFrameBits = syncLayerFrameBits; } if (pfConfigFound != NULL) { *pfConfigFound = fConfigFound; } return err; } /* How many bits to advance for synchronization search. */ #define TPDEC_SYNCSKIP 8 static TRANSPORTDEC_ERROR synchronization( HANDLE_TRANSPORTDEC hTp, INT *pHeaderBits ) { TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK, errFirstFrame = TRANSPORTDEC_OK; HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[0]; INT syncLayerFrameBits = 0; /* Length of sync layer frame (i.e. LOAS) */ INT rawDataBlockLength = 0, rawDataBlockLengthPrevious; INT totalBits; INT headerBits = 0, headerBitsFirstFrame = 0, headerBitsPrevious; INT numFramesTraversed = 0, fTraverseMoreFrames, fConfigFound = (hTp->flags & TPDEC_CONFIG_FOUND), startPosFirstFrame = -1; INT numRawDataBlocksFirstFrame = 0, numRawDataBlocksPrevious, globalFramePosFirstFrame = 0, rawDataBlockLengthFirstFrame = 0; INT ignoreBufferFullness = hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK); /* Synch parameters */ INT syncLength; /* Length of sync word in bits */ UINT syncWord; /* Sync word to be found */ UINT syncMask; /* Mask for sync word (for adding one bit, so comprising one bit less) */ C_ALLOC_SCRATCH_START(contextFirstFrame, transportdec_parser_t, 1); totalBits = (INT)FDKgetValidBits(hBs); if (totalBits <= 0) { err = TRANSPORTDEC_NOT_ENOUGH_BITS; goto bail; } fTraverseMoreFrames = (hTp->flags & (TPDEC_MINIMIZE_DELAY|TPDEC_EARLY_CONFIG)) && ! (hTp->flags & TPDEC_SYNCOK); /* Set transport specific sync parameters */ switch (hTp->transportFmt) { case TT_MP4_ADTS: syncWord = ADTS_SYNCWORD; syncLength = ADTS_SYNCLENGTH; break; case TT_MP4_LOAS: syncWord = 0x2B7; syncLength = 11; break; default: syncWord = 0; syncLength = 0; break; } syncMask = (1<numberOfRawDataBlocks == 0) { /* search synchword */ FDK_ASSERT( (bitsAvail % TPDEC_SYNCSKIP) == 0); if ((bitsAvail-syncLength) < TPDEC_SYNCSKIP) { err = TRANSPORTDEC_NOT_ENOUGH_BITS; headerBits = 0; } else { synch = FDKreadBits(hBs, syncLength); if ( !(hTp->flags & TPDEC_SYNCOK) ) { for (; (bitsAvail-syncLength) >= TPDEC_SYNCSKIP; bitsAvail-=TPDEC_SYNCSKIP) { if (synch == syncWord) { break; } synch = ((synch << TPDEC_SYNCSKIP) & syncMask) | FDKreadBits(hBs, TPDEC_SYNCSKIP); } } if (synch != syncWord) { /* No correct syncword found. */ err = TRANSPORTDEC_SYNC_ERROR; } else { err = TRANSPORTDEC_OK; } headerBits = syncLength; } } else { headerBits = 0; } /* Save previous raw data block data */ rawDataBlockLengthPrevious = rawDataBlockLength; numRawDataBlocksPrevious = hTp->numberOfRawDataBlocks; /* Parse transport header (raw data block granularity) */ if (err == TRANSPORTDEC_OK ) { err = transportDec_readHeader( hTp, hBs, syncLength, ignoreBufferFullness, &rawDataBlockLength, &fTraverseMoreFrames, &syncLayerFrameBits, &fConfigFound, &headerBits ); } bitsAvail -= headerBits; checkLengthBits = syncLayerFrameBits; /* Check if the whole frame would fit the bitstream buffer */ if (err == TRANSPORTDEC_OK) { if ( (checkLengthBits+headerBits) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { /* We assume that the size of the transport bit buffer has been chosen to meet all system requirements, thus this condition is considered a synchronisation error. */ err = TRANSPORTDEC_SYNC_ERROR; } else { if ( bitsAvail < checkLengthBits ) { err = TRANSPORTDEC_NOT_ENOUGH_BITS; } } } if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { break; } if (err == TRANSPORTDEC_SYNC_ERROR) { int bits; /* Enforce re-sync of transport headers. */ hTp->numberOfRawDataBlocks = 0; /* Ensure that the bit amount lands at a multiple of TPDEC_SYNCSKIP */ bits = (bitsAvail + headerBits) % TPDEC_SYNCSKIP; /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead next time. */ FDKpushBiDirectional(hBs, -(headerBits - TPDEC_SYNCSKIP) + bits); bitsAvail += headerBits - TPDEC_SYNCSKIP - bits; headerBits = 0; } /* Frame traversal */ if ( fTraverseMoreFrames ) { /* Save parser context for early config discovery "rewind all frames" */ if ( (hTp->flags & TPDEC_EARLY_CONFIG) && !(hTp->flags & TPDEC_MINIMIZE_DELAY)) { /* ignore buffer fullness if just traversing additional frames for ECD */ ignoreBufferFullness = 1; /* Save context in order to return later */ if ( err == TRANSPORTDEC_OK && startPosFirstFrame == -1 ) { startPosFirstFrame = FDKgetValidBits(hBs); numRawDataBlocksFirstFrame = hTp->numberOfRawDataBlocks; globalFramePosFirstFrame = hTp->globalFramePos; rawDataBlockLengthFirstFrame = rawDataBlockLength; headerBitsFirstFrame = headerBits; errFirstFrame = err; FDKmemcpy(contextFirstFrame, &hTp->parser, sizeof(transportdec_parser_t)); } /* Break when config was found or it is not possible anymore to find a config */ if (startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK)) { /* In case of ECD and sync error, do not rewind anywhere. */ if (err == TRANSPORTDEC_SYNC_ERROR) { startPosFirstFrame = -1; fConfigFound = 0; numFramesTraversed = 0; } break; } } if (err == TRANSPORTDEC_OK) { FDKpushFor(hBs, rawDataBlockLength); bitsAvail -= rawDataBlockLength; numFramesTraversed++; /* Ignore error here itentionally. */ transportDec_AdjustEndOfAccessUnit(hTp); } } } while ( fTraverseMoreFrames || (err == TRANSPORTDEC_SYNC_ERROR && !(hTp->flags & TPDEC_SYNCOK))); /* Restore context in case of ECD frame traversal */ if ( startPosFirstFrame != -1 && (fConfigFound || err != TRANSPORTDEC_OK) ) { FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - startPosFirstFrame); FDKmemcpy(&hTp->parser, contextFirstFrame, sizeof(transportdec_parser_t)); hTp->numberOfRawDataBlocks = numRawDataBlocksFirstFrame; hTp->globalFramePos = globalFramePosFirstFrame; rawDataBlockLength = rawDataBlockLengthFirstFrame; headerBits = headerBitsFirstFrame; err = errFirstFrame; numFramesTraversed = 0; } /* Additional burst data mode buffer fullness check. */ if ( !(hTp->flags & (TPDEC_LOST_FRAMES_PENDING|TPDEC_IGNORE_BUFFERFULLNESS|TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) { err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), FDKgetValidBits(hBs) - syncLayerFrameBits); if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { hTp->holdOffFrames++; } } /* Rewind for retry because of not enough bits */ if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { FDKpushBack(hBs, headerBits); headerBits = 0; } else { /* reset hold off frame counter */ hTp->holdOffFrames = 0; } /* Return to last good frame in case of frame traversal but not ECD. */ if (numFramesTraversed > 0) { FDKpushBack(hBs, rawDataBlockLengthPrevious); if (err != TRANSPORTDEC_OK) { hTp->numberOfRawDataBlocks = numRawDataBlocksPrevious; headerBits = headerBitsPrevious; } err = TRANSPORTDEC_OK; } bail: hTp->auLength[0] = rawDataBlockLength; /* Detect pointless TRANSPORTDEC_NOT_ENOUGH_BITS error case, were the bit buffer is already full, or no new burst packet fits. Recover by advancing the bit buffer. */ if ( (TRANSPORTDEC_NOT_ENOUGH_BITS == err) && (FDKgetValidBits(hBs) >= ((TRANSPORTDEC_INBUF_SIZE*8 - ((hTp->avgBitRate*hTp->burstPeriod)/1000)) - 7)) ) { FDKpushFor(hBs, TPDEC_SYNCSKIP); err = TRANSPORTDEC_SYNC_ERROR; } if (err == TRANSPORTDEC_OK) { hTp->flags |= TPDEC_SYNCOK; } if (fConfigFound) { hTp->flags |= TPDEC_CONFIG_FOUND; } if (pHeaderBits != NULL) { *pHeaderBits = headerBits; } if (err == TRANSPORTDEC_SYNC_ERROR) { hTp->flags &= ~TPDEC_SYNCOK; } C_ALLOC_SCRATCH_END(contextFirstFrame, transportdec_parser_t, 1); return err; } /** * \brief Synchronize to stream and estimate the amount of missing access units due * to a current synchronization error in case of constant average bit rate. */ static TRANSPORTDEC_ERROR transportDec_readStream ( HANDLE_TRANSPORTDEC hTp, const UINT layer ) { TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream[layer]; INT nAU = -1; INT headerBits; INT bitDistance, bfDelta; /* Obtain distance to next synch word */ bitDistance = FDKgetValidBits(hBs); error = synchronization(hTp, &headerBits); bitDistance -= FDKgetValidBits(hBs); FDK_ASSERT(bitDistance >= 0); if (error == TRANSPORTDEC_SYNC_ERROR || (hTp->flags & TPDEC_LOST_FRAMES_PENDING)) { /* Check if estimating lost access units is feasible. */ if (hTp->avgBitRate > 0 && hTp->asc[0].m_samplesPerFrame > 0 && hTp->asc[0].m_samplingFrequency > 0) { if (error == TRANSPORTDEC_OK) { int aj; aj = transportDec_GetBufferFullness(hTp); if (aj > 0) { bfDelta = aj; } else { bfDelta = 0; } /* sync was ok: last of a series of bad access units. */ hTp->flags &= ~TPDEC_LOST_FRAMES_PENDING; /* Add up bitDistance until end of the current frame. Later we substract this frame from the grand total, since this current successfully synchronized frame should not be skipped of course; but it must be accounted into the bufferfulness math. */ bitDistance += hTp->auLength[0]; } else { if ( !(hTp->flags & TPDEC_LOST_FRAMES_PENDING) ) { /* sync not ok: one of many bad access units. */ hTp->flags |= TPDEC_LOST_FRAMES_PENDING; bfDelta = - (INT)hTp->lastValidBufferFullness; } else { bfDelta = 0; } } { int num, denom; /* Obtain estimate of number of lost frames */ num = hTp->asc[0].m_samplingFrequency * (bfDelta + bitDistance) + hTp->remainder; denom = hTp->avgBitRate * hTp->asc[0].m_samplesPerFrame; if (num > 0) { nAU = num / denom; hTp->remainder = num % denom; } else { hTp->remainder = num; } if (error == TRANSPORTDEC_OK) { /* Final adjustment of remainder, taken -1 into account because current frame should not be skipped, thus substract -1 or do nothing instead of +1-1 accordingly. */ if ( (denom - hTp->remainder) >= hTp->remainder ) { nAU--; } if (nAU < 0) { /* There was one frame too much concealed, so unfortunately we will have to skip one good frame. */ transportDec_EndAccessUnit(hTp); error = synchronization(hTp, &headerBits); nAU = -1; #ifdef DEBUG FDKprintf("ERROR: Bufferfullness accounting failed. remainder=%d, nAU=%d\n", hTp->remainder, nAU); #endif } hTp->remainder = 0; /* Enforce last missed frames to be concealed. */ if (nAU > 0) { FDKpushBack(hBs, headerBits); } } } } } /* Be sure that lost frames are handled correctly. This is necessary due to some sync error sequences where later it turns out that there is not enough data, but the bits upto the sync word are discarded, thus causing a value of nAU > 0 */ if (nAU > 0) { error = TRANSPORTDEC_SYNC_ERROR; } hTp->missingAccessUnits = nAU; return error; } /* returns error code */ TRANSPORTDEC_ERROR transportDec_ReadAccessUnit( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) { TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; HANDLE_FDK_BITSTREAM hBs; if (!hTp) { return TRANSPORTDEC_INVALID_PARAMETER; } hBs = &hTp->bitStream[layer]; if ((INT)FDKgetValidBits(hBs) <= 0) { err = TRANSPORTDEC_NOT_ENOUGH_BITS; } switch (hTp->transportFmt) { case TT_MP4_ADIF: /* Read header if not already done */ if (!(hTp->flags & TPDEC_CONFIG_FOUND)) { CProgramConfig *pce; AudioSpecificConfig_Init(&hTp->asc[0]); pce = &hTp->asc[0].m_progrConfigElement; err = adifRead_DecodeHeader(&hTp->parser.adif, pce, hBs); if (err) goto bail; /* Map adif header to ASC */ hTp->asc[0].m_aot = (AUDIO_OBJECT_TYPE)(pce->Profile + 1); hTp->asc[0].m_samplingFrequencyIndex = pce->SamplingFrequencyIndex; hTp->asc[0].m_samplingFrequency = SamplingRateTable[pce->SamplingFrequencyIndex]; hTp->asc[0].m_channelConfiguration = 0; hTp->asc[0].m_samplesPerFrame = 1024; hTp->avgBitRate = hTp->parser.adif.BitRate; /* Call callback to decoder. */ { int errC; errC = hTp->callbacks.cbUpdateConfig(hTp->callbacks.cbUpdateConfigData, &hTp->asc[0]); if (errC == 0) { hTp->flags |= TPDEC_CONFIG_FOUND; } else { err = TRANSPORTDEC_PARSE_ERROR; goto bail; } } } hTp->auLength[layer] = -1; /* Access Unit data length is unknown. */ break; case TT_MP4_RAW: /* One Access Unit was filled into buffer. So get the length out of the buffer. */ hTp->auLength[layer] = FDKgetValidBits(hBs); hTp->flags |= TPDEC_SYNCOK; break; case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: { int fConfigFound = hTp->flags & TPDEC_CONFIG_FOUND; err = transportDec_readHeader(hTp, hBs, 0, 1, &hTp->auLength[layer], NULL, NULL, &fConfigFound, NULL); if (fConfigFound) { hTp->flags |= TPDEC_CONFIG_FOUND; } } break; case TT_RSVD50: case TT_MP4_ADTS: case TT_MP4_LOAS: err = transportDec_readStream(hTp, layer); break; default: err = TRANSPORTDEC_UNSUPPORTED_FORMAT; break; } if (err == TRANSPORTDEC_OK) { hTp->accessUnitAnchor[layer] = FDKgetValidBits(hBs); } else { hTp->accessUnitAnchor[layer] = 0; } bail: return err; } INT transportDec_GetAuBitsRemaining( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) { INT bits; if (hTp->accessUnitAnchor[layer] > 0 && hTp->auLength[layer] > 0) { bits = hTp->auLength[layer] - (hTp->accessUnitAnchor[layer] - FDKgetValidBits(&hTp->bitStream[layer])); } else { bits = FDKgetValidBits(&hTp->bitStream[layer]); } return bits; } INT transportDec_GetAuBitsTotal( const HANDLE_TRANSPORTDEC hTp, const UINT layer ) { return hTp->auLength[layer]; } TRANSPORTDEC_ERROR transportDec_GetMissingAccessUnitCount ( INT *pNAccessUnits, HANDLE_TRANSPORTDEC hTp ) { *pNAccessUnits = hTp->missingAccessUnits; return TRANSPORTDEC_OK; } /* Inform the transportDec layer that reading of access unit has finished. */ TRANSPORTDEC_ERROR transportDec_EndAccessUnit(HANDLE_TRANSPORTDEC hTp) { TRANSPORTDEC_ERROR err = TRANSPORTDEC_OK; err = transportDec_AdjustEndOfAccessUnit(hTp); switch (hTp->transportFmt) { default: break; } return err; } TRANSPORTDEC_ERROR transportDec_SetParam ( const HANDLE_TRANSPORTDEC hTp, const TPDEC_PARAM param, const INT value) { TRANSPORTDEC_ERROR error = TRANSPORTDEC_OK; switch (param) { case TPDEC_PARAM_MINIMIZE_DELAY: if (value) { hTp->flags |= TPDEC_MINIMIZE_DELAY; } else { hTp->flags &= ~TPDEC_MINIMIZE_DELAY; } break; case TPDEC_PARAM_EARLY_CONFIG: if (value) { hTp->flags |= TPDEC_EARLY_CONFIG; } else { hTp->flags &= ~TPDEC_EARLY_CONFIG; } break; case TPDEC_PARAM_IGNORE_BUFFERFULLNESS: if (value) { hTp->flags |= TPDEC_IGNORE_BUFFERFULLNESS; } else { hTp->flags &= ~TPDEC_IGNORE_BUFFERFULLNESS; } break; case TPDEC_PARAM_SET_BITRATE: hTp->avgBitRate = value; break; case TPDEC_PARAM_BURST_PERIOD: hTp->burstPeriod = value; break; case TPDEC_PARAM_RESET: { int i; for (i=0; i<(1*2); i++) { FDKresetBitbuffer(&hTp->bitStream[i]); hTp->auLength[i] = 0; hTp->accessUnitAnchor[i] = 0; } hTp->flags &= ~(TPDEC_SYNCOK|TPDEC_LOST_FRAMES_PENDING); if (hTp->transportFmt != TT_MP4_ADIF) { hTp->flags &= ~TPDEC_CONFIG_FOUND; } hTp->remainder = 0; hTp->avgBitRate = 0; hTp->missingAccessUnits = 0; hTp->numberOfRawDataBlocks = 0; hTp->globalFramePos = 0; hTp->holdOffFrames = 0; } break; } return error; } UINT transportDec_GetNrOfSubFrames(HANDLE_TRANSPORTDEC hTp) { UINT nSubFrames = 0; if (hTp == NULL) return 0; if (hTp->transportFmt==TT_MP4_LATM_MCP1 || hTp->transportFmt==TT_MP4_LATM_MCP0 || hTp->transportFmt==TT_MP4_LOAS) nSubFrames = CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); else if (hTp->transportFmt==TT_MP4_ADTS) nSubFrames = hTp->parser.adts.bs.num_raw_blocks; return nSubFrames; } void transportDec_Close(HANDLE_TRANSPORTDEC *phTp) { if (phTp != NULL) { if (*phTp != NULL) { if ( ! TT_IS_PACKET((*phTp)->transportFmt) ) { FreeRam_TransportDecoderBuffer(&(*phTp)->bsBuffer); } if (*phTp != NULL) { FreeRam_TransportDecoder(phTp); } } } } TRANSPORTDEC_ERROR transportDec_GetLibInfo( LIB_INFO *info ) { int i; if (info == NULL) { return TRANSPORTDEC_UNKOWN_ERROR; } /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) return TRANSPORTDEC_UNKOWN_ERROR; info += i; info->module_id = FDK_TPDEC; info->build_date = __DATE__; info->build_time = __TIME__; info->title = TP_LIB_TITLE; info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2); LIB_VERSION_STRING(info); info->flags = 0 | CAPF_ADIF | CAPF_ADTS | CAPF_LATM | CAPF_LOAS | CAPF_RAWPACKETS ; return TRANSPORTDEC_OK; /* FDKERR_NOERROR; */ } int transportDec_CrcStartReg(HANDLE_TRANSPORTDEC pTp, INT mBits) { switch (pTp->transportFmt) { case TT_MP4_ADTS: return adtsRead_CrcStartReg(&pTp->parser.adts, &pTp->bitStream[0], mBits); default: return 0; } } void transportDec_CrcEndReg(HANDLE_TRANSPORTDEC pTp, INT reg) { switch (pTp->transportFmt) { case TT_MP4_ADTS: adtsRead_CrcEndReg(&pTp->parser.adts, &pTp->bitStream[0], reg); break; default: break; } } TRANSPORTDEC_ERROR transportDec_CrcCheck(HANDLE_TRANSPORTDEC pTp) { switch (pTp->transportFmt) { case TT_MP4_ADTS: if ( (pTp->parser.adts.bs.num_raw_blocks > 0) && (pTp->parser.adts.bs.protection_absent == 0) ) { HANDLE_FDK_BITSTREAM hBs = &pTp->bitStream[0]; transportDec_AdjustEndOfAccessUnit(pTp); } return adtsRead_CrcCheck(&pTp->parser.adts); default: return TRANSPORTDEC_OK; } } fdk-aac-0.1.3/libMpegTPDec/src/version0000644000175000017500000000027712372261464020056 0ustar00tootstoots00000000000000 /* library info */ #define TP_LIB_VL0 2 #define TP_LIB_VL1 3 #define TP_LIB_VL2 3 #define TP_LIB_TITLE "MPEG Transport" #define TP_LIB_BUILD_DATE __DATE__ #define TP_LIB_BUILD_TIME __TIME__ fdk-aac-0.1.3/libMpegTPDec/src/tpdec_adts.cpp0000644000175000017500000003435712372261464021272 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ADTS interface ******************************************************************************/ #include "tpdec_adts.h" #include "FDK_bitstream.h" void adtsRead_CrcInit(HANDLE_ADTS pAdts) /*!< pointer to adts crc info stucture */ { FDKcrcInit(&pAdts->crcInfo, 0x8005, 0xFFFF, 16); } int adtsRead_CrcStartReg( HANDLE_ADTS pAdts, /*!< pointer to adts stucture */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ int mBits /*!< number of bits in crc region */ ) { if (pAdts->bs.protection_absent) { return 0; } return ( FDKcrcStartReg(&pAdts->crcInfo, hBs, mBits) ); } void adtsRead_CrcEndReg( HANDLE_ADTS pAdts, /*!< pointer to adts crc info stucture */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ int reg /*!< crc region */ ) { if (pAdts->bs.protection_absent == 0) { FDKcrcEndReg(&pAdts->crcInfo, hBs, reg); } } TRANSPORTDEC_ERROR adtsRead_CrcCheck( HANDLE_ADTS pAdts ) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; USHORT crc; if (pAdts->bs.protection_absent) return TRANSPORTDEC_OK; crc = FDKcrcGetCRC(&pAdts->crcInfo); if (crc != pAdts->crcReadValue) { return (TRANSPORTDEC_CRC_ERROR); } return (ErrorStatus); } #define Adts_Length_SyncWord 12 #define Adts_Length_Id 1 #define Adts_Length_Layer 2 #define Adts_Length_ProtectionAbsent 1 #define Adts_Length_Profile 2 #define Adts_Length_SamplingFrequencyIndex 4 #define Adts_Length_PrivateBit 1 #define Adts_Length_ChannelConfiguration 3 #define Adts_Length_OriginalCopy 1 #define Adts_Length_Home 1 #define Adts_Length_CopyrightIdentificationBit 1 #define Adts_Length_CopyrightIdentificationStart 1 #define Adts_Length_FrameLength 13 #define Adts_Length_BufferFullness 11 #define Adts_Length_NumberOfRawDataBlocksInFrame 2 #define Adts_Length_CrcCheck 16 TRANSPORTDEC_ERROR adtsRead_DecodeHeader( HANDLE_ADTS pAdts, CSAudioSpecificConfig *pAsc, HANDLE_FDK_BITSTREAM hBs, const INT ignoreBufferFullness ) { INT crcReg; INT valBits; INT cmp_buffer_fullness; int i, adtsHeaderLength; STRUCT_ADTS_BS bs; #ifdef TP_PCE_ENABLE CProgramConfig oldPce; /* Store the old PCE temporarily. Maybe we'll need it later if we have channelConfig=0 and no PCE in this frame. */ FDKmemcpy(&oldPce, &pAsc->m_progrConfigElement, sizeof(CProgramConfig)); #endif valBits = FDKgetValidBits(hBs); /* adts_fixed_header */ bs.mpeg_id = FDKreadBits(hBs, Adts_Length_Id); bs.layer = FDKreadBits(hBs, Adts_Length_Layer); bs.protection_absent = FDKreadBits(hBs, Adts_Length_ProtectionAbsent); bs.profile = FDKreadBits(hBs, Adts_Length_Profile); bs.sample_freq_index = FDKreadBits(hBs, Adts_Length_SamplingFrequencyIndex); bs.private_bit = FDKreadBits(hBs, Adts_Length_PrivateBit); bs.channel_config = FDKreadBits(hBs, Adts_Length_ChannelConfiguration); bs.original = FDKreadBits(hBs, Adts_Length_OriginalCopy); bs.home = FDKreadBits(hBs, Adts_Length_Home); /* adts_variable_header */ bs.copyright_id = FDKreadBits(hBs, Adts_Length_CopyrightIdentificationBit); bs.copyright_start = FDKreadBits(hBs, Adts_Length_CopyrightIdentificationStart); bs.frame_length = FDKreadBits(hBs, Adts_Length_FrameLength); bs.adts_fullness = FDKreadBits(hBs, Adts_Length_BufferFullness); bs.num_raw_blocks = FDKreadBits(hBs, Adts_Length_NumberOfRawDataBlocksInFrame); bs.num_pce_bits = 0; adtsHeaderLength = ADTS_HEADERLENGTH; if (!bs.protection_absent) { FDKcrcReset(&pAdts->crcInfo); FDKpushBack(hBs, 56); /* complete fixed and variable header! */ crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0); FDKpushFor(hBs, 56); } if (! bs.protection_absent && bs.num_raw_blocks>0) { for (i=0; irawDataBlockDist[i] = (USHORT)FDKreadBits(hBs, 16); adtsHeaderLength += 16; } /* Change raw data blocks to delta values */ pAdts->rawDataBlockDist[bs.num_raw_blocks] = bs.frame_length - 7 - bs.num_raw_blocks*2 - 2 ; for (i=bs.num_raw_blocks; i>0; i--) { pAdts->rawDataBlockDist[i] -= pAdts->rawDataBlockDist[i-1]; } } /* adts_error_check */ if (!bs.protection_absent) { USHORT crc_check; FDKcrcEndReg(&pAdts->crcInfo, hBs, crcReg); crc_check = FDKreadBits(hBs, Adts_Length_CrcCheck); adtsHeaderLength += Adts_Length_CrcCheck; pAdts->crcReadValue = crc_check; /* Check header CRC in case of multiple raw data blocks */ if (bs.num_raw_blocks > 0) { if (pAdts->crcReadValue != FDKcrcGetCRC(&pAdts->crcInfo)) { return TRANSPORTDEC_CRC_ERROR; } /* Reset CRC for the upcoming raw_data_block() */ FDKcrcReset(&pAdts->crcInfo); } } /* check if valid header */ if ( (bs.layer != 0) || // we only support MPEG ADTS (bs.sample_freq_index >= 13) // we only support 96kHz - 7350kHz ) { FDKpushFor(hBs, bs.frame_length * 8); // try again one frame later return TRANSPORTDEC_UNSUPPORTED_FORMAT; } /* special treatment of id-bit */ if ( (bs.mpeg_id == 0) && (pAdts->decoderCanDoMpeg4 == 0) ) { /* MPEG-2 decoder cannot play MPEG-4 bitstreams */ FDKpushFor(hBs, bs.frame_length * 8); // try again one frame later return TRANSPORTDEC_UNSUPPORTED_FORMAT; } if (!ignoreBufferFullness) { cmp_buffer_fullness = bs.frame_length*8 + bs.adts_fullness*32*getNumberOfEffectiveChannels(bs.channel_config); /* Evaluate buffer fullness */ if (bs.adts_fullness != 0x7FF) { if (pAdts->BufferFullnesStartFlag) { if ( valBits < cmp_buffer_fullness ) { /* Condition for start of decoding is not fulfilled */ /* The current frame will not be decoded */ FDKpushBack(hBs, adtsHeaderLength); if ( (cmp_buffer_fullness+adtsHeaderLength) > ((TRANSPORTDEC_INBUF_SIZE<<3)-7) ) { return TRANSPORTDEC_SYNC_ERROR; } else { return TRANSPORTDEC_NOT_ENOUGH_BITS; } } else { pAdts->BufferFullnesStartFlag = 0; } } } } /* Get info from ADTS header */ AudioSpecificConfig_Init(pAsc); pAsc->m_aot = (AUDIO_OBJECT_TYPE)(bs.profile + 1); pAsc->m_samplingFrequencyIndex = bs.sample_freq_index; pAsc->m_samplingFrequency = SamplingRateTable[bs.sample_freq_index]; pAsc->m_channelConfiguration = bs.channel_config; pAsc->m_samplesPerFrame = 1024; #ifdef TP_PCE_ENABLE if (bs.channel_config == 0) { int pceBits = 0; UINT alignAnchor = FDKgetValidBits(hBs); if (FDKreadBits(hBs,3) == ID_PCE) { /* Got luck! Parse the PCE */ int crcReg; crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0); CProgramConfig_Read(&pAsc->m_progrConfigElement, hBs, alignAnchor); adtsRead_CrcEndReg(pAdts, hBs, crcReg); pceBits = alignAnchor - FDKgetValidBits(hBs); /* store the number of PCE bits */ bs.num_pce_bits = pceBits; } else { /* No PCE in this frame! Push back the ID tag bits. */ FDKpushBack(hBs,3); /* Encoders do not have to write a PCE in each frame. So if we already have a valid PCE we have to use it. */ if ( oldPce.isValid && (bs.sample_freq_index == pAdts->bs.sample_freq_index) /* we could compare the complete fixed header (bytes) here! */ && (bs.channel_config == pAdts->bs.channel_config) /* == 0 */ && (bs.mpeg_id == pAdts->bs.mpeg_id) ) { /* Restore previous PCE which is still valid */ FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce, sizeof(CProgramConfig)); } else if (bs.mpeg_id == 0) { /* If not it seems that we have a implicit channel configuration. This mode is not allowed in the context of ISO/IEC 14496-3. Skip this frame and try the next one. */ FDKpushFor(hBs, (bs.frame_length<<3) - adtsHeaderLength - 3); return TRANSPORTDEC_UNSUPPORTED_FORMAT; } /* else { ISO/IEC 13818-7 implicit channel mapping is allowed. So just open the box of chocolates to see what we got. } */ } } #endif /* TP_PCE_ENABLE */ /* Copy bit stream data struct to persistent memory now, once we passed all sanity checks above. */ FDKmemcpy(&pAdts->bs, &bs, sizeof(STRUCT_ADTS_BS)); return TRANSPORTDEC_OK; } int adtsRead_GetRawDataBlockLength( HANDLE_ADTS pAdts, INT blockNum ) { int length; if (pAdts->bs.num_raw_blocks == 0) { length = (pAdts->bs.frame_length - 7) << 3; /* aac_frame_length subtracted by the header size (7 bytes). */ if (pAdts->bs.protection_absent == 0) length -= 16; /* substract 16 bit CRC */ } else { if (pAdts->bs.protection_absent) { length = -1; /* raw data block length is unknown */ } else { if (blockNum < 0 || blockNum > 3) { length = -1; } length = (pAdts->rawDataBlockDist[blockNum] << 3) - 16; } } if (blockNum == 0 && length > 0) { length -= pAdts->bs.num_pce_bits; } return length; } fdk-aac-0.1.3/libMpegTPDec/src/tpdec_adif.h0000644000175000017500000001315112372261464020674 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ADIF reader ******************************************************************************/ #ifndef TPDEC_ADIF_H #define TPDEC_ADIF_H #include "tpdec_lib.h" #define MIN_ADIF_HEADERLENGTH 63 /* in bits */ typedef struct { INT NumProgramConfigElements; UINT BitRate; UCHAR CopyrightIdPresent; UCHAR OriginalCopy; UCHAR Home; UCHAR BitstreamType; } CAdifHeader; /** * \brief Parse a ADIF header at the given bitstream and store the parsed data into a given CAdifHeader * and CProgramConfig struct * * \param pAdifHeader pointer to a CAdifHeader structure to hold the parsed ADIF header data. * \param pPce pointer to a CProgramConfig structure where the last PCE will remain. * * \return TRANSPORTDEC_ERROR error code */ TRANSPORTDEC_ERROR adifRead_DecodeHeader( CAdifHeader *pAdifHeader, CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs ); #endif /* TPDEC_ADIF_H */ fdk-aac-0.1.3/libMpegTPDec/src/tpdec_adif.cpp0000644000175000017500000001450712372261464021235 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ADIF reader ******************************************************************************/ #include "tpdec_adif.h" #include "FDK_bitstream.h" #include "genericStds.h" TRANSPORTDEC_ERROR adifRead_DecodeHeader( CAdifHeader *pAdifHeader, CProgramConfig *pPce, HANDLE_FDK_BITSTREAM bs ) { int i; TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; UINT startAnchor = FDKgetValidBits(bs); if ((INT)startAnchor < MIN_ADIF_HEADERLENGTH) { return (TRANSPORTDEC_NOT_ENOUGH_BITS); } if (FDKreadBits(bs,8) != 'A') { return (TRANSPORTDEC_SYNC_ERROR); } if (FDKreadBits(bs,8) != 'D') { return (TRANSPORTDEC_SYNC_ERROR); } if (FDKreadBits(bs,8) != 'I') { return (TRANSPORTDEC_SYNC_ERROR); } if (FDKreadBits(bs,8) != 'F') { return (TRANSPORTDEC_SYNC_ERROR); } if ( (pAdifHeader->CopyrightIdPresent = FDKreadBits(bs,1)) != 0 ) FDKpushBiDirectional(bs,72); /* CopyrightId */ pAdifHeader->OriginalCopy = FDKreadBits(bs,1); pAdifHeader->Home = FDKreadBits(bs,1); pAdifHeader->BitstreamType = FDKreadBits(bs,1); /* pAdifHeader->BitRate = FDKreadBits(bs, 23); */ pAdifHeader->BitRate = FDKreadBits(bs,16); pAdifHeader->BitRate <<= 7; pAdifHeader->BitRate |= FDKreadBits(bs,7); pAdifHeader->NumProgramConfigElements = FDKreadBits(bs,4) + 1; if (pAdifHeader->BitstreamType == 0) { FDKpushBiDirectional(bs,20); /* adif_buffer_fullness */ } /* Parse all PCEs but keep only one */ for (i=0; i < pAdifHeader->NumProgramConfigElements; i++) { CProgramConfig_Read(pPce, bs, startAnchor); } FDKbyteAlign(bs, startAnchor); return (ErrorStatus); } fdk-aac-0.1.3/libMpegTPDec/src/tpdec_adts.h0000644000175000017500000002146612372261464020734 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ADTS interface ******************************************************************************/ #ifndef TPDEC_ADTS_H #define TPDEC_ADTS_H #include "tpdec_lib.h" #define ADTS_SYNCWORD ( 0xfff ) #define ADTS_SYNCLENGTH ( 12 ) /* in bits */ #define ADTS_HEADERLENGTH ( 56 ) /* minimum header size in bits */ #define ADTS_FIXED_HEADERLENGTH ( 28 ) /* in bits */ #define ADTS_VARIABLE_HEADERLENGTH ( ADTS_HEADERLENGTH - ADTS_FIXED_HEADERLENGTH ) #ifdef CHECK_TWO_SYNCS #define ADTS_MIN_TP_BUF_SIZE ( 8191 + 2 ) #else #define ADTS_MIN_TP_BUF_SIZE ( 8191 ) #endif #include "FDK_crc.h" typedef struct { /* ADTS header fields */ UCHAR mpeg_id; UCHAR layer; UCHAR protection_absent; UCHAR profile; UCHAR sample_freq_index; UCHAR private_bit; UCHAR channel_config; UCHAR original; UCHAR home; UCHAR copyright_id; UCHAR copyright_start; USHORT frame_length; USHORT adts_fullness; UCHAR num_raw_blocks; UCHAR num_pce_bits; } STRUCT_ADTS_BS; struct STRUCT_ADTS { STRUCT_ADTS_BS bs; UCHAR decoderCanDoMpeg4; UCHAR BufferFullnesStartFlag; FDK_CRCINFO crcInfo; /* CRC state info */ USHORT crcReadValue; /* CRC value read from bitstream data */ USHORT rawDataBlockDist[4]; /* distance between each raw data block. Not the same as found in the bitstream */ } ; typedef struct STRUCT_ADTS *HANDLE_ADTS; /*! \brief Initialize ADTS CRC The function initialzes the crc buffer and the crc lookup table. \return none */ void adtsRead_CrcInit( HANDLE_ADTS pAdts ); /** * \brief Starts CRC region with a maximum number of bits * If mBits is positive zero padding will be used for CRC calculation, if there * are less than mBits bits available. * If mBits is negative no zero padding is done. * If mBits is zero the memory for the buffer is allocated dynamically, the * number of bits is not limited. * * \param pAdts ADTS data handle * \param hBs bitstream handle, on which the CRC region referes to * \param mBits max number of bits in crc region to be considered * * \return ID for the created region, -1 in case of an error */ int adtsRead_CrcStartReg( HANDLE_ADTS pAdts, HANDLE_FDK_BITSTREAM hBs, int mBits ); /** * \brief Ends CRC region identified by reg * * \param pAdts ADTS data handle * \param hBs bitstream handle, on which the CRC region referes to * \param reg CRC regions ID returned by adtsRead_CrcStartReg() * * \return none */ void adtsRead_CrcEndReg( HANDLE_ADTS pAdts, HANDLE_FDK_BITSTREAM hBs, int reg ); /** * \brief Check CRC * * Checks if the currently calculated CRC matches the CRC field read from the bitstream * Deletes all CRC regions. * * \param pAdts ADTS data handle * * \return Returns 0 if they are identical otherwise 1 */ TRANSPORTDEC_ERROR adtsRead_CrcCheck( HANDLE_ADTS pAdts ); /** * \brief Check if we have a valid ADTS frame at the current bitbuffer position * * This function assumes enough bits in buffer for the current frame. * It reads out the header bits to prepare the bitbuffer for the decode loop. * In case the header bits show an invalid bitstream/frame, the whole frame is skipped. * * \param pAdts ADTS data handle which is filled with parsed ADTS header data * \param bs handle of bitstream from whom the ADTS header is read * * \return error status */ TRANSPORTDEC_ERROR adtsRead_DecodeHeader( HANDLE_ADTS pAdts, CSAudioSpecificConfig *pAsc, HANDLE_FDK_BITSTREAM bs, const INT ignoreBufferFullness ); /** * \brief Get the raw data block length of the given block number. * * \param pAdts ADTS data handle * \param blockNum current raw data block index * \param pLength pointer to an INT where the length of the given raw data block is stored into * the returned value might be -1, in which case the raw data block length is unknown. * * \return error status */ int adtsRead_GetRawDataBlockLength( HANDLE_ADTS pAdts, INT blockNum ); #endif /* TPDEC_ADTS_H */ fdk-aac-0.1.3/configure.ac0000644000175000017500000000212312372262205015670 0ustar00tootstoots00000000000000dnl -*- Autoconf -*- dnl Process this file with autoconf to produce a configure script. AC_INIT([fdk-aac], [0.1.3], [http://sourceforge.net/projects/opencore-amr/]) AC_CONFIG_AUX_DIR(.) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([tar-ustar foreign]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) dnl Various options for configure AC_ARG_ENABLE([example], [AS_HELP_STRING([--enable-example], [enable example encoding program (default is no)])], [example=$enableval], [example=no]) dnl Automake conditionals to set AM_CONDITIONAL(EXAMPLE, test x$example = xyes) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX LT_INIT AC_SEARCH_LIBS([sin], [m]) dnl soname version to use dnl goes by â€current[:revision[:age]]’ with the soname ending up as dnl current.age.revision FDK_AAC_VERSION=0:4:0 AS_IF([test x$enable_shared = xyes], [LIBS_PRIVATE=$LIBS], [LIBS_PUBLIC=$LIBS]) AC_SUBST(FDK_AAC_VERSION) AC_SUBST(LIBS_PUBLIC) AC_SUBST(LIBS_PRIVATE) AC_CONFIG_FILES([Makefile fdk-aac.pc]) AC_OUTPUT fdk-aac-0.1.3/configure0000755000175000017500000206353112372262354015332 0ustar00tootstoots00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for fdk-aac 0.1.3. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://sourceforge.net/projects/opencore-amr/ about $0: your system, including any error possibly output before $0: this message. Then install a modern shell, or manually $0: run the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='fdk-aac' PACKAGE_TARNAME='fdk-aac' PACKAGE_VERSION='0.1.3' PACKAGE_STRING='fdk-aac 0.1.3' PACKAGE_BUGREPORT='http://sourceforge.net/projects/opencore-amr/' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS LIBS_PRIVATE LIBS_PUBLIC FDK_AAC_VERSION CXXCPP CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC EXAMPLE_FALSE EXAMPLE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_example enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures fdk-aac 0.1.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/fdk-aac] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fdk-aac 0.1.3:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-example enable example encoding program (default is no) --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF fdk-aac configure 0.1.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by fdk-aac $as_me 0.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in . "$srcdir"/.; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. am__api_version='1.14' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='fdk-aac' VERSION='0.1.3' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 $as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test $am_uid -le $am_max_uid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 $as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test $am_gid -le $am_max_gid; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } _am_tools=none fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 $as_echo_n "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_ustar+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_ustar=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 $as_echo "$am_cv_prog_tar_ustar" >&6; } # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' # Check whether --enable-example was given. if test "${enable_example+set}" = set; then : enableval=$enable_example; example=$enableval else example=no fi if test x$example = xyes; then EXAMPLE_TRUE= EXAMPLE_FALSE='#' else EXAMPLE_TRUE='#' EXAMPLE_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sin" >&5 $as_echo_n "checking for library containing sin... " >&6; } if ${ac_cv_search_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); int main () { return sin (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sin+:} false; then : break fi done if ${ac_cv_search_sin+:} false; then : else ac_cv_search_sin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sin" >&5 $as_echo "$ac_cv_search_sin" >&6; } ac_res=$ac_cv_search_sin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi FDK_AAC_VERSION=0:4:0 if test x$enable_shared = xyes; then : LIBS_PRIVATE=$LIBS else LIBS_PUBLIC=$LIBS fi ac_config_files="$ac_config_files Makefile fdk-aac.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${EXAMPLE_TRUE}" && test -z "${EXAMPLE_FALSE}"; then as_fn_error $? "conditional \"EXAMPLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by fdk-aac $as_me 0.1.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ fdk-aac config.status 0.1.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "fdk-aac.pc") CONFIG_FILES="$CONFIG_FILES fdk-aac.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi fdk-aac-0.1.3/depcomp0000755000175000017500000005601612372262356015000 0ustar00tootstoots00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fdk-aac-0.1.3/libPCMutils/0000755000175000017500000000000012372262442015576 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libPCMutils/include/0000755000175000017500000000000012372262445017224 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libPCMutils/include/pcmutils_lib.h0000644000175000017500000003142712372261464022072 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************ FDK PCM up/downmixing module ********************* Author(s): Christian Griebel Description: Declares functions to interface with the PCM downmix processing module. *******************************************************************************/ #ifndef _PCMUTILS_LIB_H_ #define _PCMUTILS_LIB_H_ #include "machine_type.h" #include "common_fix.h" #include "FDK_audio.h" /* ------------------------ * * MODULE SETTINGS: * * ------------------------ */ /* #define PCM_UPMIX_ENABLE */ /*!< Generally enable up mixing. */ #define PCM_DOWNMIX_ENABLE /*!< Generally enable down mixing. */ #define DVB_MIXDOWN_ENABLE /*!< Enable this to support DVB ancillary data for encoder assisted downmixing of MPEG-4 AAC and MPEG-1/2 layer 2 streams. PCM_DOWNMIX_ENABLE has to be enabled, too! */ #define MPEG_PCE_MIXDOWN_ENABLE /*!< Enable this to support MPEG matrix mixdown with a coefficient carried in the PCE. PCM_DOWNMIX_ENABLE has to be enabled, too! */ /* #define ARIB_MIXDOWN_ENABLE */ /*!< Enable modifications to the MPEG PCE mixdown method to fulfill ARIB standard. MPEG_PCE_MIXDOWN_ENABLE has to be set. */ /* ------------------------ * * ERROR CODES: * * ------------------------ */ typedef enum { PCMDMX_OK = 0x0, /*!< No error happened. */ PCMDMX_OUT_OF_MEMORY = 0x2, /*!< Not enough memory to set up an instance of the module. */ PCMDMX_UNKNOWN = 0x5, /*!< Error condition is of unknown reason, or from a third party module. */ PCMDMX_INVALID_HANDLE, /*!< The given instance handle is not valid. */ PCMDMX_INVALID_ARGUMENT, /*!< One of the parameters handed over is invalid. */ PCMDMX_INVALID_CH_CONFIG, /*!< The given channel configuration is not supported and thus no processing was performed. */ PCMDMX_INVALID_MODE, /*!< The set configuration/mode is not applicable. */ PCMDMX_UNKNOWN_PARAM, /*!< The handed parameter is not known/supported. */ PCMDMX_UNABLE_TO_SET_PARAM, /*!< Unable to set the specific parameter. Most probably the value ist out of range. */ PCMDMX_CORRUPT_ANC_DATA /*!< The read ancillary data was corrupt. */ } PCMDMX_ERROR; /* ------------------------ * * RUNTIME PARAMS: * * ------------------------ */ typedef enum { DMX_BS_DATA_EXPIRY_FRAME, /*!< The number of frames without new metadata that have to go by before the bitstream data expires. The value 0 disables expiry. */ DMX_BS_DATA_DELAY, /*!< The number of delay frames of the output samples compared to the bitstream data. */ NUMBER_OF_OUTPUT_CHANNELS , /*!< The number of output channels (equals the number of channels processed by the audio output setup). */ DUAL_CHANNEL_DOWNMIX_MODE /*!< Downmix mode for two channel audio data. */ } PCMDMX_PARAM; typedef enum { STEREO_MODE = 0x0, /*!< Leave stereo signals as they are. */ CH1_MODE = 0x1, /*!< Create a dual mono output signal from channel 1. */ CH2_MODE = 0x2, /*!< Create a dual mono output signal from channel 2. */ MIXED_MODE = 0x3 /*!< Create a dual mono output signal by mixing the two channels. */ } DUAL_CHANNEL_MODE; /* ------------------------ * * MODULES INTERFACE: * * ------------------------ */ typedef struct PCM_DMX_INSTANCE *HANDLE_PCM_DOWNMIX; /* Modules reset flags */ #define PCMDMX_RESET_PARAMS ( 1 ) #define PCMDMX_RESET_BS_DATA ( 2 ) #define PCMDMX_RESET_FULL ( PCMDMX_RESET_PARAMS | PCMDMX_RESET_BS_DATA ) #ifdef __cplusplus extern "C" { #endif /** Open and initialize an instance of the PCM downmix module * @param [out] Pointer to a buffer receiving the handle of the new instance. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Open ( HANDLE_PCM_DOWNMIX *pSelf ); /** Set one parameter for one instance of the PCM downmix module. * @param [in] Handle of PCM downmix instance. * @param [in] Parameter to be set. * @param [in] Parameter value. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_SetParam ( HANDLE_PCM_DOWNMIX self, PCMDMX_PARAM param, UINT value ); /** Read the ancillary data transported in DSEs of DVB streams with MPEG-4 content * @param [in] Handle of PCM downmix instance. * @param [in] Pointer to ancillary data buffer. * @param [in] Size of ancillary data. * @param [in] Flag indicating wheter the ancillary data is from a MPEG-1/2 or an MPEG-4 stream. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_ReadDvbAncData ( HANDLE_PCM_DOWNMIX self, UCHAR *pAncDataBuf, UINT ancDataBytes, int isMpeg2 ); /** Set the matrix mixdown information extracted from the PCE of an AAC bitstream. * Note: Call only if matrix_mixdown_idx_present is true. * @param [in] Handle of PCM downmix instance. * @param [in] Matrix mixdown index present flag extracted from PCE. * @param [in] The 2 bit matrix mixdown index extracted from PCE. * @param [in] The pseudo surround enable flag extracted from PCE. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_SetMatrixMixdownFromPce ( HANDLE_PCM_DOWNMIX self, int matrixMixdownPresent, int matrixMixdownIdx, int pseudoSurroundEnable ); /** Reset the module. * @param [in] Handle of PCM downmix instance. * @param [in] Flags telling which parts of the module shall be reset. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Reset ( HANDLE_PCM_DOWNMIX self, UINT flags ); /** Apply down or up mixing. * * \param [in] Handle of PCM downmix module instance. * \param [inout] Pointer to time buffer with decoded PCM samples. * \param [in] Pointer where the amount of output samples is returned into. * \param [inout] Pointer where the amount of output channels is returned into. * \param [in] Flag which indicates if output time data are writtern interleaved or as subsequent blocks. * \param [inout] Array were the corresponding channel type for each output audio channel is stored into. * \param [inout] Array were the corresponding channel type index for each output audio channel is stored into. * \param [in] Array containing the output channel mapping to be used (From MPEG PCE ordering to whatever is required). * * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_ApplyFrame ( HANDLE_PCM_DOWNMIX self, INT_PCM *pPcmBuf, UINT frameSize, INT *nChannels, int fInterleaved, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], const UCHAR channelMapping[][8] ); /** Close an instance of the PCM downmix module. * @param [inout] Pointer to a buffer containing the handle of the instance. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Close ( HANDLE_PCM_DOWNMIX *pSelf ); /** Get library info for this module. * @param [out] Pointer to an allocated LIB_INFO structure. * @returns Returns an error code. */ PCMDMX_ERROR pcmDmx_GetLibInfo( LIB_INFO *info ); #ifdef __cplusplus } #endif #endif /* _PCMUTILS_LIB_H_ */ fdk-aac-0.1.3/libPCMutils/src/0000755000175000017500000000000012372262444016367 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libPCMutils/src/pcmutils_lib.cpp0000644000175000017500000013060612372261464021570 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /**************************** FDK PCM utils module ************************** Author(s): Christian Griebel Description: Defines functions to interface with the PCM post processing module. *******************************************************************************/ #include "pcmutils_lib.h" #include "genericStds.h" #include "fixpoint_math.h" /* Decoder library info */ #define PCMDMX_LIB_VL0 2 #define PCMDMX_LIB_VL1 4 #define PCMDMX_LIB_VL2 0 #define PCMDMX_LIB_TITLE "PCM Downmix Lib" #define PCMDMX_LIB_BUILD_DATE __DATE__ #define PCMDMX_LIB_BUILD_TIME __TIME__ /* Library settings */ #define PCM_DMX_MAX_DELAY_FRAMES ( 1 ) #define PCM_DMX_MAX_CHANNELS ( 8 ) #define PCM_DMX_MAX_CHANNEL_GROUPS ( 4 ) #define PCM_DMX_MAX_CHANNELS_PER_GROUP ( 3 ) /* The maximum over all groups */ #define PCMDMX_DFLT_EXPIRY_FRAME ( 50 ) /* At least 500ms (FL 960 @ 96kHz) */ /* Fixed and unique channel group indices. * The last group index has to be smaller than PCM_DMX_MAX_CHANNEL_GROUPS. */ #define CH_GROUP_FRONT ( 0 ) #define CH_GROUP_SIDE ( 1 ) #define CH_GROUP_REAR ( 2 ) #define CH_GROUP_LFE ( 3 ) /* The ordering of the following fixed channel labels has to be in MPEG-4 style. * From the center to the back with left and right channel interleaved (starting with left). * The last channel label index has to be smaller than PCM_DMX_MAX_CHANNELS. */ #define CENTER_FRONT_CHANNEL ( 0 ) /* C */ #define LEFT_FRONT_CHANNEL ( 1 ) /* L */ #define RIGHT_FRONT_CHANNEL ( 2 ) /* R */ #define LEFT_OUTSIDE_CHANNEL ( 3 ) /* Lo */ #define RIGHT_OUTSIDE_CHANNEL ( 4 ) /* Ro */ #define LEFT_REAR_CHANNEL ( 5 ) /* Lr aka left back channel */ #define RIGHT_REAR_CHANNEL ( 6 ) /* Rr aka right back channel */ #define LOW_FREQUENCY_CHANNEL ( 7 ) /* Lf */ /* More constants */ #define ANC_DATA_SYNC_BYTE ( 0xBC ) /* ancillary data sync byte. */ #define ATTENUATION_FACTOR_1 ( FL2FXCONST_SGL(0.70710678f) ) #define TWO_CHANNEL ( 2 ) /* Sanity checks on library setting: */ /* List of packed channel modes */ typedef enum { /* CH_MODE____ */ CH_MODE_UNDEFINED = 0x0000, /* 1 channel */ CH_MODE_1_0_0_0 = 0x0001, /* chCfg 1 */ /* 2 channels */ CH_MODE_2_0_0_0 = 0x0002, /* chCfg 2 */ /* 3 channels */ CH_MODE_3_0_0_0 = 0x0003, /* chCfg 3 */ CH_MODE_2_0_1_0 = 0x0102, CH_MODE_2_0_0_1 = 0x1002, /* 4 channels */ CH_MODE_3_0_1_0 = 0x0103, /* chCfg 4 */ CH_MODE_2_0_2_0 = 0x0202, CH_MODE_2_0_1_1 = 0x1102, /* 5 channels */ CH_MODE_3_0_2_0 = 0x0203, /* chCfg 5 */ CH_MODE_2_0_2_1 = 0x1202, CH_MODE_3_0_1_1 = 0x1103, CH_MODE_3_2_0_0 = 0x0023, /* 6 channels */ CH_MODE_3_0_2_1 = 0x1203, /* chCfg 6 */ CH_MODE_3_2_1_0 = 0x0123, /* 7 channels */ CH_MODE_2_2_2_1 = 0x1222, CH_MODE_3_2_1_1 = 0x1123, CH_MODE_3_2_2_0 = 0x0223, /* 8 channels */ CH_MODE_3_2_2_1 = 0x1222, /* chCfg 7 */ CH_MODE_3_2_1_2 = 0x2123, CH_MODE_2_2_2_2 = 0x2222 } PCM_DMX_CHANNEL_MODE; /* These are the channel configurations linked to the number of output channels give by the user: */ static const PCM_DMX_CHANNEL_MODE outChModeTable[PCM_DMX_MAX_CHANNELS] = { CH_MODE_1_0_0_0, /* 1 channel */ CH_MODE_2_0_0_0, /* 2 channels */ CH_MODE_3_0_0_0, /* 3 channels */ CH_MODE_3_0_1_0, /* 4 channels */ CH_MODE_3_0_2_0, /* 5 channels */ CH_MODE_3_0_2_1, /* 6 channels */ CH_MODE_3_2_2_0, /* 7 channels */ CH_MODE_3_2_2_1 /* 8 channels */ }; static const FIXP_SGL dvbDownmixFactors[8] = { FL2FXCONST_SGL(1.0f), FL2FXCONST_SGL(0.841f), FL2FXCONST_SGL(0.707f), FL2FXCONST_SGL(0.596f), FL2FXCONST_SGL(0.500f), FL2FXCONST_SGL(0.422f), FL2FXCONST_SGL(0.355f), FL2FXCONST_SGL(0.0f) }; /* MPEG matrix mixdown: Set 1: L' = (1 + 2^-0.5 + A )^-1 * [L + C * 2^-0.5 + A * Ls]; R' = (1 + 2^-0.5 + A )^-1 * [R + C * 2^-0.5 + A * Rs]; Set 2: L' = (1 + 2^-0.5 + 2A )^-1 * [L + C * 2^-0.5 - A * (Ls + Rs)]; R' = (1 + 2^-0.5 + 2A )^-1 * [R + C * 2^-0.5 + A * (Ls + Rs)]; M = (3 + 2A)^-1 * [L + C + R + A*(Ls + Rs)]; */ static const FIXP_SGL mpegMixDownIdx2Coef[4] = { FL2FXCONST_SGL(0.70710678f), FL2FXCONST_SGL(0.5f), FL2FXCONST_SGL(0.35355339f), FL2FXCONST_SGL(0.0f) }; static const FIXP_SGL mpegMixDownIdx2PreFact[4] = { FL2FXCONST_SGL(0.4142135623730950f), FL2FXCONST_SGL(0.4530818393219728f), FL2FXCONST_SGL(0.4852813742385703f), FL2FXCONST_SGL(0.5857864376269050f) }; typedef struct { USHORT matrixMixdownIdx; /*!< MPEG mixdown index extracted from PCE. */ USHORT pseudoSurroundEnable; /*!< Pseudo surround enable flag extracted from PCE. */ USHORT mixdownAvailable; /*!< Will be set to 1 if we found a valid coefficient. */ } MPEG_MIXDOWN_INFO; typedef struct { FIXP_SGL centerMixLevelValue; /*!< DVB mixdown level for the center channel extracted from anc data. */ FIXP_SGL surroundMixLevelValue; /*!< DVB mixdown level for back channels extracted from anc data. */ UCHAR mixLevelsAvail; /*!< Will be set to 1 if we found a valid coefficient. */ } DVB_MIXDOWN_LEVELS; /* Modules main data structure: */ struct PCM_DMX_INSTANCE { DVB_MIXDOWN_LEVELS dvbMixDownLevels[PCM_DMX_MAX_DELAY_FRAMES+1]; MPEG_MIXDOWN_INFO mpegMixDownInfo[PCM_DMX_MAX_DELAY_FRAMES+1]; DUAL_CHANNEL_MODE dualChannelMode; UINT expiryFrame; UINT expiryCount; SHORT numOutputChannels; UCHAR applyProcessing; UCHAR frameDelay; }; /* Memory allocation macro */ C_ALLOC_MEM_STATIC(PcmDmxInstance, struct PCM_DMX_INSTANCE, 1) /** Evaluate a given channel configuration and extract a packed channel mode and generate a channel offset table * This function is the inverse to the getChannelDescription() routine. * @param [in] The total number of channels of the given configuration. * @param [in] Array holding the corresponding channel types for each channel. * @param [in] Array holding the corresponding channel type indices for each channel. * @param [out] Array where the buffer offsets for each channel are stored into. * @returns Returns the packed channel mode. **/ static PCM_DMX_CHANNEL_MODE getChannelMode ( const INT numChannels, /* in */ const AUDIO_CHANNEL_TYPE channelType[], /* in */ const UCHAR channelIndices[], /* in */ UCHAR offsetTable[PCM_DMX_MAX_CHANNELS] /* out */ ) { UINT chMode = CH_MODE_UNDEFINED; UCHAR chIdx[PCM_DMX_MAX_CHANNEL_GROUPS][PCM_DMX_MAX_CHANNELS_PER_GROUP]; UCHAR numChInGrp[PCM_DMX_MAX_CHANNEL_GROUPS]; int ch, grpIdx, err = 0; FDK_ASSERT(channelType != NULL); FDK_ASSERT(channelIndices != NULL); FDK_ASSERT(offsetTable != NULL); /* For details see ISO/IEC 13818-7:2005(E), 8.5.3 Channel configuration */ FDKmemclear(numChInGrp, PCM_DMX_MAX_CHANNEL_GROUPS*sizeof(UCHAR)); FDKmemset(offsetTable, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); FDKmemset(chIdx, 255, PCM_DMX_MAX_CHANNEL_GROUPS*PCM_DMX_MAX_CHANNELS_PER_GROUP*sizeof(UCHAR)); /* Categorize channels */ for (ch = 0; ch < numChannels; ch += 1) { int i = 0, j, chGrpIdx = channelIndices[ch]; switch (channelType[ch]) { case ACT_FRONT: case ACT_FRONT_TOP: grpIdx = CH_GROUP_FRONT; break; case ACT_SIDE: case ACT_SIDE_TOP: grpIdx = CH_GROUP_SIDE; break; case ACT_BACK: case ACT_BACK_TOP: grpIdx = CH_GROUP_REAR; break; case ACT_LFE: grpIdx = CH_GROUP_LFE; break; default: err = -1; continue; } if (numChInGrp[grpIdx] < PCM_DMX_MAX_CHANNELS_PER_GROUP) { /* Sort channels by index */ while ( (i < numChInGrp[grpIdx]) && (chGrpIdx > channelIndices[chIdx[grpIdx][i]]) ) { i += 1; } for (j = numChInGrp[grpIdx]; j > i; j -= 1) { chIdx[grpIdx][j] = chIdx[grpIdx][j-1]; } chIdx[grpIdx][i] = ch; numChInGrp[grpIdx] += 1; } } /* Compose channel offset table */ /* Non-symmetric channels */ if (numChInGrp[CH_GROUP_FRONT] & 0x1) { /* Odd number of front channels -> we have a center channel. In MPEG-4 the center has the index 0. */ offsetTable[CENTER_FRONT_CHANNEL] = chIdx[CH_GROUP_FRONT][0]; } for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { int chMapPos, maxChannels = 0; ch = 0; switch (grpIdx) { case CH_GROUP_FRONT: chMapPos = LEFT_FRONT_CHANNEL; maxChannels = 3; ch = numChInGrp[grpIdx] & 0x1; break; case CH_GROUP_SIDE: chMapPos = LEFT_OUTSIDE_CHANNEL; maxChannels = 2; break; case CH_GROUP_REAR: chMapPos = LEFT_REAR_CHANNEL; maxChannels = 2; break; case CH_GROUP_LFE: chMapPos = LOW_FREQUENCY_CHANNEL; maxChannels = 1; break; default: err = -1; continue; } for ( ; ch < numChInGrp[grpIdx]; ch += 1) { if (ch < maxChannels) { offsetTable[chMapPos] = chIdx[grpIdx][ch]; chMapPos += 1; } else { err = -1; } } } if (err == 0) { /* Compose the channel mode */ chMode = (numChInGrp[CH_GROUP_LFE] & 0xF) << 12 | (numChInGrp[CH_GROUP_REAR] & 0xF) << 8 | (numChInGrp[CH_GROUP_SIDE] & 0xF) << 4 | (numChInGrp[CH_GROUP_FRONT] & 0xF); } return (PCM_DMX_CHANNEL_MODE)chMode; } /** Generate a channel offset table and complete channel description for a given (packed) channel mode. * This function is the inverse to the getChannelMode() routine. * @param [in] The total number of channels of the given configuration. * @param [in] Array containing the channel mapping to be used (From MPEG PCE ordering to whatever is required). * @param [out] Array where corresponding channel types for each channels are stored into. * @param [out] Array where corresponding channel type indices for each output channel are stored into. * @param [out] Array where the buffer offsets for each channel are stored into. * @returns None. **/ void getChannelDescription ( const PCM_DMX_CHANNEL_MODE chMode, /* in */ const UCHAR channelMapping[][PCM_DMX_MAX_CHANNELS], /* in */ AUDIO_CHANNEL_TYPE channelType[], /* out */ UCHAR channelIndices[], /* out */ UCHAR offsetTable[PCM_DMX_MAX_CHANNELS] /* out */ ) { const UCHAR *pChannelMap; int grpIdx, ch = 0, numChannels = 0; UCHAR numChInGrp[PCM_DMX_MAX_CHANNEL_GROUPS]; FDK_ASSERT(channelType != NULL); FDK_ASSERT(channelIndices != NULL); FDK_ASSERT(channelMapping != NULL); FDK_ASSERT(offsetTable != NULL); /* Init output arrays */ FDKmemclear(channelType, PCM_DMX_MAX_CHANNELS*sizeof(AUDIO_CHANNEL_TYPE)); FDKmemclear(channelIndices, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); FDKmemset(offsetTable, 255, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); /* Extract the number of channels per group */ numChInGrp[CH_GROUP_FRONT] = chMode & 0xF; numChInGrp[CH_GROUP_SIDE] = (chMode >> 4) & 0xF; numChInGrp[CH_GROUP_REAR] = (chMode >> 8) & 0xF; numChInGrp[CH_GROUP_LFE] = (chMode >> 12) & 0xF; /* Summerize to get the total number of channels */ for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { numChannels += numChInGrp[grpIdx]; } /* Get the appropriate channel map */ pChannelMap = channelMapping[numChannels-1]; /* Compose channel offset table */ /* Non-symmetric channels */ if (numChInGrp[CH_GROUP_FRONT] & 0x1) { /* Odd number of front channels -> we have a center channel. In MPEG-4 the center has the index 0. */ offsetTable[CENTER_FRONT_CHANNEL] = pChannelMap[0]; channelType[0] = ACT_FRONT; ch += 1; } for (grpIdx = 0; grpIdx < PCM_DMX_MAX_CHANNEL_GROUPS; grpIdx += 1) { AUDIO_CHANNEL_TYPE type; int chMapPos, maxChannels = 0; int chIdx = 0; switch (grpIdx) { case CH_GROUP_FRONT: type = ACT_FRONT; chMapPos = LEFT_FRONT_CHANNEL; maxChannels = 3; chIdx = numChInGrp[grpIdx] & 0x1; break; case CH_GROUP_SIDE: type = ACT_SIDE; chMapPos = LEFT_OUTSIDE_CHANNEL; maxChannels = 2; break; case CH_GROUP_REAR: type = ACT_BACK; chMapPos = LEFT_REAR_CHANNEL; maxChannels = 2; break; case CH_GROUP_LFE: type = ACT_LFE; chMapPos = LOW_FREQUENCY_CHANNEL; maxChannels = 1; break; default: break; } for ( ; (chIdx < numChInGrp[grpIdx]) && (chIdx < maxChannels); chIdx += 1) { offsetTable[chMapPos] = pChannelMap[ch]; channelType[ch] = type; channelIndices[ch] = chIdx; chMapPos += 1; ch += 1; } } } /** Open and initialize an instance of the PCM downmix module * @param [out] Pointer to a buffer receiving the handle of the new instance. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Open ( HANDLE_PCM_DOWNMIX *pSelf ) { HANDLE_PCM_DOWNMIX self; if (pSelf == NULL) { return (PCMDMX_INVALID_HANDLE); } *pSelf = NULL; self = (HANDLE_PCM_DOWNMIX) GetPcmDmxInstance( 0 ); if (self == NULL) { return (PCMDMX_OUT_OF_MEMORY); } /* Reset the full instance */ pcmDmx_Reset( self, PCMDMX_RESET_FULL ); *pSelf = self; return (PCMDMX_OK); } /** Reset all static values like e.g. mixdown coefficients. * @param [in] Handle of PCM downmix module instance. * @param [in] Flags telling which parts of the module shall be reset. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Reset ( HANDLE_PCM_DOWNMIX self, UINT flags ) { if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } if (flags & PCMDMX_RESET_PARAMS) { self->dualChannelMode = STEREO_MODE; self->numOutputChannels = 0; self->applyProcessing = 0; self->frameDelay = 0; self->expiryFrame = PCMDMX_DFLT_EXPIRY_FRAME; } if (flags & PCMDMX_RESET_BS_DATA) { int slot; for (slot = 0; slot <= PCM_DMX_MAX_DELAY_FRAMES; slot += 1) { self->dvbMixDownLevels[slot].centerMixLevelValue = dvbDownmixFactors[2]; /* 0.707 */ self->dvbMixDownLevels[slot].surroundMixLevelValue = dvbDownmixFactors[0]; /* 1.000 */ self->dvbMixDownLevels[slot].mixLevelsAvail = 0; self->mpegMixDownInfo[slot].mixdownAvailable = 0; } /* Reset expiry counter */ self->expiryCount = 0; } return (PCMDMX_OK); } /** Set one parameter for one instance of the PCM downmix module. * @param [in] Handle of PCM downmix module instance. * @param [in] Parameter to be set. * @param [in] Parameter value. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_SetParam ( HANDLE_PCM_DOWNMIX self, PCMDMX_PARAM param, UINT value ) { switch (param) { case DMX_BS_DATA_EXPIRY_FRAME: if (self == NULL) return (PCMDMX_INVALID_HANDLE); self->expiryFrame = value; break; case DMX_BS_DATA_DELAY: if (value > PCM_DMX_MAX_DELAY_FRAMES) { return (PCMDMX_UNABLE_TO_SET_PARAM); } if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } self->frameDelay = value; break; case NUMBER_OF_OUTPUT_CHANNELS: switch ((int)value) { /* supported output channels */ case -1: case 0: case 1: case 2: case 6: case 8: break; default: return (PCMDMX_UNABLE_TO_SET_PARAM); } if (self == NULL) return (PCMDMX_INVALID_HANDLE); if ((int)value > 0) { self->numOutputChannels = (int)value; self->applyProcessing = 1; } else { self->numOutputChannels = 0; self->applyProcessing = 0; } break; case DUAL_CHANNEL_DOWNMIX_MODE: switch ((DUAL_CHANNEL_MODE)value) { case STEREO_MODE: case CH1_MODE: case CH2_MODE: case MIXED_MODE: break; default: return (PCMDMX_UNABLE_TO_SET_PARAM); } if (self == NULL) return (PCMDMX_INVALID_HANDLE); self->dualChannelMode = (DUAL_CHANNEL_MODE)value; self->applyProcessing = 1; break; default: return (PCMDMX_UNKNOWN_PARAM); } return (PCMDMX_OK); } /** Read the ancillary data transported in DSEs of DVB streams with MPEG-4 content * @param [in] Handle of PCM downmix module instance. * @param [in] Pointer to ancillary data buffer. * @param [in] Size of ancillary data. * @param [in] Flag indicating wheter the DVB ancillary data is from an MPEG-1/2 or an MPEG-4 stream. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_ReadDvbAncData ( HANDLE_PCM_DOWNMIX self, UCHAR *pAncDataBuf, UINT ancDataBytes, int isMpeg2 ) { DVB_MIXDOWN_LEVELS *pDownmixLevels = &self->dvbMixDownLevels[0]; int offset = (isMpeg2) ? 2 : 0; UCHAR ancDataStatus; if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } /* sanity checks */ if (pAncDataBuf == NULL || ancDataBytes < (UCHAR)(3+offset)) { return (PCMDMX_CORRUPT_ANC_DATA); } /* check sync word */ if (pAncDataBuf[offset] != ANC_DATA_SYNC_BYTE) { return (PCMDMX_CORRUPT_ANC_DATA); } offset += 2; ancDataStatus = pAncDataBuf[offset++]; if (isMpeg2) { /* skip advanced_dynamic_range_control */ if (ancDataStatus & 0x80) offset += 3; /* skip dialog_normalization */ if (ancDataStatus & 0x40) offset += 1; /* skip reproduction_level */ if (ancDataStatus & 0x20) offset += 1; } else { /* check reserved bits */ if (ancDataStatus & 0xE8) { return (PCMDMX_CORRUPT_ANC_DATA); } } /* downmix_levels_MPEGX */ if (ancDataStatus & 0x10) { int foundNewData = 0; UCHAR downmixData = pAncDataBuf[offset++]; if (downmixData & 0x80) { /* center_mix_level_on */ pDownmixLevels->centerMixLevelValue = dvbDownmixFactors[(downmixData >> 4) & 0x07]; foundNewData = 1; } else { pDownmixLevels->centerMixLevelValue = dvbDownmixFactors[0]; if (downmixData & 0x70) { return (PCMDMX_CORRUPT_ANC_DATA); } } if (downmixData & 0x08) { /* surround_mix_level_on */ pDownmixLevels->surroundMixLevelValue = dvbDownmixFactors[downmixData & 0x07]; foundNewData = 1; } else { pDownmixLevels->surroundMixLevelValue = dvbDownmixFactors[0]; if (downmixData & 0x07) { return (PCMDMX_CORRUPT_ANC_DATA); } } pDownmixLevels->mixLevelsAvail = foundNewData; } /* Reset expiry counter */ self->expiryCount = 0; return (PCMDMX_OK); } /** Set the matrix mixdown information extracted from the PCE of an AAC bitstream. * Note: Call only if matrix_mixdown_idx_present is true. * @param [in] Handle of PCM downmix module instance. * @param [in] The 2 bit matrix mixdown index extracted from PCE. * @param [in] The pseudo surround enable flag extracted from PCE. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_SetMatrixMixdownFromPce ( HANDLE_PCM_DOWNMIX self, int matrixMixdownPresent, int matrixMixdownIdx, int pseudoSurroundEnable ) { MPEG_MIXDOWN_INFO *pMpegMixDownInfo; if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } pMpegMixDownInfo = &self->mpegMixDownInfo[0]; if (matrixMixdownPresent) { pMpegMixDownInfo->matrixMixdownIdx = matrixMixdownIdx & 0x03; pMpegMixDownInfo->pseudoSurroundEnable = pseudoSurroundEnable; } pMpegMixDownInfo->mixdownAvailable = matrixMixdownPresent; /* Reset expiry counter */ self->expiryCount = 0; return (PCMDMX_OK); } /** Apply down or up mixing. * @param [in] Handle of PCM downmix module instance. * @param [inout] Pointer to time buffer. Depending on interface configuration, the content of pTimeData is ignored, * and the internal QMF buffer will be used as input data source. Otherwise, the MPEG Surround processing is * applied to the timesignal pTimeData. For both variants, the resulting MPEG Surround signal is written into pTimeData. * @param [in] Pointer where the amount of output samples is returned into. * @param [inout] Pointer where the amount of output channels is returned into. * @param [in] Flag which indicates if output time data are writtern interleaved or as subsequent blocks. * @param [inout] Array where the corresponding channel type for each output audio channel is stored into. * @param [inout] Array where the corresponding channel type index for each output audio channel is stored into. * @param [in] Array containing the output channel mapping to be used (From MPEG PCE ordering to whatever is required). * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_ApplyFrame ( HANDLE_PCM_DOWNMIX self, INT_PCM *pPcmBuf, UINT frameSize, INT *nChannels, int fInterleaved, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], const UCHAR channelMapping[][8] ) { PCMDMX_ERROR errorStatus = PCMDMX_OK; DUAL_CHANNEL_MODE dualChannelMode; PCM_DMX_CHANNEL_MODE inChMode; int numOutChannels; int numInChannels = *nChannels; int slot; UCHAR inOffsetTable[PCM_DMX_MAX_CHANNELS]; MPEG_MIXDOWN_INFO mpegMixDownInfo; DVB_MIXDOWN_LEVELS dvbMixDownLevels; if (self == NULL) { return (PCMDMX_INVALID_HANDLE); } if ( (self->expiryFrame > 0) && (++self->expiryCount > self->expiryFrame) ) { /* The metadata read from bitstream is too old. */ errorStatus = pcmDmx_Reset(self, PCMDMX_RESET_BS_DATA); } FDKmemcpy(&mpegMixDownInfo, &self->mpegMixDownInfo[self->frameDelay], sizeof(MPEG_MIXDOWN_INFO)); /* Maintain delay line */ for (slot = self->frameDelay; slot > 0; slot -= 1) { FDKmemcpy(&self->mpegMixDownInfo[slot], &self->mpegMixDownInfo[slot-1], sizeof(MPEG_MIXDOWN_INFO)); } FDKmemcpy(&dvbMixDownLevels, &self->dvbMixDownLevels[self->frameDelay], sizeof(DVB_MIXDOWN_LEVELS)); /* Maintain delay line */ for (slot = self->frameDelay; slot > 0; slot -= 1) { FDKmemcpy(&self->dvbMixDownLevels[slot], &self->dvbMixDownLevels[slot-1], sizeof(DVB_MIXDOWN_LEVELS)); } if (self->applyProcessing == 0) { return (errorStatus); } if (pPcmBuf == NULL) { return (PCMDMX_INVALID_ARGUMENT); } if (frameSize == 0) { return (PCMDMX_INVALID_ARGUMENT); } if (numInChannels == 0) { return (PCMDMX_INVALID_ARGUMENT); } if (self->numOutputChannels <= 0) { numOutChannels = numInChannels; } else { numOutChannels = self->numOutputChannels; } dualChannelMode = self->dualChannelMode; /* Analyse input channel configuration and get channel offset * table that can be accessed with the fixed channel labels. */ inChMode = getChannelMode( numInChannels, channelType, channelIndices, inOffsetTable ); if (inChMode == CH_MODE_UNDEFINED) { /* We don't need to restore because the channel configuration has not been changed. Just exit. */ return (PCMDMX_INVALID_CH_CONFIG); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ if ( numInChannels > numOutChannels ) { /* Apply downmix */ INT_PCM *pInCF, *pInLF, *pInRF, *pInLO, *pInRO, *pInLR, *pInRR, *pOutL, *pOutR; FIXP_SGL flev, clev, slev; UINT sample; int inStride, outStride, offset; int useGuidedDownMix = 0; UCHAR outOffsetTable[PCM_DMX_MAX_CHANNELS]; /* Set I/O strides and offsets */ if (fInterleaved) { inStride = numInChannels; outStride = TWO_CHANNEL; /* The output of STAGE ONE is always STEREO !!! STAGE TWO creates a downmix to mono if required. */ offset = 1; /* Channel specific offset factor */ } else { inStride = 1; outStride = 1; offset = frameSize; /* Channel specific offset factor */ } /* Get channel description and channel mapping for this * stages number of output channels (always STEREO). */ getChannelDescription( CH_MODE_2_0_0_0, channelMapping, channelType, channelIndices, outOffsetTable ); /* Now there is no way back because we modified the channel configuration! */ /* Set channel pointer for input */ pInCF = &pPcmBuf[inOffsetTable[CENTER_FRONT_CHANNEL]*offset]; pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; pInLO = &pPcmBuf[inOffsetTable[LEFT_OUTSIDE_CHANNEL]*offset]; pInRO = &pPcmBuf[inOffsetTable[RIGHT_OUTSIDE_CHANNEL]*offset]; pInLR = &pPcmBuf[inOffsetTable[LEFT_REAR_CHANNEL]*offset]; pInRR = &pPcmBuf[inOffsetTable[RIGHT_REAR_CHANNEL]*offset]; /* Set channel pointer for output Caution: Different channel mapping compared to input */ pOutL = &pPcmBuf[outOffsetTable[LEFT_FRONT_CHANNEL]*offset]; /* LEFT_FRONT_CHANNEL */ pOutR = &pPcmBuf[outOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; /* RIGHT_FRONT_CHANNEL */ /* Set downmix levels: */ flev = ATTENUATION_FACTOR_1; /* 0.707 */ clev = ATTENUATION_FACTOR_1; /* 0.707 */ slev = ATTENUATION_FACTOR_1; /* 0.707 */ if ( dvbMixDownLevels.mixLevelsAvail ) { clev = dvbMixDownLevels.centerMixLevelValue; slev = dvbMixDownLevels.surroundMixLevelValue; useGuidedDownMix = 1; } /* FIRST STAGE: Always downmix to 2 channel output: */ switch ( inChMode ) { case CH_MODE_2_0_0_0: case CH_MODE_2_0_0_1: /* 2/0 input: */ switch (dualChannelMode) { case CH1_MODE: /* L' = 0.707 * Ch1; R' = 0.707 * Ch1 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInLF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); pInLF += inStride; pOutL += outStride; pOutR += outStride; } break; case CH2_MODE: /* L' = 0.707 * Ch2; R' = 0.707 * Ch2 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInRF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); pInRF += inStride; pOutL += outStride; pOutR += outStride; } break; case MIXED_MODE: /* L' = 0.5*Ch1 + 0.5*Ch2; R' = 0.5*Ch1 + 0.5*Ch2 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (*pInLF >> 1) + (*pInRF >> 1); pInLF += inStride; pInRF += inStride; pOutL += outStride; pOutR += outStride; } break; default: case STEREO_MODE: /* nothing to do */ break; } break; case CH_MODE_3_0_0_0: /* 3/0 input: L' = L + 0.707*C; R' = R + 0.707*C; */ for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev); #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>1)+tCF, 1, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>1)+tCF, 1, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>1)+tCF, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>1)+tCF, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pOutL += outStride; pOutR += outStride; } break; /* 2/1 input: not supported! case CH_MODE_2_0_1_0: */ case CH_MODE_3_0_1_0: if (useGuidedDownMix) { /* 3/1 input: L' = L + clev*C + 0.707*slev*S; R' = R + clev*C + 0.707*slev*S; */ slev = FX_DBL2FX_SGL(fMult(flev, slev)); /* 0.707*slef */ for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, 2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, 2, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pOutL += outStride; pOutR += outStride; } } else { /* 3/1 input: L' = L + 0.707*C - 0.707*S; R' = R + 0.707*C + 0.707*S */ for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, 2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, 2, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF-tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pOutL += outStride; pOutR += outStride; } } break; /* 2/2 input: not supported! case CH_MODE_2_0_2_0: */ case CH_MODE_3_0_2_0: /* 5.0ch input */ case CH_MODE_3_0_2_1: /* 5.1ch input */ if (useGuidedDownMix) { /* 3/2 input: L' = L + clev*C + slev*Ls; R' = R + clev*C + slev*Rs; */ for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 1; FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 1; FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev) >> 1; #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, 2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tRR, 2, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>2)+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>2)+tCF+tRR, DFRACT_BITS-SAMPLE_BITS-2, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; pOutL += outStride; pOutR += outStride; } } else if (mpegMixDownInfo.mixdownAvailable) { /* 3/2 input: L' = (1.707+A)^-1 * [L+0.707*C+A*Ls]; R'= (1.707+A)^-1 * [R+0.707*C+A*Rs]; */ FIXP_SGL mtrxMixDwnCoef = mpegMixDownIdx2Coef[mpegMixDownInfo.matrixMixdownIdx]; FIXP_SGL mtrxMixDwnPreFact = mpegMixDownIdx2PreFact[mpegMixDownInfo.matrixMixdownIdx]; clev = FX_DBL2FX_SGL(fMult(mtrxMixDwnPreFact, flev /* 0.707 */)); flev = mtrxMixDwnPreFact; slev = FX_DBL2FX_SGL(fMult(mtrxMixDwnPreFact, mtrxMixDwnCoef)); for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev); FIXP_DBL tLF = fMultDiv2((FIXP_PCM)*pInLF, flev); FIXP_DBL tRF = fMultDiv2((FIXP_PCM)*pInRF, flev); FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev); FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev); #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT(tLF+tCF+tLR, 1, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT(tRF+tCF+tRR, 1, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT(tLF+tCF+tLR, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(tRF+tCF+tRR, DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; pOutL += outStride; pOutR += outStride; } } else { /* 3/2 input: L' = L + 0.707*C - 0.707*Ls - 0.707*Rs; R' = R + 0.707*C + 0.707*Ls + 0.707*Rs */ for (sample = 0; sample < frameSize; sample++) { FIXP_DBL tCF = fMultDiv2((FIXP_PCM)*pInCF, clev) >> 2; FIXP_DBL tLR = fMultDiv2((FIXP_PCM)*pInLR, slev) >> 2; FIXP_DBL tRR = fMultDiv2((FIXP_PCM)*pInRR, slev) >> 2; #if (SAMPLE_BITS == 32) /* left channel */ *pOutL = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>3)+tCF-tLR-tRR, 3, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_LEFT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>3)+tCF+tLR+tRR, 3, SAMPLE_BITS); #else /* left channel */ *pOutL = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInLF)>>3)+tCF-tLR-tRR, DFRACT_BITS-SAMPLE_BITS-3, SAMPLE_BITS); /* right channel */ *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT((FX_PCM2FX_DBL((FIXP_PCM)*pInRF)>>3)+tCF+tLR+tRR, DFRACT_BITS-SAMPLE_BITS-3, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pInCF += inStride; pInLR += inStride; pInRR += inStride; pOutL += outStride; pOutR += outStride; } } break; default: errorStatus = PCMDMX_INVALID_MODE; break; } /* SECOND STAGE: If desired create a mono donwmix: Note: Input are always two channels! */ if (numOutChannels == 1) { INT_PCM *pOutC; FIXP_SGL mlev; if (useGuidedDownMix) mlev = FL2FXCONST_SGL(1.0f); else mlev = flev; /* Output of STAGE ONE = Input of STAGE TWO */ FDKmemcpy(inOffsetTable, outOffsetTable, PCM_DMX_MAX_CHANNELS*sizeof(UCHAR)); /* Set I/O strides and offsets */ inStride = outStride; /* output from STAGE ONE */ outStride = numOutChannels; /* final output */ /* Get channel description and channel mapping for this * stages number of output channels (always MONO). */ getChannelDescription( CH_MODE_1_0_0_0, channelMapping, channelType, channelIndices, outOffsetTable ); /* Set input channel pointer. */ pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; /* Set output channel pointer */ pOutC = &pPcmBuf[outOffsetTable[CENTER_FRONT_CHANNEL]*offset]; /* C' = 0.707*L + 0.707*R */ for (sample = 0; sample < frameSize; sample++) { #if (SAMPLE_BITS == 32) *pOutC = (INT_PCM)SATURATE_LEFT_SHIFT(fMultDiv2((FIXP_PCM)*pInLF,mlev)+fMultDiv2((FIXP_PCM)*pInRF,mlev), 1, SAMPLE_BITS); #else *pOutC = (INT_PCM)SATURATE_RIGHT_SHIFT(fMultDiv2((FIXP_PCM)*pInLF,mlev)+fMultDiv2((FIXP_PCM)*pInRF,mlev), DFRACT_BITS-SAMPLE_BITS-1, SAMPLE_BITS); #endif pInLF += inStride; pInRF += inStride; pOutC += 1; } /* Finished STAGE TWO */ } /* Update the number of output channels */ *nChannels = self->numOutputChannels; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ else if ( numInChannels == numOutChannels ) { /* Don't need to change the channel description here */ switch (numInChannels) { case 2: { /* Set up channel pointer */ INT_PCM *pInLF, *pInRF, *pOutL, *pOutR; FIXP_SGL flev; UINT sample; int inStride, outStride, offset; if (fInterleaved) { inStride = numInChannels; outStride = 2; /* fixed !!! (below stereo is donwmixed to mono if required */ offset = 1; /* Channel specific offset factor */ } else { inStride = 1; outStride = 1; offset = frameSize; /* Channel specific offset factor */ } /* Set input channel pointer */ pInLF = &pPcmBuf[inOffsetTable[LEFT_FRONT_CHANNEL]*offset]; pInRF = &pPcmBuf[inOffsetTable[RIGHT_FRONT_CHANNEL]*offset]; /* Set output channel pointer (same as input) */ pOutL = pInLF; pOutR = pInRF; /* Set downmix levels: */ flev = ATTENUATION_FACTOR_1; /* 0.707 */ /* 2/0 input: */ switch (dualChannelMode) { case CH1_MODE: /* L' = 0.707 * Ch1; R' = 0.707 * Ch1 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInLF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); pInLF += inStride; pOutL += outStride; pOutR += outStride; } break; case CH2_MODE: /* L' = 0.707 * Ch2; R' = 0.707 * Ch2 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (INT_PCM)SATURATE_RIGHT_SHIFT(fMult((FIXP_PCM)*pInRF, flev), DFRACT_BITS-SAMPLE_BITS, SAMPLE_BITS); pInRF += inStride; pOutL += outStride; pOutR += outStride; } break; case MIXED_MODE: /* L' = 0.5*Ch1 + 0.5*Ch2; R' = 0.5*Ch1 + 0.5*Ch2 */ for (sample = 0; sample < frameSize; sample++) { *pOutL = *pOutR = (*pInLF >> 1) + (*pInRF >> 1); pInLF += inStride; pInRF += inStride; pOutL += outStride; pOutR += outStride; } break; default: case STEREO_MODE: /* nothing to do */ break; } } break; default: /* nothing to do */ break; } } return (errorStatus); } /** Close an instance of the PCM downmix module. * @param [inout] Pointer to a buffer containing the handle of the instance. * @returns Returns an error code. **/ PCMDMX_ERROR pcmDmx_Close ( HANDLE_PCM_DOWNMIX *pSelf ) { if (pSelf == NULL) { return (PCMDMX_INVALID_HANDLE); } FreePcmDmxInstance( pSelf ); *pSelf = NULL; return (PCMDMX_OK); } /** Get library info for this module. * @param [out] Pointer to an allocated LIB_INFO structure. * @returns Returns an error code. */ PCMDMX_ERROR pcmDmx_GetLibInfo( LIB_INFO *info ) { int i; if (info == NULL) { return PCMDMX_INVALID_ARGUMENT; } /* Search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) { return PCMDMX_UNKNOWN; } info += i; /* Add the library info */ info->module_id = FDK_PCMDMX; info->version = LIB_VERSION(PCMDMX_LIB_VL0, PCMDMX_LIB_VL1, PCMDMX_LIB_VL2); LIB_VERSION_STRING(info); info->build_date = PCMDMX_LIB_BUILD_DATE; info->build_time = PCMDMX_LIB_BUILD_TIME; info->title = PCMDMX_LIB_TITLE; /* Set flags */ info->flags = 0 | CAPF_DMX_BLIND /* At least blind downmixing is possible */ | CAPF_DMX_PCE /* Guided downmix with data from MPEG-2/4 Program Config Elements (PCE). */ | CAPF_DMX_DVB /* Guided downmix with data from DVB ancillary data fields. */ ; return PCMDMX_OK; } fdk-aac-0.1.3/aac-enc.c0000644000175000017500000001433012144411136015034 0ustar00tootstoots00000000000000/* ------------------------------------------------------------------ * Copyright (C) 2011 Martin Storsjo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- */ #include #include #include #include #include "libAACenc/include/aacenc_lib.h" #include "wavreader.h" void usage(const char* name) { fprintf(stderr, "%s [-r bitrate] [-t aot] [-a afterburner] [-s sbr] [-v vbr] in.wav out.aac\n", name); fprintf(stderr, "Supported AOTs:\n"); fprintf(stderr, "\t2\tAAC-LC\n"); fprintf(stderr, "\t5\tHE-AAC\n"); fprintf(stderr, "\t29\tHE-AAC v2\n"); fprintf(stderr, "\t23\tAAC-LD\n"); fprintf(stderr, "\t39\tAAC-ELD\n"); } int main(int argc, char *argv[]) { int bitrate = 64000; int ch; const char *infile, *outfile; FILE *out; void *wav; int format, sample_rate, channels, bits_per_sample; int input_size; uint8_t* input_buf; int16_t* convert_buf; int aot = 2; int afterburner = 1; int eld_sbr = 0; int vbr = 0; HANDLE_AACENCODER handle; CHANNEL_MODE mode; AACENC_InfoStruct info = { 0 }; while ((ch = getopt(argc, argv, "r:t:a:s:v:")) != -1) { switch (ch) { case 'r': bitrate = atoi(optarg); break; case 't': aot = atoi(optarg); break; case 'a': afterburner = atoi(optarg); break; case 's': eld_sbr = atoi(optarg); break; case 'v': vbr = atoi(optarg); break; case '?': default: usage(argv[0]); return 1; } } if (argc - optind < 2) { usage(argv[0]); return 1; } infile = argv[optind]; outfile = argv[optind + 1]; wav = wav_read_open(infile); if (!wav) { fprintf(stderr, "Unable to open wav file %s\n", infile); return 1; } if (!wav_get_header(wav, &format, &channels, &sample_rate, &bits_per_sample, NULL)) { fprintf(stderr, "Bad wav file %s\n", infile); return 1; } if (format != 1) { fprintf(stderr, "Unsupported WAV format %d\n", format); return 1; } if (bits_per_sample != 16) { fprintf(stderr, "Unsupported WAV sample depth %d\n", bits_per_sample); return 1; } switch (channels) { case 1: mode = MODE_1; break; case 2: mode = MODE_2; break; case 3: mode = MODE_1_2; break; case 4: mode = MODE_1_2_1; break; case 5: mode = MODE_1_2_2; break; case 6: mode = MODE_1_2_2_1; break; default: fprintf(stderr, "Unsupported WAV channels %d\n", channels); return 1; } if (aacEncOpen(&handle, 0, channels) != AACENC_OK) { fprintf(stderr, "Unable to open encoder\n"); return 1; } if (aacEncoder_SetParam(handle, AACENC_AOT, aot) != AACENC_OK) { fprintf(stderr, "Unable to set the AOT\n"); return 1; } if (aot == 39 && eld_sbr) { if (aacEncoder_SetParam(handle, AACENC_SBR_MODE, 1) != AACENC_OK) { fprintf(stderr, "Unable to set SBR mode for ELD\n"); return 1; } } if (aacEncoder_SetParam(handle, AACENC_SAMPLERATE, sample_rate) != AACENC_OK) { fprintf(stderr, "Unable to set the AOT\n"); return 1; } if (aacEncoder_SetParam(handle, AACENC_CHANNELMODE, mode) != AACENC_OK) { fprintf(stderr, "Unable to set the channel mode\n"); return 1; } if (aacEncoder_SetParam(handle, AACENC_CHANNELORDER, 1) != AACENC_OK) { fprintf(stderr, "Unable to set the wav channel order\n"); return 1; } if (vbr) { if (aacEncoder_SetParam(handle, AACENC_BITRATEMODE, vbr) != AACENC_OK) { fprintf(stderr, "Unable to set the VBR bitrate mode\n"); return 1; } } else { if (aacEncoder_SetParam(handle, AACENC_BITRATE, bitrate) != AACENC_OK) { fprintf(stderr, "Unable to set the bitrate\n"); return 1; } } if (aacEncoder_SetParam(handle, AACENC_TRANSMUX, 2) != AACENC_OK) { fprintf(stderr, "Unable to set the ADTS transmux\n"); return 1; } if (aacEncoder_SetParam(handle, AACENC_AFTERBURNER, afterburner) != AACENC_OK) { fprintf(stderr, "Unable to set the afterburner mode\n"); return 1; } if (aacEncEncode(handle, NULL, NULL, NULL, NULL) != AACENC_OK) { fprintf(stderr, "Unable to initialize the encoder\n"); return 1; } if (aacEncInfo(handle, &info) != AACENC_OK) { fprintf(stderr, "Unable to get the encoder info\n"); return 1; } out = fopen(outfile, "wb"); if (!out) { perror(outfile); return 1; } input_size = channels*2*info.frameLength; input_buf = (uint8_t*) malloc(input_size); convert_buf = (int16_t*) malloc(input_size); while (1) { AACENC_BufDesc in_buf = { 0 }, out_buf = { 0 }; AACENC_InArgs in_args = { 0 }; AACENC_OutArgs out_args = { 0 }; int in_identifier = IN_AUDIO_DATA; int in_size, in_elem_size; int out_identifier = OUT_BITSTREAM_DATA; int out_size, out_elem_size; int read, i; void *in_ptr, *out_ptr; uint8_t outbuf[20480]; AACENC_ERROR err; read = wav_read_data(wav, input_buf, input_size); for (i = 0; i < read/2; i++) { const uint8_t* in = &input_buf[2*i]; convert_buf[i] = in[0] | (in[1] << 8); } if (read <= 0) { in_args.numInSamples = -1; } else { in_ptr = convert_buf; in_size = read; in_elem_size = 2; in_args.numInSamples = read/2; in_buf.numBufs = 1; in_buf.bufs = &in_ptr; in_buf.bufferIdentifiers = &in_identifier; in_buf.bufSizes = &in_size; in_buf.bufElSizes = &in_elem_size; } out_ptr = outbuf; out_size = sizeof(outbuf); out_elem_size = 1; out_buf.numBufs = 1; out_buf.bufs = &out_ptr; out_buf.bufferIdentifiers = &out_identifier; out_buf.bufSizes = &out_size; out_buf.bufElSizes = &out_elem_size; if ((err = aacEncEncode(handle, &in_buf, &out_buf, &in_args, &out_args)) != AACENC_OK) { if (err == AACENC_ENCODE_EOF) break; fprintf(stderr, "Encoding failed\n"); return 1; } if (out_args.numOutBytes == 0) continue; fwrite(outbuf, 1, out_args.numOutBytes, out); } free(input_buf); free(convert_buf); fclose(out); wav_read_close(wav); aacEncClose(&handle); return 0; } fdk-aac-0.1.3/missing0000755000175000017500000001533012372262356015014 0ustar00tootstoots00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fdk-aac-0.1.3/m4/0000755000175000017500000000000012372262442013727 5ustar00tootstoots00000000000000fdk-aac-0.1.3/m4/lt~obsolete.m40000644000175000017500000001375612372262346016562 0ustar00tootstoots00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) fdk-aac-0.1.3/m4/ltsugar.m40000644000175000017500000001042412372262346015656 0ustar00tootstoots00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) fdk-aac-0.1.3/m4/ltversion.m40000644000175000017500000000126212372262346016222 0ustar00tootstoots00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) fdk-aac-0.1.3/m4/ltoptions.m40000644000175000017500000003007312372262346016232 0ustar00tootstoots00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) fdk-aac-0.1.3/m4/libtool.m40000644000175000017500000106011112372262345015637 0ustar00tootstoots00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS fdk-aac-0.1.3/libAACdec/0000755000175000017500000000000012372262442015136 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACdec/include/0000755000175000017500000000000012372262442016561 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACdec/include/aacdecoder_lib.h0000644000175000017500000011552212372261464021643 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander ******************************************************************************/ /** * \file aacdecoder_lib.h * \brief FDK AAC decoder library interface header file. * \page INTRO Introduction \section SCOPE Scope This document describes the high-level interface and usage of the ISO/MPEG-2/4 AAC Decoder library developed by the Fraunhofer Institute for Integrated Circuits (IIS). Depending on the library configuration, it implements decoding of AAC-LC (Low-Complexity), HE-AAC (High-Efficiency AAC, v1 and v2), AAC-LD (Low-Delay) and AAC-ELD (Enhanced Low-Delay). All references to SBR (Spectral Band Replication) are only applicable to HE-AAC and AAC-ELD versions of the library. All references to PS (Parametric Stereo) are only applicable to HE-AAC v2 versions of the library. \section DecoderBasics Decoder Basics This document can only give a rough overview about the ISO/MPEG-2 and ISO/MPEG-4 AAC audio coding standard. To understand all the terms in this document, you are encouraged to read the following documents. - ISO/IEC 13818-7 (MPEG-2 AAC), which defines the syntax of MPEG-2 AAC audio bitstreams. - ISO/IEC 14496-3 (MPEG-4 AAC, subpart 1 and 4), which defines the syntax of MPEG-4 AAC audio bitstreams. - Lutzky, Schuller, Gayer, Krämer, Wabnik, "A guideline to audio codec delay", 116th AES Convention, May 8, 2004 MPEG Advanced Audio Coding is based on a time-to-frequency mapping of the signal. The signal is partitioned into overlapping portions and transformed into frequency domain. The spectral components are then quantized and coded.\n An MPEG2 or MPEG4 AAC audio bitstream is composed of frames. Contrary to MPEG-1/2 Layer-3 (mp3), the length of individual frames is not restricted to a fixed number of bytes, but can take on any length between 1 and 768 bytes. \page LIBUSE Library Usage \section InterfaceDescritpion API Description All API header files are located in the folder /include of the release package. They are described in detail in this document. All header files are provided for usage in C/C++ programs. The AAC decoder library API functions are located at aacdecoder_lib.h. In binary releases the decoder core resides in statically linkable libraries called for example libAACdec.a, (Linux) or FDK_aacDec_lib (Microsoft Visual C++). \section Calling_Sequence Calling Sequence For decoding of ISO/MPEG-2/4 AAC or HE-AAC v2 bitstreams the following sequence is mandatory. Input read and output write functions as well as the corresponding open and close functions are left out, since they may be implemented differently according to the user's specific requirements. The example implementation in main.cpp uses file-based input/output, and in such case call mpegFileRead_Open() to open an input file and to allocate memory for the required structures, and the corresponding mpegFileRead_Close() to close opened files and to de-allocate associated structures. mpegFileRead_Open() tries to detect the bitstream format and in case of MPEG-4 file format or Raw Packets file format (a Fraunhofer IIS proprietary format) reads the Audio Specific Config data (ASC). An unsuccessful attempt to recognize the bitstream format requires the user to provide this information manually (see \ref CommandLineUsage). For any other bitstream formats that are usually applicable in streaming applications, the decoder itself will try to synchronize and parse the given bitstream fragment using the FDK transport library. Hence, for streaming applications (without file access) this step is not necessary. -# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder instance. \dontinclude main.cpp \skipline aacDecoder_Open -# If out-of-band config data (Audio Specific Config (ASC) or Stream Mux Config (SMC)) is available, call aacDecoder_ConfigRaw() to pass it to the decoder and before the decoding process starts. If this data is not available in advance, the decoder will get it from the bitstream and configure itself while decoding with aacDecoder_DecodeFrame(). -# Begin decoding loop. \skipline do { -# Read data from bitstream file or stream into a client-supplied input buffer ("inBuffer" in main.cpp). If it is very small like just 4, aacDecoder_DecodeFrame() will repeatedly return ::AAC_DEC_NOT_ENOUGH_BITS until enough bits were fed by aacDecoder_Fill(). Only read data when this buffer has completely been processed and is then empty. For file-based input execute mpegFileRead_Read() or any other implementation with similar functionality. -# Call aacDecoder_Fill() to fill the decoder's internal bitstream input buffer with the client-supplied external bitstream input buffer. \skipline aacDecoder_Fill -# Call aacDecoder_DecodeFrame() which writes decoded PCM audio data to a client-supplied buffer. It is the client's responsibility to allocate a buffer which is large enough to hold this output data. \skipline aacDecoder_DecodeFrame If the bitstream's configuration (number of channels, sample rate, frame size) is not known in advance, you may call aacDecoder_GetStreamInfo() to retrieve a structure containing this information and then initialize an audio output device. In the example main.cpp, if the number of channels or the sample rate has changed since program start or since the previously decoded frame, the audio output device will be re-initialized. If WAVE file output is chosen, a new WAVE file for each new configuration will be created. \skipline aacDecoder_GetStreamInfo -# Repeat steps 5 to 7 until no data to decode is available anymore, or if an error occured. \skipline } while -# Call aacDecoder_Close() to de-allocate all AAC decoder and transport layer structures. \skipline aacDecoder_Close \section BufferSystem Buffer System There are three main buffers in an AAC decoder application. One external input buffer to hold bitstream data from file I/O or elsewhere, one decoder-internal input buffer, and one to hold the decoded output PCM sample data, whereas this output buffer may overlap with the external input buffer. The external input buffer is set in the example framework main.cpp and its size is defined by ::IN_BUF_SIZE. You may freely choose different sizes here. To feed the data to the decoder-internal input buffer, use the function aacDecoder_Fill(). This function returns important information about how many bytes in the external input buffer have not yet been copied into the internal input buffer (variable bytesValid). Once the external buffer has been fully copied, it can be re-filled again. In case you want to re-fill it when there are still unprocessed bytes (bytesValid is unequal 0), you would have to additionally perform a memcpy(), so that just means unnecessary computational overhead and therefore we recommend to re-fill the buffer only when bytesValid is 0. \image latex dec_buffer.png "Lifecycle of the external input buffer" width=9cm The size of the decoder-internal input buffer is set in tpdec_lib.h (see define ::TRANSPORTDEC_INBUF_SIZE). You may choose a smaller size under the following considerations: - each input channel requires 768 bytes - the whole buffer must be of size 2^n So for example a stereo decoder: \f[ TRANSPORTDEC\_INBUF\_SIZE = 2 * 768 = 1536 => 2048 \f] tpdec_lib.h and TRANSPORTDEC_INBUF_SIZE are not part of the decoder's library interface. Therefore only source-code clients may change this setting. If you received a library release, please ask us and we can change this in order to meet your memory requirements. \page OutputFormat Decoder audio output \section OutputFormatObtaining Obtaining channel mapping information The decoded audio output format is indicated by a set of variables of the CStreamInfo structure. While the members sampleRate, frameSize and numChannels might be quite self explaining, pChannelType and pChannelIndices might require some more detailed explanation. These two arrays indicate what is each output channel supposed to be. Both array have CStreamInfo::numChannels cells. Each cell of pChannelType indicates the channel type, described in the enum ::AUDIO_CHANNEL_TYPE defined in FDK_audio.h. The cells of pChannelIndices indicate the sub index among the channels starting with 0 among all channels of the same audio channel type. The indexing scheme is the same as for MPEG-2/4. Thus indices are counted upwards starting from the front direction (thus a center channel if any, will always be index 0). Then the indices count up, starting always with the left side, pairwise from front toward back. For detailed explanation, please refer to ISO/IEC 13818-7:2005(E), chapter 8.5.3.2. In case a Program Config is included in the audio configuration, the channel mapping described within it will be adopted. In case of MPEG-D Surround the channel mapping will follow the same criteria described in ISO/IEC 13818-7:2005(E), but adding corresponding top channels to the channel types front, side and back, in order to avoid any loss of information. \section OutputFormatChange Changing the audio output format The channel interleaving scheme and the actual channel order can be changed at runtime through the parameters ::AAC_PCM_OUTPUT_INTERLEAVED and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING. See the description of those parameters and the decoder library function aacDecoder_SetParam() for more detail. \section OutputFormatExample Channel mapping examples The following examples illustrate the location of individual audio samples in the audio buffer that is passed to aacDecoder_DecodeFrame() and the expected data in the CStreamInfo structure which can be obtained by calling aacDecoder_GetStreamInfo(). \subsection ExamplesStereo Stereo In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 0 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1, a AAC-LC bit stream which has channelConfiguration = 2 in its audio specific config would lead to the following values in CStreamInfo: CStreamInfo::numChannels = 2 CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT } CStreamInfo::pChannelIndices = { 0, 1 } Since ::AAC_PCM_OUTPUT_INTERLEAVED is set to 0, the audio channels will be located as contiguous blocks in the output buffer as follows: \verbatim ... ... \endverbatim Where N equals to CStreamInfo::frameSize . \subsection ExamplesSurround Surround 5.1 In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 1 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1, a AAC-LC bit stream which has channelConfiguration = 6 in its audio specific config, would lead to the following values in CStreamInfo: CStreamInfo::numChannels = 6 CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT, ::ACT_FRONT, ::ACT_LFE, ::ACT_BACK, ::ACT_BACK } CStreamInfo::pChannelIndices = { 1, 2, 0, 0, 0, 1 } Since ::AAC_PCM_OUTPUT_CHANNEL_MAPPING is 1, WAV file channel ordering will be used. For a 5.1 channel scheme, thus the channels would be: front left, front right, center, LFE, surround left, surround right. Thus the third channel is the center channel, receiving the index 0. The other front channels are front left, front right being placed as first and second channels with indices 1 and 2 correspondingly. There is only one LFE, placed as the fourth channel and index 0. Finally both surround channels get the type definition ACT_BACK, and the indices 0 and 1. Since ::AAC_PCM_OUTPUT_INTERLEAVED is set to 1, the audio channels will be placed in the output buffer as follows: \verbatim
...
\endverbatim Where N equals to CStreamInfo::frameSize . \subsection ExamplesArib ARIB coding mode 2/1 In case of ::AAC_PCM_OUTPUT_INTERLEAVED set to 1 and ::AAC_PCM_OUTPUT_CHANNEL_MAPPING set to 1, in case of a ARIB bit stream using coding mode 2/1 as described in ARIB STD-B32 Part 2 Version 2.1-E1, page 61, would lead to the following values in CStreamInfo: CStreamInfo::numChannels = 3 CStreamInfo::pChannelType = { ::ACT_FRONT, ::ACT_FRONT,:: ACT_BACK } CStreamInfo::pChannelIndices = { 0, 1, 0 } The audio channels will be placed as follows in the audio output buffer: \verbatim ... Where N equals to CStreamInfo::frameSize . \endverbatim */ #ifndef AACDECODER_LIB_H #define AACDECODER_LIB_H #include "machine_type.h" #include "FDK_audio.h" #include "genericStds.h" /** * \brief AAC decoder error codes. */ typedef enum { AAC_DEC_OK = 0x0000, /*!< No error occured. Output buffer is valid and error free. */ AAC_DEC_OUT_OF_MEMORY = 0x0002, /*!< Heap returned NULL pointer. Output buffer is invalid. */ AAC_DEC_UNKNOWN = 0x0005, /*!< Error condition is of unknown reason, or from a another module. Output buffer is invalid. */ /* Synchronization errors. Output buffer is invalid. */ aac_dec_sync_error_start = 0x1000, AAC_DEC_TRANSPORT_SYNC_ERROR = 0x1001, /*!< The transport decoder had syncronisation problems. Do not exit decoding. Just feed new bitstream data. */ AAC_DEC_NOT_ENOUGH_BITS = 0x1002, /*!< The input buffer ran out of bits. */ aac_dec_sync_error_end = 0x1FFF, /* Initialization errors. Output buffer is invalid. */ aac_dec_init_error_start = 0x2000, AAC_DEC_INVALID_HANDLE = 0x2001, /*!< The handle passed to the function call was invalid (NULL). */ AAC_DEC_UNSUPPORTED_AOT = 0x2002, /*!< The AOT found in the configuration is not supported. */ AAC_DEC_UNSUPPORTED_FORMAT = 0x2003, /*!< The bitstream format is not supported. */ AAC_DEC_UNSUPPORTED_ER_FORMAT = 0x2004, /*!< The error resilience tool format is not supported. */ AAC_DEC_UNSUPPORTED_EPCONFIG = 0x2005, /*!< The error protection format is not supported. */ AAC_DEC_UNSUPPORTED_MULTILAYER = 0x2006, /*!< More than one layer for AAC scalable is not supported. */ AAC_DEC_UNSUPPORTED_CHANNELCONFIG = 0x2007, /*!< The channel configuration (either number or arrangement) is not supported. */ AAC_DEC_UNSUPPORTED_SAMPLINGRATE = 0x2008, /*!< The sample rate specified in the configuration is not supported. */ AAC_DEC_INVALID_SBR_CONFIG = 0x2009, /*!< The SBR configuration is not supported. */ AAC_DEC_SET_PARAM_FAIL = 0x200A, /*!< The parameter could not be set. Either the value was out of range or the parameter does not exist. */ AAC_DEC_NEED_TO_RESTART = 0x200B, /*!< The decoder needs to be restarted, since the requiered configuration change cannot be performed. */ aac_dec_init_error_end = 0x2FFF, /* Decode errors. Output buffer is valid but concealed. */ aac_dec_decode_error_start = 0x4000, AAC_DEC_TRANSPORT_ERROR = 0x4001, /*!< The transport decoder encountered an unexpected error. */ AAC_DEC_PARSE_ERROR = 0x4002, /*!< Error while parsing the bitstream. Most probably it is corrupted, or the system crashed. */ AAC_DEC_UNSUPPORTED_EXTENSION_PAYLOAD = 0x4003, /*!< Error while parsing the extension payload of the bitstream. The extension payload type found is not supported. */ AAC_DEC_DECODE_FRAME_ERROR = 0x4004, /*!< The parsed bitstream value is out of range. Most probably the bitstream is corrupt, or the system crashed. */ AAC_DEC_CRC_ERROR = 0x4005, /*!< The embedded CRC did not match. */ AAC_DEC_INVALID_CODE_BOOK = 0x4006, /*!< An invalid codebook was signalled. Most probably the bitstream is corrupt, or the system crashed. */ AAC_DEC_UNSUPPORTED_PREDICTION = 0x4007, /*!< Predictor found, but not supported in the AAC Low Complexity profile. Most probably the bitstream is corrupt, or has a wrong format. */ AAC_DEC_UNSUPPORTED_CCE = 0x4008, /*!< A CCE element was found which is not supported. Most probably the bitstream is corrupt, or has a wrong format. */ AAC_DEC_UNSUPPORTED_LFE = 0x4009, /*!< A LFE element was found which is not supported. Most probably the bitstream is corrupt, or has a wrong format. */ AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA = 0x400A, /*!< Gain control data found but not supported. Most probably the bitstream is corrupt, or has a wrong format. */ AAC_DEC_UNSUPPORTED_SBA = 0x400B, /*!< SBA found, but currently not supported in the BSAC profile. */ AAC_DEC_TNS_READ_ERROR = 0x400C, /*!< Error while reading TNS data. Most probably the bitstream is corrupt or the system crashed. */ AAC_DEC_RVLC_ERROR = 0x400D, /*!< Error while decoding error resillient data. */ aac_dec_decode_error_end = 0x4FFF, /* Ancillary data errors. Output buffer is valid. */ aac_dec_anc_data_error_start = 0x8000, AAC_DEC_ANC_DATA_ERROR = 0x8001, /*!< Non severe error concerning the ancillary data handling. */ AAC_DEC_TOO_SMALL_ANC_BUFFER = 0x8002, /*!< The registered ancillary data buffer is too small to receive the parsed data. */ AAC_DEC_TOO_MANY_ANC_ELEMENTS = 0x8003, /*!< More than the allowed number of ancillary data elements should be written to buffer. */ aac_dec_anc_data_error_end = 0x8FFF } AAC_DECODER_ERROR; /** Macro to identify initialization errors. */ #define IS_INIT_ERROR(err) ( (((err)>=aac_dec_init_error_start) && ((err)<=aac_dec_init_error_end)) ? 1 : 0) /** Macro to identify decode errors. */ #define IS_DECODE_ERROR(err) ( (((err)>=aac_dec_decode_error_start) && ((err)<=aac_dec_decode_error_end)) ? 1 : 0) /** Macro to identify if the audio output buffer contains valid samples after calling aacDecoder_DecodeFrame(). */ #define IS_OUTPUT_VALID(err) ( ((err) == AAC_DEC_OK) || IS_DECODE_ERROR(err) ) /** * \brief AAC decoder setting parameters */ typedef enum { AAC_PCM_OUTPUT_INTERLEAVED = 0x0000, /*!< PCM output mode (1: interleaved (default); 0: not interleaved). */ AAC_PCM_OUTPUT_CHANNELS = 0x0001, /*!< Number of PCM output channels (if different from encoded audio channels, downmixing or upmixing is applied). \n -1: Disable up-/downmixing. The decoder output contains the same number of channels as the encoded bitstream. \n 1: The decoder performs a mono matrix mix-down if the encoded audio channels are greater than one. Thus it ouputs always exact one channel. \n 2: The decoder performs a stereo matrix mix-down if the encoded audio channels are greater than two. If the encoded audio channels are smaller than two the decoder duplicates the output. Thus it ouputs always exact two channels. \n */ AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE = 0x0002, /*!< Defines how the decoder processes two channel signals: 0: Leave both signals as they are (default). 1: Create a dual mono output signal from channel 1. 2: Create a dual mono output signal from channel 2. 3: Create a dual mono output signal by mixing both channels (L' = R' = 0.5*Ch1 + 0.5*Ch2). */ AAC_PCM_OUTPUT_CHANNEL_MAPPING = 0x0003, /*!< Output buffer channel ordering. 0: MPEG PCE style order, 1: WAV file channel order (default). */ AAC_CONCEAL_METHOD = 0x0100, /*!< Error concealment: Processing method. \n 0: Spectral muting. \n 1: Noise substitution (see ::CONCEAL_NOISE). \n 2: Energy interpolation (adds additional signal delay of one frame, see ::CONCEAL_INTER). \n */ AAC_DRC_BOOST_FACTOR = 0x0200, /*!< Dynamic Range Control: Scaling factor for boosting gain values. Defines how the boosting DRC factors (conveyed in the bitstream) will be applied to the decoded signal. The valid values range from 0 (don't apply boost factors) to 127 (fully apply all boosting factors). */ AAC_DRC_ATTENUATION_FACTOR = 0x0201, /*!< Dynamic Range Control: Scaling factor for attenuating gain values. Same as AAC_DRC_BOOST_FACTOR but for attenuating DRC factors. */ AAC_DRC_REFERENCE_LEVEL = 0x0202, /*!< Dynamic Range Control: Target reference level. Defines the level below full-scale (quantized in steps of 0.25dB) to which the output audio signal will be normalized to by the DRC module. The valid values range from 0 (full-scale) to 127 (31.75 dB below full-scale). The value smaller than 0 switches off normalization. */ AAC_DRC_HEAVY_COMPRESSION = 0x0203, /*!< Dynamic Range Control: En-/Disable DVB specific heavy compression (aka RF mode). If set to 1, the decoder will apply the compression values from the DVB specific ancillary data field. At the same time the MPEG-4 Dynamic Range Control tool will be disabled. By default heavy compression is disabled. */ AAC_QMF_LOWPOWER = 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing mode. \n -1: Use internal default. Implies MPEG Surround partially complex accordingly. \n 0: Use complex QMF data mode. \n 1: Use real (low power) QMF data mode. \n */ AAC_MPEGS_ENABLE = 0x0500, /*!< MPEG Surround: Allow/Disable decoding of MPS content. Available only for decoders with MPEG Surround support. */ AAC_TPDEC_CLEAR_BUFFER = 0x0603 /*!< Clear internal bit stream buffer of transport layers. The decoder will start decoding at new data passed after this event and any previous data is discarded. */ } AACDEC_PARAM; /** * \brief This structure gives information about the currently decoded audio data. * All fields are read-only. */ typedef struct { /* These three members are the only really relevant ones for the user. */ INT sampleRate; /*!< The samplerate in Hz of the fully decoded PCM audio signal (after SBR processing). */ INT frameSize; /*!< The frame size of the decoded PCM audio signal. \n 1024 or 960 for AAC-LC \n 2048 or 1920 for HE-AAC (v2) \n 512 or 480 for AAC-LD and AAC-ELD */ INT numChannels; /*!< The number of output audio channels in the decoded and interleaved PCM audio signal. */ AUDIO_CHANNEL_TYPE *pChannelType; /*!< Audio channel type of each output audio channel. */ UCHAR *pChannelIndices; /*!< Audio channel index for each output audio channel. See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a program_config_element() */ /* Decoder internal members. */ INT aacSampleRate; /*!< sampling rate in Hz without SBR (from configuration info). */ INT profile; /*!< MPEG-2 profile (from file header) (-1: not applicable (e. g. MPEG-4)). */ AUDIO_OBJECT_TYPE aot; /*!< Audio Object Type (from ASC): is set to the appropriate value for MPEG-2 bitstreams (e. g. 2 for AAC-LC). */ INT channelConfig; /*!< Channel configuration (0: PCE defined, 1: mono, 2: stereo, ... */ INT bitRate; /*!< Instantaneous bit rate. */ INT aacSamplesPerFrame; /*!< Samples per frame for the AAC core (from ASC). \n 1024 or 960 for AAC-LC \n 512 or 480 for AAC-LD and AAC-ELD */ INT aacNumChannels; /*!< The number of audio channels after AAC core processing (before PS or MPS processing). CAUTION: This are not the final number of output channels! */ AUDIO_OBJECT_TYPE extAot; /*!< Extension Audio Object Type (from ASC) */ INT extSamplingRate; /*!< Extension sampling rate in Hz (from ASC) */ UINT flags; /*!< Copy if internal flags. Only to be written by the decoder, and only to be read externally. */ SCHAR epConfig; /*!< epConfig level (from ASC): only level 0 supported, -1 means no ER (e. g. AOT=2, MPEG-2 AAC, etc.) */ /* Statistics */ INT numLostAccessUnits; /*!< This integer will reflect the estimated amount of lost access units in case aacDecoder_DecodeFrame() returns AAC_DEC_TRANSPORT_SYNC_ERROR. It will be < 0 if the estimation failed. */ UINT numTotalBytes; /*!< This is the number of total bytes that have passed through the decoder. */ UINT numBadBytes; /*!< This is the number of total bytes that were considered with errors from numTotalBytes. */ UINT numTotalAccessUnits; /*!< This is the number of total access units that have passed through the decoder. */ UINT numBadAccessUnits; /*!< This is the number of total access units that were considered with errors from numTotalBytes. */ } CStreamInfo; typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; #ifdef __cplusplus extern "C" { #endif /** * \brief Initialize ancillary data buffer. * * \param self AAC decoder handle. * \param buffer Pointer to (external) ancillary data buffer. * \param size Size of the buffer pointed to by buffer. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_AncDataInit ( HANDLE_AACDECODER self, UCHAR *buffer, int size ); /** * \brief Get one ancillary data element. * * \param self AAC decoder handle. * \param index Index of the ancillary data element to get. * \param ptr Pointer to a buffer receiving a pointer to the requested ancillary data element. * \param size Pointer to a buffer receiving the length of the requested ancillary data element. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_AncDataGet ( HANDLE_AACDECODER self, int index, UCHAR **ptr, int *size ); /** * \brief Set one single decoder parameter. * * \param self AAC decoder handle. * \param param Parameter to be set. * \param value Parameter value. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_SetParam ( const HANDLE_AACDECODER self, const AACDEC_PARAM param, const INT value ); /** * \brief Get free bytes inside decoder internal buffer * \param self Handle of AAC decoder instance * \param pFreeBytes Pointer to variable receving amount of free bytes inside decoder internal buffer * \return Error code */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER self, UINT *pFreeBytes); /** * \brief Open an AAC decoder instance * \param transportFmt The transport type to be used * \return AAC decoder handle */ LINKSPEC_H HANDLE_AACDECODER aacDecoder_Open ( TRANSPORT_TYPE transportFmt, UINT nrOfLayers ); /** * \brief Explicitly configure the decoder by passing a raw AudioSpecificConfig (ASC) or a StreamMuxConfig (SMC), * contained in a binary buffer. This is required for MPEG-4 and Raw Packets file format bitstreams * as well as for LATM bitstreams with no in-band SMC. If the transport format is LATM with or without * LOAS, configuration is assumed to be an SMC, for all other file formats an ASC. * * \param self AAC decoder handle. * \param conf Pointer to an unsigned char buffer containing the binary configuration buffer (either ASC or SMC). * \param length Length of the configuration buffer in bytes. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_ConfigRaw ( HANDLE_AACDECODER self, UCHAR *conf[], const UINT length[] ); /** * \brief Fill AAC decoder's internal input buffer with bitstream data from the external input buffer. * The function only copies such data as long as the decoder-internal input buffer is not full. * So it grabs whatever it can from pBuffer and returns information (bytesValid) so that at a * subsequent call of %aacDecoder_Fill(), the right position in pBuffer can be determined to * grab the next data. * * \param self AAC decoder handle. * \param pBuffer Pointer to external input buffer. * \param bufferSize Size of external input buffer. This argument is required because decoder-internally * we need the information to calculate the offset to pBuffer, where the next * available data is, which is then fed into the decoder-internal buffer (as much * as possible). Our example framework implementation fills the buffer at pBuffer * again, once it contains no available valid bytes anymore (meaning bytesValid equal 0). * \param bytesValid Number of bitstream bytes in the external bitstream buffer that have not yet been * copied into the decoder's internal bitstream buffer by calling this function. * The value is updated according to the amount of newly copied bytes. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_Fill ( HANDLE_AACDECODER self, UCHAR *pBuffer[], const UINT bufferSize[], UINT *bytesValid ); #define AACDEC_CONCEAL 1 /*!< Flag for aacDecoder_DecodeFrame(): do not consider new input data. Do concealment. */ #define AACDEC_FLUSH 2 /*!< Flag for aacDecoder_DecodeFrame(): Do not consider new input data. Flush filterbanks (output delayed audio). */ #define AACDEC_INTR 4 /*!< Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data discontinuity. Resync any internals as necessary. */ #define AACDEC_CLRHIST 8 /*!< Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and history buffers. Caution: This can cause discontinuities in the output signal. */ /** * \brief Decode one audio frame * * \param self AAC decoder handle. * \param pTimeData Pointer to external output buffer where the decoded PCM samples will be stored into. * \param flags Bit field with flags for the decoder: \n * (flags & AACDEC_CONCEAL) == 1: Do concealment. \n * (flags & AACDEC_FLUSH) == 2: Discard input data. Flush filter banks (output delayed audio). \n * (flags & AACDEC_INTR) == 4: Input data is discontinuous. Resynchronize any internals as necessary. * \return Error code. */ LINKSPEC_H AAC_DECODER_ERROR aacDecoder_DecodeFrame ( HANDLE_AACDECODER self, INT_PCM *pTimeData, const INT timeDataSize, const UINT flags ); /** * \brief De-allocate all resources of an AAC decoder instance. * * \param self AAC decoder handle. * \return void */ LINKSPEC_H void aacDecoder_Close ( HANDLE_AACDECODER self ); /** * \brief Get CStreamInfo handle from decoder. * * \param self AAC decoder handle. * \return Reference to requested CStreamInfo. */ LINKSPEC_H CStreamInfo* aacDecoder_GetStreamInfo( HANDLE_AACDECODER self ); /** * \brief Get decoder library info. * * \param info Pointer to an allocated LIB_INFO structure. * \return 0 on success */ LINKSPEC_H INT aacDecoder_GetLibInfo( LIB_INFO *info ); #ifdef __cplusplus } #endif #endif /* AACDECODER_LIB_H */ fdk-aac-0.1.3/libAACdec/src/0000755000175000017500000000000012372262444015727 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACdec/src/rvlc.h0000644000175000017500000001502412372261464017051 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Defines structures and prototypes for RVLC \author Robert Weidner */ #ifndef RVLC_H #define RVLC_H #include "aacdecoder.h" #include "channel.h" #include "rvlc_info.h" /* ------------------------------------------------------------------- */ /* errorLogRvlc: A word of 32 bits used for logging possible errors */ /* within RVLC in case of distorted bitstreams. */ /* ------------------------------------------------------------------- */ #define RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID 0x80000000 /* ESC-Dec During RVLC-Escape-decoding there have been more bits decoded as there are available */ #define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD 0x40000000 /* RVL-Dec negative sum-bitcounter during RVL-fwd-decoding (long+shrt) */ #define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD 0x20000000 /* RVL-Dec negative sum-bitcounter during RVL-fwd-decoding (long+shrt) */ #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD 0x08000000 /* RVL-Dec forbidden codeword detected fwd (long+shrt) */ #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD 0x04000000 /* RVL-Dec forbidden codeword detected bwd (long+shrt) */ void CRvlc_Read (CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs); void CRvlc_Decode (CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, HANDLE_FDK_BITSTREAM bs); /** * \brief performe sanity checks to the channel data corresponding to one channel element. * \param pAacDecoderChannelInfo * \param pAacDecoderStaticChannelInfo * \param elChannels amount of channels of the channel element. */ void CRvlc_ElementCheck ( CAacDecoderChannelInfo *pAacDecoderChannelInfo[], CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], const UINT flags, const INT elChannels ); #endif /* RVLC_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcr_bit.h0000644000175000017500000001237712372261464021005 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Bitstream reading prototypes *******************************************************************************/ #ifndef _AACDEC_HCR_BIT_H_ #define _AACDEC_HCR_BIT_H_ #include "aacdec_hcr.h" UCHAR ToggleReadDirection(UCHAR readDirection); UINT HcrGetABitFromBitstream(HANDLE_FDK_BITSTREAM bs, USHORT *pLeftStartOfSegment, USHORT *pRightStartOfSegment, UCHAR readDirection); #endif /* _AACDEC_HCR_BIT_H_ */ fdk-aac-0.1.3/libAACdec/src/conceal.h0000644000175000017500000001617112372261464017513 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: independent channel concealment ******************************************************************************/ #ifndef _CONCEAL_H_ #define _CONCEAL_H_ #include "aacdecoder_lib.h" #include "channelinfo.h" #define AACDEC_CONCEAL_PARAM_NOT_SPECIFIED ( 0xFFFE ) void CConcealment_InitCommonData (CConcealParams *pConcealCommonData); void CConcealment_InitChannelData (CConcealmentInfo *hConcealmentInfo, CConcealParams *pConcealCommonData, int samplesPerFrame); CConcealmentMethod CConcealment_GetMethod (CConcealParams *pConcealCommonData); UINT CConcealment_GetDelay (CConcealParams *pConcealCommonData); AAC_DECODER_ERROR CConcealment_SetParams (CConcealParams *concealParams, int method, int fadeOutSlope, int fadeInSlope, int muteRelease, int comfNoiseLevel); CConcealmentState CConcealment_GetState (CConcealmentInfo *hConcealmentInfo); AAC_DECODER_ERROR CConcealment_SetAttenuation (CConcealParams *concealParams, SHORT *fadeOutAttenuationVector, SHORT *fadeInAttenuationVector); void CConcealment_Store (CConcealmentInfo *hConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ); int CConcealment_Apply (CConcealmentInfo *hConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, const UCHAR lastLpdMode, const int FrameOk, const UINT flags); FIXP_DBL CConcealment_GetFadeFactor (CConcealmentInfo *hConcealmentInfo, const int fPreviousFactor); int CConcealment_GetLastFrameOk (CConcealmentInfo *hConcealmentInfo, const int fBeforeApply); #endif /* #ifndef _CONCEAL_H_ */ fdk-aac-0.1.3/libAACdec/src/rvlcbit.cpp0000644000175000017500000001374612372261464020114 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief RVLC bitstream reading \author Robert Weidner */ #include "rvlcbit.h" /*--------------------------------------------------------------------------------------------- function: rvlcReadBitFromBitstream description: This function returns a bit from the bitstream according to read direction. It is called very often, therefore it makes sense to inline it (runtime). ----------------------------------------------------------------------------------------------- input: - bitstream - pPosition - readDirection ----------------------------------------------------------------------------------------------- return: - bit from bitstream -------------------------------------------------------------------------------------------- */ UCHAR rvlcReadBitFromBitstream (HANDLE_FDK_BITSTREAM bs, USHORT *pPosition, UCHAR readDirection) { UINT bit; INT readBitOffset = *pPosition-FDKgetBitCnt(bs); if( readBitOffset ) { FDKpushBiDirectional(bs, readBitOffset); } if (readDirection == FWD) { bit = FDKreadBits(bs, 1); *pPosition += 1; } else { /* to be replaced with a brother function of FDKreadBits() */ bit = FDKreadBits(bs, 1); FDKpushBack(bs, 2); *pPosition -= 1; } return (bit); } fdk-aac-0.1.3/libAACdec/src/aacdec_drc_types.h0000644000175000017500000001644012372261464021362 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Dynamic range control (DRC) global data types ******************************************************************************/ #ifndef AACDEC_DRC_TYPES_H #define AACDEC_DRC_TYPES_H #include "common_fix.h" #define MAX_DRC_THREADS ( 3 ) /* Heavy compression value is handled just like MPEG DRC data */ #define MAX_DRC_BANDS ( 16 ) /* 2^LEN_DRC_BAND_INCR (LEN_DRC_BAND_INCR = 4) */ /** * \brief DRC module global data types */ typedef enum { UNKNOWN_PAYLOAD = 0, MPEG_DRC_EXT_DATA = 1, DVB_DRC_ANC_DATA = 2 } AACDEC_DRC_PAYLOAD_TYPE; typedef struct { UINT expiryCount; UINT numBands; USHORT bandTop[MAX_DRC_BANDS]; SHORT drcInterpolationScheme; UCHAR drcValue[MAX_DRC_BANDS]; SCHAR drcDataType; } CDrcChannelData; typedef struct { UINT excludedChnsMask; SCHAR progRefLevel; SCHAR pceInstanceTag; CDrcChannelData channelData; } CDrcPayload; typedef struct { FIXP_DBL cut; /* The attenuation scale factor currently used. */ FIXP_DBL usrCut; /* The latest attenuation scale factor set by user. */ FIXP_DBL boost; /* The boost scale factor currently used. */ FIXP_DBL usrBoost; /* The latest boost scale factor set by user. */ UINT expiryFrame; SCHAR targetRefLevel; UCHAR bsDelayEnable; UCHAR applyHeavyCompression; } CDrcParams; typedef struct { CDrcParams params; /* Module parameters that can be set by user (via SetParam API function) */ UCHAR enable; /* Switch that controls dynamic range processing */ UCHAR digitalNorm; /* Switch to en-/disable reference level normalization in digital domain */ USHORT numPayloads; /* The number of DRC data payload elements found within frame */ USHORT numThreads; /* The number of DRC data threads extracted from the found payload elements */ SCHAR progRefLevel; /* Program reference level for all channels */ UINT prlExpiryCount; /* Counter that can be used to monitor the life time of the program reference level. */ UCHAR dvbAncDataAvailable; /* Flag that indicates whether DVB ancillary data is present or not */ UINT dvbAncDataPosition; /* Used to store the DVB ancillary data payload position in the bitstream (only one per frame) */ UINT drcPayloadPosition[MAX_DRC_THREADS]; /* Used to store the DRC payload positions in the bitstream */ } CDrcInfo; typedef CDrcInfo *HANDLE_AAC_DRC; #endif /* AACDEC_DRC_TYPES_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_tns.cpp0000644000175000017500000003343012372261464020523 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: temporal noise shaping tool ******************************************************************************/ #include "aacdec_tns.h" #include "aac_rom.h" #include "FDK_bitstream.h" #include "channelinfo.h" /*! \brief Reset tns data The function resets the tns data \return none */ void CTns_Reset(CTnsData *pTnsData) { /* Note: the following FDKmemclear should not be required. */ FDKmemclear(pTnsData->Filter, TNS_MAX_WINDOWS*TNS_MAXIMUM_FILTERS*sizeof(CFilter)); FDKmemclear(pTnsData->NumberOfFilters, TNS_MAX_WINDOWS*sizeof(UCHAR)); pTnsData->DataPresent = 0; pTnsData->Active = 0; } void CTns_ReadDataPresentFlag(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */ CTnsData *pTnsData) /*!< pointer to aac decoder channel info */ { pTnsData->DataPresent = (UCHAR) FDKreadBits(bs,1); } /*! \brief Read tns data from bitstream The function reads the elements for tns from the bitstream. \return none */ AAC_DECODER_ERROR CTns_Read(HANDLE_FDK_BITSTREAM bs, CTnsData *pTnsData, const CIcsInfo *pIcsInfo, const UINT flags) { UCHAR n_filt,order; UCHAR length,coef_res,coef_compress; UCHAR window; UCHAR wins_per_frame = GetWindowsPerFrame(pIcsInfo); UCHAR isLongFlag = IsLongBlock(pIcsInfo); AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; if (!pTnsData->DataPresent) { return ErrorStatus; } for (window = 0; window < wins_per_frame; window++) { pTnsData->NumberOfFilters[window] = n_filt = (UCHAR) FDKreadBits(bs, isLongFlag ? 2 : 1); if (pTnsData->NumberOfFilters[window] > TNS_MAXIMUM_FILTERS){ pTnsData->NumberOfFilters[window] = n_filt = TNS_MAXIMUM_FILTERS; } if (n_filt) { int index; UCHAR nextstopband; coef_res = (UCHAR) FDKreadBits(bs,1); nextstopband = GetScaleFactorBandsTotal(pIcsInfo); for (index=0; index < n_filt; index++) { CFilter *filter = &pTnsData->Filter[window][index]; length = (UCHAR)FDKreadBits(bs, isLongFlag ? 6 : 4); if (length > nextstopband){ length = nextstopband; } filter->StartBand = nextstopband - length; filter->StopBand = nextstopband; nextstopband = filter->StartBand; { filter->Order = order = (UCHAR) FDKreadBits(bs, isLongFlag ? 5 : 3); } if (filter->Order > TNS_MAXIMUM_ORDER){ filter->Order = order = TNS_MAXIMUM_ORDER; } if (order) { UCHAR coef,s_mask; UCHAR i; SCHAR n_mask; static const UCHAR sgn_mask[] = { 0x2, 0x4, 0x8 }; static const SCHAR neg_mask[] = { ~0x3, ~0x7, ~0xF }; filter->Direction = FDKreadBits(bs,1) ? -1 : 1; coef_compress = (UCHAR) FDKreadBits(bs,1); filter->Resolution = coef_res + 3; s_mask = sgn_mask[coef_res + 1 - coef_compress]; n_mask = neg_mask[coef_res + 1 - coef_compress]; for (i=0; i < order; i++) { coef = (UCHAR) FDKreadBits(bs,filter->Resolution - coef_compress); filter->Coeff[i] = (coef & s_mask) ? (coef | n_mask) : coef; } } } } } pTnsData->Active = 1; return ErrorStatus; } static void CTns_Filter (FIXP_DBL *spec, int size, int inc, FIXP_TCC coeff [], int order) { // - Simple all-pole filter of order "order" defined by // y(n) = x(n) - a(2)*y(n-1) - ... - a(order+1)*y(n-order) // // - The state variables of the filter are initialized to zero every time // // - The output data is written over the input data ("in-place operation") // // - An input vector of "size" samples is processed and the index increment // to the next data sample is given by "inc" int i,j,N; FIXP_DBL *pSpec; FIXP_DBL maxVal=FL2FXCONST_DBL(0.0); INT s; FDK_ASSERT(order <= TNS_MAXIMUM_ORDER); C_ALLOC_SCRATCH_START(state, FIXP_DBL, TNS_MAXIMUM_ORDER); FDKmemclear(state, order*sizeof(FIXP_DBL)); for (i=0; i FL2FXCONST_DBL(0.03125*0.70710678118) ) s = fixMax(CntLeadingZeros(maxVal)-6,0); else s = fixMax(CntLeadingZeros(maxVal)-5,0); s = fixMin(s,2); s = s-1; if (inc == -1) pSpec = &spec[size - 1]; else pSpec = &spec[0]; FIXP_TCC *pCoeff; #define FIRST_PART_FLTR \ FIXP_DBL x, *pState = state; \ pCoeff = coeff; \ \ if (s < 0) \ x = (pSpec [0]>>1) + fMultDiv2 (*pCoeff++, pState [0]) ; \ else \ x = (pSpec [0]<> s; \ *pState =(-x) << 1; \ pSpec += inc ; if (order>8) { N = (order-1)&7; for (i = size ; i != 0 ; i--) { FIRST_PART_FLTR for (j = N; j > 0 ; j--) { INNER_FLTR_INLINE } INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE LAST_PART_FLTR } } else if (order>4) { N = (order-1)&3; for (i = size ; i != 0 ; i--) { FIRST_PART_FLTR for (j = N; j > 0 ; j--) { INNER_FLTR_INLINE } INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE INNER_FLTR_INLINE LAST_PART_FLTR } } else { N = order-1; for (i = size ; i != 0 ; i--) { FIRST_PART_FLTR for (j = N; j > 0 ; j--) { INNER_FLTR_INLINE } LAST_PART_FLTR } } C_ALLOC_SCRATCH_END(state, FIXP_DBL, TNS_MAXIMUM_ORDER); } /*! \brief Apply tns to spectral lines The function applies the tns to the spectrum, \return none */ void CTns_Apply ( CTnsData *RESTRICT pTnsData, /*!< pointer to aac decoder info */ const CIcsInfo *pIcsInfo, SPECTRAL_PTR pSpectralCoefficient, const SamplingRateInfo *pSamplingRateInfo, const INT granuleLength ) { int window,index,start,stop,size; if (pTnsData->Active) { C_AALLOC_SCRATCH_START(coeff, FIXP_TCC, TNS_MAXIMUM_ORDER); for (window=0; window < GetWindowsPerFrame(pIcsInfo); window++) { FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window, granuleLength); for (index=0; index < pTnsData->NumberOfFilters[window]; index++) { CFilter *RESTRICT filter = &pTnsData->Filter[window][index]; if (filter->Order > 0) { FIXP_TCC *pCoeff; int tns_max_bands; pCoeff = &coeff[filter->Order-1]; if (filter->Resolution == 3) { int i; for (i=0; i < filter->Order; i++) *pCoeff-- = FDKaacDec_tnsCoeff3[filter->Coeff[i]+4]; } else { int i; for (i=0; i < filter->Order; i++) *pCoeff-- = FDKaacDec_tnsCoeff4[filter->Coeff[i]+8]; } switch (granuleLength) { case 480: tns_max_bands = tns_max_bands_tbl_480[pSamplingRateInfo->samplingRateIndex]; break; case 512: tns_max_bands = tns_max_bands_tbl_512[pSamplingRateInfo->samplingRateIndex]; break; default: tns_max_bands = GetMaximumTnsBands(pIcsInfo, pSamplingRateInfo->samplingRateIndex); break; } start = fixMin( fixMin(filter->StartBand, tns_max_bands), GetScaleFactorBandsTransmitted(pIcsInfo) ); start = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo)[start]; stop = fixMin( fixMin(filter->StopBand, tns_max_bands), GetScaleFactorBandsTransmitted(pIcsInfo) ); stop = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo)[stop]; size = stop - start; if (size > 0) { CTns_Filter(&pSpectrum[start], size, filter->Direction, coeff, filter->Order ); } } } } C_AALLOC_SCRATCH_END(coeff, FIXP_TCC, TNS_MAXIMUM_ORDER); } } fdk-aac-0.1.3/libAACdec/src/conceal.cpp0000644000175000017500000017272612372261464020057 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: independent channel concealment ******************************************************************************/ /*! \page concealment AAC core concealment This AAC core implementation includes a concealment function, which can be enabled using the several defines during compilation. There are various tests inside the core, starting with simple CRC tests and ending in a variety of plausibility checks. If such a check indicates an invalid bitstream, then concealment is applied. Concealment is also applied when the calling main program indicates a distorted or missing data frame using the frameOK flag. This is used for error detection on the transport layer. (See below) There are three concealment-modes: 1) Muting: The spectral data is simply set to zero in case of an detected error. 2) Noise substitution: In case of an detected error, concealment copies the last frame and adds attenuates the spectral data. For this mode you have to set the #CONCEAL_NOISE define. Noise substitution adds no additional delay. 3) Interpolation: The interpolation routine swaps the spectral data from the previous and the current frame just before the final frequency to time conversion. In case a single frame is corrupted, concealmant interpolates between the last good and the first good frame to create the spectral data for the missing frame. If multiple frames are corrupted, concealment implements first a fade out based on slightly modified spectral values from the last good frame. As soon as good frames are available, concealmant fades in the new spectral data. For this mode you have to set the #CONCEAL_INTER define. Note that in this case, you also need to set #SBR_BS_DELAY_ENABLE, which basically adds approriate delay in the SBR decoder. Note that the Interpolating-Concealment increases the delay of your decoder by one frame and that it does require additional resources such as memory and computational complexity.

How concealment can be used with errors on the transport layer

Many errors can or have to be detected on the transport layer. For example in IP based systems packet loss can occur. The transport protocol used should indicate such packet loss by inserting an empty frame with frameOK=0. */ #include "conceal.h" #include "aac_rom.h" #include "genericStds.h" /* PNS (of block) */ #include "aacdec_pns.h" #include "block.h" #include "FDK_tools_rom.h" #define CONCEAL_DFLT_COMF_NOISE_LEVEL ( 46 ) /* ~= -70 dB */ /* default settings */ #define CONCEAL_DFLT_FADEOUT_FRAMES ( 5 ) #define CONCEAL_DFLT_FADEIN_FRAMES ( 5 ) #define CONCEAL_DFLT_MUTE_RELEASE_FRAMES ( 3 ) #define CONCEAL_DFLT_FADE_FACTOR ( 0.707106781186548f ) /* 1/sqrt(2) */ /* some often used constants: */ #define FIXP_ZERO FL2FXCONST_DBL(0.0f) #define FIXP_ONE FL2FXCONST_DBL(1.0f) #define FIXP_FL_CORRECTION FL2FXCONST_DBL(0.53333333333333333f) /* For parameter conversion */ #define CONCEAL_PARAMETER_BITS ( 8 ) #define CONCEAL_MAX_QUANT_FACTOR ( (1<method = ConcealMethodInter; pConcealCommonData->numFadeOutFrames = CONCEAL_DFLT_FADEOUT_FRAMES; pConcealCommonData->numFadeInFrames = CONCEAL_DFLT_FADEIN_FRAMES; pConcealCommonData->numMuteReleaseFrames = CONCEAL_DFLT_MUTE_RELEASE_FRAMES; pConcealCommonData->comfortNoiseLevel = CONCEAL_DFLT_COMF_NOISE_LEVEL; /* Init fade factors (symetric) */ pConcealCommonData->fadeOutFactor[0] = FL2FXCONST_SGL( CONCEAL_DFLT_FADE_FACTOR ); pConcealCommonData->fadeInFactor[0] = pConcealCommonData->fadeOutFactor[0]; for (i = 1; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { pConcealCommonData->fadeOutFactor[i] = FX_DBL2FX_SGL(fMult(pConcealCommonData->fadeOutFactor[i-1],FL2FXCONST_SGL(CONCEAL_DFLT_FADE_FACTOR))); pConcealCommonData->fadeInFactor[i] = pConcealCommonData->fadeOutFactor[i]; } } } /*! \brief Get current concealment method. \pConcealCommonData Pointer to common concealment data (for all channels) \return Concealment method. */ CConcealmentMethod CConcealment_GetMethod( CConcealParams *pConcealCommonData ) { CConcealmentMethod method = ConcealMethodNone; if (pConcealCommonData != NULL) { method = pConcealCommonData->method; } return (method); } /*! \brief Init concealment information for each channel The function initializes the concealment information. Two methods can be chosen: 0 = interpolation method (adds delay) 1 = noise substitution (no delay, low complexity) \return none */ void CConcealment_InitChannelData ( CConcealmentInfo *pConcealChannelInfo, CConcealParams *pConcealCommonData, int samplesPerFrame ) { int i; pConcealChannelInfo->pConcealParams = pConcealCommonData; FDKmemclear(pConcealChannelInfo->spectralCoefficient, 1024 * sizeof(FIXP_CNCL)); for (i = 0; i < 8; i++) { pConcealChannelInfo->specScale[i] = 0; } pConcealChannelInfo->iRandomPhase = 0; pConcealChannelInfo->windowSequence = 0; pConcealChannelInfo->windowShape = 0; pConcealChannelInfo->prevFrameOk[0] = 1; pConcealChannelInfo->prevFrameOk[1] = 1; pConcealChannelInfo->cntFadeFrames = 0; pConcealChannelInfo->cntValidFrames = 0; pConcealChannelInfo->concealState = ConcealState_Ok; } /*! \brief Set error concealment parameters \concealParams \method \fadeOutSlope \fadeInSlope \muteRelease \comfNoiseLevel \return none */ AAC_DECODER_ERROR CConcealment_SetParams ( CConcealParams *concealParams, int method, int fadeOutSlope, int fadeInSlope, int muteRelease, int comfNoiseLevel ) { /* set concealment technique */ if (method != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { switch ((CConcealmentMethod)method) { case ConcealMethodMute: case ConcealMethodNoise: case ConcealMethodInter: /* Be sure to enable delay adjustment of SBR decoder! */ if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } else { /* set param */ concealParams->method = (CConcealmentMethod)method; } break; default: return AAC_DEC_SET_PARAM_FAIL; } } /* set number of frames for fade-out slope */ if (fadeOutSlope != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { if ( (fadeOutSlope < CONCEAL_MAX_NUM_FADE_FACTORS) && (fadeOutSlope >= 0) ) { if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } else { /* set param */ concealParams->numFadeOutFrames = fadeOutSlope; } } else { return AAC_DEC_SET_PARAM_FAIL; } } /* set number of frames for fade-in slope */ if (fadeInSlope != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { if ( (fadeInSlope < CONCEAL_MAX_NUM_FADE_FACTORS) && (fadeInSlope >= 1) ) { if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } else { /* set param */ concealParams->numFadeInFrames = fadeInSlope; } } else { return AAC_DEC_SET_PARAM_FAIL; } } /* set number of error-free frames after which the muting will be released */ if (muteRelease != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { if ( (muteRelease < (CONCEAL_MAX_NUM_FADE_FACTORS<<1)) && (muteRelease >= 0) ) { if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } else { /* set param */ concealParams->numMuteReleaseFrames = muteRelease; } } else { return AAC_DEC_SET_PARAM_FAIL; } } /* set confort noise level which will be inserted while in state 'muting' */ if (comfNoiseLevel != AACDEC_CONCEAL_PARAM_NOT_SPECIFIED) { if ( (comfNoiseLevel < -1) || (comfNoiseLevel > 127) ) { return AAC_DEC_SET_PARAM_FAIL; } if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } else { concealParams->comfortNoiseLevel = comfNoiseLevel; } } return (AAC_DEC_OK); } /*! \brief Set fade-out/in attenuation factor vectors \concealParams \fadeOutAttenuationVector \fadeInAttenuationVector \return 0 if OK all other values indicate errors */ AAC_DECODER_ERROR CConcealment_SetAttenuation ( CConcealParams *concealParams, SHORT *fadeOutAttenuationVector, SHORT *fadeInAttenuationVector ) { if ( (fadeOutAttenuationVector == NULL) && (fadeInAttenuationVector == NULL) ) { return AAC_DEC_SET_PARAM_FAIL; } /* Fade-out factors */ if (fadeOutAttenuationVector != NULL) { int i; /* check quantized factors first */ for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { if ((fadeOutAttenuationVector[i] < 0) || (fadeOutAttenuationVector[i] > CONCEAL_MAX_QUANT_FACTOR)) { return AAC_DEC_SET_PARAM_FAIL; } } if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } /* now dequantize factors */ for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { concealParams->fadeOutFactor[i] = FX_DBL2FX_SGL( fLdPow( CONCEAL_MIN_ATTENUATION_FACTOR_025_LD, 0, (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0/2.0)>>(CONCEAL_PARAMETER_BITS-1)) * (INT)fadeOutAttenuationVector[i]), CONCEAL_PARAMETER_BITS ) ); } } /* Fade-in factors */ if (fadeInAttenuationVector != NULL) { int i; /* check quantized factors first */ for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { if ((fadeInAttenuationVector[i] < 0) || (fadeInAttenuationVector[i] > CONCEAL_MAX_QUANT_FACTOR)) { return AAC_DEC_SET_PARAM_FAIL; } } if (concealParams == NULL) { return AAC_DEC_INVALID_HANDLE; } /* now dequantize factors */ for (i = 0; i < CONCEAL_MAX_NUM_FADE_FACTORS; i++) { concealParams->fadeInFactor[i] = FX_DBL2FX_SGL( fLdPow( CONCEAL_MIN_ATTENUATION_FACTOR_025_LD, 0, (FIXP_DBL)((INT)(FIXP_ONE>>CONCEAL_PARAMETER_BITS) * (INT)fadeInAttenuationVector[i]), CONCEAL_PARAMETER_BITS ) ); } } return (AAC_DEC_OK); } /*! \brief Get state of concealment module. \pConcealChannelInfo \return Concealment state. */ CConcealmentState CConcealment_GetState ( CConcealmentInfo *pConcealChannelInfo ) { CConcealmentState state = ConcealState_Ok; if (pConcealChannelInfo != NULL) { state = pConcealChannelInfo->concealState; } return (state); } static void CConcealment_fakePnsData ( CPnsData *pPnsData, CIcsInfo *pIcsInfo, const SamplingRateInfo *pSamplingRateInfo, SHORT *pSpecScale, SHORT *pScaleFactor, const int level ) { CPnsInterChannelData *pInterChannelData = pPnsData->pPnsInterChannelData; int pnsBand, band, group, win; //int delta = 0; int windowsPerFrame = GetWindowsPerFrame(pIcsInfo); int refLevel = (windowsPerFrame > 1) ? 82 : 91; FDK_ASSERT(level >= 0 && level <= 127); for (win = 0; win < windowsPerFrame; win++) { pSpecScale[win] = 31; } /* fake ICS info if necessary */ if (!IsValid(pIcsInfo)) { pIcsInfo->WindowGroups = 1; if (IsLongBlock(pIcsInfo)) { pIcsInfo->TotalSfBands = pSamplingRateInfo->NumberOfScaleFactorBands_Long; pIcsInfo->WindowGroupLength[0] = 1; } else { pIcsInfo->TotalSfBands = pSamplingRateInfo->NumberOfScaleFactorBands_Short; pIcsInfo->WindowGroupLength[0] = 8; } pIcsInfo->MaxSfBands = pIcsInfo->TotalSfBands; } /* global activate PNS */ pPnsData->PnsActive = 1; /* set energy level */ pPnsData->CurrentEnergy = fixMax( 0, refLevel - level ); /* value: | Avg. RMS power | Avg. RMS power | | specScale = 22 | specScale = 31 | -------+----------------+----------------+ 5 | | -99.0 dB 15 | | -90.0 dB 25 | | -89.7 dB 35 | | -85.3 dB ... | ... | ... 45 | -69.9 dB | -70.0 dB 50 | -62.2 dB | 55 | -55.6 dB | -54.6 dB 60 | -47.0 dB | 65 | -39.5 dB | -39.5 dB 70 | -31.9 dB | 75 | -24.4 dB | -24.4 dB 80 | -16.9 dB | 85 | -9.4 dB (c) | -9.4 dB 90 | -3.9 dB (c) | 95 | | -2.1 dB 100 | | -1.6 dB 105 | | -1.4 dB */ for (group=0; group < GetWindowGroups(pIcsInfo); group++) { for (band=0; band < GetScaleFactorBandsTransmitted(pIcsInfo); band++) { pnsBand = group * 16 + band; if (pnsBand >= NO_OFBANDS) { return; } //pPnsData->CurrentEnergy += delta ; pScaleFactor[pnsBand] = pPnsData->CurrentEnergy; pInterChannelData->correlated[pnsBand] = 0; pPnsData->pnsUsed[pnsBand] = 1; } } } /*! \brief Store data for concealment techniques applied later Interface function to store data for different concealment strategies \return none */ void CConcealment_Store ( CConcealmentInfo *hConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ) { if ( !(pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD ) ) { FIXP_DBL *pSpectralCoefficient = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; SHORT tSpecScale[8]; UCHAR tWindowShape, tWindowSequence; /* store old window infos for swapping */ tWindowSequence = hConcealmentInfo->windowSequence; tWindowShape = hConcealmentInfo->windowShape; /* store old scale factors for swapping */ FDKmemcpy(tSpecScale, hConcealmentInfo->specScale, 8*sizeof(SHORT)); /* store new window infos */ hConcealmentInfo->windowSequence = GetWindowSequence(pIcsInfo); hConcealmentInfo->windowShape = GetWindowShape(pIcsInfo); hConcealmentInfo->lastWinGrpLen = *(GetWindowGroupLengthTable(pIcsInfo)+GetWindowGroups(pIcsInfo)-1); /* store new scale factors */ FDKmemcpy(hConcealmentInfo->specScale, pSpecScale, 8*sizeof(SHORT)); if (CConcealment_GetDelay(hConcealmentInfo->pConcealParams) == 0) { /* store new spectral bins */ #if (CNCL_FRACT_BITS == DFRACT_BITS) FDKmemcpy(hConcealmentInfo->spectralCoefficient, pSpectralCoefficient, 1024 * sizeof(FIXP_CNCL)); #else FIXP_CNCL *RESTRICT pCncl = &hConcealmentInfo->spectralCoefficient[1024-1]; FIXP_DBL *RESTRICT pSpec = &pSpectralCoefficient[1024-1]; int i; for (i = 1024; i != 0; i--) { *pCncl-- = FX_DBL2FX_CNCL(*pSpec--); } #endif } else { FIXP_CNCL *RESTRICT pCncl = &hConcealmentInfo->spectralCoefficient[1024-1]; FIXP_DBL *RESTRICT pSpec = &pSpectralCoefficient[1024-1]; int i; /* swap spectral data */ for (i = 1024; i != 0; i--) { FIXP_DBL tSpec = *pSpec; *pSpec-- = FX_CNCL2FX_DBL(*pCncl); *pCncl-- = FX_DBL2FX_CNCL( tSpec); } /* complete swapping of window infos */ pIcsInfo->WindowSequence = tWindowSequence; pIcsInfo->WindowShape = tWindowShape; /* complete swapping of scale factors */ FDKmemcpy(pSpecScale, tSpecScale, 8*sizeof(SHORT)); } } } /*! \brief Apply concealment Interface function to different concealment strategies \return none */ int CConcealment_Apply ( CConcealmentInfo *hConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, const UCHAR lastLpdMode, const int frameOk, const UINT flags) { int appliedProcessing = 0; if ( (frameOk == 0) && (pAacDecoderChannelInfo->renderMode != (AACDEC_RENDER_MODE)hConcealmentInfo->lastRenderMode) ) { /* restore the last render mode to stay in the same domain which allows to do a proper concealment */ pAacDecoderChannelInfo->renderMode = (AACDEC_RENDER_MODE)hConcealmentInfo->lastRenderMode; } else { /* otherwise store the current mode */ hConcealmentInfo->lastRenderMode = (SCHAR)pAacDecoderChannelInfo->renderMode; } if ( frameOk ) { /* Rescue current data for concealment in future frames */ CConcealment_Store ( hConcealmentInfo, pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo ); /* Reset index to random sign vector to make sign calculation frame agnostic (only depends on number of subsequently concealed spectral blocks) */ hConcealmentInfo->iRandomPhase = 0; } /* hand current frame status to the state machine */ CConcealment_UpdateState( hConcealmentInfo, frameOk ); if ( !frameOk ) { /* Create data for signal rendering according to the selected concealment method and decoder operating mode. */ if ( !(pAacDecoderChannelInfo->renderMode == AACDEC_RENDER_LPD ) ) { switch (hConcealmentInfo->pConcealParams->method) { default: case ConcealMethodMute: /* Mute spectral data in case of errors */ FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, samplesPerFrame * sizeof(FIXP_DBL)); /* Set last window shape */ pAacDecoderChannelInfo->icsInfo.WindowShape = hConcealmentInfo->windowShape; appliedProcessing = 1; break; case ConcealMethodNoise: /* Noise substitution error concealment technique */ appliedProcessing = CConcealment_ApplyNoise (hConcealmentInfo, pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, pSamplingRateInfo, samplesPerFrame, flags); break; case ConcealMethodInter: /* Energy interpolation concealment based on 3GPP */ appliedProcessing = CConcealment_ApplyInter (hConcealmentInfo, pAacDecoderChannelInfo, pSamplingRateInfo, samplesPerFrame, 0, /* don't use tonal improvement */ 0); break; } } } /* update history */ hConcealmentInfo->prevFrameOk[0] = hConcealmentInfo->prevFrameOk[1]; hConcealmentInfo->prevFrameOk[1] = frameOk; return appliedProcessing; } /*! \brief Apply concealment noise substitution In case of frame lost this function produces a noisy frame with respect to the energies values of past frame. \return none */ static int CConcealment_ApplyNoise (CConcealmentInfo *pConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, const UINT flags) { CConcealParams *pConcealCommonData = pConcealmentInfo->pConcealParams; FIXP_DBL *pSpectralCoefficient = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; int appliedProcessing = 0; FDK_ASSERT((samplesPerFrame>=480) && (samplesPerFrame<=1024)); FDK_ASSERT((samplesPerFrame&0x1F) == 0); switch (pConcealmentInfo->concealState) { case ConcealState_Ok: /* Nothing to do here! */ break; case ConcealState_Single: case ConcealState_FadeOut: { /* restore frequency coefficients from buffer with a specific muting */ FIXP_SGL fac; int win, numWindows = 1; int windowLen = samplesPerFrame; int tFadeFrames, lastWindow = 0; int win_idx_stride = 1; FDK_ASSERT(pConcealmentInfo != NULL); FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < CONCEAL_MAX_NUM_FADE_FACTORS); FDK_ASSERT(pConcealmentInfo->cntFadeFrames <= pConcealCommonData->numFadeOutFrames); /* get attenuation factor */ tFadeFrames = pConcealmentInfo->cntFadeFrames; fac = pConcealCommonData->fadeOutFactor[tFadeFrames]; /* set old window parameters */ { pIcsInfo->WindowShape = pConcealmentInfo->windowShape; pIcsInfo->WindowSequence = pConcealmentInfo->windowSequence; if (pConcealmentInfo->windowSequence == 2) { /* short block handling */ numWindows = 8; windowLen = samplesPerFrame >> 3; lastWindow = numWindows - pConcealmentInfo->lastWinGrpLen; } } for (win = 0; win < numWindows; win++) { FIXP_CNCL *pCncl = pConcealmentInfo->spectralCoefficient + (lastWindow * windowLen); FIXP_DBL *pOut = pSpectralCoefficient + (win * windowLen); int i; FDK_ASSERT((lastWindow * windowLen + windowLen) <= samplesPerFrame); /* restore frequency coefficients from buffer with a specific attenuation */ for (i = 0; i < windowLen; i++) { pOut[i] = fMult(pCncl[i], fac); } /* apply random change of sign for spectral coefficients */ CConcealment_ApplyRandomSign(pConcealmentInfo->iRandomPhase, pOut, windowLen ); /* Increment random phase index to avoid repetition artifacts. */ pConcealmentInfo->iRandomPhase = (pConcealmentInfo->iRandomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); /* set old scale factors */ pSpecScale[win*win_idx_stride] = pConcealmentInfo->specScale[win_idx_stride*lastWindow++]; if ( (lastWindow >= numWindows) && (numWindows > 1) ) { /* end of sequence -> rewind */ lastWindow = numWindows - pConcealmentInfo->lastWinGrpLen; /* update the attenuation factor to get a faster fade-out */ tFadeFrames += 1; if (tFadeFrames < pConcealCommonData->numFadeOutFrames) { fac = pConcealCommonData->fadeOutFactor[tFadeFrames]; } else { fac = (FIXP_SGL)0; } } } /* store temp vars */ pConcealmentInfo->cntFadeFrames = tFadeFrames; appliedProcessing = 1; } break; case ConcealState_Mute: { /* set dummy window parameters */ pIcsInfo->Valid = 0; /* Trigger the generation of a consitent IcsInfo */ pIcsInfo->WindowShape = pConcealmentInfo->windowShape; /* Prevent an invalid WindowShape (required for F/T transform) */ pIcsInfo->WindowSequence = CConcealment_GetWinSeq(pConcealmentInfo->windowSequence); pConcealmentInfo->windowSequence = pIcsInfo->WindowSequence; /* Store for next frame (spectrum in concealment buffer can't be used at all) */ /* mute spectral data */ FDKmemclear(pSpectralCoefficient, samplesPerFrame * sizeof(FIXP_DBL)); if ( !(flags & (AC_USAC|AC_RSVD50)) && pConcealCommonData->comfortNoiseLevel >= 0 && pConcealCommonData->comfortNoiseLevel <= 61 /* -90dB */) { /* insert comfort noise using PNS */ CConcealment_fakePnsData ( &pAacDecoderChannelInfo->data.aac.PnsData, pIcsInfo, pSamplingRateInfo, pAacDecoderChannelInfo->pDynData->aSfbScale, pAacDecoderChannelInfo->pDynData->aScaleFactor, pConcealCommonData->comfortNoiseLevel ); CPns_Apply ( &pAacDecoderChannelInfo->data.aac.PnsData, pIcsInfo, pAacDecoderChannelInfo->pSpectralCoefficient, pAacDecoderChannelInfo->specScale, pAacDecoderChannelInfo->pDynData->aScaleFactor, pSamplingRateInfo, pAacDecoderChannelInfo->granuleLength, 0 /* always apply to first channel */ ); } appliedProcessing = 1; } break; case ConcealState_FadeIn: { FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < CONCEAL_MAX_NUM_FADE_FACTORS); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < pConcealCommonData->numFadeInFrames); /* attenuate signal to get a smooth fade-in */ FIXP_DBL *RESTRICT pOut = &pSpectralCoefficient[samplesPerFrame-1]; FIXP_SGL fac = pConcealCommonData->fadeInFactor[pConcealmentInfo->cntFadeFrames]; int i; for (i = samplesPerFrame; i != 0; i--) { *pOut = fMult(*pOut, fac); pOut--; } appliedProcessing = 1; } break; default: /* we shouldn't come here anyway */ FDK_ASSERT(0); break; } return appliedProcessing; } /*! \brief Apply concealment interpolation The function swaps the data from the current and the previous frame. If an error has occured, frame interpolation is performed to restore the missing frame. In case of multiple faulty frames, fade-in and fade-out is applied. \return none */ static int CConcealment_ApplyInter ( CConcealmentInfo *pConcealmentInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const int samplesPerFrame, const int improveTonal, const int frameOk ) { CConcealParams *pConcealCommonData = pConcealmentInfo->pConcealParams; FIXP_DBL *pSpectralCoefficient = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; int sfbEnergyPrev[64]; int sfbEnergyAct [64]; int i, appliedProcessing = 0; /* clear/init */ FDKmemclear(sfbEnergyPrev, 64 * sizeof(int)); FDKmemclear(sfbEnergyAct, 64 * sizeof(int)); if (!frameOk) { /* Restore last frame from concealment buffer */ pIcsInfo->WindowShape = pConcealmentInfo->windowShape; pIcsInfo->WindowSequence = pConcealmentInfo->windowSequence; /* Restore spectral data */ for (i = 0; i < samplesPerFrame; i++) { pSpectralCoefficient[i] = FX_CNCL2FX_DBL(pConcealmentInfo->spectralCoefficient[i]); } /* Restore scale factors */ FDKmemcpy(pSpecScale, pConcealmentInfo->specScale, 8*sizeof(SHORT)); } /* if previous frame was not ok */ if (!pConcealmentInfo->prevFrameOk[1]) { /* if current frame (f_n) is ok and the last but one frame (f_(n-2)) was ok, too, then interpolate both frames in order to generate the current output frame (f_(n-1)). Otherwise, use the last stored frame (f_(n-2) or f_(n-3) or ...). */ if (frameOk && pConcealmentInfo->prevFrameOk[0]) { appliedProcessing = 1; /* Interpolate both frames in order to generate the current output frame (f_(n-1)). */ if (pIcsInfo->WindowSequence == EightShortSequence) { /* f_(n-2) == EightShortSequence */ /* short--??????--short, short--??????--long interpolation */ /* short--short---short, short---long---long interpolation */ int wnd; if (pConcealmentInfo->windowSequence == EightShortSequence) { /* f_n == EightShortSequence */ /* short--short---short interpolation */ int scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Short; const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; pIcsInfo->WindowShape = 1; pIcsInfo->WindowSequence = EightShortSequence; for (wnd = 0; wnd < 8; wnd++) { CConcealment_CalcBandEnergy( &pSpectralCoefficient[wnd * (samplesPerFrame / 8)], /* spec_(n-2) */ pSamplingRateInfo, EightShortSequence, CConcealment_NoExpand, sfbEnergyPrev); CConcealment_CalcBandEnergy( &pConcealmentInfo->spectralCoefficient[wnd * (samplesPerFrame / 8)], /* spec_n */ pSamplingRateInfo, EightShortSequence, CConcealment_NoExpand, sfbEnergyAct); CConcealment_InterpolateBuffer( &pSpectralCoefficient[wnd * (samplesPerFrame / 8)], /* spec_(n-1) */ &pSpecScale[wnd], &pConcealmentInfo->specScale[wnd], &pSpecScale[wnd], sfbEnergyPrev, sfbEnergyAct, scaleFactorBandsTotal, pSfbOffset); } } else { /* f_n != EightShortSequence */ /* short---long---long interpolation */ int scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Long; const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; SHORT specScaleOut; CConcealment_CalcBandEnergy(&pSpectralCoefficient[samplesPerFrame - (samplesPerFrame / 8)], /* [wnd] spec_(n-2) */ pSamplingRateInfo, EightShortSequence, CConcealment_Expand, sfbEnergyAct); CConcealment_CalcBandEnergy(pConcealmentInfo->spectralCoefficient, /* spec_n */ pSamplingRateInfo, OnlyLongSequence, CConcealment_NoExpand, sfbEnergyPrev); pIcsInfo->WindowShape = 0; pIcsInfo->WindowSequence = LongStopSequence; for (i = 0; i < samplesPerFrame ; i++) { pSpectralCoefficient[i] = pConcealmentInfo->spectralCoefficient[i]; /* spec_n */ } for (i = 0; i < 8; i++) { /* search for max(specScale) */ if (pSpecScale[i] > pSpecScale[0]) { pSpecScale[0] = pSpecScale[i]; } } CConcealment_InterpolateBuffer( pSpectralCoefficient, /* spec_(n-1) */ &pConcealmentInfo->specScale[0], &pSpecScale[0], &specScaleOut, sfbEnergyPrev, sfbEnergyAct, scaleFactorBandsTotal, pSfbOffset); pSpecScale[0] = specScaleOut; } } else { /* long--??????--short, long--??????--long interpolation */ /* long---long---short, long---long---long interpolation */ int scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Long; const SHORT *pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; SHORT specScaleAct = pConcealmentInfo->specScale[0]; CConcealment_CalcBandEnergy(pSpectralCoefficient, /* spec_(n-2) */ pSamplingRateInfo, OnlyLongSequence, CConcealment_NoExpand, sfbEnergyPrev); if (pConcealmentInfo->windowSequence == EightShortSequence) { /* f_n == EightShortSequence */ /* long---long---short interpolation */ pIcsInfo->WindowShape = 1; pIcsInfo->WindowSequence = LongStartSequence; for (i = 1; i < 8; i++) { /* search for max(specScale) */ if (pConcealmentInfo->specScale[i] > specScaleAct) { specScaleAct = pConcealmentInfo->specScale[i]; } } /* Expand first short spectrum */ CConcealment_CalcBandEnergy(pConcealmentInfo->spectralCoefficient, /* spec_n */ pSamplingRateInfo, EightShortSequence, CConcealment_Expand, /* !!! */ sfbEnergyAct); } else { /* long---long---long interpolation */ pIcsInfo->WindowShape = 0; pIcsInfo->WindowSequence = OnlyLongSequence; CConcealment_CalcBandEnergy(pConcealmentInfo->spectralCoefficient, /* spec_n */ pSamplingRateInfo, OnlyLongSequence, CConcealment_NoExpand, sfbEnergyAct); } CConcealment_InterpolateBuffer( pSpectralCoefficient, /* spec_(n-1) */ &pSpecScale[0], &specScaleAct, &pSpecScale[0], sfbEnergyPrev, sfbEnergyAct, scaleFactorBandsTotal, pSfbOffset); } } /* Noise substitution of sign of the output spectral coefficients */ CConcealment_ApplyRandomSign (pConcealmentInfo->iRandomPhase, pSpectralCoefficient, samplesPerFrame); /* Increment random phase index to avoid repetition artifacts. */ pConcealmentInfo->iRandomPhase = (pConcealmentInfo->iRandomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); } /* scale spectrum according to concealment state */ switch (pConcealmentInfo->concealState) { case ConcealState_Single: appliedProcessing = 1; break; case ConcealState_FadeOut: { FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < CONCEAL_MAX_NUM_FADE_FACTORS); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < pConcealCommonData->numFadeOutFrames); /* restore frequency coefficients from buffer with a specific muting */ FIXP_DBL *RESTRICT pOut = &pSpectralCoefficient[samplesPerFrame-1]; FIXP_SGL fac = pConcealCommonData->fadeOutFactor[pConcealmentInfo->cntFadeFrames]; for (i = samplesPerFrame; i != 0; i--) { *pOut = fMult(*pOut, fac); pOut--; } appliedProcessing = 1; } break; case ConcealState_FadeIn: { FDK_ASSERT(pConcealmentInfo->cntFadeFrames >= 0); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < CONCEAL_MAX_NUM_FADE_FACTORS); FDK_ASSERT(pConcealmentInfo->cntFadeFrames < pConcealCommonData->numFadeInFrames); /* attenuate signal to get a smooth fade-in */ FIXP_DBL *RESTRICT pOut = &pSpectralCoefficient[samplesPerFrame-1]; FIXP_SGL fac = pConcealCommonData->fadeInFactor[pConcealmentInfo->cntFadeFrames]; for (i = samplesPerFrame; i != 0; i--) { *pOut = fMult(*pOut, fac); pOut--; } appliedProcessing = 1; } break; case ConcealState_Mute: { int fac = pConcealCommonData->comfortNoiseLevel; /* set dummy window parameters */ pIcsInfo->Valid = 0; /* Trigger the generation of a consitent IcsInfo */ pIcsInfo->WindowShape = pConcealmentInfo->windowShape; /* Prevent an invalid WindowShape (required for F/T transform) */ pIcsInfo->WindowSequence = CConcealment_GetWinSeq(pConcealmentInfo->windowSequence); pConcealmentInfo->windowSequence = pIcsInfo->WindowSequence; /* Store for next frame (spectrum in concealment buffer can't be used at all) */ /* mute spectral data */ FDKmemclear(pSpectralCoefficient, samplesPerFrame * sizeof(FIXP_DBL)); if (fac >= 0 && fac <= 61) { /* insert comfort noise using PNS */ CConcealment_fakePnsData ( &pAacDecoderChannelInfo->data.aac.PnsData, pIcsInfo, pSamplingRateInfo, pAacDecoderChannelInfo->specScale, pAacDecoderChannelInfo->pDynData->aScaleFactor, fac ); CPns_Apply ( &pAacDecoderChannelInfo->data.aac.PnsData, pIcsInfo, pAacDecoderChannelInfo->pSpectralCoefficient, pAacDecoderChannelInfo->specScale, pAacDecoderChannelInfo->pDynData->aScaleFactor, pSamplingRateInfo, pAacDecoderChannelInfo->granuleLength, 0 /* always apply to first channel */ ); } appliedProcessing = 1; } break; default: /* nothing to do here */ break; } return appliedProcessing; } /*! \brief Calculate the spectral energy The function calculates band-wise the spectral energy. This is used for frame interpolation. \return none */ static void CConcealment_CalcBandEnergy ( FIXP_DBL *spectrum, const SamplingRateInfo *pSamplingRateInfo, const int blockType, CConcealmentExpandType expandType, int *sfbEnergy ) { const SHORT *pSfbOffset; int line, sfb, scaleFactorBandsTotal = 0; /* In the following calculations, enAccu is initialized with LSB-value in order to avoid zero energy-level */ line = 0; switch(blockType) { case OnlyLongSequence: case LongStartSequence: case LongStopSequence: if (expandType == CConcealment_NoExpand) { /* standard long calculation */ scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Long; pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; int sfbScale = (sizeof(LONG)<<3) - CntLeadingZeros(pSfbOffset[sfb+1] - pSfbOffset[sfb]) - 1; /* scaling depends on sfb width. */ for ( ; line < pSfbOffset[sfb+1]; line++) { enAccu += fPow2Div2(*(spectrum + line)) >> sfbScale; } *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; } } else { /* compress long to short */ scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Short; pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; int sfbScale = (sizeof(LONG)<<3) - CntLeadingZeros(pSfbOffset[sfb+1] - pSfbOffset[sfb]) - 1; /* scaling depends on sfb width. */ for (; line < pSfbOffset[sfb+1] << 3; line++) { enAccu += (enAccu + (fPow2Div2(*(spectrum + line)) >> sfbScale)) >> 3; } *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; } } break; case EightShortSequence: if (expandType == CConcealment_NoExpand) { /* standard short calculation */ scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Short; pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Short; for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; int sfbScale = (sizeof(LONG)<<3) - CntLeadingZeros(pSfbOffset[sfb+1] - pSfbOffset[sfb]) - 1; /* scaling depends on sfb width. */ for ( ; line < pSfbOffset[sfb+1]; line++) { enAccu += fPow2Div2(*(spectrum + line)) >> sfbScale; } *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; } } else { /* expand short to long spectrum */ scaleFactorBandsTotal = pSamplingRateInfo->NumberOfScaleFactorBands_Long; pSfbOffset = pSamplingRateInfo->ScaleFactorBands_Long; for (sfb = 0; sfb < scaleFactorBandsTotal; sfb++) { FIXP_DBL enAccu = (FIXP_DBL)(LONG)1; int sfbScale = (sizeof(LONG)<<3) - CntLeadingZeros(pSfbOffset[sfb+1] - pSfbOffset[sfb]) - 1; /* scaling depends on sfb width. */ for ( ; line < pSfbOffset[sfb+1]; line++) { enAccu += fPow2Div2(*(spectrum + (line >> 3))) >> sfbScale; } *(sfbEnergy + sfb) = CntLeadingZeros(enAccu) - 1; } } break; } } /*! \brief Interpolate buffer The function creates the interpolated spectral data according to the energy of the last good frame and the current (good) frame. \return none */ static void CConcealment_InterpolateBuffer ( FIXP_DBL *spectrum, SHORT *pSpecScalePrv, SHORT *pSpecScaleAct, SHORT *pSpecScaleOut, int *enPrv, int *enAct, int sfbCnt, const SHORT *pSfbOffset ) { int sfb, line = 0; int fac_shift; int fac_mod; FIXP_DBL accu; for (sfb = 0; sfb < sfbCnt; sfb++) { fac_shift = enPrv[sfb] - enAct[sfb] + ((*pSpecScaleAct - *pSpecScalePrv) << 1); fac_mod = fac_shift & 3; fac_shift = (fac_shift >> 2) + 1; fac_shift += *pSpecScalePrv - fixMax(*pSpecScalePrv, *pSpecScaleAct); for (; line < pSfbOffset[sfb+1]; line++) { accu = fMult(*(spectrum+line), facMod4Table[fac_mod]); if (fac_shift < 0) { accu >>= -fac_shift; } else { accu <<= fac_shift; } *(spectrum+line) = accu; } } *pSpecScaleOut = fixMax(*pSpecScalePrv, *pSpecScaleAct); } static INT findEquiFadeFrame ( CConcealParams *pConcealCommonData, INT actFadeIndex, int direction ) { FIXP_SGL *pFactor; FIXP_SGL referenceVal; FIXP_SGL minDiff = (FIXP_SGL)MAXVAL_SGL; INT numFrames = 0; INT nextFadeIndex = 0; int i; /* init depending on direction */ if (direction == 0) { /* FADE-OUT => FADE-IN */ numFrames = pConcealCommonData->numFadeInFrames; referenceVal = pConcealCommonData->fadeOutFactor[actFadeIndex] >> 1; pFactor = pConcealCommonData->fadeInFactor; } else { /* FADE-IN => FADE-OUT */ numFrames = pConcealCommonData->numFadeOutFrames; referenceVal = pConcealCommonData->fadeInFactor[actFadeIndex] >> 1; pFactor = pConcealCommonData->fadeOutFactor; } /* search for minimum difference */ for (i = 0; i < numFrames; i++) { FIXP_SGL diff = fixp_abs((pFactor[i]>>1) - referenceVal); if (diff < minDiff) { minDiff = diff; nextFadeIndex = i; } } /* check and adjust depending on direction */ if (direction == 0) { /* FADE-OUT => FADE-IN */ if (((pFactor[nextFadeIndex]>>1) <= referenceVal) && (nextFadeIndex > 0)) { nextFadeIndex -= 1; } } else { /* FADE-IN => FADE-OUT */ if (((pFactor[nextFadeIndex]>>1) >= referenceVal) && (nextFadeIndex < numFrames-1)) { nextFadeIndex += 1; } } return (nextFadeIndex); } /*! \brief Update the concealment state The function updates the state of the concealment state-machine. The states are: mute, fade-in, fade-out, interpolate and frame-ok. \return none */ static void CConcealment_UpdateState ( CConcealmentInfo *pConcealmentInfo, int frameOk ) { CConcealParams *pConcealCommonData = pConcealmentInfo->pConcealParams; switch (pConcealCommonData->method) { case ConcealMethodNoise: { if (pConcealmentInfo->concealState != ConcealState_Ok) { /* count the valid frames during concealment process */ if (frameOk) { pConcealmentInfo->cntValidFrames += 1; } else { pConcealmentInfo->cntValidFrames = 0; } } /* -- STATE MACHINE for Noise Substitution -- */ switch (pConcealmentInfo->concealState) { case ConcealState_Ok: if (!frameOk) { if (pConcealCommonData->numFadeOutFrames > 0) { /* change to state SINGLE-FRAME-LOSS */ pConcealmentInfo->concealState = ConcealState_Single; } else { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } pConcealmentInfo->cntFadeFrames = 0; pConcealmentInfo->cntValidFrames = 0; } break; case ConcealState_Single: /* Just a pre-stage before fade-out begins. Stay here only one frame! */ pConcealmentInfo->cntFadeFrames += 1; if (frameOk) { if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) { /* change to state FADE-IN */ pConcealmentInfo->concealState = ConcealState_FadeIn; pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData, pConcealmentInfo->cntFadeFrames-1, 0 /* FadeOut -> FadeIn */); } else { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } else { if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } else { /* change to state FADE-OUT */ pConcealmentInfo->concealState = ConcealState_FadeOut; } } break; case ConcealState_FadeOut: pConcealmentInfo->cntFadeFrames += 1; /* used to address the fade-out factors */ if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) { if (pConcealCommonData->numFadeInFrames > 0) { /* change to state FADE-IN */ pConcealmentInfo->concealState = ConcealState_FadeIn; pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData, pConcealmentInfo->cntFadeFrames-1, 0 /* FadeOut -> FadeIn */); } else { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } else { if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } } break; case ConcealState_Mute: if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) { if (pConcealCommonData->numFadeInFrames > 0) { /* change to state FADE-IN */ pConcealmentInfo->concealState = ConcealState_FadeIn; pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1; } else { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } break; case ConcealState_FadeIn: pConcealmentInfo->cntFadeFrames -= 1; /* used to address the fade-in factors */ if (frameOk) { if (pConcealmentInfo->cntFadeFrames < 0) { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } else { if (pConcealCommonData->numFadeOutFrames > 0) { /* change to state FADE-OUT */ pConcealmentInfo->concealState = ConcealState_FadeOut; pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData, pConcealmentInfo->cntFadeFrames+1, 1 /* FadeIn -> FadeOut */); } else { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } } break; default: FDK_ASSERT(0); break; } } break; case ConcealMethodInter: case ConcealMethodTonal: { if (pConcealmentInfo->concealState != ConcealState_Ok) { /* count the valid frames during concealment process */ if ( pConcealmentInfo->prevFrameOk[1] || (pConcealmentInfo->prevFrameOk[0] && !pConcealmentInfo->prevFrameOk[1] && frameOk) ) { /* The frame is OK even if it can be estimated by the energy interpolation algorithm */ pConcealmentInfo->cntValidFrames += 1; } else { pConcealmentInfo->cntValidFrames = 0; } } /* -- STATE MACHINE for energy interpolation -- */ switch (pConcealmentInfo->concealState) { case ConcealState_Ok: if (!(pConcealmentInfo->prevFrameOk[1] || (pConcealmentInfo->prevFrameOk[0] && !pConcealmentInfo->prevFrameOk[1] && frameOk))) { if (pConcealCommonData->numFadeOutFrames > 0) { /* Fade out only if the energy interpolation algorithm can not be applied! */ pConcealmentInfo->concealState = ConcealState_FadeOut; } else { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } pConcealmentInfo->cntFadeFrames = 0; pConcealmentInfo->cntValidFrames = 0; } break; case ConcealState_Single: pConcealmentInfo->concealState = ConcealState_Ok; break; case ConcealState_FadeOut: pConcealmentInfo->cntFadeFrames += 1; if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) { if (pConcealCommonData->numFadeInFrames > 0) { /* change to state FADE-IN */ pConcealmentInfo->concealState = ConcealState_FadeIn; pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData, pConcealmentInfo->cntFadeFrames-1, 0 /* FadeOut -> FadeIn */); } else { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } else { if (pConcealmentInfo->cntFadeFrames >= pConcealCommonData->numFadeOutFrames) { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } } break; case ConcealState_Mute: if (pConcealmentInfo->cntValidFrames > pConcealCommonData->numMuteReleaseFrames) { if (pConcealCommonData->numFadeInFrames > 0) { /* change to state FADE-IN */ pConcealmentInfo->concealState = ConcealState_FadeIn; pConcealmentInfo->cntFadeFrames = pConcealCommonData->numFadeInFrames - 1; } else { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } break; case ConcealState_FadeIn: pConcealmentInfo->cntFadeFrames -= 1; /* used to address the fade-in factors */ if (frameOk || pConcealmentInfo->prevFrameOk[1]) { if (pConcealmentInfo->cntFadeFrames < 0) { /* change to state OK */ pConcealmentInfo->concealState = ConcealState_Ok; } } else { if (pConcealCommonData->numFadeOutFrames > 0) { /* change to state FADE-OUT */ pConcealmentInfo->concealState = ConcealState_FadeOut; pConcealmentInfo->cntFadeFrames = findEquiFadeFrame( pConcealCommonData, pConcealmentInfo->cntFadeFrames+1, 1 /* FadeIn -> FadeOut */); } else { /* change to state MUTE */ pConcealmentInfo->concealState = ConcealState_Mute; } } break; } /* End switch(pConcealmentInfo->concealState) */ } break; default: /* Don't need a state machine for other concealment methods. */ break; } } /*! \brief Randomizes the sign of the spectral data The function toggles the sign of the spectral data randomly. This is useful to ensure the quality of the concealed frames. \return none */ static void CConcealment_ApplyRandomSign (int randomPhase, FIXP_DBL *spec, int samplesPerFrame ) { int i; USHORT packedSign=0; /* random table 512x16bit has been reduced to 512 packed sign bits = 32x16 bit */ /* read current packed sign word */ packedSign = randomSign[randomPhase>>4]; packedSign >>= (randomPhase&0xf); for (i = 0; i < samplesPerFrame ; i++) { if ((randomPhase & 0xf) == 0) { packedSign = randomSign[randomPhase>>4]; } if (packedSign & 0x1) { spec[i] = -spec[i]; } packedSign >>= 1; randomPhase = (randomPhase + 1) & (AAC_NF_NO_RANDOM_VAL - 1); } } /*! \brief Get fadeing factor for current concealment state. The function returns the factor used for fading that belongs to the current internal state. \return Fade factor */ FIXP_DBL CConcealment_GetFadeFactor ( CConcealmentInfo *hConcealmentInfo, const int fPreviousFactor ) { FIXP_DBL fac = (FIXP_DBL)0; CConcealParams *pConcealCommonData = hConcealmentInfo->pConcealParams; if (hConcealmentInfo->pConcealParams->method > ConcealMethodMute) { switch (hConcealmentInfo->concealState) { default: case ConcealState_Mute: /* Nothing to do here */ break; case ConcealState_Ok: fac = (FIXP_DBL)MAXVAL_DBL; break; case ConcealState_Single: case ConcealState_FadeOut: { int idx = hConcealmentInfo->cntFadeFrames - ((fPreviousFactor != 0) ? 1 : 0); fac = (idx < 0) ? (FIXP_DBL)MAXVAL_DBL : FX_SGL2FX_DBL(pConcealCommonData->fadeOutFactor[idx]); } break; case ConcealState_FadeIn: { int idx = hConcealmentInfo->cntFadeFrames + ((fPreviousFactor != 0) ? 1 : 0); fac = (idx >= hConcealmentInfo->pConcealParams->numFadeInFrames) ? (FIXP_DBL)0 : FX_SGL2FX_DBL(pConcealCommonData->fadeInFactor[idx]); } break; } } return (fac); } /*! \brief Get fadeing factor for current concealment state. The function returns the state (ok or not) of the previous frame. If called before the function CConcealment_Apply() set the fBeforeApply flag to get the correct value. \return Frame OK flag of previous frame. */ int CConcealment_GetLastFrameOk ( CConcealmentInfo *hConcealmentInfo, const int fBeforeApply ) { int prevFrameOk = 1; if (hConcealmentInfo != NULL) { prevFrameOk = hConcealmentInfo->prevFrameOk[fBeforeApply & 0x1]; } return prevFrameOk; } /*! \brief Get the number of delay frames introduced by concealment technique. \return Number of delay frames. */ UINT CConcealment_GetDelay ( CConcealParams *pConcealCommonData ) { UINT frameDelay = 0; if (pConcealCommonData != NULL) { switch (pConcealCommonData->method) { case ConcealMethodTonal: case ConcealMethodInter: frameDelay = 1; break; default: break; } } return frameDelay; } fdk-aac-0.1.3/libAACdec/src/channel.h0000644000175000017500000001673512372261464017525 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ #ifndef CHANNEL_H #define CHANNEL_H #include "common_fix.h" #include "FDK_bitstream.h" #include "channelinfo.h" #include "tpdec_lib.h" /** * \brief Init codeBook SFB indices (section data) with HCB_ESC. Useful for bitstreams * which do not have any section data, but still SFB's (scale factor bands). This has * the effect that upto the amount of transmitted SFB are treated as non-zero. * \param pAacDecoderChannelInfo channel info structure containing a valid icsInfo struct. */ void CChannel_CodebookTableInit(CAacDecoderChannelInfo *pAacDecoderChannelInfo); /** * \brief decode a channel element. To be called after CChannelElement_Read() * \param pAacDecoderChannelInfo pointer to channel data struct. Depending on el_channels either one or two. * \param pSamplingRateInfo pointer to sample rate information structure * \param el_channels amount of channels of the element to be decoded. * \param output pointer to time domain output buffer (ACELP) * \param stride factor for accessing output */ void CChannelElement_Decode ( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], SamplingRateInfo *pSamplingRateInfo, UINT flags, int el_channels ); /** * \brief Read channel element of given type from bitstream. * \param hBs bitstream handle to access bitstream data. * \param pAacDecoderChannelInfo pointer array to store channel information. * \param aot Audio Object Type * \param pSamplingRateInfo sampling rate info table. * \param flags parser guidance flags * \param numberOfChannels amoun of channels contained in the object to be parsed. * \param epConfig the current epConfig value obtained from the Audio Specific Config. * \param pTp transport decoder handle required for ADTS CRC checking. * ... * \return an AAC_DECODER_ERROR error code. */ AAC_DECODER_ERROR CChannelElement_Read(HANDLE_FDK_BITSTREAM hBs, CAacDecoderChannelInfo *pAacDecoderChannelInfo[], CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], const AUDIO_OBJECT_TYPE aot, const SamplingRateInfo *pSamplingRateInfo, const UINT flags, const UINT frame_length, const UCHAR numberOfChannels, const SCHAR epConfig, HANDLE_TRANSPORTDEC pTpDec ); #endif /* #ifndef CHANNEL_H */ fdk-aac-0.1.3/libAACdec/src/rvlc_info.h0000644000175000017500000002066612372261464020074 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Defines structures for RVLC \author Robert Weidner */ #ifndef RVLC_INFO_H #define RVLC_INFO_H #define FWD 0 /* bitstream decoding direction forward (RVL coded part) */ #define BWD 1 /* bitstream decoding direction backward (RVL coded part) */ #define MAX_RVL 7 /* positive RVLC escape */ #define MIN_RVL -7 /* negative RVLC escape */ #define MAX_ALLOWED_DPCM_INDEX 14 /* the maximum allowed index of a decoded dpcm value (offset 'TABLE_OFFSET' incl --> must be subtracted) */ #define TABLE_OFFSET 7 /* dpcm offset of valid output values of rvl table decoding, the rvl table ouly returns positive values, therefore the offset */ #define MAX_LEN_RVLC_CODE_WORD 9 /* max length of a RVL codeword in bits */ #define MAX_LEN_RVLC_ESCAPE_WORD 20 /* max length of huffman coded RVLC escape word in bits */ #define DPCM_NOISE_NRG_BITS 9 #define SF_OFFSET 100 /* offset for correcting scf value */ #define CONCEAL_MAX_INIT 1311 /* arbitrary value */ #define CONCEAL_MIN_INIT -1311 /* arbitrary value */ #define RVLC_MAX_SFB ((8) * (16)) /* sideinfo of RVLC */ typedef struct { /* ------- ESC 1 Data: --------- */ /* order of RVLC-bitstream components in bitstream (RVLC-initialization), every component appears only once in bitstream */ INT sf_concealment; /* 1 */ INT rev_global_gain; /* 2 */ SHORT length_of_rvlc_sf; /* 3 */ /* original value, gets modified (subtract 9) in case of noise (PNS); is kept for later use */ INT dpcm_noise_nrg; /* 4 optional */ INT sf_escapes_present; /* 5 */ SHORT length_of_rvlc_escapes; /* 6 optional */ INT dpcm_noise_last_position; /* 7 optional */ INT dpcm_is_last_position; SHORT length_of_rvlc_sf_fwd; /* length_of_rvlc_sf used for forward decoding */ SHORT length_of_rvlc_sf_bwd; /* length_of_rvlc_sf used for backward decoding */ /* for RVL-Codeword decoder to distinguish between fwd and bwd decoding */ SHORT *pRvlBitCnt_RVL; USHORT *pBitstrIndxRvl_RVL; UCHAR numWindowGroups; UCHAR maxSfbTransmitted; UCHAR first_noise_group; UCHAR first_noise_band; UCHAR direction; /* bitstream indices */ USHORT bitstreamIndexRvlFwd; /* base address of RVL-coded-scalefactor data (ESC 2) for forward decoding */ USHORT bitstreamIndexRvlBwd; /* base address of RVL-coded-scalefactor data (ESC 2) for backward decoding */ USHORT bitstreamIndexEsc; /* base address where RVLC-escapes start (ESC 2) */ /* decoding trees */ const UINT *pHuffTreeRvlCodewds; const UINT *pHuffTreeRvlcEscape; /* escape counters */ UCHAR numDecodedEscapeWordsFwd; /* when decoding RVL-codes forward */ UCHAR numDecodedEscapeWordsBwd; /* when decoding RVL-codes backward */ UCHAR numDecodedEscapeWordsEsc; /* when decoding the escape-Words */ SCHAR noise_used; SCHAR intensity_used; SCHAR sf_used; SHORT firstScf; SHORT lastScf; SHORT firstNrg; SHORT lastNrg; SHORT firstIs; SHORT lastIs; /* ------ RVLC error detection ------ */ UINT errorLogRvlc; /* store RVLC errors */ SHORT conceal_min; /* is set at backward decoding */ SHORT conceal_max; /* is set at forward decoding */ SHORT conceal_min_esc; /* is set at backward decoding */ SHORT conceal_max_esc; /* is set at forward decoding */ } CErRvlcInfo; typedef CErRvlcInfo RVLC_INFO; /* temp */ #endif /* RVLC_INFO_H */ fdk-aac-0.1.3/libAACdec/src/rvlcconceal.h0000644000175000017500000001237512372261464020404 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief rvlc concealment \author Josef Hoepfl */ #ifndef RVLCCONCEAL_H #define RVLCCONCEAL_H #include "rvlc.h" void BidirectionalEstimation_UseLowerScfOfCurrentFrame(CAacDecoderChannelInfo *pAacDecoderChannelInfo); void BidirectionalEstimation_UseScfOfPrevFrameAsReference( CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ); void StatisticalEstimation (CAacDecoderChannelInfo *pAacDecoderChannelInfo); void PredictiveInterpolation ( CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ); #endif /* RVLCCONCEAL_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcr_bit.cpp0000644000175000017500000001654312372261464021337 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Bitstream reading *******************************************************************************/ #include "aacdec_hcr_bit.h" /*--------------------------------------------------------------------------------------------- description: This function toggles the read direction. ----------------------------------------------------------------------------------------------- input: current read direction ----------------------------------------------------------------------------------------------- return: new read direction -------------------------------------------------------------------------------------------- */ UCHAR ToggleReadDirection(UCHAR readDirection) { if ( readDirection == FROM_LEFT_TO_RIGHT ) { return FROM_RIGHT_TO_LEFT; } else { return FROM_LEFT_TO_RIGHT; } } /*--------------------------------------------------------------------------------------------- description: This function returns a bit from the bitstream according to read direction. It is called very often, therefore it makes sense to inline it (runtime). ----------------------------------------------------------------------------------------------- input: - handle to FDK bitstream - reference value marking start of bitfield - pLeftStartOfSegment - pRightStartOfSegment - readDirection ----------------------------------------------------------------------------------------------- return: - bit from bitstream -------------------------------------------------------------------------------------------- */ UINT HcrGetABitFromBitstream(HANDLE_FDK_BITSTREAM bs, USHORT *pLeftStartOfSegment, USHORT *pRightStartOfSegment, UCHAR readDirection) { UINT bit; INT readBitOffset; if (readDirection == FROM_LEFT_TO_RIGHT) { readBitOffset = *pLeftStartOfSegment-FDKgetBitCnt(bs); if( readBitOffset ) { FDKpushBiDirectional(bs, readBitOffset); } bit = FDKreadBits(bs, 1); *pLeftStartOfSegment += 1; } else { readBitOffset = *pRightStartOfSegment-FDKgetBitCnt(bs); if( readBitOffset ) { FDKpushBiDirectional(bs, readBitOffset); } /* to be replaced with a brother function of FDKreadBits() */ bit = FDKreadBits(bs, 1); FDKpushBack(bs, 2); *pRightStartOfSegment -= 1; } #if ERROR_GENERATOR_BIT_STREAM_HCR static int a; if ((++a % MODULO_DIVISOR_HCR) == 0) { bit = (bit == 0) ? 1 : 0; } #endif return (bit); } fdk-aac-0.1.3/libAACdec/src/rvlcbit.h0000644000175000017500000001212512372261464017547 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: RVLC Decoder: Bitstream reading *******************************************************************************/ #ifndef RVLCBIT_H #define RVLCBIT_H #include "rvlc.h" UCHAR rvlcReadBitFromBitstream (HANDLE_FDK_BITSTREAM bs, USHORT *pPosition, UCHAR readDirection); #endif /* RVLCBIT_H */ fdk-aac-0.1.3/libAACdec/src/rvlc.cpp0000644000175000017500000013620012372261464017404 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief RVLC Decoder \author Robert Weidner */ #include "rvlc.h" #include "block.h" #include "aac_rom.h" #include "rvlcbit.h" #include "rvlcconceal.h" #include "aacdec_hcr.h" /*--------------------------------------------------------------------------------------------- function: rvlcInit description: init RVLC by data from channelinfo, which was decoded previously and set up pointers ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void rvlcInit (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs) { /* RVLC common initialization part 2 of 2 */ SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; SHORT *pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; int bnds; pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = 0; pRvlc->numDecodedEscapeWordsEsc = 0; pRvlc->numDecodedEscapeWordsFwd = 0; pRvlc->numDecodedEscapeWordsBwd = 0; pRvlc->intensity_used = 0; pRvlc->errorLogRvlc = 0; pRvlc->conceal_max = CONCEAL_MAX_INIT; pRvlc->conceal_min = CONCEAL_MIN_INIT; pRvlc->conceal_max_esc = CONCEAL_MAX_INIT; pRvlc->conceal_min_esc = CONCEAL_MIN_INIT; pRvlc->pHuffTreeRvlcEscape = aHuffTreeRvlcEscape; pRvlc->pHuffTreeRvlCodewds = aHuffTreeRvlCodewds; /* init scf arrays (for savety (in case of there are only zero codebooks)) */ for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) { pScfFwd[bnds] = 0; pScfBwd[bnds] = 0; pScfEsc[bnds] = 0; pScaleFactor[bnds] = 0; } /* set base bitstream ptr to the RVL-coded part (start of RVLC data (ESC 2)) */ FDKsyncCache (bs); pRvlc->bitstreamIndexRvlFwd = FDKgetBitCnt(bs); /* first bit within RVL coded block as start address for forward decoding */ pRvlc->bitstreamIndexRvlBwd = FDKgetBitCnt(bs) + pRvlc->length_of_rvlc_sf - 1; /* last bit within RVL coded block as start address for backward decoding */ /* skip RVLC-bitstream-part -- pointing now to escapes (if present) or to TNS data (if present) */ FDKpushFor (bs, pRvlc->length_of_rvlc_sf); if ( pRvlc->sf_escapes_present != 0 ) { /* locate internal bitstream ptr at escapes (which is the second part) */ FDKsyncCache (bs); pRvlc->bitstreamIndexEsc = FDKgetBitCnt(bs); /* skip escapeRVLC-bitstream-part -- pointing to TNS data (if present) to make decoder continue */ /* decoding of RVLC should work despite this second pushFor during initialization because */ /* bitstream initialization is valid for both ESC2 data parts (RVL-coded values and ESC-coded values) */ FDKpushFor (bs, pRvlc->length_of_rvlc_escapes); } #if VERBOSE_RVLC_INIT DebugOutputInit(pRvlc,pAacDecoderChannelInfo); #endif } /*--------------------------------------------------------------------------------------------- function: rvlcCheckIntensityCb description: Check if a intensity codebook is used in the current channel. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure ----------------------------------------------------------------------------------------------- output: - intensity_used: 0 no intensity codebook is used 1 intensity codebook is used ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void rvlcCheckIntensityCb (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { int group, band, bnds; pRvlc->intensity_used = 0; for (group=0; group < pRvlc->numWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; if ( (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB) || (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds] == INTENSITY_HCB2) ) { pRvlc->intensity_used = 1; break; } } } } /*--------------------------------------------------------------------------------------------- function: rvlcDecodeEscapeWord description: Decode a huffman coded RVLC Escape-word. This value is part of a DPCM coded scalefactor. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure ----------------------------------------------------------------------------------------------- return: - a single RVLC-Escape value which had to be applied to a DPCM value (which has a absolute value of 7) -------------------------------------------------------------------------------------------- */ static SCHAR rvlcDecodeEscapeWord (CErRvlcInfo *pRvlc, HANDLE_FDK_BITSTREAM bs) { int i; SCHAR value; UCHAR carryBit; UINT treeNode; UINT branchValue; UINT branchNode; USHORT* pBitstreamIndexEsc; const UINT* pEscTree; pEscTree = pRvlc->pHuffTreeRvlcEscape; pBitstreamIndexEsc = &(pRvlc->bitstreamIndexEsc); treeNode = *pEscTree; /* init at starting node */ for (i=MAX_LEN_RVLC_ESCAPE_WORD-1; i >= 0; i--) { carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ pBitstreamIndexEsc, FWD); CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */ treeNode, &branchValue, &branchNode); if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-escape-word is completely decoded */ value = (SCHAR) branchNode & CLR_BIT_10; pRvlc->length_of_rvlc_escapes -= (MAX_LEN_RVLC_ESCAPE_WORD - i); if (pRvlc->length_of_rvlc_escapes < 0) { pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; value = -1; } return value; } else { treeNode = *(pEscTree + branchValue); /* update treeNode for further step in decoding tree */ } } pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; return -1; /* should not be reached */ } /*--------------------------------------------------------------------------------------------- function: rvlcDecodeEscapes description: Decodes all huffman coded RVLC Escape Words. Here a difference to the pseudo-code-implementation from standard can be found. A while loop (and not two nested for loops) is used for two reasons: 1. The plain huffman encoded escapes are decoded before the RVL-coded scalefactors. Therefore the escapes are present in the second step when decoding the RVL-coded-scalefactor values in forward and backward direction. When the RVL-coded scalefactors are decoded and there a escape is needed, then it is just taken out of the array in ascending order. 2. It's faster. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - handle to FDK bitstream ----------------------------------------------------------------------------------------------- return: - 0 ok the decoded escapes seem to be valid - 1 error there was a error detected during decoding escapes --> all escapes are invalid -------------------------------------------------------------------------------------------- */ static void rvlcDecodeEscapes (CErRvlcInfo *pRvlc, SHORT *pEsc, HANDLE_FDK_BITSTREAM bs) { SCHAR escWord; SCHAR escCnt=0; SHORT* pEscBitCntSum; pEscBitCntSum = &(pRvlc->length_of_rvlc_escapes); /* Decode all RVLC-Escape words with a plain Huffman-Decoder */ while ( *pEscBitCntSum > 0 ) { escWord = rvlcDecodeEscapeWord(pRvlc, bs); if (escWord >= 0) { pEsc[escCnt] = escWord; escCnt++; } else { pRvlc->errorLogRvlc |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID; pRvlc->numDecodedEscapeWordsEsc = escCnt; return; } } /* all RVLC escapes decoded */ pRvlc->numDecodedEscapeWordsEsc = escCnt; } /*--------------------------------------------------------------------------------------------- function: decodeRVLCodeword description: Decodes a RVL-coded dpcm-word (-part). ----------------------------------------------------------------------------------------------- input: - FDK bitstream handle - pointer rvlc structure ----------------------------------------------------------------------------------------------- return: - a dpcm value which is within range [0,1,..,14] in case of no errors. The offset of 7 must be subtracted to get a valid dpcm scalefactor value. In case of errors a forbidden codeword is detected --> returning -1 -------------------------------------------------------------------------------------------- */ SCHAR decodeRVLCodeword (HANDLE_FDK_BITSTREAM bs, CErRvlcInfo *pRvlc) { int i; SCHAR value; UCHAR carryBit; UINT branchValue; UINT branchNode; const UINT *pRvlCodeTree = pRvlc->pHuffTreeRvlCodewds; UCHAR direction = pRvlc->direction; USHORT *pBitstrIndxRvl = pRvlc->pBitstrIndxRvl_RVL; UINT treeNode = *pRvlCodeTree; for (i=MAX_LEN_RVLC_CODE_WORD-1; i >= 0; i--) { carryBit = rvlcReadBitFromBitstream(bs, /* get next bit */ pBitstrIndxRvl, direction); CarryBitToBranchValue(carryBit, /* huffman decoding, do a single step in huffman decoding tree */ treeNode, &branchValue, &branchNode); if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> a RVLC-codeword is completely decoded */ value = (SCHAR) (branchNode & CLR_BIT_10); *pRvlc->pRvlBitCnt_RVL -= (MAX_LEN_RVLC_CODE_WORD - i); /* check available bits for decoding */ if (*pRvlc->pRvlBitCnt_RVL < 0) { if (direction == FWD) { pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD; } else { pRvlc->errorLogRvlc |= RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD; } value = -1; /* signalize an error in return value, because too many bits was decoded */ } /* check max value of dpcm value */ if (value > MAX_ALLOWED_DPCM_INDEX) { if (direction == FWD) { pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD; } else { pRvlc->errorLogRvlc |= RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD; } value = -1; /* signalize an error in return value, because a forbidden cw was detected*/ } return value; /* return a dpcm value with offset +7 or an error status */ } else { treeNode = *(pRvlCodeTree + branchValue); /* update treeNode for further step in decoding tree */ } } return -1; } /*--------------------------------------------------------------------------------------------- function: rvlcDecodeForward description: Decode RVL-coded codewords in forward direction. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - handle to FDK bitstream ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void rvlcDecodeForward (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs) { int band = 0; int group = 0; int bnds = 0; SHORT dpcm; SHORT factor = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; SHORT position = - SF_OFFSET; SHORT noisenrg = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; SHORT* pScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd; SHORT* pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; UCHAR* pEscFwdCnt = &(pRvlc->numDecodedEscapeWordsFwd); pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_fwd); pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlFwd); *pEscFwdCnt = 0; pRvlc->direction = FWD; pRvlc->noise_used = 0; pRvlc->sf_used = 0; pRvlc->lastScf = 0; pRvlc->lastNrg = 0; pRvlc->lastIs = 0; rvlcCheckIntensityCb(pRvlc,pAacDecoderChannelInfo); /* main loop fwd long */ for (group=0; group < pRvlc->numWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB : pScfFwd[bnds] = 0; break; case INTENSITY_HCB2 : case INTENSITY_HCB : /* store dpcm_is_position */ dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pRvlc->conceal_max = bnds; return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc++; } else { dpcm += *pScfEsc++; } (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { pRvlc->conceal_max_esc = bnds; } } } position += dpcm; pScfFwd[bnds] = position; pRvlc->lastIs = position; break; case NOISE_HCB : if (pRvlc->noise_used == 0) { pRvlc->noise_used = 1; pRvlc->first_noise_band = bnds; noisenrg += pRvlc->dpcm_noise_nrg; pScfFwd[bnds] = 100 + noisenrg; pRvlc->lastNrg = noisenrg; } else { dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pRvlc->conceal_max = bnds; return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc++; } else { dpcm += *pScfEsc++; } (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { pRvlc->conceal_max_esc = bnds; } } } noisenrg += dpcm; pScfFwd[bnds] = 100 + noisenrg; pRvlc->lastNrg = noisenrg; } pAacDecoderChannelInfo->data.aac.PnsData.pnsUsed[bnds] = 1; break ; default : pRvlc->sf_used = 1; dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pRvlc->conceal_max = bnds; return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc++; } else { dpcm += *pScfEsc++; } (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { pRvlc->conceal_max_esc = bnds; } } } factor += dpcm; pScfFwd[bnds] = factor; pRvlc->lastScf = factor; break; } } } /* postfetch fwd long */ if (pRvlc->intensity_used) { dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ if ( dpcm < 0 ) { pRvlc->conceal_max = bnds; return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_max = bnds; return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc++; } else { dpcm += *pScfEsc++; } (*pEscFwdCnt)++; if (pRvlc->conceal_max_esc == CONCEAL_MAX_INIT) { pRvlc->conceal_max_esc = bnds; } } } pRvlc->dpcm_is_last_position = dpcm; } } /*--------------------------------------------------------------------------------------------- function: rvlcDecodeBackward description: Decode RVL-coded codewords in backward direction. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - handle FDK bitstream ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void rvlcDecodeBackward (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs) { SHORT band, group, dpcm, offset; SHORT bnds = pRvlc->maxSfbTransmitted-1; SHORT factor = pRvlc->rev_global_gain - SF_OFFSET; SHORT position = pRvlc->dpcm_is_last_position - SF_OFFSET; SHORT noisenrg = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256; SHORT *pScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd; SHORT *pScfEsc = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc; UCHAR *pEscEscCnt = &(pRvlc->numDecodedEscapeWordsEsc); UCHAR *pEscBwdCnt = &(pRvlc->numDecodedEscapeWordsBwd); pRvlc->pRvlBitCnt_RVL = &(pRvlc->length_of_rvlc_sf_bwd); pRvlc->pBitstrIndxRvl_RVL = &(pRvlc->bitstreamIndexRvlBwd); *pEscBwdCnt = 0; pRvlc->direction = BWD; pScfEsc += *pEscEscCnt - 1; /* set pScfEsc to last entry */ pRvlc->firstScf = 0; pRvlc->firstNrg = 0; pRvlc->firstIs = 0; /* prefetch long BWD */ if (pRvlc->intensity_used) { dpcm = decodeRVLCodeword(bs, pRvlc); /* dpcm_is_last_position */ if ( dpcm < 0 ) { pRvlc->dpcm_is_last_position = 0; pRvlc->conceal_min = bnds; return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pRvlc->conceal_min = bnds; return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; } else { dpcm += *pScfEsc--; } (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { pRvlc->conceal_min_esc = bnds; } } } pRvlc->dpcm_is_last_position = dpcm; } /* main loop long BWD */ for (group=pRvlc->numWindowGroups-1; group >= 0; group--) { for (band=pRvlc->maxSfbTransmitted-1; band >= 0; band--) { bnds = 16*group+band; if ((band == 0) && (pRvlc->numWindowGroups != 1)) offset = 16 - pRvlc->maxSfbTransmitted + 1; else offset = 1; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB : pScfBwd[bnds] = 0; break; case INTENSITY_HCB2 : case INTENSITY_HCB : /* store dpcm_is_position */ dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pScfBwd[bnds] = position; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pScfBwd[bnds] = position; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; } else { dpcm += *pScfEsc--; } (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); } } } pScfBwd[bnds] = position; position -= dpcm; pRvlc->firstIs = position; break; case NOISE_HCB : if ( bnds == pRvlc->first_noise_band ) { pScfBwd[bnds] = pRvlc->dpcm_noise_nrg + pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; pRvlc->firstNrg = pScfBwd[bnds]; } else { dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pScfBwd[bnds] = noisenrg; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pScfBwd[bnds] = noisenrg; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; } else { dpcm += *pScfEsc--; } (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); } } } pScfBwd[bnds] = noisenrg; noisenrg -= dpcm; pRvlc->firstNrg = noisenrg; } break ; default : dpcm = decodeRVLCodeword(bs, pRvlc); if ( dpcm < 0 ) { pScfBwd[bnds] = factor; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } dpcm -= TABLE_OFFSET; if ((dpcm == MIN_RVL) || (dpcm == MAX_RVL)) { if (pRvlc->length_of_rvlc_escapes) { pScfBwd[bnds] = factor; pRvlc->conceal_min = FDKmax(0,bnds-offset); return; } else { if (dpcm == MIN_RVL) { dpcm -= *pScfEsc--; } else { dpcm += *pScfEsc--; } (*pEscBwdCnt)++; if (pRvlc->conceal_min_esc == CONCEAL_MIN_INIT) { pRvlc->conceal_min_esc = FDKmax(0,bnds-offset); } } } pScfBwd[bnds] = factor; factor -= dpcm; pRvlc->firstScf = factor; break; } } } } /*--------------------------------------------------------------------------------------------- function: rvlcFinalErrorDetection description: Call RVLC concealment if error was detected in decoding process ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void rvlcFinalErrorDetection (CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; UCHAR ErrorStatusComplete = 0; UCHAR ErrorStatusLengthFwd = 0; UCHAR ErrorStatusLengthBwd = 0; UCHAR ErrorStatusLengthEscapes = 0; UCHAR ErrorStatusFirstScf = 0; UCHAR ErrorStatusLastScf = 0; UCHAR ErrorStatusFirstNrg = 0; UCHAR ErrorStatusLastNrg = 0; UCHAR ErrorStatusFirstIs = 0; UCHAR ErrorStatusLastIs = 0; UCHAR ErrorStatusForbiddenCwFwd = 0; UCHAR ErrorStatusForbiddenCwBwd = 0; UCHAR ErrorStatusNumEscapesFwd = 0; UCHAR ErrorStatusNumEscapesBwd = 0; UCHAR ConcealStatus = 1; UCHAR currentBlockType; /* short: 0, not short: 1*/ #if VERBOSE_RVLC_OUTPUT CHAR Strategy[60]="No"; SHORT conceal_max; SHORT conceal_min; #endif pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 1; /* invalid escape words, bit counter unequal zero, forbidden codeword detected */ if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD) ErrorStatusForbiddenCwFwd = 1; if (pRvlc->errorLogRvlc & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD) ErrorStatusForbiddenCwBwd = 1; /* bit counter forward unequal zero */ if (pRvlc->length_of_rvlc_sf_fwd) ErrorStatusLengthFwd = 1; /* bit counter backward unequal zero */ if (pRvlc->length_of_rvlc_sf_bwd) ErrorStatusLengthBwd = 1; /* bit counter escape sequences unequal zero */ if (pRvlc->sf_escapes_present) if (pRvlc->length_of_rvlc_escapes) ErrorStatusLengthEscapes = 1; if (pRvlc->sf_used) { /* first decoded scf does not match to global gain in backward direction */ if (pRvlc->firstScf != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET) ) ErrorStatusFirstScf = 1; /* last decoded scf does not match to rev global gain in forward direction */ if (pRvlc->lastScf != (pRvlc->rev_global_gain - SF_OFFSET) ) ErrorStatusLastScf = 1; } if (pRvlc->noise_used) { /* first decoded nrg does not match to dpcm_noise_nrg in backward direction */ if (pRvlc->firstNrg != (pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain + pRvlc->dpcm_noise_nrg - SF_OFFSET -90 - 256) ) ErrorStatusFirstNrg = 1; /* last decoded nrg does not match to dpcm_noise_last_position in forward direction */ if (pRvlc->lastNrg != (pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256) ) ErrorStatusLastNrg = 1; } if (pRvlc->intensity_used) { /* first decoded is position does not match in backward direction */ if (pRvlc->firstIs != (-SF_OFFSET) ) ErrorStatusFirstIs = 1; /* last decoded is position does not match in forward direction */ if (pRvlc->lastIs != (pRvlc->dpcm_is_last_position - SF_OFFSET) ) ErrorStatusLastIs = 1; } /* decoded escapes and used escapes in forward direction do not fit */ if ((pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_max == CONCEAL_MAX_INIT)) { ErrorStatusNumEscapesFwd = 1; } /* decoded escapes and used escapes in backward direction do not fit */ if ((pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { ErrorStatusNumEscapesBwd = 1; } #if VERBOSE_RVLC_OUTPUT conceal_max = pRvlc->conceal_max; conceal_min = pRvlc->conceal_min; #endif if ( ErrorStatusLengthEscapes || ( ( (pRvlc->conceal_max == CONCEAL_MAX_INIT) && (pRvlc->numDecodedEscapeWordsFwd != pRvlc->numDecodedEscapeWordsEsc) && (ErrorStatusLastScf || ErrorStatusLastNrg || ErrorStatusLastIs) ) && ( (pRvlc->conceal_min == CONCEAL_MIN_INIT) && (pRvlc->numDecodedEscapeWordsBwd != pRvlc->numDecodedEscapeWordsEsc) && (ErrorStatusFirstScf || ErrorStatusFirstNrg || ErrorStatusFirstIs) ) ) || ( (pRvlc->conceal_max == CONCEAL_MAX_INIT) && ((pRvlc->rev_global_gain - SF_OFFSET - pRvlc->lastScf) < -15) ) || ( (pRvlc->conceal_min == CONCEAL_MIN_INIT) && ((pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - pRvlc->firstScf) < -15) ) ) { if ((pRvlc->conceal_max == CONCEAL_MAX_INIT) || (pRvlc->conceal_min == CONCEAL_MIN_INIT)) { pRvlc->conceal_max = 0; pRvlc->conceal_min = FDKmax(0, (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1); } else { pRvlc->conceal_max = FDKmin(pRvlc->conceal_max,pRvlc->conceal_max_esc); pRvlc->conceal_min = FDKmax(pRvlc->conceal_min,pRvlc->conceal_min_esc); } } ErrorStatusComplete = ErrorStatusLastScf || ErrorStatusFirstScf || ErrorStatusLastNrg || ErrorStatusFirstNrg || ErrorStatusLastIs || ErrorStatusFirstIs || ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || ErrorStatusLengthFwd || ErrorStatusLengthBwd || ErrorStatusLengthEscapes || ErrorStatusNumEscapesFwd || ErrorStatusNumEscapesBwd; currentBlockType = (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) ? 0 : 1; if (!ErrorStatusComplete) { int band; int group; int bnds; int lastSfbIndex; lastSfbIndex = (pRvlc->numWindowGroups > 1) ? 16 : 64; for (group=0; group < pRvlc->numWindowGroups; group++) { for (band=0; bandmaxSfbTransmitted; band++) { bnds = 16*group+band; pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; } } for (group=0; group < pRvlc->numWindowGroups; group++) { for (band=0; bandmaxSfbTransmitted; band++) { bnds = 16*group+band; pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]; } for (; band = 0 && bnds < RVLC_MAX_SFB); pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds] = ZERO_HCB; } } } else { int band; int group; /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward decoding, backward decoding and previous frame. */ if ( ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && (pRvlc->conceal_min <= pRvlc->conceal_max) && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment && ConcealStatus ) { BidirectionalEstimation_UseScfOfPrevFrameAsReference (pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); ConcealStatus=0; #if VERBOSE_RVLC_OUTPUT FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseScfOfPrevFrameAsReference)"); #endif } /* A single bit error was detected in decoding of dpcm values. It also could be an error with more bits in decoding of escapes and dpcm values whereby an illegal codeword followed not directly after the corrupted bits but just after decoding some more (wrong) scalefactors. Use the smaller scalefactor from forward and backward decoding. */ if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((pRvlc->conceal_min != CONCEAL_MIN_INIT) || (pRvlc->conceal_max != CONCEAL_MAX_INIT)) && !(pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType)) && ConcealStatus ) { BidirectionalEstimation_UseLowerScfOfCurrentFrame (pAacDecoderChannelInfo); ConcealStatus=0; #if VERBOSE_RVLC_OUTPUT FDKstrcpy(Strategy,"Yes (BidirectionalEstimation_UseLowerScfOfCurrentFrame)"); #endif } /* No errors were detected in decoding of escapes and dpcm values however the first and last value of a group (is,nrg,sf) is incorrect */ if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && ((ErrorStatusLastScf && ErrorStatusFirstScf) || (ErrorStatusLastNrg && ErrorStatusFirstNrg) || (ErrorStatusLastIs && ErrorStatusFirstIs)) && !(ErrorStatusForbiddenCwFwd || ErrorStatusForbiddenCwBwd || ErrorStatusLengthEscapes ) && ConcealStatus) { StatisticalEstimation (pAacDecoderChannelInfo); ConcealStatus=0; #if VERBOSE_RVLC_OUTPUT FDKstrcpy(Strategy,"Yes (StatisticalEstimation)"); #endif } /* A error with more bits in decoding of escapes and dpcm values was detected. Use the smaller scalefactor from forward decoding, backward decoding and previous frame. */ if ( (pRvlc->conceal_min <= pRvlc->conceal_max) && pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousScaleFactorOK && pRvlc->sf_concealment && (pAacDecoderStaticChannelInfo->concealmentInfo.rvlcPreviousBlockType == currentBlockType) && ConcealStatus ) { PredictiveInterpolation(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); ConcealStatus=0; #if VERBOSE_RVLC_OUTPUT FDKstrcpy(Strategy,"Yes (PredictiveInterpolation)"); #endif } /* Call frame concealment, because no better strategy was found. Setting the scalefactors to zero is done for debugging purposes */ if (ConcealStatus) { for (group=0; group < pRvlc->numWindowGroups; group++) { for (band=0; bandmaxSfbTransmitted; band++) { pAacDecoderChannelInfo->pDynData->aScaleFactor[16*group+band] = 0; } } pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; #if VERBOSE_RVLC_OUTPUT FDKstrcpy(Strategy,"Yes (FrameConcealment)"); #endif } } #if VERBOSE_RVLC_OUTPUT DebugOutputDistortedBitstreams(pRvlc,pAacDecoderChannelInfo,ErrorStatusLengthFwd,ErrorStatusLengthBwd, ErrorStatusLengthEscapes,ErrorStatusFirstScf,ErrorStatusLastScf, ErrorStatusFirstNrg,ErrorStatusLastNrg,ErrorStatusFirstIs,ErrorStatusLastIs, ErrorStatusForbiddenCwFwd,ErrorStatusForbiddenCwBwd,ErrorStatusNumEscapesFwd, ErrorStatusNumEscapesBwd,conceal_max,conceal_min,Strategy); #endif } /*--------------------------------------------------------------------------------------------- function: CRvlc_Read description: Read RVLC ESC1 data (side info) from bitstream. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ void CRvlc_Read ( CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; int group,band; /* RVLC long specific initialization Init part 1 of 2 */ pRvlc->numWindowGroups = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); pRvlc->maxSfbTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); pRvlc->noise_used = 0; /* noise detection */ pRvlc->dpcm_noise_nrg = 0; /* only for debugging */ pRvlc->dpcm_noise_last_position = 0; /* only for debugging */ pRvlc->length_of_rvlc_escapes = -1; /* default value is used for error detection and concealment */ /* read only error sensitivity class 1 data (ESC 1 - data) */ pRvlc->sf_concealment = FDKreadBits(bs,1); /* #1 */ pRvlc->rev_global_gain = FDKreadBits(bs,8); /* #2 */ if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { pRvlc->length_of_rvlc_sf = FDKreadBits(bs,11); /* #3 */ } else { pRvlc->length_of_rvlc_sf = FDKreadBits(bs,9); /* #3 */ } /* check if noise codebook is used */ for (group = 0; group < pRvlc->numWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { if (pAacDecoderChannelInfo->pDynData->aCodeBook[16*group+band] == NOISE_HCB) { pRvlc->noise_used = 1; break; } } } if (pRvlc->noise_used) pRvlc->dpcm_noise_nrg = FDKreadBits(bs, 9); /* #4 PNS */ pRvlc->sf_escapes_present = FDKreadBits(bs, 1); /* #5 */ if ( pRvlc->sf_escapes_present) { pRvlc->length_of_rvlc_escapes = FDKreadBits(bs, 8); /* #6 */ } if (pRvlc->noise_used) { pRvlc->dpcm_noise_last_position = FDKreadBits(bs, 9); /* #7 PNS */ pRvlc->length_of_rvlc_sf -= 9; } pRvlc->length_of_rvlc_sf_fwd = pRvlc->length_of_rvlc_sf; pRvlc->length_of_rvlc_sf_bwd = pRvlc->length_of_rvlc_sf; } /*--------------------------------------------------------------------------------------------- function: CRvlc_Decode description: Decode rvlc data The function reads both the escape sequences and the scalefactors in forward and backward direction. If an error occured during decoding process which can not be concealed with the rvlc concealment frame concealment will be initiated. Then the element "rvlcCurrentScaleFactorOK" in the decoder channel info is set to 0 otherwise it is set to 1. ----------------------------------------------------------------------------------------------- input: - pointer rvlc structure - pointer channel info structure - pointer to persistent channel info structure - pointer bitstream structure ----------------------------------------------------------------------------------------------- return: ErrorStatus = AAC_DEC_OK -------------------------------------------------------------------------------------------- */ void CRvlc_Decode ( CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, HANDLE_FDK_BITSTREAM bs ) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; INT bitCntOffst; UINT saveBitCnt; rvlcInit(pRvlc,pAacDecoderChannelInfo,bs); /* save bitstream position */ saveBitCnt = FDKgetBitCnt(bs); #if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_SF GenerateSingleBitError(pRvlc, &(pRvlc->bitstreamIndexRvlFwd), pRvlc->length_of_rvlc_sf, 0); #endif #if RVLC_ADVANCED_BITSTREAM_ERROR_GENERATOR_ESC if (pRvlc->sf_escapes_present) GenerateSingleBitError(pRvlc, &(pRvlc->bitstreamIndexEsc), pRvlc->length_of_rvlc_escapes, 1); #endif if ( pRvlc->sf_escapes_present) rvlcDecodeEscapes(pRvlc, pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfEsc, bs); rvlcDecodeForward(pRvlc,pAacDecoderChannelInfo, bs); rvlcDecodeBackward(pRvlc,pAacDecoderChannelInfo, bs); rvlcFinalErrorDetection(pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo); pAacDecoderChannelInfo->pDynData->specificTo.aac.rvlcIntensityUsed = pRvlc->intensity_used; pAacDecoderChannelInfo->data.aac.PnsData.PnsActive = pRvlc->noise_used; /* restore bitstream position */ bitCntOffst = saveBitCnt - FDKgetBitCnt(bs); if( bitCntOffst ) { FDKpushBiDirectional(bs, bitCntOffst); } } void CRvlc_ElementCheck ( CAacDecoderChannelInfo *pAacDecoderChannelInfo[], CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], const UINT flags, const INT elChannels ) { int ch; /* Required for MPS residuals. */ if (pAacDecoderStaticChannelInfo == NULL) { return; } /* RVLC specific sanity checks */ if ( (flags & AC_ER_RVLC) && (elChannels == 2)) { /* to be reviewed */ if ( ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) || (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) ) && pAacDecoderChannelInfo[0]->pComData->jointStereoData.MsMaskPresent ) { pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; } if ( (pAacDecoderChannelInfo[0]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 0) && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK == 1) && (pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcIntensityUsed == 1) ){ pAacDecoderChannelInfo[1]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK = 0; } } for (ch = 0; ch < elChannels; ch ++) { pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousBlockType = (GetWindowSequence(&pAacDecoderChannelInfo[ch]->icsInfo) == EightShortSequence) ? 0 : 1; if (flags & AC_ER_RVLC) { pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.rvlcCurrentScaleFactorOK; } else { pAacDecoderStaticChannelInfo[ch]->concealmentInfo.rvlcPreviousScaleFactorOK = 0; } } } fdk-aac-0.1.3/libAACdec/src/aacdec_drc.cpp0000644000175000017500000010467012372261464020474 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Dynamic range control (DRC) decoder tool for AAC ******************************************************************************/ #include "aacdec_drc.h" #include "channelinfo.h" #include "aac_rom.h" #include "sbrdecoder.h" /* * Dynamic Range Control */ /* For parameter conversion */ #define DRC_PARAMETER_BITS ( 7 ) #define DRC_MAX_QUANT_STEPS ( 1<enable = 0; self->numThreads = 0; self->digitalNorm = 0; /* init params */ pParams = &self->params; pParams->bsDelayEnable = 0; pParams->cut = FL2FXCONST_DBL(0.0f); pParams->usrCut = FL2FXCONST_DBL(0.0f); pParams->boost = FL2FXCONST_DBL(0.0f); pParams->usrBoost = FL2FXCONST_DBL(0.0f); pParams->targetRefLevel = AACDEC_DRC_DEFAULT_REF_LEVEL; pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; pParams->applyHeavyCompression = 0; /* initial program ref level = target ref level */ self->progRefLevel = pParams->targetRefLevel; } /*! \brief Initialize DRC control data for one channel \self Handle of DRC info \return none */ void aacDecoder_drcInitChannelData ( CDrcChannelData *pDrcChData ) { if (pDrcChData != NULL) { pDrcChData->expiryCount = 0; pDrcChData->numBands = 1; pDrcChData->bandTop[0] = (1024 >> 2) - 1; pDrcChData->drcValue[0] = 0; pDrcChData->drcInterpolationScheme = 0; pDrcChData->drcDataType = UNKNOWN_PAYLOAD; } } /*! \brief Set one single DRC parameter \self Handle of DRC info. \param Parameter to be set. \value Value to be set. \return an error code. */ AAC_DECODER_ERROR aacDecoder_drcSetParam ( HANDLE_AAC_DRC self, AACDEC_DRC_PARAM param, INT value ) { AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; switch (param) { case DRC_CUT_SCALE: /* set attenuation scale factor */ if ( (value < 0) || (value > DRC_MAX_QUANT_FACTOR) ) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } self->params.usrCut = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value); if (self->params.applyHeavyCompression == 0) self->params.cut = self->params.usrCut; break; case DRC_BOOST_SCALE: /* set boost factor */ if ( (value < 0) || (value > DRC_MAX_QUANT_FACTOR) ) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } self->params.usrBoost = (FIXP_DBL)((INT)(DRC_PARAM_QUANT_STEP>>DRC_PARAM_SCALE) * (INT)value); if (self->params.applyHeavyCompression == 0) self->params.boost = self->params.usrBoost; break; case TARGET_REF_LEVEL: if ( value > MAX_REFERENCE_LEVEL || value < -MAX_REFERENCE_LEVEL ) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } if (value < 0) { self->digitalNorm = 0; } else { /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ self->digitalNorm = 1; if (self->params.targetRefLevel != (SCHAR)value) { self->params.targetRefLevel = (SCHAR)value; self->progRefLevel = (SCHAR)value; /* Always set the program reference level equal to the target level according to 4.5.2.7.3 of ISO/IEC 14496-3. */ } } break; case APPLY_HEAVY_COMPRESSION: if (value < 0 || value > 1) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } if (self->params.applyHeavyCompression != (UCHAR)value) { if (value == 1) { /* Disable scaling of DRC values by setting the max values */ self->params.boost = FL2FXCONST_DBL(1.0f/(float)(1<params.cut = FL2FXCONST_DBL(1.0f/(float)(1<params.boost = self->params.usrBoost; self->params.cut = self->params.usrCut; } /* Store new parameter value */ self->params.applyHeavyCompression = (UCHAR)value; } break; case DRC_BS_DELAY: if (value < 0 || value > 1) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } self->params.bsDelayEnable = value; break; case DRC_DATA_EXPIRY_FRAME: if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } self->params.expiryFrame = (UINT)value; break; default: return AAC_DEC_SET_PARAM_FAIL; } /* switch(param) */ /* switch on/off processing */ self->enable = ( (self->params.boost > (FIXP_DBL)0) || (self->params.cut > (FIXP_DBL)0) || (self->params.applyHeavyCompression != 0) || (self->digitalNorm == 1) ); return ErrorStatus; } static int parseExcludedChannels( UINT *excludedChnsMask, HANDLE_FDK_BITSTREAM bs ) { UINT excludeMask = 0; UINT i, j; int bitCnt = 9; for (i = 0, j = 1; i < 7; i++, j<<=1) { if (FDKreadBits(bs,1)) { excludeMask |= j; } } /* additional_excluded_chns */ while (FDKreadBits(bs,1)) { for (i = 0; i < 7; i++, j<<=1) { if (FDKreadBits(bs,1)) { excludeMask |= j; } } bitCnt += 9; FDK_ASSERT(j < (UINT)-1); } *excludedChnsMask = excludeMask; return (bitCnt); } /*! \brief Save DRC payload bitstream position \self Handle of DRC info \bs Handle of FDK bitstream \return The number of DRC payload bits */ int aacDecoder_drcMarkPayload ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM bs, AACDEC_DRC_PAYLOAD_TYPE type ) { UINT bsStartPos; int i, numBands = 1, bitCnt = 0; if (self == NULL) { return 0; } bsStartPos = FDKgetValidBits(bs); switch (type) { case MPEG_DRC_EXT_DATA: { bitCnt = 4; if (FDKreadBits(bs,1)) { /* pce_tag_present */ FDKreadBits(bs,8); /* pce_instance_tag + drc_tag_reserved_bits */ bitCnt+=8; } if (FDKreadBits(bs,1)) { /* excluded_chns_present */ FDKreadBits(bs,7); /* exclude mask [0..7] */ bitCnt+=8; while (FDKreadBits(bs,1)) { /* additional_excluded_chns */ FDKreadBits(bs,7); /* exclude mask [x..y] */ bitCnt+=8; } } if (FDKreadBits(bs,1)) { /* drc_bands_present */ numBands += FDKreadBits(bs, 4); /* drc_band_incr */ FDKreadBits(bs,4); /* reserved */ bitCnt+=8; for (i = 0; i < numBands; i++) { FDKreadBits(bs,8); /* drc_band_top[i] */ bitCnt+=8; } } if (FDKreadBits(bs,1)) { /* prog_ref_level_present */ FDKreadBits(bs,8); /* prog_ref_level + prog_ref_level_reserved_bits */ bitCnt+=8; } for (i = 0; i < numBands; i++) { FDKreadBits(bs,8); /* dyn_rng_sgn[i] + dyn_rng_ctl[i] */ bitCnt+=8; } if ( (self->numPayloads < MAX_DRC_THREADS) && ((INT)FDKgetValidBits(bs) >= 0) ) { self->drcPayloadPosition[self->numPayloads++] = bsStartPos; } } break; case DVB_DRC_ANC_DATA: bitCnt += 8; /* check sync word */ if (FDKreadBits(bs, 8) == DVB_ANC_DATA_SYNC_BYTE) { int dmxLevelsPresent, compressionPresent; int coarseGrainTcPresent, fineGrainTcPresent; /* bs_info field */ FDKreadBits(bs, 8); /* mpeg_audio_type, dolby_surround_mode, presentation_mode */ bitCnt+=8; /* Evaluate ancillary_data_status */ FDKreadBits(bs, 3); /* reserved, set to 0 */ dmxLevelsPresent = FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */ FDKreadBits(bs, 1); /* reserved, set to 0 */ compressionPresent = FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */ coarseGrainTcPresent = FDKreadBits(bs, 1); /* coarse_grain_timecode_status */ fineGrainTcPresent = FDKreadBits(bs, 1); /* fine_grain_timecode_status */ bitCnt+=8; /* MPEG4 downmixing levels */ if (dmxLevelsPresent) { FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */ bitCnt+=8; } /* audio coding mode and compression status */ if (compressionPresent) { FDKreadBits(bs, 16); /* audio_coding_mode, Compression_value */ bitCnt+=16; } /* coarse grain timecode */ if (coarseGrainTcPresent) { FDKreadBits(bs, 16); /* coarse_grain_timecode */ bitCnt+=16; } /* fine grain timecode */ if (fineGrainTcPresent) { FDKreadBits(bs, 16); /* fine_grain_timecode */ bitCnt+=16; } if ( !self->dvbAncDataAvailable && ((INT)FDKgetValidBits(bs) >= 0) ) { self->dvbAncDataPosition = bsStartPos; self->dvbAncDataAvailable = 1; } } break; default: break; } return (bitCnt); } /*! \brief Parse DRC parameters from bitstream \bs Handle of FDK bitstream (in) \pDrcBs Pointer to DRC payload data container (out) \payloadPosition Bitstream position of MPEG DRC data junk (in) \return Number of bits read (0 in case of a parse error) */ static int aacDecoder_drcParse ( HANDLE_FDK_BITSTREAM bs, CDrcPayload *pDrcBs, UINT payloadPosition ) { int i, numBands, bitCnt = 4; /* Move to the beginning of the DRC payload field */ FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition); /* pce_tag_present */ if (FDKreadBits(bs,1)) { pDrcBs->pceInstanceTag = FDKreadBits(bs, 4); /* pce_instance_tag */ /* only one program supported */ FDKreadBits(bs, 4); /* drc_tag_reserved_bits */ bitCnt += 8; } else { pDrcBs->pceInstanceTag = -1; /* not present */ } if (FDKreadBits(bs,1)) { /* excluded_chns_present */ /* get excluded_chn_mask */ bitCnt += parseExcludedChannels(&pDrcBs->excludedChnsMask, bs); } else { pDrcBs->excludedChnsMask = 0; } numBands = 1; if (FDKreadBits(bs,1)) /* drc_bands_present */ { /* get band_incr */ numBands += FDKreadBits(bs, 4); /* drc_band_incr */ pDrcBs->channelData.drcInterpolationScheme = FDKreadBits(bs, 4); /* drc_interpolation_scheme */ bitCnt += 8; /* band_top */ for (i = 0; i < numBands; i++) { pDrcBs->channelData.bandTop[i] = FDKreadBits(bs, 8); /* drc_band_top[i] */ bitCnt += 8; } } else { pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */; } pDrcBs->channelData.numBands = numBands; if (FDKreadBits(bs,1)) /* prog_ref_level_present */ { pDrcBs->progRefLevel = FDKreadBits(bs, 7); /* prog_ref_level */ FDKreadBits(bs, 1); /* prog_ref_level_reserved_bits */ bitCnt += 8; } else { pDrcBs->progRefLevel = -1; } for (i = 0; i < numBands; i++) { pDrcBs->channelData.drcValue[i] = FDKreadBits(bs, 1) << 7; /* dyn_rng_sgn[i] */ pDrcBs->channelData.drcValue[i] |= FDKreadBits(bs, 7) & 0x7F; /* dyn_rng_ctl[i] */ bitCnt += 8; } /* Set DRC payload type */ pDrcBs->channelData.drcDataType = MPEG_DRC_EXT_DATA; return (bitCnt); } /*! \brief Parse heavy compression value transported in DSEs of DVB streams with MPEG-4 content. \bs Handle of FDK bitstream (in) \pDrcBs Pointer to DRC payload data container (out) \payloadPosition Bitstream position of DVB ancillary data junk \return Number of bits read (0 in case of a parse error) */ #define DVB_COMPRESSION_SCALE ( 8 ) /* 48,164 dB */ static int aacDecoder_drcReadCompression ( HANDLE_FDK_BITSTREAM bs, CDrcPayload *pDrcBs, UINT payloadPosition ) { int bitCnt = 0; int dmxLevelsPresent, compressionPresent; int coarseGrainTcPresent, fineGrainTcPresent; /* Move to the beginning of the DRC payload field */ FDKpushBiDirectional(bs, FDKgetValidBits(bs)-payloadPosition); /* Sanity checks */ if ( FDKgetValidBits(bs) < 24 ) { return 0; } /* Check sync word */ if (FDKreadBits(bs, 8) != DVB_ANC_DATA_SYNC_BYTE) { return 0; } /* Evaluate bs_info field */ if (FDKreadBits(bs, 2) != 3) { /* mpeg_audio_type */ /* No MPEG-4 audio data */ return 0; } FDKreadBits(bs, 2); /* dolby_surround_mode */ FDKreadBits(bs, 2); /* presentation_mode */ if (FDKreadBits(bs, 2) != 0) { /* reserved, set to 0 */ return 0; } /* Evaluate ancillary_data_status */ if (FDKreadBits(bs, 3) != 0) { /* reserved, set to 0 */ return 0; } dmxLevelsPresent = FDKreadBits(bs, 1); /* downmixing_levels_MPEG4_status */ if (FDKreadBits(bs, 1) != 0) { /* reserved, set to 0 */ return 0; } compressionPresent = FDKreadBits(bs, 1); /* audio_coding_mode_and_compression status */ coarseGrainTcPresent = FDKreadBits(bs, 1); /* coarse_grain_timecode_status */ fineGrainTcPresent = FDKreadBits(bs, 1); /* fine_grain_timecode_status */ bitCnt += 24; if (dmxLevelsPresent) { FDKreadBits(bs, 8); /* downmixing_levels_MPEG4 */ bitCnt += 8; } /* audio_coding_mode_and_compression_status */ if (compressionPresent) { UCHAR compressionOn, compressionValue; /* audio_coding_mode */ if ( FDKreadBits(bs, 7) != 0 ) { /* The reserved bits shall be set to "0". */ return 0; } compressionOn = (UCHAR)FDKreadBits(bs, 1); /* compression_on */ compressionValue = (UCHAR)FDKreadBits(bs, 8); /* Compression_value */ bitCnt += 16; if ( compressionOn ) { /* A compression value is available so store the data just like MPEG DRC data */ pDrcBs->channelData.numBands = 1; /* One band ... */ pDrcBs->channelData.drcValue[0] = compressionValue; /* ... with one value ... */ pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */ pDrcBs->pceInstanceTag = -1; /* Not present */ pDrcBs->progRefLevel = -1; /* Not present */ pDrcBs->channelData.drcDataType = DVB_DRC_ANC_DATA; /* Set DRC payload type to DVB. */ } else { /* No compression value available */ /* CAUTION: It is not clearly defined by standard how to react in this situation. */ /* Turn down the compression value to aprox. 0dB */ pDrcBs->channelData.numBands = 1; /* One band ... */ pDrcBs->channelData.drcValue[0] = 0x80; /* ... with aprox. 0dB ... */ pDrcBs->channelData.bandTop[0] = (1024 >> 2) - 1; /* ... comprising the whole spectrum. */ pDrcBs->channelData.drcDataType = DVB_DRC_ANC_DATA; /* Set DRC payload type to DVB. */ /* If compression_on field is set to "0" the compression_value field shall be "0000 0000". */ if (compressionValue != 0) { return 0; } } } /* Read timecodes if available just to get the right amount of bits. */ if (coarseGrainTcPresent) { FDKreadBits(bs, 16); /* coarse_grain_timecode */ bitCnt += 16; } if (fineGrainTcPresent) { FDKreadBits(bs, 16); /* fine_grain_timecode */ bitCnt += 16; } return (bitCnt); } /* * Prepare DRC processing */ static int aacDecoder_drcExtractAndMap ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], UCHAR pceInstanceTag, UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ int validChannels ) { CDrcPayload threadBs[MAX_DRC_THREADS]; CDrcPayload *validThreadBs[MAX_DRC_THREADS]; CDrcParams *pParams; UINT backupBsPosition; int i, thread, validThreads = 0; int numExcludedChns[MAX_DRC_THREADS]; FDK_ASSERT(self != NULL); FDK_ASSERT(hBs != NULL); FDK_ASSERT(pAacDecoderStaticChannelInfo != NULL); pParams = &self->params; self->numThreads = 0; backupBsPosition = FDKgetValidBits(hBs); for (i = 0; i < self->numPayloads && self->numThreads < MAX_DRC_THREADS; i++) { int bitsParsed; /* Init payload data chunk. The memclear is very important because it initializes the most values. Without it the module wouldn't work properly or crash. */ FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload)); threadBs[self->numThreads].channelData.bandTop[0] = (1024 >> 2) - 1; /* Extract payload */ bitsParsed = aacDecoder_drcParse( hBs, &threadBs[self->numThreads], self->drcPayloadPosition[i] ); if (bitsParsed > 0) { self->numThreads++; } } self->numPayloads = 0; if (self->dvbAncDataAvailable) { /* Append a DVB heavy compression payload thread if available. */ int bitsParsed; /* Init payload data chunk. The memclear is very important because it initializes the most values. Without it the module wouldn't work properly or crash. */ FDKmemclear(&threadBs[self->numThreads], sizeof(CDrcPayload)); threadBs[self->numThreads].channelData.bandTop[0] = (1024 >> 2) - 1; /* Extract payload */ bitsParsed = aacDecoder_drcReadCompression( hBs, &threadBs[self->numThreads], self->dvbAncDataPosition ); if (bitsParsed > 0) { self->numThreads++; } } self->dvbAncDataAvailable = 0; /* Reset the bitbufffer */ FDKpushBiDirectional(hBs, FDKgetValidBits(hBs) - backupBsPosition); /* calculate number of valid bits in excl_chn_mask */ /* coupling channels not supported */ /* check for valid threads */ for (thread = 0; thread < self->numThreads; thread++) { CDrcPayload *pThreadBs = &threadBs[thread]; int numExclChns = 0; switch ((AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType) { default: continue; case MPEG_DRC_EXT_DATA: case DVB_DRC_ANC_DATA: break; } if (pThreadBs->pceInstanceTag >= 0) { /* if PCE tag present */ if (pThreadBs->pceInstanceTag != pceInstanceTag) { continue; /* don't accept */ } } /* calculate number of excluded channels */ if (pThreadBs->excludedChnsMask > 0) { INT exclMask = pThreadBs->excludedChnsMask; int ch; for (ch = 0; ch < validChannels; ch++) { numExclChns += exclMask & 0x1; exclMask >>= 1; } } if (numExclChns < validChannels) { validThreadBs[validThreads] = pThreadBs; numExcludedChns[validThreads] = numExclChns; validThreads++; } } if (validThreads > 1) { int ch; /* check consistency of excl_chn_mask amongst valid DRC threads */ for (ch = 0; ch < validChannels; ch++) { int present = 0; for (thread = 0; thread < validThreads; thread++) { CDrcPayload *pThreadBs = validThreadBs[thread]; /* thread applies to this channel */ if ( (pThreadBs->channelData.drcDataType == MPEG_DRC_EXT_DATA) && ( (numExcludedChns[thread] == 0) || (!(pThreadBs->excludedChnsMask & (1< 1) { return -1; } } } /* map DRC bitstream information onto DRC channel information */ for (thread = 0; thread < validThreads; thread++) { CDrcPayload *pThreadBs = validThreadBs[thread]; INT exclMask = pThreadBs->excludedChnsMask; AACDEC_DRC_PAYLOAD_TYPE drcPayloadType = (AACDEC_DRC_PAYLOAD_TYPE)pThreadBs->channelData.drcDataType; int ch; /* last progRefLevel transmitted is the one that is used * (but it should really only be transmitted once per block!) */ if (pThreadBs->progRefLevel >= 0) { self->progRefLevel = pThreadBs->progRefLevel; self->prlExpiryCount = 0; /* Got a new value -> Reset counter */ } /* SCE, CPE and LFE */ for (ch = 0; ch < validChannels; ch++) { int mapedChannel = channelMapping[ch]; if ( ((exclMask & (1<params.applyHeavyCompression) ) ) { /* copy thread to channel */ pAacDecoderStaticChannelInfo[ch]->drcData = pThreadBs->channelData; } } /* CCEs not supported by now */ } /* Increment and check expiry counter for the program reference level: */ if ( (pParams->expiryFrame > 0) && (self->prlExpiryCount++ > pParams->expiryFrame) ) { /* The program reference level is too old, so set it back to the target level. */ self->progRefLevel = pParams->targetRefLevel; self->prlExpiryCount = 0; } return 0; } void aacDecoder_drcApply ( HANDLE_AAC_DRC self, void *pSbrDec, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CDrcChannelData *pDrcChData, int ch, /* needed only for SBR */ int aacFrameSize, int bSbrPresent ) { int band, top, bin, numBands; int bottom = 0; int modifyBins = 0; FIXP_DBL max_mantissa; INT max_exponent; FIXP_DBL norm_mantissa = FL2FXCONST_DBL(0.0f); INT norm_exponent = 0; FIXP_DBL fact_mantissa[MAX_DRC_BANDS]; INT fact_exponent[MAX_DRC_BANDS]; CDrcParams *pParams = &self->params; FIXP_DBL *pSpectralCoefficient = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; SHORT *pSpecScale = pAacDecoderChannelInfo->specScale; int winSeq = pIcsInfo->WindowSequence; /* Increment and check expiry counter */ if ( (pParams->expiryFrame > 0) && (++pDrcChData->expiryCount > pParams->expiryFrame) ) { /* The DRC data is too old, so delete it. */ aacDecoder_drcInitChannelData( pDrcChData ); } if (!self->enable) { sbrDecoder_drcDisable( (HANDLE_SBRDECODER)pSbrDec, ch ); return; } numBands = pDrcChData->numBands; top = FDKmax(0, numBands-1); pDrcChData->bandTop[0] = fixMin(pDrcChData->bandTop[0], (aacFrameSize >> 2) - 1); /* If program reference normalization is done in the digital domain, modify factor to perform normalization. prog_ref_level can alternatively be passed to the system for modification of the level in the analog domain. Analog level modification avoids problems with reduced DAC SNR (if signal is attenuated) or clipping (if signal is boosted) */ if (self->digitalNorm == 1) { /* 0.5^((targetRefLevel - progRefLevel)/24) */ norm_mantissa = fLdPow( FL2FXCONST_DBL(-1.0), /* log2(0.5) */ 0, (FIXP_DBL)((INT)(FL2FXCONST_DBL(1.0f/24.0)>>3) * (INT)(pParams->targetRefLevel-self->progRefLevel)), 3, &norm_exponent ); } else { norm_mantissa = FL2FXCONST_DBL(0.5f); norm_exponent = 1; } /* calc scale factors */ for (band = 0; band < numBands; band++) { UCHAR drcVal = pDrcChData->drcValue[band]; top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); fact_mantissa[band] = FL2FXCONST_DBL(0.5f); fact_exponent[band] = 1; if ( pParams->applyHeavyCompression && ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == DVB_DRC_ANC_DATA) ) { INT compressionFactorVal_e; int valX, valY; valX = drcVal >> 4; valY = drcVal & 0x0F; /* calculate the unscaled heavy compression factor. compressionFactor = 48.164 - 6.0206*valX - 0.4014*valY dB range: -48.166 dB to 48.164 dB */ if ( drcVal != 0x7F ) { fact_mantissa[band] = fPowInt( FL2FXCONST_DBL(0.95483867181), /* -0.4014dB = 0.95483867181 */ 0, valY, &compressionFactorVal_e ); /* -0.0008dB (48.164 - 6.0206*8 = -0.0008) */ fact_mantissa[band] = fMult(FL2FXCONST_DBL(0.99990790084), fact_mantissa[band]); fact_exponent[band] = DVB_COMPRESSION_SCALE - valX + compressionFactorVal_e; } } else if ((AACDEC_DRC_PAYLOAD_TYPE)pDrcChData->drcDataType == MPEG_DRC_EXT_DATA) { /* apply the scaled dynamic range control words to factor. * if scaling drc_cut (or drc_boost), or control word drc_mantissa is 0 * then there is no dynamic range compression * * if pDrcChData->drcSgn[band] is * 1 then gain is < 1 : factor = 2^(-self->cut * pDrcChData->drcMag[band] / 24) * 0 then gain is > 1 : factor = 2^( self->boost * pDrcChData->drcMag[band] / 24) */ if ((drcVal&0x7F) > 0) { FIXP_DBL tParamVal = (drcVal & 0x80) ? -pParams->cut : pParams->boost; fact_mantissa[band] = f2Pow( (FIXP_DBL)((INT)fMult(FL2FXCONST_DBL(1.0f/192.0f), tParamVal) * (drcVal&0x7F)), 3+DRC_PARAM_SCALE, &fact_exponent[band] ); } } fact_mantissa[band] = fMult(fact_mantissa[band], norm_mantissa); fact_exponent[band] += norm_exponent; bottom = top; } /* end loop over bands */ /* normalizations */ { int res; max_mantissa = FL2FXCONST_DBL(0.0f); max_exponent = 0; for (band = 0; band < numBands; band++) { max_mantissa = fixMax(max_mantissa, fact_mantissa[band]); max_exponent = fixMax(max_exponent, fact_exponent[band]); } /* left shift factors to gain accurancy */ res = CntLeadingZeros(max_mantissa) - 1; /* above topmost DRC band gain factor is 1 */ if (((pDrcChData->bandTop[numBands-1]+1)<<2) < aacFrameSize) res = 0; if (res > 0) { res = fixMin(res, max_exponent); max_exponent -= res; for (band = 0; band < numBands; band++) { fact_mantissa[band] <<= res; fact_exponent[band] -= res; } } /* normalize magnitudes to one scale factor */ for (band = 0; band < numBands; band++) { if (fact_exponent[band] < max_exponent) { fact_mantissa[band] >>= max_exponent - fact_exponent[band]; } if (fact_mantissa[band] != FL2FXCONST_DBL(0.5f)) { modifyBins = 1; } } if (max_exponent != 1) { modifyBins = 1; } } /* apply factor to spectral lines * short blocks must take care that bands fall on * block boundaries! */ if (!bSbrPresent) { bottom = 0; if (!modifyBins) { /* We don't have to modify the spectral bins because the fractional part of all factors is 0.5. In order to keep accurancy we don't apply the factor but decrease the exponent instead. */ max_exponent -= 1; } else { for (band = 0; band < numBands; band++) { top = fixMin((int)( (pDrcChData->bandTop[band]+1)<<2 ), aacFrameSize); /* ... * DRC_BAND_MULT; */ for (bin = bottom; bin < top; bin++) { pSpectralCoefficient[bin] = fMult(pSpectralCoefficient[bin], fact_mantissa[band]); } bottom = top; } } /* above topmost DRC band gain factor is 1 */ if (max_exponent > 0) { for (bin = bottom; bin < aacFrameSize; bin+=1) { pSpectralCoefficient[bin] >>= max_exponent; } } /* adjust scaling */ pSpecScale[0] += max_exponent; if (winSeq == EightShortSequence) { int win; for (win = 1; win < 8; win++) { pSpecScale[win] += max_exponent; } } } else { HANDLE_SBRDECODER hSbrDecoder = (HANDLE_SBRDECODER)pSbrDec; UINT numBands = pDrcChData->numBands; /* feed factors into SBR decoder for application in QMF domain. */ sbrDecoder_drcFeedChannel ( hSbrDecoder, ch, numBands, fact_mantissa, max_exponent, pDrcChData->drcInterpolationScheme, winSeq, pDrcChData->bandTop ); } return; } /* * Prepare DRC processing */ int aacDecoder_drcProlog ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], UCHAR pceInstanceTag, UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ int validChannels ) { int err = 0; if (self == NULL) { return -1; } if (!self->params.bsDelayEnable) { err = aacDecoder_drcExtractAndMap ( self, hBs, pAacDecoderStaticChannelInfo, pceInstanceTag, channelMapping, validChannels ); } return err; } /* * Finalize DRC processing */ int aacDecoder_drcEpilog ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], UCHAR pceInstanceTag, UCHAR channelMapping[], /* Channel mapping translating drcChannel index to canonical channel index */ int validChannels ) { int err = 0; if (self == NULL) { return -1; } if (self->params.bsDelayEnable) { err = aacDecoder_drcExtractAndMap ( self, hBs, pAacDecoderStaticChannelInfo, pceInstanceTag, channelMapping, validChannels ); } return err; } fdk-aac-0.1.3/libAACdec/src/aac_ram.h0000644000175000017500000001260512372261464017470 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ #ifndef AAC_RAM_H #define AAC_RAM_H #include "common_fix.h" #include "aacdecoder.h" #include "channel.h" #include "aacdec_hcr_types.h" #include "aacdec_hcr.h" /* End of formal fix.h */ #define MAX_SYNCHS 10 #define SAMPL_FREQS 12 H_ALLOC_MEM(AacDecoder, AAC_DECODER_INSTANCE) H_ALLOC_MEM(DrcInfo, CDrcInfo) H_ALLOC_MEM(AacDecoderStaticChannelInfo, CAacDecoderStaticChannelInfo) H_ALLOC_MEM(AacDecoderChannelInfo, CAacDecoderChannelInfo) H_ALLOC_MEM(OverlapBuffer, FIXP_DBL) H_ALLOC_MEM_OVERLAY(WorkBufferCore1, CWorkBufferCore1) H_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL) #endif /* #ifndef AAC_RAM_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_pns.cpp0000644000175000017500000003164012372261464020520 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: perceptual noise substitution tool ******************************************************************************/ #include "aacdec_pns.h" #include "aac_ram.h" #include "aac_rom.h" #include "channelinfo.h" #include "block.h" #include "FDK_bitstream.h" #include "genericStds.h" #define NOISE_OFFSET 90 /* cf. ISO 14496-3 p. 175 */ /*! \brief Reset InterChannel and PNS data The function resets the InterChannel and PNS data */ void CPns_ResetData( CPnsData *pPnsData, CPnsInterChannelData *pPnsInterChannelData ) { /* Assign pointer always, since pPnsData is not persistent data */ pPnsData->pPnsInterChannelData = pPnsInterChannelData; pPnsData->PnsActive = 0; pPnsData->CurrentEnergy = 0; FDKmemclear(pPnsData->pnsUsed,(8*16)*sizeof(UCHAR)); FDKmemclear(pPnsInterChannelData->correlated,(8*16)*sizeof(UCHAR)); } /*! \brief Initialize PNS data The function initializes the PNS data */ void CPns_InitPns( CPnsData *pPnsData, CPnsInterChannelData *pPnsInterChannelData, INT* currentSeed, INT* randomSeed) { /* save pointer to inter channel data */ pPnsData->pPnsInterChannelData = pPnsInterChannelData; /* use pointer because seed has to be same, left and right channel ! */ pPnsData->currentSeed = currentSeed; pPnsData->randomSeed = randomSeed; } /*! \brief Indicates if PNS is used The function returns a value indicating whether PNS is used or not acordding to the noise energy \return PNS used */ int CPns_IsPnsUsed (const CPnsData *pPnsData, const int group, const int band) { unsigned pns_band = group*16+band; return pPnsData->pnsUsed[pns_band] & (UCHAR)1; } /*! \brief Set correlation The function activates the noise correlation between the channel pair */ void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band, const int outofphase) { CPnsInterChannelData *pInterChannelData = pPnsData->pPnsInterChannelData; unsigned pns_band = group*16+band; pInterChannelData->correlated[pns_band] = (outofphase) ? 3 : 1; } /*! \brief Indicates if correlation is used The function indicates if the noise correlation between the channel pair is activated \return PNS is correlated */ static int CPns_IsCorrelated(const CPnsData *pPnsData, const int group, const int band) { CPnsInterChannelData *pInterChannelData = pPnsData->pPnsInterChannelData; unsigned pns_band = group*16+band; return (pInterChannelData->correlated[pns_band] & 0x01) ? 1 : 0; } /*! \brief Indicates if correlated out of phase mode is used. The function indicates if the noise correlation between the channel pair is activated in out-of-phase mode. \return PNS is out-of-phase */ static int CPns_IsOutOfPhase(const CPnsData *pPnsData, const int group, const int band) { CPnsInterChannelData *pInterChannelData = pPnsData->pPnsInterChannelData; unsigned pns_band = group*16+band; return (pInterChannelData->correlated[pns_band] & 0x02) ? 1 : 0; } /*! \brief Read PNS information The function reads the PNS information from the bitstream */ void CPns_Read (CPnsData *pPnsData, HANDLE_FDK_BITSTREAM bs, const CodeBookDescription *hcb, SHORT *pScaleFactor, UCHAR global_gain, int band, int group /* = 0 */) { int delta ; UINT pns_band = group*16+band; if (pPnsData->PnsActive) { /* Next PNS band case */ delta = CBlock_DecodeHuffmanWord (bs, hcb) - 60; } else { /* First PNS band case */ int noiseStartValue = FDKreadBits(bs,9); delta = noiseStartValue - 256 ; pPnsData->PnsActive = 1; pPnsData->CurrentEnergy = global_gain - NOISE_OFFSET; } pPnsData->CurrentEnergy += delta ; pScaleFactor[pns_band] = pPnsData->CurrentEnergy; pPnsData->pnsUsed[pns_band] = 1; } /** * \brief Generate a vector of noise of given length. The noise values are * scaled in order to yield a noise energy of 1.0 * \param spec pointer to were the noise values will be written to. * \param size amount of noise values to be generated. * \param pRandomState pointer to the state of the random generator being used. * \return exponent of generated noise vector. */ static int GenerateRandomVector (FIXP_DBL *RESTRICT spec, int size, int *pRandomState) { int i, invNrg_e = 0, nrg_e = 0; FIXP_DBL invNrg_m, nrg_m = FL2FXCONST_DBL(0.0f) ; FIXP_DBL *RESTRICT ptr = spec; int randomState = *pRandomState; #define GEN_NOISE_NRG_SCALE 7 /* Generate noise and calculate energy. */ for (i=0; i>GEN_NOISE_NRG_SCALE); *ptr++ = (FIXP_DBL)randomState; } nrg_e = GEN_NOISE_NRG_SCALE*2 + 1; /* weight noise with = 1 / sqrt_nrg; */ invNrg_m = invSqrtNorm2(nrg_m<<1, &invNrg_e); invNrg_e += -((nrg_e-1)>>1); for (i=size; i--; ) { spec[i] = fMult(spec[i], invNrg_m); } /* Store random state */ *pRandomState = randomState; return invNrg_e; } static void ScaleBand (FIXP_DBL *RESTRICT spec, int size, int scaleFactor, int specScale, int noise_e, int out_of_phase) { int i, shift, sfExponent; FIXP_DBL sfMatissa; /* Get gain from scale factor value = 2^(scaleFactor * 0.25) */ sfMatissa = MantissaTable[scaleFactor & 0x03][0]; /* sfExponent = (scaleFactor >> 2) + ExponentTable[scaleFactor & 0x03][0]; */ /* Note: ExponentTable[scaleFactor & 0x03][0] is always 1. */ sfExponent = (scaleFactor >> 2) + 1; if (out_of_phase != 0) { sfMatissa = -sfMatissa; } /* +1 because of fMultDiv2 below. */ shift = sfExponent - specScale + 1 + noise_e; /* Apply gain to noise values */ if (shift>=0) { shift = fixMin( shift, DFRACT_BITS-1 ); for (i = size ; i-- != 0; ) { spec [i] = fMultDiv2 (spec [i], sfMatissa) << shift; } } else { shift = fixMin( -shift, DFRACT_BITS-1 ); for (i = size ; i-- != 0; ) { spec [i] = fMultDiv2 (spec [i], sfMatissa) >> shift; } } } /*! \brief Apply PNS The function applies PNS (i.e. it generates noise) on the bands flagged as noisy bands */ void CPns_Apply (const CPnsData *pPnsData, const CIcsInfo *pIcsInfo, SPECTRAL_PTR pSpectrum, const SHORT *pSpecScale, const SHORT *pScaleFactor, const SamplingRateInfo *pSamplingRateInfo, const INT granuleLength, const int channel) { if (pPnsData->PnsActive) { const short *BandOffsets = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); int ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(pIcsInfo); for (int window = 0, group = 0; group < GetWindowGroups(pIcsInfo); group++) { for (int groupwin = 0; groupwin < GetWindowGroupLength(pIcsInfo, group); groupwin++, window++) { FIXP_DBL *spectrum = SPEC(pSpectrum, window, granuleLength); for (int band = 0 ; band < ScaleFactorBandsTransmitted; band++) { if (CPns_IsPnsUsed (pPnsData, group, band)) { UINT pns_band = group*16+band; int bandWidth = BandOffsets [band + 1] - BandOffsets [band] ; int noise_e; FDK_ASSERT(bandWidth >= 0); if (channel > 0 && CPns_IsCorrelated(pPnsData, group, band)) { noise_e = GenerateRandomVector (spectrum + BandOffsets [band], bandWidth, &pPnsData->randomSeed [pns_band]) ; } else { pPnsData->randomSeed [pns_band] = *pPnsData->currentSeed ; noise_e = GenerateRandomVector (spectrum + BandOffsets [band], bandWidth, pPnsData->currentSeed) ; } int outOfPhase = CPns_IsOutOfPhase (pPnsData, group, band); ScaleBand (spectrum + BandOffsets [band], bandWidth, pScaleFactor[pns_band], pSpecScale[window], noise_e, outOfPhase) ; } } } } } } fdk-aac-0.1.3/libAACdec/src/pulsedata.cpp0000644000175000017500000001510512372261464020420 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: pulse data tool ******************************************************************************/ #include "pulsedata.h" #include "channelinfo.h" INT CPulseData_Read( HANDLE_FDK_BITSTREAM bs, CPulseData *const PulseData, const SHORT *sfb_startlines, const void *pIcsInfo, const SHORT frame_length ) { int i, k=0; const UINT MaxSfBands = GetScaleFactorBandsTransmitted((CIcsInfo*)pIcsInfo); /* reset pulse data flag */ PulseData->PulseDataPresent = 0; if ((PulseData->PulseDataPresent = (UCHAR) FDKreadBit(bs)) != 0) { if (!IsLongBlock((CIcsInfo*)pIcsInfo)) { return AAC_DEC_DECODE_FRAME_ERROR; } PulseData->NumberPulse = (UCHAR) FDKreadBits(bs,2); PulseData->PulseStartBand = (UCHAR) FDKreadBits(bs,6); if (PulseData->PulseStartBand >= MaxSfBands) { return AAC_DEC_DECODE_FRAME_ERROR; } k = sfb_startlines[PulseData->PulseStartBand]; for (i=0; i<=PulseData->NumberPulse; i++) { PulseData->PulseOffset[i] = (UCHAR) FDKreadBits(bs,5); PulseData->PulseAmp[i] = (UCHAR) FDKreadBits(bs,4); k += PulseData->PulseOffset[i]; } if (k >= frame_length) { return AAC_DEC_DECODE_FRAME_ERROR; } } return 0; } void CPulseData_Apply(CPulseData *PulseData, /*!< pointer to pulse data side info */ const short *pScaleFactorBandOffsets, /*!< pointer to scalefactor band offsets */ FIXP_DBL *coef) /*!< pointer to spectrum */ { int i,k; if (PulseData->PulseDataPresent) { k = pScaleFactorBandOffsets[PulseData->PulseStartBand]; for (i=0; i<=PulseData->NumberPulse; i++) { k += PulseData->PulseOffset[i]; if (coef [k] > (FIXP_DBL)0) coef[k] += (FIXP_DBL)(int)PulseData->PulseAmp[i]; else coef[k] -= (FIXP_DBL)(int)PulseData->PulseAmp[i]; } } } fdk-aac-0.1.3/libAACdec/src/stereo.h0000644000175000017500000001340212372261464017402 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: joint stereo processing ******************************************************************************/ #ifndef STEREO_H #define STEREO_H #include "machine_type.h" #include "FDK_bitstream.h" enum { JointStereoMaximumGroups = 8, JointStereoMaximumBands = 64 }; typedef struct { UCHAR MsMaskPresent; UCHAR MsUsed[JointStereoMaximumBands]; /*!< every arry element contains flags for up to 8 groups */ } CJointStereoData; /*! \brief Read joint stereo data from bitstream The function reads joint stereo data from bitstream. \param bs bit stream handle data source. \param pJointStereoData pointer to stereo data structure to receive decoded data. \param windowGroups number of window groups. \param scaleFactorBandsTransmitted number of transmitted scalefactor bands. \param flags decoder flags \return 0 on success, -1 on error. */ int CJointStereo_Read( HANDLE_FDK_BITSTREAM bs, CJointStereoData *pJointStereoData, int windowGroups, int scaleFactorBandsTransmitted, UINT flags ); #endif /* #ifndef STEREO_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcrs.cpp0000644000175000017500000020703112372261464020656 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Prepare decoding of non-PCWs, segmentation- and bitfield-handling, HCR-Statemachine *******************************************************************************/ #include "aacdec_hcrs.h" #include "aacdec_hcr.h" #include "aacdec_hcr_bit.h" #include "aac_rom.h" #include "aac_ram.h" static UINT InitSegmentBitfield(UINT *pNumSegment, SCHAR *pRemainingBitsInSegment, UINT *pSegmentBitfield, UCHAR *pNumWordForBitfield, USHORT *pNumBitValidInLastWord); static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr); static INT ModuloValue(INT input, INT bufferlength); static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset, UINT *pBitfield); /*--------------------------------------------------------------------------------------------- description: This function decodes all non-priority codewords (non-PCWs) by using a state-machine. -------------------------------------------------------------------------------------------- */ void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) { UINT numValidSegment; INT segmentOffset; INT codewordOffsetBase; INT codewordOffset; UINT trial; UINT *pNumSegment; SCHAR *pRemainingBitsInSegment; UINT *pSegmentBitfield; UCHAR *pNumWordForBitfield; USHORT *pNumBitValidInLastWord; UINT *pCodewordBitfield; INT bitfieldWord; INT bitInWord; UINT tempWord; UINT interMediateWord; INT tempBit; INT carry; UINT numCodeword; UCHAR numSet; UCHAR currentSet; UINT codewordInSet; UINT remainingCodewordsInSet; SCHAR *pSta; UINT ret; pNumSegment = &(pHcr->segmentInfo.numSegment); pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pNumWordForBitfield = &(pHcr->segmentInfo.numWordForBitfield); pNumBitValidInLastWord = &(pHcr->segmentInfo.pNumBitValidInLastWord); pSta = pHcr->nonPcwSideinfo.pSta; numValidSegment = InitSegmentBitfield(pNumSegment, pRemainingBitsInSegment, pSegmentBitfield, pNumWordForBitfield, pNumBitValidInLastWord); if ( numValidSegment != 0 ) { numCodeword = pHcr->sectionInfo.numCodeword; numSet = ((numCodeword - 1) / *pNumSegment) + 1; pHcr->segmentInfo.readDirection = FROM_RIGHT_TO_LEFT; /* Process sets subsequently */ for ( currentSet = 1; currentSet < numSet ; currentSet++ ) { /* step 1 */ numCodeword -= *pNumSegment; /* number of remaining non PCWs [for all sets] */ if ( numCodeword < *pNumSegment ) { codewordInSet = numCodeword; /* for last set */ } else { codewordInSet = *pNumSegment; /* for all sets except last set */ } /* step 2 */ /* prepare array 'CodewordBitfield'; as much ones are written from left in all words, as much decodedCodewordInSetCounter nonPCWs exist in this set */ tempWord = 0xFFFFFFFF; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; for ( bitfieldWord = *pNumWordForBitfield; bitfieldWord !=0; bitfieldWord-- ) { /* loop over all used words */ if ( codewordInSet > NUMBER_OF_BIT_IN_WORD ) { /* more codewords than number of bits => fill ones */ /* fill a whole word with ones */ *pCodewordBitfield++ = tempWord; codewordInSet -= NUMBER_OF_BIT_IN_WORD; /* subtract number of bits */ } else { /* prepare last tempWord */ for (remainingCodewordsInSet = codewordInSet; remainingCodewordsInSet < NUMBER_OF_BIT_IN_WORD ; remainingCodewordsInSet++ ) { tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-remainingCodewordsInSet)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ } *pCodewordBitfield++ = tempWord; tempWord = 0x00000000; } } pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; /* step 3 */ /* build non-PCW sideinfo for each non-PCW of the current set */ InitNonPCWSideInformationForCurrentSet(pHcr); /* step 4 */ /* decode all non-PCWs belonging to this set */ /* loop over trials */ codewordOffsetBase = 0; for ( trial = *pNumSegment; trial > 0; trial-- ) { /* loop over number of words in bitfields */ segmentOffset = 0; /* start at zero in every segment */ pHcr->segmentInfo.segmentOffset = segmentOffset; /* store in structure for states */ codewordOffset = codewordOffsetBase; pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; /* store in structure for states */ for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield; bitfieldWord++ ) { /* derive tempWord with bitwise and */ tempWord = pSegmentBitfield[bitfieldWord] & pCodewordBitfield[bitfieldWord]; /* if tempWord is not zero, decode something */ if ( tempWord != 0 ) { /* loop over all bits in tempWord; start state machine if & is true */ for ( bitInWord = NUMBER_OF_BIT_IN_WORD; bitInWord > 0; bitInWord-- ) { interMediateWord = ((UINT)1 << (bitInWord-1) ); if ( ( tempWord & interMediateWord ) == interMediateWord ) { /* get state and start state machine */ pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; while(pHcr->nonPcwSideinfo.pState) { ret = ((STATEFUNC) pHcr->nonPcwSideinfo.pState)(bs, pHcr); #if STATE_MACHINE_ERROR_CHECK if ( ret != 0 ) { return; } #endif } } /* update both offsets */ segmentOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ pHcr->segmentInfo.segmentOffset = segmentOffset; codewordOffset += 1; /* add NUMBER_OF_BIT_IN_WORD times one */ codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; } } else { segmentOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ pHcr->segmentInfo.segmentOffset = segmentOffset; codewordOffset += NUMBER_OF_BIT_IN_WORD; /* add NUMBER_OF_BIT_IN_WORD at once */ codewordOffset = ModuloValue(codewordOffset,*pNumSegment); /* index of the current codeword lies within modulo range */ pHcr->nonPcwSideinfo.codewordOffset = codewordOffset; } } /* end of bitfield word loop */ /* decrement codeword - pointer */ codewordOffsetBase -= 1; codewordOffsetBase = ModuloValue(codewordOffsetBase,*pNumSegment); /* index of the current codeword base lies within modulo range */ /* rotate numSegment bits in codewordBitfield */ /* rotation of *numSegment bits in bitfield of codewords (circle-rotation) */ /* get last valid bit */ tempBit = pCodewordBitfield[*pNumWordForBitfield-1] & (1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); tempBit = tempBit >> (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord); /* write zero into place where tempBit was fetched from */ pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] & ~(1 << (NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord)); /* rotate last valid word */ pCodewordBitfield[*pNumWordForBitfield-1] = pCodewordBitfield[*pNumWordForBitfield-1] >> 1; /* transfare carry bit 0 from current word into bitposition 31 from next word and rotate current word */ for ( bitfieldWord = *pNumWordForBitfield-2; bitfieldWord > -1 ; bitfieldWord-- ) { /* get carry (=bit at position 0) from current word */ carry = pCodewordBitfield[bitfieldWord] & 1; /* put the carry bit at position 31 into word right from current word */ pCodewordBitfield[bitfieldWord+1] = pCodewordBitfield[bitfieldWord+1] | (carry << (NUMBER_OF_BIT_IN_WORD-1)); /* shift current word */ pCodewordBitfield[bitfieldWord] = pCodewordBitfield[bitfieldWord] >> 1; } /* put tempBit into free bit-position 31 from first word */ pCodewordBitfield[0] = pCodewordBitfield[0] | (tempBit << (NUMBER_OF_BIT_IN_WORD-1)); } /* end of trial loop */ /* toggle read direction */ pHcr->segmentInfo.readDirection = ToggleReadDirection(pHcr->segmentInfo.readDirection); } /* end of set loop */ /* all non-PCWs of this spectrum are decoded */ } /* all PCWs and all non PCWs are decoded. They are unbacksorted in output buffer. Here is the Interface with comparing QSCs to asm decoding */ } /*--------------------------------------------------------------------------------------------- description: This function prepares the bitfield used for the segments. The list is set up once to be used in all following sets. If a segment is decoded empty, the according bit from the Bitfield is removed. ----------------------------------------------------------------------------------------------- return: numValidSegment = the number of valid segments -------------------------------------------------------------------------------------------- */ static UINT InitSegmentBitfield(UINT *pNumSegment, SCHAR *pRemainingBitsInSegment, UINT *pSegmentBitfield, UCHAR *pNumWordForBitfield, USHORT *pNumBitValidInLastWord) { SHORT i; USHORT r; UCHAR bitfieldWord; UINT tempWord; USHORT numValidSegment; *pNumWordForBitfield = ((*pNumSegment-1) >> THIRTYTWO_LOG_DIV_TWO_LOG) + 1; /* loop over all words, which are completely used or only partial */ /* bit in pSegmentBitfield is zero if segment is empty; bit in pSegmentBitfield is one if segment is not empty */ numValidSegment = 0; *pNumBitValidInLastWord = *pNumSegment; /* loop over words */ for ( bitfieldWord=0; bitfieldWord < *pNumWordForBitfield - 1; bitfieldWord++ ) { tempWord = 0xFFFFFFFF; /* set ones */ r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; for ( i=0; i < NUMBER_OF_BIT_IN_WORD; i++) { if ( pRemainingBitsInSegment[r + i] == 0 ) { tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-i)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ } else { numValidSegment += 1; /* count segments which are not empty */ } } pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ *pNumBitValidInLastWord -= NUMBER_OF_BIT_IN_WORD; /* calculate number of zeros on LSB side in the last word */ } /* calculate last word: prepare special tempWord */ tempWord = 0xFFFFFFFF; for ( i=0; i < ( NUMBER_OF_BIT_IN_WORD - *pNumBitValidInLastWord ); i++ ) { tempWord = tempWord & ~(1 << i); /* clear bit i in tempWord */ } /* calculate last word */ r = bitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG; for ( i=0; i<*pNumBitValidInLastWord; i++) { if ( pRemainingBitsInSegment[r + i] == 0 ) { tempWord = tempWord & ~(1 << (NUMBER_OF_BIT_IN_WORD-1-i)); /* set a zero at bit number (NUMBER_OF_BIT_IN_WORD-1-i) in tempWord */ } else { numValidSegment += 1; /* count segments which are not empty */ } } pSegmentBitfield[bitfieldWord] = tempWord; /* store result */ return numValidSegment; } /*--------------------------------------------------------------------------------------------- description: This function sets up sideinfo for the non-PCW decoder (for the current set). ---------------------------------------------------------------------------------------------*/ static void InitNonPCWSideInformationForCurrentSet(H_HCR_INFO pHcr) { USHORT i,k; UCHAR codebookDim; UINT startNode; UCHAR *pCodebook = pHcr->nonPcwSideinfo.pCodebook; UINT *iNode = pHcr->nonPcwSideinfo.iNode; UCHAR *pCntSign = pHcr->nonPcwSideinfo.pCntSign; USHORT *iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; UINT *pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; SCHAR *pSta = pHcr->nonPcwSideinfo.pSta; USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx; const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension; int iterationCounter = 0; /* loop over number of extended sorted sections in the current set so all codewords sideinfo variables within this set can be prepared for decoding */ for ( i=pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; i != 0; i-- ) { codebookDim = pCbDimension[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; startNode = *aHuffTable[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; for ( k = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx]; k != 0; k-- ) { iterationCounter++; if (iterationCounter > (1024>>2)) { return; } *pSta++ = aCodebook2StartInt[pExtendedSortedCodebook[extendedSortedCodebookIdx]]; *pCodebook++ = pExtendedSortedCodebook[extendedSortedCodebookIdx]; *iNode++ = startNode; *pCntSign++ = 0; *iResultPointer++ = quantizedSpectralCoefficientsIdx; *pEscapeSequenceInfo++ = 0; quantizedSpectralCoefficientsIdx += codebookDim; /* update pointer by codebookDim --> point to next starting value for writing out */ if (quantizedSpectralCoefficientsIdx >= 1024) { return; } } numExtendedSortedCodewordInSectionIdx++; /* inc ptr for next ext sort sec in current set */ extendedSortedCodebookIdx++; /* inc ptr for next ext sort sec in current set */ if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS) || extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { return; } } numExtendedSortedSectionsInSetsIdx++; /* inc ptr for next set of non-PCWs */ if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { return; } /* Write back indexes */ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx; pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx; } /*--------------------------------------------------------------------------------------------- description: This function returns the input value if the value is in the range of bufferlength. If is smaller, one bufferlength is added, if is bigger one bufferlength is subtracted. ----------------------------------------------------------------------------------------------- return: modulo result -------------------------------------------------------------------------------------------- */ static INT ModuloValue(INT input, INT bufferlength) { if ( input > (bufferlength - 1) ) { return (input - bufferlength); } if ( input < 0 ) { return (input + bufferlength); } return input; } /*--------------------------------------------------------------------------------------------- description: This function clears a bit from current bitfield and switches off the statemachine. A bit is cleared in two cases: a) a codeword is decoded, then a bit is cleared in codeword bitfield b) a segment is decoded empty, then a bit is cleared in segment bitfield -------------------------------------------------------------------------------------------- */ static void ClearBitFromBitfield(STATEFUNC *ptrState, UINT offset, UINT *pBitfield) { UINT numBitfieldWord; UINT numBitfieldBit; /* get both values needed for clearing the bit */ numBitfieldWord = offset >> THIRTYTWO_LOG_DIV_TWO_LOG; /* int = wordNr */ numBitfieldBit = offset - (numBitfieldWord << THIRTYTWO_LOG_DIV_TWO_LOG); /* fract = bitNr */ /* clear a bit in bitfield */ pBitfield[numBitfieldWord] = pBitfield[numBitfieldWord] & ~(1 << (NUMBER_OF_BIT_IN_WORD-1 - numBitfieldBit)); /* switch off state machine because codeword is decoded and/or because segment is empty */ *ptrState = NULL; } /* ========================================================================================= the states of the statemachine ========================================================================================= */ /*--------------------------------------------------------------------------------------------- description: Decodes the body of a codeword. This State is used for codebooks 1,2,5 and 6. No sign bits are decoded, because the table of the quantized spectral values has got a valid sign at the quantized spectral lines. ----------------------------------------------------------------------------------------------- output: Two or four quantizes spectral values written at position where pResultPointr points to ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_ONLY(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; FIXP_DBL *pResultBase; UINT *iNode; USHORT *iResultPointer; UINT codewordOffset; UINT branchNode; UINT branchValue; UINT iQSC; UINT treeNode; UCHAR carryBit; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; SCHAR *pRemainingBitsInSegment; UCHAR readDirection; UCHAR *pCodebook; UCHAR dimCntr; const UINT *pCurrentTree; const UCHAR *pCbDimension; const SCHAR *pQuantVal; const SCHAR *pQuantValBase; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; pCodebook = pHcr->nonPcwSideinfo.pCodebook; iNode = pHcr->nonPcwSideinfo.iNode; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pCbDimension = pHcr->tableInfo.pCbDimension; treeNode = iNode[codewordOffset]; pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ treeNode, &branchValue, &branchNode); /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; ==> body is complete */ pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing out result */ for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal++; /* write out 2 or 4 lines into spectrum; no Sign bits available in this state */ } ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ } else { /* body is not decoded completely: */ treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ } } iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_ONLY; return BODY_ONLY; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: Decodes the codeword body, writes out result and counts the number of quantized spectral values, which are different form zero. For those values sign bits are needed. If sign bit counter cntSign is different from zero, switch to next state to decode sign Bits there. If sign bit counter cntSign is zero, no sign bits are needed and codeword is decoded. ----------------------------------------------------------------------------------------------- output: Two or four written quantizes spectral values written at position where pResultPointr points to. The signs of those lines may be wrong. If the signs [on just one signle sign] is wrong, the next state will correct it. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; UCHAR *pCodebook; UINT *iNode; UCHAR *pCntSign; FIXP_DBL *pResultBase; USHORT *iResultPointer; UINT codewordOffset; UINT iQSC; UINT cntSign; UCHAR dimCntr; UCHAR carryBit; SCHAR *pSta; UINT treeNode; UINT branchValue; UINT branchNode; const UCHAR *pCbDimension; const UINT *pCurrentTree; const SCHAR *pQuantValBase; const SCHAR *pQuantVal; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; pCodebook = pHcr->nonPcwSideinfo.pCodebook; iNode = pHcr->nonPcwSideinfo.iNode; pCntSign = pHcr->nonPcwSideinfo.pCntSign; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pSta = pHcr->nonPcwSideinfo.pSta; pCbDimension = pHcr->tableInfo.pCbDimension; treeNode = iNode[codewordOffset]; pCurrentTree = aHuffTable[pCodebook[codewordOffset]]; for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); CarryBitToBranchValue(carryBit, /* make a step in decoding tree */ treeNode, &branchValue, &branchNode); /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ /* body completely decoded; branchValue is valid, set pQuantVal to first (of two or four) quantized spectral coefficients */ pQuantValBase = aQuantTable[pCodebook[codewordOffset]]; /* get base address of quantized values belonging to current codebook */ pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ iQSC = iResultPointer[codewordOffset]; /* get position of first line for writing result */ /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ cntSign = 0; for ( dimCntr = pCbDimension[pCodebook[codewordOffset]]; dimCntr != 0; dimCntr-- ) { pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ if ( *pQuantVal++ != 0 ) { cntSign += 1; } } if ( cntSign == 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ } else { pCntSign[codewordOffset] = cntSign; /* write sign count result into codewordsideinfo of current codeword */ pSta[codewordOffset] = BODY_SIGN__SIGN; /* change state */ pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ } pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ } else {/* body is not decoded completely: */ treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ } } iNode[codewordOffset] = treeNode; /* store updated treeNode because maybe decoding of codeword body not finished yet */ if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__BODY; return BODY_SIGN__BODY; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: This state decodes the sign bits belonging to a codeword. The state is called as often in different "trials" until pCntSgn[codewordOffset] is zero. ----------------------------------------------------------------------------------------------- output: The two or four quantizes spectral values (written in previous state) have now the correct sign. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; UCHAR *pCntSign; FIXP_DBL *pResultBase; USHORT *iResultPointer; UINT codewordOffset; UCHAR carryBit; UINT iQSC; UCHAR cntSign; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; pCntSign = pHcr->nonPcwSideinfo.pCntSign; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; iQSC = iResultPointer[codewordOffset]; cntSign = pCntSign[codewordOffset]; /* loop for sign bit decoding */ for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); cntSign -= 1; /* decrement sign counter because one sign bit has been read */ /* search for a line (which was decoded in previous state) which is not zero. [This value will get a sign] */ while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { iQSC++; /* points to current value different from zero */ if (iQSC >= 1024) { return BODY_SIGN__SIGN; } } /* put sign together with line; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ if ( carryBit != 0 ) { pResultBase[iQSC] = -pResultBase[iQSC]; /* carryBit = 1 --> minus */ } iQSC++; /* update pointer to next (maybe valid) value */ if ( cntSign == 0 ) { /* if (cntSign==0) ==> set state CODEWORD_DECODED */ ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ break; /* whole nonPCW-Body and according sign bits are decoded */ } } pCntSign[codewordOffset] = cntSign; iResultPointer[codewordOffset] = iQSC; /* store updated pResultPointer */ if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN__SIGN; return BODY_SIGN__SIGN; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: Decodes the codeword body in case of codebook is 11. Writes out resulting two or four lines [with probably wrong sign] and counts the number of lines, which are different form zero. This information is needed in next state where sign bits will be decoded, if necessary. If sign bit counter cntSign is zero, no sign bits are needed and codeword is decoded completely. ----------------------------------------------------------------------------------------------- output: Two lines (quantizes spectral coefficients) which are probably wrong. The sign may be wrong and if one or two values is/are 16, the following states will decode the escape sequence to correct the values which are wirtten here. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN_ESC__BODY(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; UINT *iNode; UCHAR *pCntSign; FIXP_DBL *pResultBase; USHORT *iResultPointer; UINT codewordOffset; UCHAR carryBit; UINT iQSC; UINT cntSign; UINT dimCntr; UINT treeNode; SCHAR *pSta; UINT branchNode; UINT branchValue; const UINT *pCurrentTree; const SCHAR *pQuantValBase; const SCHAR *pQuantVal; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; iNode = pHcr->nonPcwSideinfo.iNode; pCntSign = pHcr->nonPcwSideinfo.pCntSign; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pSta = pHcr->nonPcwSideinfo.pSta; treeNode = iNode[codewordOffset]; pCurrentTree = aHuffTable[ESCAPE_CODEBOOK]; for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); /* make a step in tree */ CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode); /* if end of branch reached write out lines and count bits needed for sign, otherwise store node in codeword sideinfo */ if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set body complete */ /* body completely decoded; branchValue is valid */ /* set pQuantVol to first (of two or four) quantized spectral coefficients */ pQuantValBase = aQuantTable[ESCAPE_CODEBOOK]; /* get base address of quantized values belonging to current codebook */ pQuantVal = pQuantValBase + branchValue; /* set pointer to first valid line [of 2 or 4 quantized values] */ /* make backup from original resultPointer in node storage for state BODY_SIGN_ESC__SIGN */ iNode[codewordOffset] = iResultPointer[codewordOffset]; /* get position of first line for writing result */ iQSC = iResultPointer[codewordOffset]; /* codeword decoding result is written out here: Write out 2 or 4 quantized spectral values with probably */ /* wrong sign and count number of values which are different from zero for sign bit decoding [which happens in next state] */ cntSign = 0; for ( dimCntr = DIMENSION_OF_ESCAPE_CODEBOOK; dimCntr != 0; dimCntr-- ) { pResultBase[iQSC++] = (FIXP_DBL)*pQuantVal; /* write quant. spec. coef. into spectrum */ if ( *pQuantVal++ != 0 ) { cntSign += 1; } } if ( cntSign == 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ /* codeword decoded */ } else { /* write sign count result into codewordsideinfo of current codeword */ pCntSign[codewordOffset] = cntSign; pSta[codewordOffset] = BODY_SIGN_ESC__SIGN; /* change state */ pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ } pRemainingBitsInSegment[segmentOffset] -= 1; /* the last reinitialzation of for loop counter (see above) is done here */ break; /* end of branch in tree reached i.e. a whole nonPCW-Body is decoded */ } else { /* body is not decoded completely: */ /* update treeNode for further step in decoding tree and store updated treeNode because maybe no more bits left in segment */ treeNode = *(pCurrentTree + branchValue); iNode[codewordOffset] = treeNode; } } if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__BODY; return BODY_SIGN_ESC__BODY; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: This state decodes the sign bits, if a codeword of codebook 11 needs some. A flag named 'flagB' in codeword sideinfo is set, if the second line of quantized spectral values is 16. The 'flagB' is used in case of decoding of a escape sequence is necessary as far as the second line is concerned. If only the first line needs an escape sequence, the flagB is cleared. If only the second line needs an escape sequence, the flagB is not used. For storing sideinfo in case of escape sequence decoding one single word can be used for both escape sequences because they are decoded not at the same time: bit 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ===== == == =========== =========== =================================== ^ ^ ^ ^ ^ ^ | | | | | | res. flagA flagB escapePrefixUp escapePrefixDown escapeWord ----------------------------------------------------------------------------------------------- output: Two lines with correct sign. If one or two values is/are 16, the lines are not valid, otherwise they are. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN_ESC__SIGN(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; UINT *iNode; UCHAR *pCntSign; FIXP_DBL *pResultBase; USHORT *iResultPointer; UINT *pEscapeSequenceInfo; UINT codewordOffset; UINT iQSC; UCHAR cntSign; UINT flagA; UINT flagB; UINT flags; UCHAR carryBit; SCHAR *pSta; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; iNode = pHcr->nonPcwSideinfo.iNode; pCntSign = pHcr->nonPcwSideinfo.pCntSign; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pSta = pHcr->nonPcwSideinfo.pSta; iQSC = iResultPointer[codewordOffset]; cntSign = pCntSign[codewordOffset]; /* loop for sign bit decoding */ for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); /* decrement sign counter because one sign bit has been read */ cntSign -= 1; pCntSign[codewordOffset] = cntSign; /* get a quantized spectral value (which was decoded in previous state) which is not zero. [This value will get a sign] */ while ( pResultBase[iQSC] == (FIXP_DBL)0 ) { iQSC++; } iResultPointer[codewordOffset] = iQSC; /* put negative sign together with quantized spectral value; if carryBit is zero, the sign is ok already; no write operation necessary in this case */ if ( carryBit != 0 ) { pResultBase[iQSC] = - pResultBase[iQSC]; /* carryBit = 1 --> minus */ } iQSC++; /* update index to next (maybe valid) value */ iResultPointer[codewordOffset] = iQSC; if ( cntSign == 0 ) { /* all sign bits are decoded now */ pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ /* check decoded values if codeword is decoded: Check if one or two escape sequences 16 follow */ /* step 0 */ /* restore pointer to first decoded quantized value [ = original pResultPointr] from index iNode prepared in State_BODY_SIGN_ESC__BODY */ iQSC = iNode[codewordOffset]; /* step 1 */ /* test first value if escape sequence follows */ flagA = 0; /* for first possible escape sequence */ if ( fixp_abs(pResultBase[iQSC++]) == (FIXP_DBL)ESCAPE_VALUE ) { flagA = 1; } /* step 2 */ /* test second value if escape sequence follows */ flagB = 0; /* for second possible escape sequence */ if ( fixp_abs(pResultBase[iQSC]) == (FIXP_DBL)ESCAPE_VALUE ) { flagB = 1; } /* step 3 */ /* evaluate flag result and go on if necessary */ if ( !flagA && !flagB ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ } else { /* at least one of two lines is 16 */ /* store both flags at correct positions in non PCW codeword sideinfo pEscapeSequenceInfo[codewordOffset] */ flags = 0; flags = flagA << POSITION_OF_FLAG_A; flags |= (flagB << POSITION_OF_FLAG_B); pEscapeSequenceInfo[codewordOffset] = flags; /* set next state */ pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ /* set result pointer to the first line of the two decoded lines */ iResultPointer[codewordOffset] = iNode[codewordOffset]; if ( !flagA && flagB ) { /* update pResultPointr ==> state Stat_BODY_SIGN_ESC__ESC_WORD writes to correct position. Second value is the one and only escape value */ iQSC = iResultPointer[codewordOffset]; iQSC++; iResultPointer[codewordOffset] = iQSC; } } /* at least one of two lines is 16 */ break; /* nonPCW-Body at cb 11 and according sign bits are decoded */ } /* if ( cntSign == 0 ) */ } /* loop over remaining Bits in segment */ if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__SIGN; return BODY_SIGN_ESC__SIGN; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: Decode escape prefix of first or second escape sequence. The escape prefix consists of ones. The following zero is also decoded here. ----------------------------------------------------------------------------------------------- output: If the single separator-zero which follows the escape-prefix-ones is not yet decoded: The value 'escapePrefixUp' in word pEscapeSequenceInfo[codewordOffset] is updated. If the single separator-zero which follows the escape-prefix-ones is decoded: Two updated values 'escapePrefixUp' and 'escapePrefixDown' in word pEscapeSequenceInfo[codewordOffset]. This State is finished. Switch to next state. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT segmentOffset; UINT *pEscapeSequenceInfo; UINT codewordOffset; UCHAR carryBit; UINT escapePrefixUp; SCHAR *pSta; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pSta = pHcr->nonPcwSideinfo.pSta; escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; /* decode escape prefix */ for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); /* count ones and store sum in escapePrefixUp */ if ( carryBit == 1 ) { escapePrefixUp += 1; /* update conter for ones */ /* store updated counter in sideinfo of current codeword */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ } else { /* separator [zero] reached */ pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ escapePrefixUp += 4; /* if escape_separator '0' appears, add 4 and ==> break */ /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixUp */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_UP; /* delete old escapePrefixUp */ escapePrefixUp <<= LSB_ESCAPE_PREFIX_UP; /* shift to correct position */ pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixUp */ escapePrefixUp >>= LSB_ESCAPE_PREFIX_UP; /* shift back down */ /* store escapePrefixUp in pEscapeSequenceInfo[codewordOffset] at bit position escapePrefixDown */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ escapePrefixUp <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ pEscapeSequenceInfo[codewordOffset] |= escapePrefixUp; /* insert new escapePrefixDown */ escapePrefixUp >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back down */ pSta[codewordOffset] = BODY_SIGN_ESC__ESC_WORD; /* set next state */ pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ break; } } if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX; return BODY_SIGN_ESC__ESC_PREFIX; } #endif } return STOP_THIS_STATE; } /*--------------------------------------------------------------------------------------------- description: Decode escapeWord of escape sequence. If the escape sequence is decoded completely, assemble quantized-spectral-escape-coefficient and replace the previous decoded 16 by the new value. Test flagB. If flagB is set, the second escape sequence must be decoded. If flagB is not set, the codeword is decoded and the state machine is switched off. ----------------------------------------------------------------------------------------------- output: Two lines with valid sign. At least one of both lines has got the correct value. ----------------------------------------------------------------------------------------------- return: 0 -------------------------------------------------------------------------------------------- */ UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD(HANDLE_FDK_BITSTREAM bs, void *ptr) { H_HCR_INFO pHcr = (H_HCR_INFO)ptr; SCHAR *pRemainingBitsInSegment; USHORT *pLeftStartOfSegment; USHORT *pRightStartOfSegment; UCHAR readDirection; UINT *pSegmentBitfield; UINT *pCodewordBitfield; UINT segmentOffset; FIXP_DBL *pResultBase; USHORT *iResultPointer; UINT *pEscapeSequenceInfo; UINT codewordOffset; UINT escapeWord; UINT escapePrefixDown; UINT escapePrefixUp; UCHAR carryBit; UINT iQSC; INT sign; UINT flagA; UINT flagB; SCHAR *pSta; pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; readDirection = pHcr->segmentInfo.readDirection; pSegmentBitfield = pHcr->segmentInfo.pSegmentBitfield; pCodewordBitfield = pHcr->segmentInfo.pCodewordBitfield; segmentOffset = pHcr->segmentInfo.segmentOffset; pResultBase = pHcr->nonPcwSideinfo.pResultBase; iResultPointer = pHcr->nonPcwSideinfo.iResultPointer; pEscapeSequenceInfo = pHcr->nonPcwSideinfo.pEscapeSequenceInfo; codewordOffset = pHcr->nonPcwSideinfo.codewordOffset; pSta = pHcr->nonPcwSideinfo.pSta; escapeWord = pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_WORD; escapePrefixDown = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_DOWN) >> LSB_ESCAPE_PREFIX_DOWN; /* decode escape word */ for ( ; pRemainingBitsInSegment[segmentOffset] > 0 ; pRemainingBitsInSegment[segmentOffset] -= 1 ) { carryBit = HcrGetABitFromBitstream( bs, &pLeftStartOfSegment[segmentOffset], &pRightStartOfSegment[segmentOffset], readDirection); /* build escape word */ escapeWord <<= 1; /* left shift previous decoded part of escapeWord by on bit */ escapeWord = escapeWord | carryBit; /* assemble escape word by bitwise or */ /* decrement counter for length of escape word because one more bit was decoded */ escapePrefixDown -= 1; /* store updated escapePrefixDown */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_PREFIX_DOWN; /* delete old escapePrefixDown */ escapePrefixDown <<= LSB_ESCAPE_PREFIX_DOWN; /* shift to correct position */ pEscapeSequenceInfo[codewordOffset] |= escapePrefixDown; /* insert new escapePrefixDown */ escapePrefixDown >>= LSB_ESCAPE_PREFIX_DOWN; /* shift back */ /* store updated escapeWord */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_ESCAPE_WORD; /* delete old escapeWord */ pEscapeSequenceInfo[codewordOffset] |= escapeWord; /* insert new escapeWord */ if ( escapePrefixDown == 0 ) { pRemainingBitsInSegment[segmentOffset] -= 1; /* last reinitialzation of for loop counter (see above) is done here */ /* escape sequence decoded. Assemble escape-line and replace original line */ /* step 0 */ /* derive sign */ iQSC = iResultPointer[codewordOffset]; sign = (pResultBase[iQSC] >= (FIXP_DBL)0) ? 1 : -1; /* get sign of escape value 16 */ /* step 1 */ /* get escapePrefixUp */ escapePrefixUp = (pEscapeSequenceInfo[codewordOffset] & MASK_ESCAPE_PREFIX_UP) >> LSB_ESCAPE_PREFIX_UP; /* step 2 */ /* calculate escape value */ pResultBase[iQSC] = (FIXP_DBL)(sign * (((INT) 1 << escapePrefixUp) + escapeWord)); /* get both flags from sideinfo (flags are not shifted to the lsb-position) */ flagA = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_A; flagB = pEscapeSequenceInfo[codewordOffset] & MASK_FLAG_B; /* step 3 */ /* clear the whole escape sideinfo word */ pEscapeSequenceInfo[codewordOffset] = 0; /* change state in dependence of flag flagB */ if ( flagA != 0 ) { /* first escape sequence decoded; previous decoded 16 has been replaced by valid line */ /* clear flagA in sideinfo word because this escape sequence has already beed decoded */ pEscapeSequenceInfo[codewordOffset] &= ~MASK_FLAG_A; if ( flagB == 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ } else { /* updated pointer to next and last 16 */ iQSC++; iResultPointer[codewordOffset] = iQSC; /* change state */ pSta[codewordOffset] = BODY_SIGN_ESC__ESC_PREFIX; pHcr->nonPcwSideinfo.pState = aStateConstant2State[pSta[codewordOffset]]; /* get state from separate array of cw-sideinfo */ } } else { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pCodewordBitfield); /* clear a bit in bitfield and switch off statemachine */ } break; } } if ( pRemainingBitsInSegment[segmentOffset] <= 0 ) { ClearBitFromBitfield(&(pHcr->nonPcwSideinfo.pState), segmentOffset, pSegmentBitfield); /* clear a bit in bitfield and switch off statemachine */ #if STATE_MACHINE_ERROR_CHECK if ( pRemainingBitsInSegment[segmentOffset] < 0 ) { pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_WORD; return BODY_SIGN_ESC__ESC_WORD; } #endif } return STOP_THIS_STATE; } fdk-aac-0.1.3/libAACdec/src/overlapadd.h0000644000175000017500000001206012372261464020221 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ #ifndef OVERLAPADD_H #define OVERLAPADD_H #include "common_fix.h" #define OverlapBufferSize (1024*2) typedef FIXP_DBL SPECTRUM[1024]; typedef FIXP_DBL * SPECTRAL_PTR; #define SPEC_LONG(ptr) (ptr) #define SPEC(ptr,w,gl) ((ptr)+((w)*(gl))) #endif /* #ifndef OVERLAPADD_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcr.cpp0000644000175000017500000020553412372261464020501 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: HCR initialization, preprocess HCR sideinfo, decode priority codewords (PCWs) *******************************************************************************/ #include "aacdec_hcr.h" #include "aacdec_hcr_types.h" #include "aacdec_hcr_bit.h" #include "aacdec_hcrs.h" #include "aac_ram.h" #include "aac_rom.h" #include "channel.h" #include "block.h" #include "aacdecoder.h" /* for ID_CPE, ID_SCE ... */ #include "FDK_bitstream.h" extern int mlFileChCurr; static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine, UINT *errorWord); static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword, SHORT lengthOfReorderedSpectralData, UINT *errorWord); static void HcrCalcNumCodeword (H_HCR_INFO pHcr); static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr); static void HcrPrepareSegmentationGrid (H_HCR_INFO pHcr); static void HcrExtendedSectionInfo (H_HCR_INFO pHcr); static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection, int numExtendedSortedCodewordInSectionIdx, USHORT *pNumExtendedSortedSectionsInSets, int numExtendedSortedSectionsInSetsIdx); static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, INT quantSpecCoef, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ); static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, UINT codebookDim, const SCHAR *pQuantVal, FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ); static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const UINT *pCurrentTree, const SCHAR *pQuantValBase, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ); static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr); static void HcrReorderQuantizedSpectralCoefficients( H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo ); #if CHECK_SEGMENTATION_IMMEDIATELY static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment, H_HCR_INFO pHcr, PCW_TYPE kind, FIXP_DBL *qsc_base_of_cw, UCHAR dimension); #endif #if CHECK_SEGMENTATION_FINAL static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr); #endif /*--------------------------------------------------------------------------------------------- description: Check if codebook and numSect are within allowed range (short only) -------------------------------------------------------------------------------------------- */ static void errDetectorInHcrSideinfoShrt(SCHAR cb, SHORT numLine,UINT* errorWord) { if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) { *errorWord |= CB_OUT_OF_RANGE_SHORT_BLOCK; } if ( numLine < 0 || numLine > 1024 ) { *errorWord |= LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK; } } /*--------------------------------------------------------------------------------------------- description: Check both HCR lengths -------------------------------------------------------------------------------------------- */ static void errDetectorInHcrLengths(SCHAR lengthOfLongestCodeword, SHORT lengthOfReorderedSpectralData, UINT *errorWord) { if ( lengthOfReorderedSpectralData < lengthOfLongestCodeword ) { *errorWord |= HCR_SI_LENGTHS_FAILURE; } } /*--------------------------------------------------------------------------------------------- description: Decode (and adapt if necessary) the two HCR sideinfo components: 'reordered_spectral_data_length' and 'longest_codeword_length' -------------------------------------------------------------------------------------------- */ void CHcr_Read(HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo) { INT globalHcrType = getHcrType(&pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo); SHORT lengOfReorderedSpectralData; SCHAR lengOfLongestCodeword; pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = 0; pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = 0; /* ------- SI-Value No 1 ------- */ lengOfReorderedSpectralData = FDKreadBits(bs,14) + ERROR_LORSD; if ( globalHcrType == ID_CPE ) { if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= CPE_TOP_LENGTH)) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */ } else { if (lengOfReorderedSpectralData > CPE_TOP_LENGTH) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = CPE_TOP_LENGTH; /* use valid maximum */ } } } else if (globalHcrType == ID_SCE || globalHcrType == ID_LFE || globalHcrType == ID_CCE ) { if ((lengOfReorderedSpectralData >= 0) && (lengOfReorderedSpectralData <= SCE_TOP_LENGTH)) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = lengOfReorderedSpectralData; /* the decoded value is within range */ } else { if (lengOfReorderedSpectralData > SCE_TOP_LENGTH) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData = SCE_TOP_LENGTH; /* use valid maximum */ } } } /* ------- SI-Value No 2 ------- */ lengOfLongestCodeword = FDKreadBits(bs,6) + ERROR_LOLC; if ((lengOfLongestCodeword >= 0) && (lengOfLongestCodeword <= LEN_OF_LONGEST_CW_TOP_LENGTH)) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = lengOfLongestCodeword; /* the decoded value is within range */ } else { if (lengOfLongestCodeword > LEN_OF_LONGEST_CW_TOP_LENGTH) { pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword = LEN_OF_LONGEST_CW_TOP_LENGTH; /* use valid maximum */ } } } /*--------------------------------------------------------------------------------------------- description: Sets up HCR ROM-Tables -------------------------------------------------------------------------------------------- */ void HcrInitRom(H_HCR_INFO pHcr) { pHcr->cbPairs.pMinOfCbPair = aMinOfCbPair; pHcr->cbPairs.pMaxOfCbPair = aMaxOfCbPair; pHcr->tableInfo.pMaxCwLength = aMaxCwLen; pHcr->tableInfo.pCbDimension = aDimCb; pHcr->tableInfo.pCbDimShift = aDimCbShift; pHcr->tableInfo.pCbSign = aSignCb; pHcr->tableInfo.pCbPriority = aCbPriority; pHcr->tableInfo.pLargestAbsVal = aLargestAbsoluteValue; } /*--------------------------------------------------------------------------------------------- description: Set up HCR - must be called before every call to HcrDecoder(). For short block a sorting algorithm is applied to get the SI in the order that HCR could assemble the qsc's as if it is a long block. ----------------------------------------------------------------------------------------------- return: error log -------------------------------------------------------------------------------------------- */ UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, HANDLE_FDK_BITSTREAM bs) { CIcsInfo *pIcsInfo = &pAacDecoderChannelInfo->icsInfo; SHORT *pNumLinesInSec; UCHAR *pCodeBk; SHORT numSection; SCHAR cb; int numLine; int i; pHcr->decInOut.lengthOfReorderedSpectralData = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData; pHcr->decInOut.lengthOfLongestCodeword = pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfLongestCodeword; pHcr->decInOut.pQuantizedSpectralCoefficientsBase = pAacDecoderChannelInfo->pSpectralCoefficient; pHcr->decInOut.quantizedSpectralCoefficientsIdx = 0; pHcr->decInOut.pCodebook = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; pHcr->decInOut.pNumLineInSect = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; pHcr->decInOut.numSection = pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection; pHcr->decInOut.errorLog = 0; pHcr->nonPcwSideinfo.pResultBase = SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient); FDKsyncCache(bs); pHcr->decInOut.bitstreamIndex = FDKgetBitCnt(bs); if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) /* short block */ { SHORT band; SHORT maxBand; SCHAR group; SCHAR winGroupLen; SCHAR window; SCHAR numUnitInBand; SCHAR cntUnitInBand; SCHAR groupWin; SCHAR cb_prev; UCHAR *pCodeBook; const SHORT *BandOffsets; SCHAR numOfGroups; pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* in */ pNumLinesInSec = pHcr->decInOut.pNumLineInSect; /* out */ pCodeBk = pHcr->decInOut.pCodebook; /* out */ BandOffsets = GetScaleFactorBandOffsets(pIcsInfo, pSamplingRateInfo); /* aux */ numOfGroups = GetWindowGroups(pIcsInfo); numLine = 0; numSection = 0; cb = pCodeBook[0]; cb_prev = pCodeBook[0]; /* convert HCR-sideinfo into a unitwise manner: When the cb changes, a new section starts */ *pCodeBk++ = cb_prev; maxBand = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (band = 0; band < maxBand; band++) { /* from low to high sfbs i.e. from low to high frequencies */ numUnitInBand = ((BandOffsets[band+1] - BandOffsets[band]) >> FOUR_LOG_DIV_TWO_LOG); /* get the number of units in current sfb */ for (cntUnitInBand = numUnitInBand; cntUnitInBand != 0; cntUnitInBand-- ) { /* for every unit in the band */ for (window = 0, group = 0; group < numOfGroups; group++) { winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); for (groupWin = winGroupLen; groupWin != 0; groupWin--, window++) { cb = pCodeBook[group * 16 + band]; if (cb != cb_prev) { #if CHECK_VALID_HCR_INPUT /* short-block 1 of 2 */ errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog ); if (pHcr->decInOut.errorLog != 0 ) { return ( pHcr->decInOut.errorLog ); } #endif *pCodeBk++ = cb; *pNumLinesInSec++ = numLine; numSection++; cb_prev = cb; numLine = LINES_PER_UNIT; } else { numLine += LINES_PER_UNIT; } } } } } numSection++; #if CHECK_VALID_HCR_INPUT /* short-block 2 of 2 */ errDetectorInHcrSideinfoShrt(cb,numLine,&pHcr->decInOut.errorLog ); if ( numSection <= 0 || numSection > 1024/2 ) { pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK; } errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword, pHcr->decInOut.lengthOfReorderedSpectralData, &pHcr->decInOut.errorLog); if (pHcr->decInOut.errorLog != 0 ) { return ( pHcr->decInOut.errorLog ); } #endif *pCodeBk = cb; *pNumLinesInSec = numLine; pHcr->decInOut.numSection = numSection; } else /* end short block prepare SI */ { /* long block */ #if CHECK_VALID_HCR_INPUT /* long-block 1 of 1 */ errDetectorInHcrLengths(pHcr->decInOut.lengthOfLongestCodeword, pHcr->decInOut.lengthOfReorderedSpectralData, &pHcr->decInOut.errorLog); numSection = pHcr->decInOut.numSection; pNumLinesInSec = pHcr->decInOut.pNumLineInSect; pCodeBk = pHcr->decInOut.pCodebook; if ( numSection <= 0 || numSection > 64 ) { pHcr->decInOut.errorLog |= NUM_SECT_OUT_OF_RANGE_LONG_BLOCK; numSection = 0; } for ( i = numSection; i != 0; i-- ) { cb = *pCodeBk++; if ( cb < ZERO_HCB || cb >= MAX_CB_CHECK || cb == BOOKSCL ) { pHcr->decInOut.errorLog |= CB_OUT_OF_RANGE_LONG_BLOCK; } numLine = *pNumLinesInSec++; /* FDK_ASSERT(numLine > 0); */ if ( (numLine <= 0) || (numLine > 1024) ) { pHcr->decInOut.errorLog |= LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK; } } if (pHcr->decInOut.errorLog != 0 ) { return ( pHcr->decInOut.errorLog ); } #endif /* CHECK_VALID_HCR_INPUT */ } pCodeBk = pHcr->decInOut.pCodebook; for ( i = 0; i < numSection; i++ ) { if ( (*pCodeBk == NOISE_HCB) || (*pCodeBk == INTENSITY_HCB2) || (*pCodeBk == INTENSITY_HCB)) { *pCodeBk = 0; } pCodeBk++; } /* HCR-sideinfo-input is complete and seems to be valid */ return ( pHcr->decInOut.errorLog ); } #if USE_HCR_DUMMY /*--------------------------------------------------------------------------------------------- description: This HCR - dummy - function writes only a dirac-sequence in output buffer -------------------------------------------------------------------------------------------- */ UINT HcrDecoder(H_HCR_INFO pHcr, const CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs) { for (SHORT i=0; i < 1024; i++ ) { pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = FL2FXCONST_DBL(0.0f); if ( i % 30 == 0) { pHcr->decInOut.pQuantizedSpectralCoefficients->Long[i] = (FIXP_DBL)HCR_DIRAC; } } return 0; } #else /* USE_HCR_DUMMY */ /*--------------------------------------------------------------------------------------------- description: This function decodes the codewords of the spectral coefficients from the bitstream according to the HCR algorithm and stores the quantized spectral coefficients in correct order in the output buffer. -------------------------------------------------------------------------------------------- */ UINT HcrDecoder(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, HANDLE_FDK_BITSTREAM bs) { int pTmp1, pTmp2, pTmp3, pTmp4; #if DETECT_TOO_LONG_CW_READS int pTmp5; #endif INT bitCntOffst; UINT saveBitCnt = FDKgetBitCnt(bs); /* save bitstream position */ HcrCalcNumCodeword(pHcr); HcrSortCodebookAndNumCodewordInSection(pHcr); HcrPrepareSegmentationGrid(pHcr); HcrExtendedSectionInfo(pHcr); if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) != 0 ) { return ( pHcr->decInOut.errorLog ); /* sideinfo is massively corrupt, return from HCR without having decoded anything */ } DeriveNumberOfExtendedSortedSectionsInSets(pHcr->segmentInfo.numSegment, pHcr->sectionInfo.pNumExtendedSortedCodewordInSection, pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx, pHcr->sectionInfo.pNumExtendedSortedSectionsInSets, pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx); /* store */ pTmp1 = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; pTmp2 = pHcr->sectionInfo.extendedSortedCodebookIdx; pTmp3 = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; pTmp4 = pHcr->decInOut.quantizedSpectralCoefficientsIdx; #if DETECT_TOO_LONG_CW_READS pTmp5 = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx; #endif /* ------- decode meaningful PCWs ------ */ DecodePCWs(bs, pHcr); if (( pHcr->decInOut.errorLog & HCR_FATAL_PCW_ERROR_MASK ) == 0 ) { /* ------ decode the non-PCWs -------- */ DecodeNonPCWs(bs, pHcr); } #if CHECK_SEGMENTATION_FINAL errDetectWithinSegmentationFinal(pHcr); #endif /* restore */ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = pTmp1; pHcr->sectionInfo.extendedSortedCodebookIdx = pTmp2; pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = pTmp3; pHcr->decInOut.quantizedSpectralCoefficientsIdx = pTmp4; #if DETECT_TOO_LONG_CW_READS pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = pTmp5; #endif HcrReorderQuantizedSpectralCoefficients(pHcr, pAacDecoderChannelInfo, pSamplingRateInfo); /* restore bitstream position */ bitCntOffst = saveBitCnt - FDKgetBitCnt(bs); if( bitCntOffst ) { FDKpushBiDirectional(bs, bitCntOffst); } return ( pHcr->decInOut.errorLog ); } #endif /* USE_HCR_DUMMY */ /*--------------------------------------------------------------------------------------------- description: This function reorders the quantized spectral coefficients sectionwise for long- and short-blocks and compares to the LAV (Largest Absolute Value of the current codebook) -- a counter is incremented if there is an error detected. Additional for short-blocks a unit-based-deinterleaving is applied. Moreover (for short blocks) the scaling is derived (compare plain huffman decoder). -------------------------------------------------------------------------------------------- */ static void HcrReorderQuantizedSpectralCoefficients( H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo ) { INT qsc; UINT abs_qsc; UINT i,j; USHORT numSpectralValuesInSection; FIXP_DBL *pTeVa; USHORT lavErrorCnt = 0; UINT numSection = pHcr->decInOut.numSection; SPECTRAL_PTR pQuantizedSpectralCoefficientsBase = pHcr->decInOut.pQuantizedSpectralCoefficientsBase; FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift; const USHORT *pLargestAbsVal = pHcr->tableInfo.pLargestAbsVal; UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection; USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset; FIXP_DBL *pTempValues = pHcr->segmentInfo.pTempValues; FIXP_DBL *pBak = pHcr->segmentInfo.pTempValues; FDKmemclear(pTempValues,1024*sizeof(FIXP_DBL)); /* long and short: check if decoded huffman-values (quantized spectral coefficients) are within range */ for ( i=numSection; i != 0; i-- ) { numSpectralValuesInSection = *pNumSortedCodewordInSection++ << pCbDimShift[*pSortedCodebook]; pTeVa = &pTempValues[*pReorderOffset++]; for( j = numSpectralValuesInSection; j != 0; j-- ) { qsc = *pQuantizedSpectralCoefficients++; abs_qsc = FDKabs(qsc); #if VALID_LAV_ERROR_TRIGGER if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) { *pTeVa++ = (FIXP_DBL)qsc; /* the qsc value is within range */ } else { /* line is too high .. */ if ( abs_qsc == Q_VALUE_INVALID ) { /* .. because of previous marking --> dont set LAV flag (would be confusing), just copy out the already marked value */ *pTeVa++ = (FIXP_DBL) qsc; } else { /* .. because a too high value was decoded for this cb --> set LAV flag */ *pTeVa++ = (FIXP_DBL) Q_VALUE_INVALID; lavErrorCnt += 1; } } #else if ( abs_qsc <= pLargestAbsVal[*pSortedCodebook] ) { *pTeVa++ = qsc; } else { *pTeVa++ = Q_VALUE_INVALID; lavErrorCnt += 1; } #endif } pSortedCodebook++; } if (!IsLongBlock(&pAacDecoderChannelInfo->icsInfo)) { FIXP_DBL *pOut; FIXP_DBL locMax; FIXP_DBL tmp; SCHAR groupoffset; SCHAR group; SCHAR band; SCHAR groupwin; SCHAR window; SCHAR numWinGroup; SHORT interm; SCHAR numSfbTransm; SCHAR winGroupLen; SHORT index; INT msb; INT lsb; SHORT *pScaleFacHcr = pAacDecoderChannelInfo->pDynData->aScaleFactor; SHORT *pSfbSclHcr = pAacDecoderChannelInfo->pDynData->aSfbScale; const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); pBak = pHcr->segmentInfo.pTempValues; /* deinterleave unitwise for short blocks */ for ( window = 0; window < (8); window++ ) { pOut = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength); for ( i=0; i < (LINES_PER_UNIT_GROUP); i++ ) { pTeVa = pBak + (window << FOUR_LOG_DIV_TWO_LOG) + i * 32; /* distance of lines between unit groups has to be constant for every framelength (32)! */ for ( j=(LINES_PER_UNIT); j != 0; j-- ) { *pOut++ = *pTeVa++; } } } /* short blocks only */ /* derive global scaling-value for every sfb and every window (as it is done in plain-huffman-decoder at short blocks) */ groupoffset = 0; numWinGroup = GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); numSfbTransm = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (group = 0; group < numWinGroup; group++) { winGroupLen = GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); for (band = 0; band < numSfbTransm; band++) { interm = group * 16 + band; msb = pScaleFacHcr[interm] >> 2; lsb = pScaleFacHcr[interm] & 3; for (groupwin = 0; groupwin < winGroupLen; groupwin++) { window = groupoffset + groupwin; pBak = SPEC(pQuantizedSpectralCoefficientsBase, window, pAacDecoderChannelInfo->granuleLength); locMax = FL2FXCONST_DBL(0.0f); for (index = BandOffsets[band]; index < BandOffsets[band+1]; index += LINES_PER_UNIT) { pTeVa = &pBak[index]; for ( i = LINES_PER_UNIT; i != 0; i --) { tmp = (*pTeVa < FL2FXCONST_DBL(0.0f))? -*pTeVa++ : *pTeVa++; locMax = fixMax(tmp,locMax); } } if ( fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE ) { locMax = (FIXP_DBL)MAX_QUANTIZED_VALUE; } pSfbSclHcr[window*16+band] = msb - GetScaleFromValue(locMax, lsb); /* save global scale maxima in this sfb */ } } groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); } } else { /* copy straight for long-blocks */ pQuantizedSpectralCoefficients = SPEC_LONG(pQuantizedSpectralCoefficientsBase); for ( i = 1024; i != 0; i-- ) { *pQuantizedSpectralCoefficients++ = *pBak++; } } if ( lavErrorCnt != 0 ) { pHcr->decInOut.errorLog |= LAV_VIOLATION; } } /*--------------------------------------------------------------------------------------------- description: This function calculates the number of codewords for each section (numCodewordInSection) and the number of codewords for all sections (numCodeword). For zero and intensity codebooks a entry is also done in the variable numCodewordInSection. It is assumed that the codebook is a two tuples codebook. This is needed later for the calculation of the base addresses for the reordering of the quantize spectral coefficients at the end of the hcr tool. The variable numCodeword contain the number of codewords which are really in the bitstream. Zero or intensity codebooks does not increase the variable numCodewords. ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void HcrCalcNumCodeword(H_HCR_INFO pHcr) { int hcrSection; UINT numCodeword; UINT numSection = pHcr->decInOut.numSection; UCHAR *pCodebook = pHcr->decInOut.pCodebook; SHORT *pNumLineInSection = pHcr->decInOut.pNumLineInSect; const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift; USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection; numCodeword = 0; for ( hcrSection = numSection; hcrSection != 0; hcrSection-- ) { *pNumCodewordInSection = *pNumLineInSection++ >> pCbDimShift[*pCodebook]; if ( *pCodebook != 0 ) { numCodeword += *pNumCodewordInSection; } pNumCodewordInSection++; pCodebook++; } pHcr->sectionInfo.numCodeword = numCodeword; } /*--------------------------------------------------------------------------------------------- description: This function calculates the number of sorted codebooks and sorts the codebooks and the numCodewordInSection according to the priority. -------------------------------------------------------------------------------------------- */ static void HcrSortCodebookAndNumCodewordInSection(H_HCR_INFO pHcr) { UINT i,j,k; UCHAR temp; UINT counter; UINT startOffset; UINT numZeroSection; UCHAR *pDest; UINT numSectionDec; UINT numSection = pHcr->decInOut.numSection; UCHAR *pCodebook = pHcr->decInOut.pCodebook; UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; USHORT *pNumCodewordInSection = pHcr->sectionInfo.pNumCodewordInSection; USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection; UCHAR *pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch; USHORT *pReorderOffset = pHcr->sectionInfo.pReorderOffset; const UCHAR *pCbPriority = pHcr->tableInfo.pCbPriority; const UCHAR *pMinOfCbPair = pHcr->cbPairs.pMinOfCbPair; const UCHAR *pMaxOfCbPair = pHcr->cbPairs.pMaxOfCbPair; const UCHAR *pCbDimShift = pHcr->tableInfo.pCbDimShift; UINT searchStart = 0; /* calculate *pNumSortedSection and store the priorities in array pSortedCdebook */ pDest = pSortedCodebook; numZeroSection = 0; for ( i=numSection; i != 0; i-- ) { if ( pCbPriority[*pCodebook] == 0 ) { numZeroSection += 1; } *pDest++ = pCbPriority[*pCodebook++]; } pHcr->sectionInfo.numSortedSection = numSection - numZeroSection; /* numSortedSection contains no zero or intensity section */ pCodebook = pHcr->decInOut.pCodebook; /* sort priorities of the codebooks in array pSortedCdebook[] */ numSectionDec = numSection - 1; if ( numSectionDec > 0 ) { counter = numSectionDec; for ( j=numSectionDec; j != 0; j-- ) { for ( i=0; i < counter; i++ ) { /* swap priorities */ if ( pSortedCodebook[i+1] > pSortedCodebook[i] ) { temp = pSortedCodebook[i]; pSortedCodebook[i] = pSortedCodebook[i+1]; pSortedCodebook[i+1] = temp; } } counter -= 1; } } /* clear codebookSwitch array */ for ( i = numSection; i != 0; i--) { *pCodebookSwitch++ = 0; } pCodebookSwitch = pHcr->sectionInfo.pCodebookSwitch; /* sort sectionCodebooks and numCodwordsInSection and calculate pReorderOffst[j] */ for ( j = 0; j < numSection; j++ ) { for ( i = searchStart; i < numSection; i++ ) { if ( pCodebookSwitch[i] == 0 && ( pMinOfCbPair[pSortedCodebook[j]] == pCodebook[i] || pMaxOfCbPair[pSortedCodebook[j]] == pCodebook[i] )) { pCodebookSwitch[i] = 1; pSortedCodebook[j] = pCodebook[i]; /* sort codebook */ pNumSortedCodewordInSection[j] = pNumCodewordInSection[i]; /* sort NumCodewordInSection */ startOffset = 0; for ( k = 0; k < i; k++ ) { /* make entry in pReorderOffst */ startOffset += pNumCodewordInSection[k] << pCbDimShift[pCodebook[k]]; } pReorderOffset[j] = startOffset; /* offset for reordering the codewords */ if(i == searchStart) { UINT k = i; while(pCodebookSwitch[k++] == 1) searchStart++; } break; } } } } /*--------------------------------------------------------------------------------------------- description: This function calculates the segmentation, which includes numSegment, leftStartOfSegment, rightStartOfSegment and remainingBitsInSegment. The segmentation could be visualized a as kind of 'overlay-grid' for the bitstream-block holding the HCR-encoded quantized-spectral-coefficients. -------------------------------------------------------------------------------------------- */ static void HcrPrepareSegmentationGrid(H_HCR_INFO pHcr) { USHORT i,j; USHORT numSegment = 0; USHORT segmentStart = 0; UCHAR segmentWidth; UCHAR lastSegmentWidth; UCHAR sortedCodebook; UCHAR endFlag = 0; USHORT intermediateResult; SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword; SHORT lengthOfReorderedSpectralData = pHcr->decInOut.lengthOfReorderedSpectralData; UINT numSortedSection = pHcr->sectionInfo.numSortedSection; UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection; USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; USHORT *pRightStartOfSegment = pHcr->segmentInfo.pRightStartOfSegment; SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; USHORT bitstreamIndex = pHcr->decInOut.bitstreamIndex; const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength; for ( i=numSortedSection; i != 0; i-- ) { sortedCodebook = *pSortedCodebook++; segmentWidth = FDKmin(pMaxCwLength[sortedCodebook],lengthOfLongestCodeword); for ( j = *pNumSortedCodewordInSection; j != 0 ; j-- ) { /* width allows a new segment */ intermediateResult = bitstreamIndex + segmentStart; if ( (segmentStart + segmentWidth) <= lengthOfReorderedSpectralData ) { /* store segment start, segment length and increment the number of segments */ *pLeftStartOfSegment++ = intermediateResult; *pRightStartOfSegment++ = intermediateResult + segmentWidth - 1; *pRemainingBitsInSegment++ = segmentWidth; segmentStart += segmentWidth; numSegment += 1; } /* width does not allow a new segment */ else { /* correct the last segment length */ pLeftStartOfSegment--; pRightStartOfSegment--; pRemainingBitsInSegment--; segmentStart = *pLeftStartOfSegment - bitstreamIndex; lastSegmentWidth = lengthOfReorderedSpectralData - segmentStart; *pRemainingBitsInSegment = lastSegmentWidth; *pRightStartOfSegment = bitstreamIndex + segmentStart + lastSegmentWidth - 1; endFlag = 1; break; } } pNumSortedCodewordInSection++; if (endFlag != 0) { break; } } pHcr->segmentInfo.numSegment = numSegment; } /*--------------------------------------------------------------------------------------------- description: This function adapts the sorted section boundaries to the boundaries of segmentation. If the section lengths does not fit completely into the current segment, the section is spitted into two so called 'extended sections'. The extended-section-info (pNumExtendedSortedCodewordInSectin and pExtendedSortedCodebook) is updated in this case. -------------------------------------------------------------------------------------------- */ static void HcrExtendedSectionInfo(H_HCR_INFO pHcr) { UINT srtSecCnt = 0; /* counter for sorted sections */ UINT xSrtScCnt = 0; /* counter for extended sorted sections */ UINT remainNumCwInSortSec; UINT inSegmentRemainNumCW; UINT numSortedSection = pHcr->sectionInfo.numSortedSection; UCHAR *pSortedCodebook = pHcr->sectionInfo.pSortedCodebook; USHORT *pNumSortedCodewordInSection = pHcr->sectionInfo.pNumSortedCodewordInSection; UCHAR *pExtendedSortedCoBo = pHcr->sectionInfo.pExtendedSortedCodebook; USHORT *pNumExtSortCwInSect = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; UINT numSegment = pHcr->segmentInfo.numSegment; #if DETECT_TOO_LONG_CW_READS UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec; SCHAR lengthOfLongestCodeword = pHcr->decInOut.lengthOfLongestCodeword; const UCHAR *pMaxCwLength = pHcr->tableInfo.pMaxCwLength; #endif remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; inSegmentRemainNumCW = numSegment; while (srtSecCnt < numSortedSection) { if (inSegmentRemainNumCW < remainNumCwInSortSec) { pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW; pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; remainNumCwInSortSec -= inSegmentRemainNumCW; inSegmentRemainNumCW = numSegment; /* data of a sorted section was not integrated in extended sorted section */ } else if (inSegmentRemainNumCW == remainNumCwInSortSec) { pNumExtSortCwInSect[xSrtScCnt] = inSegmentRemainNumCW; pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; srtSecCnt++; remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; inSegmentRemainNumCW = numSegment; /* data of a sorted section was integrated in extended sorted section */ } else { /* inSegmentRemainNumCW > remainNumCwInSortSec */ pNumExtSortCwInSect[xSrtScCnt] = remainNumCwInSortSec; pExtendedSortedCoBo[xSrtScCnt] = pSortedCodebook[srtSecCnt]; inSegmentRemainNumCW -= remainNumCwInSortSec; srtSecCnt++; remainNumCwInSortSec = pNumSortedCodewordInSection[srtSecCnt]; /* data of a sorted section was integrated in extended sorted section */ } #if DETECT_TOO_LONG_CW_READS pMaxLenOfCbInExtSrtSec[xSrtScCnt] = FDKmin(pMaxCwLength[pExtendedSortedCoBo[xSrtScCnt]],lengthOfLongestCodeword); #endif xSrtScCnt += 1; if ( xSrtScCnt >= (MAX_SFB_HCR + MAX_HCR_SETS) ) { pHcr->decInOut.errorLog |= EXTENDED_SORTED_COUNTER_OVERFLOW; return; } } pNumExtSortCwInSect[xSrtScCnt] = 0; } /*--------------------------------------------------------------------------------------------- description: This function calculates the number of extended sorted sections which belong to the sets. Each set from set 0 (one and only set for the PCWs) till to the last set gets a entry in the array to which 'pNumExtendedSortedSectinsInSets' points to. Calculation: The entrys in pNumExtendedSortedCodewordInSectin are added untill the value numSegment is reached. Then the sum_variable is cleared and the calculation starts from the beginning. As much extended sorted Sections are summed up to reach the value numSegment, as much is the current entry in *pNumExtendedSortedCodewordInSectin. -------------------------------------------------------------------------------------------- */ static void DeriveNumberOfExtendedSortedSectionsInSets(UINT numSegment, USHORT *pNumExtendedSortedCodewordInSection, int numExtendedSortedCodewordInSectionIdx, USHORT *pNumExtendedSortedSectionsInSets, int numExtendedSortedSectionsInSetsIdx) { USHORT counter = 0; UINT cwSum = 0; USHORT *pNumExSortCwInSec = pNumExtendedSortedCodewordInSection; USHORT *pNumExSortSecInSets = pNumExtendedSortedSectionsInSets; while (pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx] != 0) { cwSum += pNumExSortCwInSec[numExtendedSortedCodewordInSectionIdx]; numExtendedSortedCodewordInSectionIdx++; if (numExtendedSortedCodewordInSectionIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { return; } if (cwSum > numSegment) { return; } counter++; if (counter > 1024/4) { return; } if ( cwSum == numSegment ) { pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; numExtendedSortedSectionsInSetsIdx++; if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { return; } counter = 0; cwSum = 0; } } pNumExSortSecInSets[numExtendedSortedSectionsInSetsIdx] = counter; /* save last entry for the last - probably shorter - set */ } /*--------------------------------------------------------------------------------------------- description: This function decodes all priority codewords (PCWs) in a spectrum (within set 0). The calculation of the PCWs is managed in two loops. The loopcounter of the outer loop is set to the first value pointer pNumExtendedSortedSectionsInSets points to. This value represents the number of extended sorted sections within set 0. The loopcounter of the inner loop is set to the first value pointer pNumExtendedSortedCodewordInSectin points to. The value represents the number of extended sorted codewords in sections (the original sections have been splitted to go along with the borders of the sets). Each time the number of the extended sorted codewords in sections are de- coded, the pointer 'pNumExtendedSortedCodewordInSectin' is incremented by one. -------------------------------------------------------------------------------------------- */ static void DecodePCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO pHcr) { UINT i; USHORT extSortSec; USHORT curExtSortCwInSec; UCHAR codebook; UCHAR dimension; const UINT *pCurrentTree; const SCHAR *pQuantValBase; const SCHAR *pQuantVal; USHORT *pNumExtendedSortedCodewordInSection = pHcr->sectionInfo.pNumExtendedSortedCodewordInSection; int numExtendedSortedCodewordInSectionIdx = pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx; UCHAR *pExtendedSortedCodebook = pHcr->sectionInfo.pExtendedSortedCodebook; int extendedSortedCodebookIdx = pHcr->sectionInfo.extendedSortedCodebookIdx; USHORT *pNumExtendedSortedSectionsInSets = pHcr->sectionInfo.pNumExtendedSortedSectionsInSets; int numExtendedSortedSectionsInSetsIdx = pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx; FIXP_DBL *pQuantizedSpectralCoefficients = SPEC_LONG(pHcr->decInOut.pQuantizedSpectralCoefficientsBase); int quantizedSpectralCoefficientsIdx = pHcr->decInOut.quantizedSpectralCoefficientsIdx; USHORT *pLeftStartOfSegment = pHcr->segmentInfo.pLeftStartOfSegment; SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; #if DETECT_TOO_LONG_CW_READS UCHAR *pMaxLenOfCbInExtSrtSec = pHcr->sectionInfo.pMaxLenOfCbInExtSrtSec; int maxLenOfCbInExtSrtSecIdx = pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx; UCHAR maxAllowedCwLen; int numDecodedBits; #endif const UCHAR *pCbDimension = pHcr->tableInfo.pCbDimension; const UCHAR *pCbSign = pHcr->tableInfo.pCbSign; /* clear result array */ //pQSC = &pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]; //pQSC = *pQuantizedSpectralCoefficients; FDKmemclear(pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx,1024*sizeof(FIXP_DBL)); /* decode all PCWs in the extended sorted section(s) belonging to set 0 */ for ( extSortSec = pNumExtendedSortedSectionsInSets[numExtendedSortedSectionsInSetsIdx]; extSortSec != 0; extSortSec-- ) { codebook = pExtendedSortedCodebook[extendedSortedCodebookIdx]; /* get codebook for this extended sorted section and increment ptr to cb of next ext. sort sec */ extendedSortedCodebookIdx++; if (extendedSortedCodebookIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { return; } dimension = pCbDimension[codebook]; /* get dimension of codebook of this extended sort. sec. */ pCurrentTree = aHuffTable [codebook]; /* convert codebook to pointer to QSCs */ pQuantValBase = aQuantTable [codebook]; /* convert codebook to index to table of QSCs */ #if DETECT_TOO_LONG_CW_READS maxAllowedCwLen = pMaxLenOfCbInExtSrtSec[maxLenOfCbInExtSrtSecIdx]; maxLenOfCbInExtSrtSecIdx++; if (maxLenOfCbInExtSrtSecIdx >= (MAX_SFB_HCR+MAX_HCR_SETS)) { return; } #endif /* switch for decoding with different codebooks: */ if ( pCbSign[codebook] == 0 ) { /* no sign bits follow after the codeword-body */ /* PCW_BodyONLY */ /*==============*/ for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) { numDecodedBits = 0; /* decode PCW_BODY */ pQuantVal = DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); /* result is written out here because NO sign bits follow the body */ for( i=dimension; i != 0 ; i-- ) { pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) *pQuantVal++; /* write quant. spec. coef. into spectrum; sign is already valid */ quantizedSpectralCoefficientsIdx++; if (quantizedSpectralCoefficientsIdx >= 1024) { return; } } /* one more PCW should be decoded */ #if DETECT_TOO_LONG_CW_READS if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_ONLY_TOO_LONG) ) { pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_BITS_DECODED; } #endif #if CHECK_SEGMENTATION_IMMEDIATELY if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY,pHcr,PCW_BODY,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) { return; } #endif pLeftStartOfSegment++; /* update pointer for decoding the next PCW */ pRemainingBitsInSegment++; /* update pointer for decoding the next PCW */ } } else if (( pCbSign[codebook] == 1 ) && ( codebook < 11 )) { /* possibly there follow 1,2,3 or 4 sign bits after the codeword-body */ /* PCW_Body and PCW_Sign */ /*=======================*/ for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) { int err; numDecodedBits = 0; pQuantVal = DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); err = DecodePCW_Sign( bs, dimension, pQuantVal, pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx, pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); if (err != 0) { return; } /* one more PCW should be decoded */ #if DETECT_TOO_LONG_CW_READS if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_TOO_LONG) ) { pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_BITS_DECODED; } #endif #if CHECK_SEGMENTATION_IMMEDIATELY if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN,pHcr,PCW_BODY_SIGN, pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-dimension,dimension)) { return; } #endif pLeftStartOfSegment++; pRemainingBitsInSegment++; } } else if (( pCbSign[codebook] == 1 ) && ( codebook >= 11 )) { /* possibly there follow some sign bits and maybe one or two escape sequences after the cw-body */ /* PCW_Body, PCW_Sign and maybe PCW_Escape */ /*=========================================*/ for ( curExtSortCwInSec = pNumExtendedSortedCodewordInSection[numExtendedSortedCodewordInSectionIdx] ; curExtSortCwInSec != 0; curExtSortCwInSec--) { int err; numDecodedBits = 0; /* decode PCW_BODY */ pQuantVal = DecodePCW_Body(bs, pCurrentTree, pQuantValBase, pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); err = DecodePCW_Sign( bs, dimension, pQuantVal, pQuantizedSpectralCoefficients, &quantizedSpectralCoefficientsIdx, pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); if (err != 0) { return; } /* decode PCW_ESCAPE if present */ quantizedSpectralCoefficientsIdx -= DIMENSION_OF_ESCAPE_CODEBOOK; if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) { pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs, pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx], pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); } quantizedSpectralCoefficientsIdx++; if (quantizedSpectralCoefficientsIdx >= 1024) { return; } if ( fixp_abs(pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx]) == (FIXP_DBL)ESCAPE_VALUE ) { pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx] = (FIXP_DBL) DecodeEscapeSequence( bs, pQuantizedSpectralCoefficients[quantizedSpectralCoefficientsIdx], pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits ); } quantizedSpectralCoefficientsIdx++; if (quantizedSpectralCoefficientsIdx >= 1024) { return; } /* one more PCW should be decoded */ #if DETECT_TOO_LONG_CW_READS if ( maxAllowedCwLen < (numDecodedBits + ERROR_PCW_BODY_SIGN_ESC_TOO_LONG) ) { pHcr->decInOut.errorLog |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED; } #endif #if CHECK_SEGMENTATION_IMMEDIATELY if (1 == errDetectPcwSegmentation(*pRemainingBitsInSegment-ERROR_PCW_BODY_SIGN_ESC,pHcr,PCW_BODY_SIGN_ESC,pQuantizedSpectralCoefficients+quantizedSpectralCoefficientsIdx-DIMENSION_OF_ESCAPE_CODEBOOK,DIMENSION_OF_ESCAPE_CODEBOOK)) { return; } #endif pLeftStartOfSegment++; pRemainingBitsInSegment++; } } /* all PCWs belonging to this extended section should be decoded */ numExtendedSortedCodewordInSectionIdx++; if (numExtendedSortedCodewordInSectionIdx >= MAX_SFB_HCR+MAX_HCR_SETS) { return; } } /* all PCWs should be decoded */ numExtendedSortedSectionsInSetsIdx++; if (numExtendedSortedSectionsInSetsIdx >= MAX_HCR_SETS) { return; } /* Write back indexes into structure */ pHcr->sectionInfo.numExtendedSortedCodewordInSectionIdx = numExtendedSortedCodewordInSectionIdx; pHcr->sectionInfo.extendedSortedCodebookIdx = extendedSortedCodebookIdx; pHcr->sectionInfo.numExtendedSortedSectionsInSetsIdx = numExtendedSortedSectionsInSetsIdx; pHcr->decInOut.quantizedSpectralCoefficientsIdx = quantizedSpectralCoefficientsIdx; pHcr->sectionInfo.maxLenOfCbInExtSrtSecIdx = maxLenOfCbInExtSrtSecIdx; } #if CHECK_SEGMENTATION_IMMEDIATELY /*--------------------------------------------------------------------------------------------- description: This function checks immediately after every decoded PCW, whether out of the current segment too many bits have been read or not. If an error occurrs, probably the sideinfo or the HCR-bitstream block holding the huffman encoded quantized spectral coefficients is distorted. In this case the two or four quantized spectral coefficients belonging to the current codeword are marked (for being detected by concealment later). -------------------------------------------------------------------------------------------- */ static UCHAR errDetectPcwSegmentation(SCHAR remainingBitsInSegment, H_HCR_INFO pHcr, PCW_TYPE kind, FIXP_DBL *qsc_base_of_cw, UCHAR dimension) { SCHAR i; if ( remainingBitsInSegment < 0 ) { /* log the error */ switch (kind) { case PCW_BODY: pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY; break; case PCW_BODY_SIGN: pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN; break; case PCW_BODY_SIGN_ESC: pHcr->decInOut.errorLog |= SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC; break; } /* mark the erred lines */ for ( i = dimension; i != 0; i-- ) { *qsc_base_of_cw++ = (FIXP_DBL) Q_VALUE_INVALID; } return 1; } return 0; } #endif #if CHECK_SEGMENTATION_FINAL /*--------------------------------------------------------------------------------------------- description: This function checks if all segments are empty after decoding. There are _no lines markded_ as invalid because it could not be traced back where from the remaining bits are. -------------------------------------------------------------------------------------------- */ static void errDetectWithinSegmentationFinal(H_HCR_INFO pHcr) { UCHAR segmentationErrorFlag = 0; USHORT i; SCHAR *pRemainingBitsInSegment = pHcr->segmentInfo.pRemainingBitsInSegment; UINT numSegment = pHcr->segmentInfo.numSegment; for ( i=numSegment; i != 0 ; i--) { if (*pRemainingBitsInSegment++ != 0) { segmentationErrorFlag = 1; } } if (segmentationErrorFlag == 1) { pHcr->decInOut.errorLog |= BIT_IN_SEGMENTATION_ERROR; } } #endif /*--------------------------------------------------------------------------------------------- description: This function walks one step within the decoding tree. Which branch is taken depends on the decoded carryBit input parameter. -------------------------------------------------------------------------------------------- */ void CarryBitToBranchValue(UCHAR carryBit, UINT treeNode, UINT *branchValue, UINT *branchNode) { if (carryBit == 0) { *branchNode = (treeNode & MASK_LEFT) >> LEFT_OFFSET; /* MASK_LEFT: 00FFF000 */ } else { *branchNode = treeNode & MASK_RIGHT; /* MASK_RIGHT: 00000FFF */ } *branchValue = *branchNode & CLR_BIT_10; /* clear bit 10 (if set) */ } /*--------------------------------------------------------------------------------------------- description: Decodes the body of a priority codeword (PCW) ----------------------------------------------------------------------------------------------- return: - return value is pointer to first of two or four quantized spectral coefficients -------------------------------------------------------------------------------------------- */ static const SCHAR *DecodePCW_Body(HANDLE_FDK_BITSTREAM bs, const UINT *pCurrentTree, const SCHAR *pQuantValBase, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ) { UCHAR carryBit; UINT branchNode; UINT treeNode; UINT branchValue; const SCHAR *pQuantVal; /* decode PCW_BODY */ treeNode = *pCurrentTree; /* get first node of current tree belonging to current codebook */ /* decode whole PCW-codeword-body */ while (1) { carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment, pLeftStartOfSegment, /* dummy */ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; CarryBitToBranchValue(carryBit, treeNode, &branchValue, &branchNode); if ((branchNode & TEST_BIT_10) == TEST_BIT_10) { /* test bit 10 ; if set --> codeword-body is complete */ break; /* end of branch in tree reached i.e. a whole PCW-Body is decoded */ } else { treeNode = *(pCurrentTree + branchValue); /* update treeNode for further step in decoding tree */ } } pQuantVal = pQuantValBase + branchValue; /* update pointer to valid first of 2 or 4 quantized values */ return pQuantVal; } /*--------------------------------------------------------------------------------------------- description: This function decodes one escape sequence. In case of a escape codebook and in case of the absolute value of the quantized spectral value == 16, a escapeSequence is decoded in two steps: 1. escape prefix 2. escape word -------------------------------------------------------------------------------------------- */ static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, INT quantSpecCoef, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ) { UINT i; INT sign; UINT escapeOnesCounter = 0; UINT carryBit; INT escape_word = 0; /* decode escape prefix */ while (1) { carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment, pLeftStartOfSegment, /* dummy */ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; if (carryBit != 0) { escapeOnesCounter += 1; } else { escapeOnesCounter += 4; break; } } /* decode escape word */ for( i=escapeOnesCounter; i != 0 ; i-- ) { carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment, pLeftStartOfSegment, /* dummy */ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; escape_word <<= 1; escape_word = escape_word | carryBit; } sign = (quantSpecCoef >= 0) ? 1 : -1; quantSpecCoef = sign * (((INT ) 1 << escapeOnesCounter) + escape_word); return quantSpecCoef; } /*--------------------------------------------------------------------------------------------- description: Decodes the Signbits of a priority codeword (PCW) and writes out the resulting quantized spectral values into unsorted sections ----------------------------------------------------------------------------------------------- output: - two or four lines at position in corresponding section (which are not located at the desired position, i.e. they must be reordered in the last of eight function of HCR) ----------------------------------------------------------------------------------------------- return: - updated pQuantSpecCoef pointer (to next empty storage for a line) -------------------------------------------------------------------------------------------- */ static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, UINT codebookDim, const SCHAR *pQuantVal, FIXP_DBL *pQuantSpecCoef, int *quantSpecCoefIdx, USHORT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, int *pNumDecodedBits ) { UINT i; UINT carryBit; INT quantSpecCoef; for( i=codebookDim; i != 0 ; i-- ) { quantSpecCoef = *pQuantVal++; if (quantSpecCoef != 0) { carryBit = HcrGetABitFromBitstream(bs, pLeftStartOfSegment, pLeftStartOfSegment, /* dummy */ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; if (*pRemainingBitsInSegment < 0 || *pNumDecodedBits >= (1024>>1)) { return -1; } /* adapt sign of values according to the decoded sign bit */ if (carryBit != 0) { pQuantSpecCoef[*quantSpecCoefIdx] = -(FIXP_DBL)quantSpecCoef; } else { pQuantSpecCoef[*quantSpecCoefIdx] = (FIXP_DBL)quantSpecCoef; } } else { pQuantSpecCoef[*quantSpecCoefIdx] = FL2FXCONST_DBL(0.0f); } *quantSpecCoefIdx += 1 ; if (*quantSpecCoefIdx >= 1024) { return -1; } } return 0; } /*--------------------------------------------------------------------------------------------- description: Mutes spectral lines which have been marked as erroneous (Q_VALUE_INVALID) -------------------------------------------------------------------------------------------- */ void HcrMuteErroneousLines(H_HCR_INFO hHcr) { int c; FIXP_DBL *RESTRICT pLong = SPEC_LONG(hHcr->decInOut.pQuantizedSpectralCoefficientsBase); /* if there is a line with value Q_VALUE_INVALID mute it */ for (c = 0; c < 1024; c++) { if (pLong[c] == (FIXP_DBL)Q_VALUE_INVALID) { #if HCR_LISTEN_TO_MUTED_LINES pLong[c] = (FIXP_DBL)HCR_DIRAC; /* marking */ #else pLong[c] = FL2FXCONST_DBL(0.0f); /* muting */ #endif } } } /*--------------------------------------------------------------------------------------------- description: Sets global HCR type -------------------------------------------------------------------------------------------- */ void setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type) { switch (type) { case ID_SCE: hHcr->globalHcrType = 0; break; case ID_CPE: hHcr->globalHcrType = 1; break; default: break; } } /*--------------------------------------------------------------------------------------------- description: Gets HCR type from the HCR data structure ----------------------------------------------------------------------------------------------- return: - global HCR type -------------------------------------------------------------------------------------------- */ INT getHcrType(H_HCR_INFO hHcr) { return hHcr->globalHcrType; } fdk-aac-0.1.3/libAACdec/src/aacdecoder.h0000644000175000017500000003050312372261464020154 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ #ifndef AACDECODER_H #define AACDECODER_H #include "common_fix.h" #include "FDK_bitstream.h" #include "channel.h" #include "tpdec_lib.h" #include "FDK_audio.h" #include "block.h" #include "genericStds.h" #include "sbrdecoder.h" #include "aacdec_drc.h" #include "pcmutils_lib.h" /* Capabilities flags */ #define CAPF_AAC_LC 0x00000001 #define CAPF_AAC_LD 0x00000002 #define CAPF_AAC_SCAL 0x00000004 #define CAPF_AAC_ER 0x00000008 #define CAPF_AAC_480 0x00000010 #define CAPF_AAC_512 0x00000020 #define CAPF_AAC_960 0x00000040 #define CAPF_AAC_1024 0x00000080 #define CAPF_AAC_HCR 0x00000100 #define CAPF_AAC_VCB11 0x00000200 #define CAPF_AAC_RVLC 0x00000400 #define CAPF_AAC_MPEG4 0x00000800 /* PNS */ #define CAPF_AAC_DRC 0x00001000 #define CAPF_AAC_CONCEAL 0x00002000 #define CAPF_AAC_DRM_BSFORMAT 0x00004000 #define CAPF_AAC_BSAC 0x00008000 typedef struct AAC_DECODER_INSTANCE *HANDLE_AACDECODER; enum { L = 0, R = 1 }; typedef struct { unsigned char *buffer; int bufferSize; int offset[8]; int nrElements; } CAncData; typedef enum { NOT_DEFINED = -1, MODE_HQ = 0, MODE_LP = 1 } QMF_MODE; typedef struct { int bsDelay; } SBR_PARAMS; /* AAC decoder (opaque toward userland) struct declaration */ struct AAC_DECODER_INSTANCE { INT aacChannels; /*!< Amount of AAC decoder channels allocated. */ INT ascChannels; /*!< Amount of AAC decoder channels signalled in ASC. */ INT blockNumber; /*!< frame counter */ INT nrOfLayers; INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved). */ HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */ SamplingRateInfo samplingRateInfo; /*!< Sampling Rate information table */ UCHAR frameOK; /*!< Will be unset if a consistency check, e.g. CRC etc. fails */ UINT flags; /*!< Flags for internal decoder use. DO NOT USE self::streaminfo::flags ! */ MP4_ELEMENT_ID elements[7]; /*!< Table where the element Id's are listed */ UCHAR elTags[7]; /*!< Table where the elements id Tags are listed */ UCHAR chMapping[(6)]; /*!< Table of MPEG canonical order to bitstream channel order mapping. */ AUDIO_CHANNEL_TYPE channelType[(6)]; /*!< Audio channel type of each output audio channel (from 0 upto numChannels). */ UCHAR channelIndices[(6)]; /*!< Audio channel index for each output audio channel (from 0 upto numChannels). */ /* See ISO/IEC 13818-7:2005(E), 8.5.3.2 Explicit channel mapping using a program_config_element() */ const UCHAR (*channelOutputMapping)[8]; /*!< Table for MPEG canonical order to output channel order mapping. */ CProgramConfig pce; CStreamInfo streamInfo; /*!< pointer to StreamInfo data (read from the bitstream) */ CAacDecoderChannelInfo *pAacDecoderChannelInfo[(6)]; /*!< Temporal channel memory */ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[(6)]; /*!< Persistent channel memory */ CAacDecoderCommonData aacCommonData; /*!< Temporal shared data for all channels hooked into pAacDecoderChannelInfo */ CConcealParams concealCommonData; INT concealChannels; HANDLE_SBRDECODER hSbrDecoder; /*!< SBR decoder handle. */ UCHAR sbrEnabled; /*!< flag to store if SBR has been detected */ UCHAR sbrEnabledPrev; /*!< flag to store if SBR has been detected from previous frame */ UCHAR psPossible; /*!< flag to store if PS is possible */ SBR_PARAMS sbrParams; /*!< struct to store all sbr parameters */ QMF_MODE qmfModeCurr; /*!< The current QMF mode */ QMF_MODE qmfModeUser; /*!< The QMF mode requested by the library user */ HANDLE_AAC_DRC hDrcInfo; /*!< handle to DRC data structure */ CAncData ancData; /*!< structure to handle ancillary data */ HANDLE_PCM_DOWNMIX hPcmUtils; /*!< privat data for the PCM utils. */ }; #define AAC_DEBUG_EXTHLP "\ --- AAC-Core ---\n\ 0x00010000 Header data\n\ 0x00020000 CRC data\n\ 0x00040000 Channel info\n\ 0x00080000 Section data\n\ 0x00100000 Scalefactor data\n\ 0x00200000 Pulse data\n\ 0x00400000 Tns data\n\ 0x00800000 Quantized spectrum\n\ 0x01000000 Requantized spectrum\n\ 0x02000000 Time output\n\ 0x04000000 Fatal errors\n\ 0x08000000 Buffer fullness\n\ 0x10000000 Average bitrate\n\ 0x20000000 Synchronization\n\ 0x40000000 Concealment\n\ 0x7FFF0000 all AAC-Core-Info\n\ " /** * \brief Synchronise QMF mode for all modules using QMF data. * \param self decoder handle */ void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self); /** * \brief Signal a bit stream interruption to the decoder * \param self decoder handle */ void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self); /*! \brief Initialize ancillary buffer \ancData Pointer to ancillary data structure \buffer Pointer to (external) anc data buffer \size Size of the buffer pointed on by buffer \return Error code */ AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size); /*! \brief Get one ancillary data element \ancData Pointer to ancillary data structure \index Index of the anc data element to get \ptr Pointer to a buffer receiving a pointer to the requested anc data element \size Pointer to a buffer receiving the length of the requested anc data element \return Error code */ AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size); /* initialization of aac decoder */ LINKSPEC_H HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat); /* Initialization of stream-info elements */ LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc); /*! \brief Decodes one aac frame The function decodes one aac frame. The decoding of coupling channel elements are not supported. The transport layer might signal, that the data of the current frame is invalid, e.g. as a result of a packet loss in streaming mode. The bitstream position of transportDec_GetBitstream(self->hInput) must be exactly the end of the access unit, including all byte alignment bits. For this purpose, the variable auStartAnchor is used. \return error status */ LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame( HANDLE_AACDECODER self, const UINT flags, INT_PCM *pTimeData, const INT timeDataSize, const INT interleaved ); /* Destroy aac decoder */ LINKSPEC_H void CAacDecoder_Close ( HANDLE_AACDECODER self ); /* get streaminfo handle from decoder */ LINKSPEC_H CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self ); #endif /* #ifndef AACDECODER_H */ fdk-aac-0.1.3/libAACdec/src/rvlcconceal.cpp0000644000175000017500000010073712372261464020737 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief rvlc concealment \author Josef Hoepfl */ #include "rvlcconceal.h" #include "block.h" #include "rvlc.h" /*--------------------------------------------------------------------------------------------- function: calcRefValFwd description: The function determines the scalefactor which is closed to the scalefactorband conceal_min. The same is done for intensity data and noise energies. ----------------------------------------------------------------------------------------------- output: - reference value scf - reference value internsity data - reference value noise energy ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void calcRefValFwd (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo, int *refIsFwd, int *refNrgFwd, int *refScfFwd) { int band,bnds,group,startBand; int idIs,idNrg,idScf; int conceal_min,conceal_group_min; int MaximumScaleFactorBands; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) MaximumScaleFactorBands = 16; else MaximumScaleFactorBands = 64; conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; /* calculate first reference value for approach in forward direction */ idIs = idNrg = idScf = 1; /* set reference values */ *refIsFwd = - SF_OFFSET; *refNrgFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET - 90 - 256; *refScfFwd = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain - SF_OFFSET; startBand = conceal_min-1; for (group=conceal_group_min; group >= 0; group--) { for (band=startBand; band >= 0; band--) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: break; case INTENSITY_HCB: case INTENSITY_HCB2: if (idIs) { *refIsFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; idIs=0; /* reference value has been set */ } break; case NOISE_HCB: if (idNrg) { *refNrgFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; idNrg=0; /* reference value has been set */ } break ; default: if (idScf) { *refScfFwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; idScf=0; /* reference value has been set */ } break; } } startBand = pRvlc->maxSfbTransmitted-1; } } /*--------------------------------------------------------------------------------------------- function: calcRefValBwd description: The function determines the scalefactor which is closed to the scalefactorband conceal_max. The same is done for intensity data and noise energies. ----------------------------------------------------------------------------------------------- output: - reference value scf - reference value internsity data - reference value noise energy ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ static void calcRefValBwd (CErRvlcInfo *pRvlc, CAacDecoderChannelInfo *pAacDecoderChannelInfo, int *refIsBwd, int *refNrgBwd, int *refScfBwd) { int band,bnds,group,startBand; int idIs,idNrg,idScf; int conceal_max,conceal_group_max; int MaximumScaleFactorBands; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) MaximumScaleFactorBands = 16; else MaximumScaleFactorBands = 64; conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; /* calculate first reference value for approach in backward direction */ idIs = idNrg = idScf = 1; /* set reference values */ *refIsBwd = pRvlc->dpcm_is_last_position - SF_OFFSET; *refNrgBwd = pRvlc->rev_global_gain + pRvlc->dpcm_noise_last_position - SF_OFFSET - 90 - 256 + pRvlc->dpcm_noise_nrg; *refScfBwd = pRvlc->rev_global_gain - SF_OFFSET; startBand=conceal_max+1; /* if needed, re-set reference values */ for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: break; case INTENSITY_HCB: case INTENSITY_HCB2: if (idIs) { *refIsBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; idIs=0; /* reference value has been set */ } break; case NOISE_HCB: if (idNrg) { *refNrgBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; idNrg=0; /* reference value has been set */ } break ; default: if (idScf) { *refScfBwd = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; idScf=0; /* reference value has been set */ } break; } } startBand=0; } } /*--------------------------------------------------------------------------------------------- function: BidirectionalEstimation_UseLowerScfOfCurrentFrame description: This approach by means of bidirectional estimation is generally performed when a single bit error has been detected, the bit error can be isolated between 'conceal_min' and 'conceal_max' and the 'sf_concealment' flag is not set. The sets of scalefactors decoded in forward and backward direction are compared with each other. The smaller scalefactor will be considered as the correct one respectively. The reconstruction of the scalefactors with this approach archieve good results in audio quality. The strategy must be applied to scalefactors, intensity data and noise energy seperately. ----------------------------------------------------------------------------------------------- output: Concealed scalefactor, noise energy and intensity data between conceal_min and conceal_max ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ void BidirectionalEstimation_UseLowerScfOfCurrentFrame (CAacDecoderChannelInfo *pAacDecoderChannelInfo) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; int band,bnds,startBand,endBand,group; int conceal_min,conceal_max; int conceal_group_min,conceal_group_max; int MaximumScaleFactorBands; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { MaximumScaleFactorBands = 16; } else { MaximumScaleFactorBands = 64; } /* If an error was detected just in forward or backward direction, set the corresponding border for concealment to a appropriate scalefactor band. The border is set to first or last sfb respectively, because the error will possibly not follow directly after the corrupt bit but just after decoding some more (wrong) scalefactors. */ if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0; if (pRvlc->conceal_max == CONCEAL_MAX_INIT) pRvlc->conceal_max = (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1; conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; if (pRvlc->conceal_min == pRvlc->conceal_max) { int refIsFwd,refNrgFwd,refScfFwd; int refIsBwd,refNrgBwd,refScfBwd; bnds = pRvlc->conceal_min; calcRefValFwd(pRvlc,pAacDecoderChannelInfo,&refIsFwd,&refNrgFwd,&refScfFwd); calcRefValBwd(pRvlc,pAacDecoderChannelInfo,&refIsBwd,&refNrgBwd,&refScfBwd); switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: break; case INTENSITY_HCB: case INTENSITY_HCB2: if (refIsFwd < refIsBwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsFwd; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refIsBwd; break; case NOISE_HCB: if (refNrgFwd < refNrgBwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgFwd; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refNrgBwd; break; default: if (refScfFwd < refScfBwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfFwd; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = refScfBwd; break; } } else { pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_max] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_max]; pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_min] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_min]; /* consider the smaller of the forward and backward decoded value as the correct one */ startBand = conceal_min; if (conceal_group_min == conceal_group_max) endBand = conceal_max; else endBand = pRvlc->maxSfbTransmitted-1; for (group=conceal_group_min; group <= conceal_group_max; group++) { for (band=startBand; band <= endBand; band++) { bnds = 16*group+band; if (pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds] < pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; } startBand = 0; if ((group+1) == conceal_group_max) endBand = conceal_max; } } /* now copy all data to the output buffer which needs not to be concealed */ if (conceal_group_min == 0) endBand = conceal_min; else endBand = pRvlc->maxSfbTransmitted; for (group=0; group <= conceal_group_min; group++) { for (band=0; band < endBand; band++) { bnds = 16*group+band; pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; } if ((group+1) == conceal_group_min) endBand = conceal_min; } startBand = conceal_max+1; for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; } startBand = 0; } } /*--------------------------------------------------------------------------------------------- function: BidirectionalEstimation_UseScfOfPrevFrameAsReference description: This approach by means of bidirectional estimation is generally performed when a single bit error has been detected, the bit error can be isolated between 'conceal_min' and 'conceal_max', the 'sf_concealment' flag is set and the previous frame has the same block type as the current frame. The scalefactor decoded in forward and backward direction and the scalefactor of the previous frame are compared with each other. The smaller scalefactor will be considered as the correct one. At this the codebook of the previous and current frame must be of the same set (scf, nrg, is) in each scalefactorband. Otherwise the scalefactor of the previous frame is not considered in the minimum calculation. The reconstruction of the scalefactors with this approach archieve good results in audio quality. The strategy must be applied to scalefactors, intensity data and noise energy seperately. ----------------------------------------------------------------------------------------------- output: Concealed scalefactor, noise energy and intensity data between conceal_min and conceal_max ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ void BidirectionalEstimation_UseScfOfPrevFrameAsReference ( CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; int band,bnds,startBand,endBand,group; int conceal_min,conceal_max; int conceal_group_min,conceal_group_max; int MaximumScaleFactorBands; int commonMin; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) { MaximumScaleFactorBands = 16; } else { MaximumScaleFactorBands = 64; } /* If an error was detected just in forward or backward direction, set the corresponding border for concealment to a appropriate scalefactor band. The border is set to first or last sfb respectively, because the error will possibly not follow directly after the corrupt bit but just after decoding some more (wrong) scalefactors. */ if (pRvlc->conceal_min == CONCEAL_MIN_INIT) pRvlc->conceal_min = 0; if (pRvlc->conceal_max == CONCEAL_MAX_INIT) pRvlc->conceal_max = (pRvlc->numWindowGroups-1)*16+pRvlc->maxSfbTransmitted-1; conceal_min = pRvlc->conceal_min % MaximumScaleFactorBands; conceal_group_min = pRvlc->conceal_min / MaximumScaleFactorBands; conceal_max = pRvlc->conceal_max % MaximumScaleFactorBands; conceal_group_max = pRvlc->conceal_max / MaximumScaleFactorBands; pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_max] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_max]; pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[pRvlc->conceal_min] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[pRvlc->conceal_min]; /* consider the smaller of the forward and backward decoded value as the correct one */ startBand = conceal_min; if (conceal_group_min == conceal_group_max) endBand = conceal_max; else endBand = pRvlc->maxSfbTransmitted-1; for (group=conceal_group_min; group <= conceal_group_max; group++) { for (band=startBand; band <= endBand; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; break; case INTENSITY_HCB: case INTENSITY_HCB2: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB) || (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB2) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); } break; case NOISE_HCB: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==NOISE_HCB) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); } break; default: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=ZERO_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=NOISE_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB2) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds], pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); } break; } } startBand = 0; if ((group+1) == conceal_group_max) endBand = conceal_max; } /* now copy all data to the output buffer which needs not to be concealed */ if (conceal_group_min == 0) endBand = conceal_min; else endBand = pRvlc->maxSfbTransmitted; for (group=0; group <= conceal_group_min; group++) { for (band=0; band < endBand; band++) { bnds = 16*group+band; pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; } if ((group+1) == conceal_group_min) endBand = conceal_min; } startBand = conceal_max+1; for (group=conceal_group_max; group < pRvlc->numWindowGroups; group++) { for (band=startBand; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; } startBand = 0; } } /*--------------------------------------------------------------------------------------------- function: StatisticalEstimation description: This approach by means of statistical estimation is generally performed when both the start value and the end value are different and no further errors have been detected. Considering the forward and backward decoded scalefactors, the set with the lower scalefactors in sum will be considered as the correct one. The scalefactors are differentially encoded. Normally it would reach to compare one pair of the forward and backward decoded scalefactors to specify the lower set. But having detected no further errors does not necessarily mean the absence of errors. Therefore all scalefactors decoded in forward and backward direction are summed up seperately. The set with the lower sum will be used. The strategy must be applied to scalefactors, intensity data and noise energy seperately. ----------------------------------------------------------------------------------------------- output: Concealed scalefactor, noise energy and intensity data ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ void StatisticalEstimation (CAacDecoderChannelInfo *pAacDecoderChannelInfo) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; int band,bnds,group; int sumIsFwd,sumIsBwd; /* sum of intensity data forward/backward */ int sumNrgFwd,sumNrgBwd; /* sum of noise energy data forward/backward */ int sumScfFwd,sumScfBwd; /* sum of scalefactor data forward/backward */ int useIsFwd,useNrgFwd,useScfFwd; /* the flags signals the elements which are used for the final result */ int MaximumScaleFactorBands; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) MaximumScaleFactorBands = 16; else MaximumScaleFactorBands = 64; sumIsFwd = sumIsBwd = sumNrgFwd = sumNrgBwd = sumScfFwd = sumScfBwd = 0; useIsFwd = useNrgFwd = useScfFwd = 0; /* calculate sum of each group (scf,nrg,is) of forward and backward direction */ for (group=0; groupnumWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: break; case INTENSITY_HCB: case INTENSITY_HCB2: sumIsFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; sumIsBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break; case NOISE_HCB: sumNrgFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; sumNrgBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break ; default: sumScfFwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; sumScfBwd += pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break; } } } /* find for each group (scf,nrg,is) the correct direction */ if ( sumIsFwd < sumIsBwd ) useIsFwd = 1; if ( sumNrgFwd < sumNrgBwd ) useNrgFwd = 1; if ( sumScfFwd < sumScfBwd ) useScfFwd = 1; /* conceal each group (scf,nrg,is) */ for (group=0; groupnumWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: break; case INTENSITY_HCB: case INTENSITY_HCB2: if (useIsFwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break; case NOISE_HCB: if (useNrgFwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break ; default: if (useScfFwd) pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds]; else pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]; break; } } } } /*--------------------------------------------------------------------------------------------- description: Approach by means of predictive interpolation This approach by means of predictive estimation is generally performed when the error cannot be isolated between 'conceal_min' and 'conceal_max', the 'sf_concealment' flag is set and the previous frame has the same block type as the current frame. Check for each scalefactorband if the same type of data (scalefactor, internsity data, noise energies) is transmitted. If so use the scalefactor (intensity data, noise energy) in the current frame. Otherwise set the scalefactor (intensity data, noise energy) for this scalefactorband to zero. ----------------------------------------------------------------------------------------------- output: Concealed scalefactor, noise energy and intensity data ----------------------------------------------------------------------------------------------- return: - -------------------------------------------------------------------------------------------- */ void PredictiveInterpolation ( CAacDecoderChannelInfo *pAacDecoderChannelInfo, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo ) { CErRvlcInfo *pRvlc = &pAacDecoderChannelInfo->pComData->overlay.aac.erRvlcInfo; int band,bnds,group; int MaximumScaleFactorBands; int commonMin; if (GetWindowSequence(&pAacDecoderChannelInfo->icsInfo) == EightShortSequence) MaximumScaleFactorBands = 16; else MaximumScaleFactorBands = 64; for (group=0; groupnumWindowGroups; group++) { for (band=0; band < pRvlc->maxSfbTransmitted; band++) { bnds = 16*group+band; switch (pAacDecoderChannelInfo->pDynData->aCodeBook[bnds]) { case ZERO_HCB: pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; break; case INTENSITY_HCB: case INTENSITY_HCB2: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB) || (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==INTENSITY_HCB2) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; } break; case NOISE_HCB: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]==NOISE_HCB) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = -110; } break; default: if ( (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=ZERO_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=NOISE_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB) && (pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousCodebook[bnds]!=INTENSITY_HCB2) ) { commonMin = FDKmin(pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfFwd[bnds],pAacDecoderChannelInfo->pComData->overlay.aac.aRvlcScfBwd[bnds]); pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = FDKmin(commonMin, pAacDecoderStaticChannelInfo->concealmentInfo.aRvlcPreviousScaleFactor[bnds]); } else { pAacDecoderChannelInfo->pDynData->aScaleFactor[bnds] = 0; } break; } } } } fdk-aac-0.1.3/libAACdec/src/channelinfo.cpp0000644000175000017500000002224612372261464020726 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: individual channel stream info ******************************************************************************/ #include "channelinfo.h" #include "aac_rom.h" #include "aac_ram.h" #include "FDK_bitstream.h" AAC_DECODER_ERROR IcsReadMaxSfb ( HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo, const SamplingRateInfo *pSamplingRateInfo ) { AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; int nbits; if (IsLongBlock(pIcsInfo)) { nbits = 6; pIcsInfo->TotalSfBands = pSamplingRateInfo->NumberOfScaleFactorBands_Long; } else { nbits = 4; pIcsInfo->TotalSfBands = pSamplingRateInfo->NumberOfScaleFactorBands_Short; } pIcsInfo->MaxSfBands = (UCHAR) FDKreadBits(bs, nbits); if (pIcsInfo->MaxSfBands > pIcsInfo->TotalSfBands){ ErrorStatus = AAC_DEC_PARSE_ERROR; } return ErrorStatus; } AAC_DECODER_ERROR IcsRead(HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo, const SamplingRateInfo* pSamplingRateInfo, const UINT flags) { AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; pIcsInfo->Valid = 0; if (flags & AC_ELD){ pIcsInfo->WindowSequence = OnlyLongSequence; pIcsInfo->WindowShape = 0; } else { if ( !(flags & (AC_USAC|AC_RSVD50)) ) { FDKreadBits(bs,1); } pIcsInfo->WindowSequence = (UCHAR) FDKreadBits(bs,2); pIcsInfo->WindowShape = (UCHAR) FDKreadBits(bs,1); if (flags & AC_LD) { if (pIcsInfo->WindowShape) { pIcsInfo->WindowShape = 2; /* select low overlap instead of KBD */ } } } /* Sanity check */ if ( (flags & (AC_ELD|AC_LD)) && pIcsInfo->WindowSequence != OnlyLongSequence) { pIcsInfo->WindowSequence = OnlyLongSequence; ErrorStatus = AAC_DEC_PARSE_ERROR; goto bail; } ErrorStatus = IcsReadMaxSfb(bs, pIcsInfo, pSamplingRateInfo); if (ErrorStatus != AAC_DEC_OK) { goto bail; } if (IsLongBlock(pIcsInfo)) { if ( !(flags & (AC_ELD|AC_SCALABLE|AC_BSAC|AC_USAC|AC_RSVD50)) ) /* If not ELD nor Scalable nor BSAC nor USAC syntax then ... */ { if ((UCHAR)FDKreadBits(bs,1) != 0 ) /* UCHAR PredictorDataPresent */ { ErrorStatus = AAC_DEC_UNSUPPORTED_PREDICTION; goto bail; } } pIcsInfo->WindowGroups = 1; pIcsInfo->WindowGroupLength[0] = 1; } else { INT i; UINT mask; pIcsInfo->ScaleFactorGrouping = (UCHAR) FDKreadBits(bs,7); pIcsInfo->WindowGroups = 0 ; for (i=0; i < (8-1); i++) { mask = 1 << (6 - i); pIcsInfo->WindowGroupLength[i] = 1; if (pIcsInfo->ScaleFactorGrouping & mask) { pIcsInfo->WindowGroupLength[pIcsInfo->WindowGroups]++; } else { pIcsInfo->WindowGroups++; } } /* loop runs to i < 7 only */ pIcsInfo->WindowGroupLength[8-1] = 1; pIcsInfo->WindowGroups++; } bail: if (ErrorStatus == AAC_DEC_OK) pIcsInfo->Valid = 1; return ErrorStatus; } /* interleave codebooks the following way 9 (84w) | 1 (51w) 10 (82w) | 2 (39w) SCL (65w) | 4 (38w) 3 (39w) | 5 (41w) | 6 (40w) | 7 (31w) | 8 (31w) (270w) (271w) */ /* Table entries are sorted as following: | num_swb_long_window | sfbands_long | num_swb_short_window | sfbands_short | */ AAC_DECODER_ERROR getSamplingRateInfo( SamplingRateInfo *t, UINT samplesPerFrame, UINT samplingRateIndex, UINT samplingRate ) { int index = 0; t->samplingRateIndex = samplingRateIndex; t->samplingRate = samplingRate; switch (samplesPerFrame) { case 1024: index = 0; break; case 960: index = 1; break; case 512: index = 3; break; case 480: index = 4; break; default: return AAC_DEC_UNSUPPORTED_FORMAT; } t->ScaleFactorBands_Long = sfbOffsetTables[index][samplingRateIndex].sfbOffsetLong; t->ScaleFactorBands_Short = sfbOffsetTables[index][samplingRateIndex].sfbOffsetShort; t->NumberOfScaleFactorBands_Long = sfbOffsetTables[index][samplingRateIndex].numberOfSfbLong; t->NumberOfScaleFactorBands_Short = sfbOffsetTables[index][samplingRateIndex].numberOfSfbShort; if (t->ScaleFactorBands_Long == NULL || t->NumberOfScaleFactorBands_Long == 0) { return AAC_DEC_UNSUPPORTED_FORMAT; } FDK_ASSERT(t->ScaleFactorBands_Long[t->NumberOfScaleFactorBands_Long] == samplesPerFrame); FDK_ASSERT(t->ScaleFactorBands_Short == NULL || t->ScaleFactorBands_Short[t->NumberOfScaleFactorBands_Short]*8 == samplesPerFrame); return AAC_DEC_OK; } fdk-aac-0.1.3/libAACdec/src/aacdecoder.cpp0000644000175000017500000016054612372261464020522 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ /*! \page default General Overview of the AAC Decoder Implementation The main entry point to decode a AAC frame is CAacDecoder_DecodeFrame(). It handles the different transport multiplexes and bitstream formats supported by this implementation. It extracts the AAC_raw_data_blocks from these bitstreams to further process then in the actual decoding stages. Note: Click on a function of file in the above image to see details about the function. Also note, that this is just an overview of the most important functions and not a complete call graph.

1 Bitstream deformatter

The basic bit stream parser function CChannelElement_Read() is called. It uses other subcalls in order to parse and unpack the bitstreams. Note, that this includes huffmann decoding of the coded spectral data. This operation can be computational significant specifically at higher bitrates. Optimization is likely in CBlock_ReadSpectralData(). The bitstream deformatter also includes many bitfield operations. Profiling on the target will determine required optimizations.

2 Actual decoding to retain the time domain output

The basic bitstream deformatter function CChannelElement_Decode() for CPE elements and SCE elements are called. Except for the stereo processing (2.1) which is only used for CPE elements, the function calls for CPE or SCE are similar, except that CPE always processes to independent channels while SCE only processes one channel. Often there is the distinction between long blocks and short blocks. However, computational expensive functions that ususally require optimization are being shared by these two groups,

2.1 Stereo processing for CPE elements

CChannelPairElement_Decode() first calles the joint stereo tools in stereo.cpp when required.

2.2 Scaling of spectral data

CBlock_ScaleSpectralData().

2.3 Apply additional coding tools

ApplyTools() calles the PNS tools in case of MPEG-4 bitstreams, and TNS filtering CTns_Apply() for MPEG-2 and MPEG-4 bitstreams. The function TnsFilterIIR() which is called by CTns_Apply() (2.3.1) might require some optimization.

3 Frequency-To-Time conversion

The filterbank is called using CBlock_FrequencyToTime() using the MDCT module from the FDK Tools */ #include "aacdecoder.h" #include "aac_rom.h" #include "aac_ram.h" #include "channel.h" #include "FDK_audio.h" #include "FDK_tools_rom.h" #include "aacdec_pns.h" #include "sbrdecoder.h" #include "aacdec_hcr.h" #include "rvlc.h" #include "tpdec_lib.h" #include "conceal.h" #define CAN_DO_PS(aot) \ ((aot) == AOT_AAC_LC \ || (aot) == AOT_SBR \ || (aot) == AOT_PS \ || (aot) == AOT_ER_BSAC \ || (aot) == AOT_DRM_AAC) #define IS_USAC(aot) \ ((aot) == AOT_USAC \ || (aot) == AOT_RSVD50) #define IS_LOWDELAY(aot) \ ((aot) == AOT_ER_AAC_LD \ || (aot) == AOT_ER_AAC_ELD) void CAacDecoder_SyncQmfMode(HANDLE_AACDECODER self) { /* Assign user requested mode */ self->qmfModeCurr = self->qmfModeUser; if ( self->qmfModeCurr == NOT_DEFINED ) { if ( (IS_LOWDELAY(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) || ( (self->streamInfo.aacNumChannels == 1) && ( (CAN_DO_PS(self->streamInfo.aot) && !(self->flags & AC_MPS_PRESENT)) || ( IS_USAC(self->streamInfo.aot) && (self->flags & AC_MPS_PRESENT)) ) ) ) { self->qmfModeCurr = MODE_HQ; } else { self->qmfModeCurr = MODE_LP; } } /* Set SBR to current QMF mode. Error does not matter. */ sbrDecoder_SetParam(self->hSbrDecoder, SBR_QMF_MODE, (self->qmfModeCurr == MODE_LP)); self->psPossible = ((CAN_DO_PS(self->streamInfo.aot) && self->streamInfo.aacNumChannels == 1 && ! (self->flags & AC_MPS_PRESENT))) && self->qmfModeCurr == MODE_HQ ; FDK_ASSERT( ! ( (self->flags & AC_MPS_PRESENT) && self->psPossible ) ); } void CAacDecoder_SignalInterruption(HANDLE_AACDECODER self) { } /*! \brief Reset ancillary data struct. Call before parsing a new frame. \ancData Pointer to ancillary data structure \return Error code */ static AAC_DECODER_ERROR CAacDecoder_AncDataReset(CAncData *ancData) { int i; for (i=0; i<8; i++) { ancData->offset[i] = 0; } ancData->nrElements = 0; return AAC_DEC_OK; } /*! \brief Initialize ancillary buffer \ancData Pointer to ancillary data structure \buffer Pointer to (external) anc data buffer \size Size of the buffer pointed on by buffer in bytes \return Error code */ AAC_DECODER_ERROR CAacDecoder_AncDataInit(CAncData *ancData, unsigned char *buffer, int size) { if (size >= 0) { ancData->buffer = buffer; ancData->bufferSize = size; CAacDecoder_AncDataReset(ancData); return AAC_DEC_OK; } return AAC_DEC_ANC_DATA_ERROR; } /*! \brief Get one ancillary data element \ancData Pointer to ancillary data structure \index Index of the anc data element to get \ptr Pointer to a buffer receiving a pointer to the requested anc data element \size Pointer to a buffer receiving the length of the requested anc data element in bytes \return Error code */ AAC_DECODER_ERROR CAacDecoder_AncDataGet(CAncData *ancData, int index, unsigned char **ptr, int *size) { AAC_DECODER_ERROR error = AAC_DEC_OK; *ptr = NULL; *size = 0; if (index >= 0 && index < 8 && index < ancData->nrElements) { *ptr = &ancData->buffer[ancData->offset[index]]; *size = ancData->offset[index+1] - ancData->offset[index]; } return error; } /*! \brief Parse ancillary data \ancData Pointer to ancillary data structure \hBs Handle to FDK bitstream \ancBytes Length of ancillary data to read from the bitstream \return Error code */ static AAC_DECODER_ERROR CAacDecoder_AncDataParse ( CAncData *ancData, HANDLE_FDK_BITSTREAM hBs, const int ancBytes ) { AAC_DECODER_ERROR error = AAC_DEC_OK; int readBytes = 0; if (ancData->buffer != NULL) { if (ancBytes > 0) { /* write ancillary data to external buffer */ int offset = ancData->offset[ancData->nrElements]; if ((offset + ancBytes) > ancData->bufferSize) { error = AAC_DEC_TOO_SMALL_ANC_BUFFER; } else if (ancData->nrElements >= 8-1) { error = AAC_DEC_TOO_MANY_ANC_ELEMENTS; } else { int i; for (i = 0; i < ancBytes; i++) { ancData->buffer[i+offset] = FDKreadBits(hBs, 8); readBytes++; } ancData->nrElements++; ancData->offset[ancData->nrElements] = ancBytes + ancData->offset[ancData->nrElements-1]; } } } readBytes = ancBytes - readBytes; if (readBytes > 0) { /* skip data */ FDKpushFor(hBs, readBytes<<3); } return error; } /*! \brief Read Stream Data Element \bs Bitstream Handle \return Error code */ static AAC_DECODER_ERROR CDataStreamElement_Read ( HANDLE_FDK_BITSTREAM bs, CAncData *ancData, HANDLE_AAC_DRC hDrcInfo, HANDLE_TRANSPORTDEC pTp, UCHAR *elementInstanceTag, UINT alignmentAnchor ) { AAC_DECODER_ERROR error = AAC_DEC_OK; UINT dataStart; int dataByteAlignFlag, count; int crcReg = transportDec_CrcStartReg(pTp, 0); /* Element Instance Tag */ *elementInstanceTag = FDKreadBits(bs,4); /* Data Byte Align Flag */ dataByteAlignFlag = FDKreadBits(bs,1); count = FDKreadBits(bs,8); if (count == 255) { count += FDKreadBits(bs,8); /* EscCount */ } if (dataByteAlignFlag) { FDKbyteAlign(bs, alignmentAnchor); } dataStart = FDKgetValidBits(bs); error = CAacDecoder_AncDataParse(ancData, bs, count); transportDec_CrcEndReg(pTp, crcReg); { INT readBits, dataBits = count<<3; /* Move to the beginning of the data junk */ FDKpushBack(bs, dataStart-FDKgetValidBits(bs)); /* Read Anc data if available */ readBits = aacDecoder_drcMarkPayload( hDrcInfo, bs, DVB_DRC_ANC_DATA ); if (readBits != dataBits) { /* Move to the end again. */ FDKpushBiDirectional(bs, FDKgetValidBits(bs)-dataStart+dataBits); } } return error; } #ifdef TP_PCE_ENABLE /*! \brief Read Program Config Element \bs Bitstream Handle \pTp Transport decoder handle for CRC handling \pce Pointer to PCE buffer \channelConfig Current channel configuration \alignAnchor Anchor for byte alignment \return PCE status (-1: fail, 0: no new PCE, 1: PCE updated, 2: PCE updated need re-config). */ static int CProgramConfigElement_Read ( HANDLE_FDK_BITSTREAM bs, HANDLE_TRANSPORTDEC pTp, CProgramConfig *pce, const UINT channelConfig, const UINT alignAnchor ) { int pceStatus = 0; int crcReg; /* read PCE to temporal buffer first */ C_ALLOC_SCRATCH_START(tmpPce, CProgramConfig, 1); CProgramConfig_Init(tmpPce); CProgramConfig_Reset(tmpPce); crcReg = transportDec_CrcStartReg(pTp, 0); CProgramConfig_Read(tmpPce, bs, alignAnchor); transportDec_CrcEndReg(pTp, crcReg); if ( CProgramConfig_IsValid(tmpPce) && (tmpPce->Profile == 1) ) { if ( !pce->isValid && (channelConfig > 0) ) { /* Create a standard channel config PCE to compare with */ CProgramConfig_GetDefault( pce, channelConfig ); } if (pce->isValid) { /* Compare the new and the old PCE (tags ignored) */ switch ( CProgramConfig_Compare( pce, tmpPce ) ) { case 1: /* Channel configuration not changed. Just new metadata. */ FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ pceStatus = 1; /* New PCE but no change of config */ break; case 2: /* The number of channels are identical but not the config */ if (channelConfig == 0) { FDKmemcpy(pce, tmpPce, sizeof(CProgramConfig)); /* Store the complete PCE */ pceStatus = 2; /* Decoder needs re-configuration */ } break; case -1: /* The channel configuration is completely different */ pceStatus = -1; /* Not supported! */ break; case 0: /* Nothing to do because PCE matches the old one exactly. */ default: /* pceStatus = 0; */ break; } } } C_ALLOC_SCRATCH_END(tmpPce, CProgramConfig, 1); return pceStatus; } #endif /* TP_PCE_ENABLE */ /*! \brief Parse Extension Payload \self Handle of AAC decoder \count Pointer to bit counter. \previous_element ID of previous element (required by some extension payloads) \return Error code */ static AAC_DECODER_ERROR CAacDecoder_ExtPayloadParse (HANDLE_AACDECODER self, HANDLE_FDK_BITSTREAM hBs, int *count, MP4_ELEMENT_ID previous_element, int elIndex, int fIsFillElement) { AAC_DECODER_ERROR error = AAC_DEC_OK; EXT_PAYLOAD_TYPE extension_type; int bytes = (*count) >> 3; int crcFlag = 0; if (*count < 4) { return AAC_DEC_PARSE_ERROR; } else if ((INT)FDKgetValidBits(hBs) < *count) { return AAC_DEC_DECODE_FRAME_ERROR; } extension_type = (EXT_PAYLOAD_TYPE) FDKreadBits(hBs, 4); /* bs_extension_type */ *count -= 4; switch (extension_type) { case EXT_DYNAMIC_RANGE: { INT readBits = aacDecoder_drcMarkPayload( self->hDrcInfo, hBs, MPEG_DRC_EXT_DATA ); if (readBits > *count) { /* Read too much. Something went wrong! */ error = AAC_DEC_PARSE_ERROR; } *count -= readBits; } break; case EXT_SBR_DATA_CRC: crcFlag = 1; case EXT_SBR_DATA: if (IS_CHANNEL_ELEMENT(previous_element)) { SBR_ERROR sbrError; CAacDecoder_SyncQmfMode(self); sbrError = sbrDecoder_InitElement( self->hSbrDecoder, self->streamInfo.aacSampleRate, self->streamInfo.extSamplingRate, self->streamInfo.aacSamplesPerFrame, self->streamInfo.aot, previous_element, elIndex ); if (sbrError == SBRDEC_OK) { sbrError = sbrDecoder_Parse ( self->hSbrDecoder, hBs, count, *count, crcFlag, previous_element, elIndex, self->flags & AC_INDEP ); /* Enable SBR for implicit SBR signalling. */ if (sbrError == SBRDEC_OK) { self->sbrEnabled = 1; } } else { /* Do not try to apply SBR because initializing the element failed. */ self->sbrEnabled = 0; } /* Citation from ISO/IEC 14496-3 chapter 4.5.2.1.5.2 Fill elements containing an extension_payload() with an extension_type of EXT_SBR_DATA or EXT_SBR_DATA_CRC shall not contain any other extension_payload of any other extension_type. */ if (fIsFillElement) { FDKpushBiDirectional(hBs, *count); *count = 0; } else { /* If this is not a fill element with a known length, we are screwed an no further parsing makes sense. */ if (sbrError != SBRDEC_OK) { self->frameOK = 0; } } } else { error = AAC_DEC_PARSE_ERROR; } break; case EXT_FILL_DATA: { int temp; temp = FDKreadBits(hBs,4); bytes--; if (temp != 0) { error = AAC_DEC_PARSE_ERROR; break; } while (bytes > 0) { temp = FDKreadBits(hBs,8); bytes--; if (temp != 0xa5) { error = AAC_DEC_PARSE_ERROR; break; } } *count = bytes<<3; } break; case EXT_DATA_ELEMENT: { int dataElementVersion; dataElementVersion = FDKreadBits(hBs,4); *count -= 4; if (dataElementVersion == 0) /* ANC_DATA */ { int temp, dataElementLength = 0; do { temp = FDKreadBits(hBs,8); *count -= 8; dataElementLength += temp; } while (temp == 255 ); CAacDecoder_AncDataParse(&self->ancData, hBs, dataElementLength); *count -= (dataElementLength<<3); } else { /* align = 0 */ error = AAC_DEC_PARSE_ERROR; goto bail; } } break; case EXT_DATA_LENGTH: if ( !fIsFillElement /* Makes no sens to have an additional length in a fill ... */ && (self->flags & AC_ER) ) /* ... element because this extension payload type was ... */ { /* ... created to circumvent the missing length in ER-Syntax. */ int bitCnt, len = FDKreadBits(hBs, 4); *count -= 4; if (len == 15) { int add_len = FDKreadBits(hBs, 8); *count -= 8; len += add_len; if (add_len == 255) { len += FDKreadBits(hBs, 16); *count -= 16; } } len <<= 3; bitCnt = len; if ( (EXT_PAYLOAD_TYPE)FDKreadBits(hBs, 4) == EXT_DATA_LENGTH ) { /* Check NOTE 2: The extension_payload() included here must not have extension_type == EXT_DATA_LENGTH. */ error = AAC_DEC_PARSE_ERROR; } else { /* rewind and call myself again. */ FDKpushBack(hBs, 4); error = CAacDecoder_ExtPayloadParse ( self, hBs, &bitCnt, previous_element, elIndex, 0 ); *count -= len - bitCnt; } /* Note: the fall through in case the if statement above is not taken is intentional. */ break; } case EXT_FIL: default: /* align = 4 */ FDKpushFor(hBs, *count); *count = 0; break; } bail: if ( (error != AAC_DEC_OK) && fIsFillElement ) { /* Skip the remaining extension bytes */ FDKpushBiDirectional(hBs, *count); *count = 0; /* Patch error code because decoding can go on. */ error = AAC_DEC_OK; /* Be sure that parsing errors have been stored. */ } return error; } /* Stream Configuration and Information. This class holds configuration and information data for a stream to be decoded. It provides the calling application as well as the decoder with substantial information, e.g. profile, sampling rate, number of channels found in the bitstream etc. */ static void CStreamInfoInit(CStreamInfo *pStreamInfo) { pStreamInfo->aacSampleRate = 0; pStreamInfo->profile = -1; pStreamInfo->aot = AOT_NONE; pStreamInfo->channelConfig = -1; pStreamInfo->bitRate = 0; pStreamInfo->aacSamplesPerFrame = 0; pStreamInfo->extAot = AOT_NONE; pStreamInfo->extSamplingRate = 0; pStreamInfo->flags = 0; pStreamInfo->epConfig = -1; /* default is no ER */ pStreamInfo->numChannels = 0; pStreamInfo->sampleRate = 0; pStreamInfo->frameSize = 0; } /*! \brief Initialization of AacDecoderChannelInfo The function initializes the pointers to AacDecoderChannelInfo for each channel, set the start values for window shape and window sequence of overlap&add to zero, set the overlap buffer to zero and initializes the pointers to the window coefficients. \param bsFormat is the format of the AAC bitstream \return AACDECODER instance */ LINKSPEC_CPP HANDLE_AACDECODER CAacDecoder_Open(TRANSPORT_TYPE bsFormat) /*!< bitstream format (adif,adts,loas,...). */ { HANDLE_AACDECODER self; self = GetAacDecoder(); if (self == NULL) { goto bail; } /* Assign channel mapping info arrays (doing so removes dependency of settings header in API header). */ self->streamInfo.pChannelIndices = self->channelIndices; self->streamInfo.pChannelType = self->channelType; /* set default output mode */ self->outputInterleaved = 1; /* interleaved */ /* initialize anc data */ CAacDecoder_AncDataInit(&self->ancData, NULL, 0); /* initialize stream info */ CStreamInfoInit(&self->streamInfo); /* initialize error concealment common data */ CConcealment_InitCommonData(&self->concealCommonData); self->hDrcInfo = GetDrcInfo(); if (self->hDrcInfo == NULL) { goto bail; } /* Init common DRC structure */ aacDecoder_drcInit( self->hDrcInfo ); /* Set default frame delay */ aacDecoder_drcSetParam ( self->hDrcInfo, DRC_BS_DELAY, CConcealment_GetDelay(&self->concealCommonData) ); self->aacCommonData.workBufferCore1 = GetWorkBufferCore1(); self->aacCommonData.workBufferCore2 = GetWorkBufferCore2(); if (self->aacCommonData.workBufferCore1 == NULL ||self->aacCommonData.workBufferCore2 == NULL ) goto bail; return self; bail: CAacDecoder_Close( self ); return NULL; } /* Destroy aac decoder */ LINKSPEC_CPP void CAacDecoder_Close(HANDLE_AACDECODER self) { int ch; if (self == NULL) return; for (ch=0; ch<(6); ch++) { if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer != NULL) { FreeOverlapBuffer (&self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer); } if (self->pAacDecoderStaticChannelInfo[ch] != NULL) { FreeAacDecoderStaticChannelInfo (&self->pAacDecoderStaticChannelInfo[ch]); } } if (self->pAacDecoderChannelInfo[ch] != NULL) { FreeAacDecoderChannelInfo (&self->pAacDecoderChannelInfo[ch]); } } self->aacChannels = 0; if (self->hDrcInfo) { FreeDrcInfo(&self->hDrcInfo); } if (self->aacCommonData.workBufferCore1 != NULL) { FreeWorkBufferCore1 (&self->aacCommonData.workBufferCore1); } if (self->aacCommonData.workBufferCore2 != NULL) { FreeWorkBufferCore2 (&self->aacCommonData.workBufferCore2); } FreeAacDecoder ( &self); } /*! \brief Initialization of decoder instance The function initializes the decoder. \return error status: 0 for success, <>0 for unsupported configurations */ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_Init(HANDLE_AACDECODER self, const CSAudioSpecificConfig *asc) { AAC_DECODER_ERROR err = AAC_DEC_OK; INT ascChannels, ch, ascChanged = 0; if (!self) return AAC_DEC_INVALID_HANDLE; // set profile and check for supported aot // leave profile on default (=-1) for all other supported MPEG-4 aot's except aot=2 (=AAC-LC) switch (asc->m_aot) { case AOT_AAC_LC: self->streamInfo.profile = 1; break; case AOT_SBR: case AOT_PS: case AOT_ER_AAC_LD: case AOT_ER_AAC_ELD: break; default: return AAC_DEC_UNSUPPORTED_AOT; } CProgramConfig_Init(&self->pce); /* set channels */ switch (asc->m_channelConfiguration) { case 0: #ifdef TP_PCE_ENABLE /* get channels from program config (ASC) */ if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { ascChannels = asc->m_progrConfigElement.NumChannels; if (ascChannels > 0) { int el; /* valid number of channels -> copy program config element (PCE) from ASC */ FDKmemcpy(&self->pce, &asc->m_progrConfigElement, sizeof(CProgramConfig)); /* Built element table */ el = CProgramConfig_GetElementTable(&asc->m_progrConfigElement, self->elements, 7); for (; el<7; el++) { self->elements[el] = ID_NONE; } } else { return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; } } else { if (transportDec_GetFormat(self->hInput) == TT_MP4_ADTS) { /* set default max_channels for memory allocation because in implicit channel mapping mode we don't know the actual number of channels until we processed at least one raw_data_block(). */ ascChannels = (6); } else { return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; } } #else /* TP_PCE_ENABLE */ return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; #endif /* TP_PCE_ENABLE */ break; case 1: case 2: case 3: case 4: case 5: case 6: ascChannels = asc->m_channelConfiguration; break; case 7: ascChannels = 8; break; default: return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; } /* Initialize constant mappings for channel config 1-7 */ if (asc->m_channelConfiguration > 0) { int el; FDKmemcpy(self->elements, elementsTab[asc->m_channelConfiguration-1], sizeof(MP4_ELEMENT_ID)*FDKmin(7,7)); for (el=7; el<7; el++) { self->elements[el] = ID_NONE; } for (ch=0; chchMapping[ch] = ch; } for (; ch<(6); ch++) { self->chMapping[ch] = 255; } } #ifdef TP_PCE_ENABLE else { if (CProgramConfig_IsValid(&asc->m_progrConfigElement)) { /* Set matrix mixdown infos if available from PCE. */ pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, asc->m_progrConfigElement.MatrixMixdownIndexPresent, asc->m_progrConfigElement.MatrixMixdownIndex, asc->m_progrConfigElement.PseudoSurroundEnable ); } } #endif self->streamInfo.channelConfig = asc->m_channelConfiguration; if (ascChannels > (6)) { return AAC_DEC_UNSUPPORTED_CHANNELCONFIG; } if (self->streamInfo.aot != asc->m_aot) { self->streamInfo.aot = asc->m_aot; ascChanged = 1; } if (self->streamInfo.aacSamplesPerFrame != (INT)asc->m_samplesPerFrame) { self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame; ascChanged = 1; } self->streamInfo.bitRate = 0; /* Set syntax flags */ self->flags = 0; self->streamInfo.extAot = asc->m_extensionAudioObjectType; self->streamInfo.extSamplingRate = asc->m_extensionSamplingFrequency; self->flags |= (asc->m_sbrPresentFlag) ? AC_SBR_PRESENT : 0; self->flags |= (asc->m_psPresentFlag) ? AC_PS_PRESENT : 0; self->sbrEnabled = 0; /* --------- vcb11 ------------ */ self->flags |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0; /* ---------- rvlc ------------ */ self->flags |= (asc->m_rvlcFlag) ? AC_ER_RVLC : 0; /* ----------- hcr ------------ */ self->flags |= (asc->m_hcrFlag) ? AC_ER_HCR : 0; if (asc->m_aot == AOT_ER_AAC_ELD) { self->flags |= AC_ELD; self->flags |= (asc->m_sc.m_eldSpecificConfig.m_sbrCrcFlag) ? AC_SBRCRC : 0; self->flags |= (asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign) ? AC_LD_MPS : 0; } self->flags |= (asc->m_aot == AOT_ER_AAC_LD) ? AC_LD : 0; self->flags |= (asc->m_epConfig >= 0) ? AC_ER : 0; if (asc->m_sbrPresentFlag) { self->sbrEnabled = 1; self->sbrEnabledPrev = 1; } if (asc->m_psPresentFlag) { self->flags |= AC_PS_PRESENT; } if ( (asc->m_epConfig >= 0) && (asc->m_channelConfiguration <= 0) ) { /* we have to know the number of channels otherwise no decoding is possible */ return AAC_DEC_UNSUPPORTED_ER_FORMAT; } self->streamInfo.epConfig = asc->m_epConfig; /* self->hInput->asc.m_epConfig = asc->m_epConfig; */ if (asc->m_epConfig > 1) return AAC_DEC_UNSUPPORTED_ER_FORMAT; /* Check if samplerate changed. */ if (self->streamInfo.aacSampleRate != (INT)asc->m_samplingFrequency) { AAC_DECODER_ERROR error; ascChanged = 1; /* Update samplerate info. */ error = getSamplingRateInfo(&self->samplingRateInfo, asc->m_samplesPerFrame, asc->m_samplingFrequencyIndex, asc->m_samplingFrequency); if (error != AAC_DEC_OK) { return error; } self->streamInfo.aacSampleRate = self->samplingRateInfo.samplingRate; } /* Check if amount of channels has changed. */ if (self->ascChannels != ascChannels) { ascChanged = 1; /* Allocate all memory structures for each channel */ { for (ch = 0; ch < ascChannels; ch++) { CAacDecoderDynamicData *aacDecoderDynamicData = &self->aacCommonData.workBufferCore1->pAacDecoderDynamicData[ch%2]; /* initialize pointer to CAacDecoderChannelInfo */ if (self->pAacDecoderChannelInfo[ch] == NULL) { self->pAacDecoderChannelInfo[ch] = GetAacDecoderChannelInfo(ch); /* This is temporary until the DynamicData is split into two or more regions! The memory could be reused after completed core decoding. */ if (self->pAacDecoderChannelInfo[ch] == NULL) { goto bail; } /* Hook shared work memory into channel data structure */ self->pAacDecoderChannelInfo[ch]->pDynData = aacDecoderDynamicData; self->pAacDecoderChannelInfo[ch]->pComData = &self->aacCommonData; } /* Allocate persistent channel memory */ if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { self->pAacDecoderStaticChannelInfo[ch] = GetAacDecoderStaticChannelInfo(ch); if (self->pAacDecoderStaticChannelInfo[ch] == NULL) { goto bail; } self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer = GetOverlapBuffer(ch); /* This area size depends on the AOT */ if (self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer == NULL) { goto bail; } self->pAacDecoderChannelInfo[ch]->pSpectralCoefficient = (SPECTRAL_PTR) &self->aacCommonData.workBufferCore2[ch*1024]; } CPns_InitPns(&self->pAacDecoderChannelInfo[ch]->data.aac.PnsData, &self->aacCommonData.pnsInterChannelData, &self->aacCommonData.pnsCurrentSeed, self->aacCommonData.pnsRandomSeed); } if (ascChannels > self->aacChannels) { /* Make allocated channel count persistent in decoder context. */ self->aacChannels = ascChannels; } HcrInitRom(&self->aacCommonData.overlay.aac.erHcrInfo); setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, ID_SCE); } /* Make amount of signalled channels persistent in decoder context. */ self->ascChannels = ascChannels; } /* Update structures */ if (ascChanged) { /* Things to be done for each channel, which do not involve allocating memory. Doing these things only on the channels needed for the current configuration (ascChannels) could lead to memory access violation later (error concealment). */ for (ch = 0; ch < self->aacChannels; ch++) { switch (self->streamInfo.aot) { case AOT_ER_AAC_ELD: case AOT_ER_AAC_LD: self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame; break; default: self->pAacDecoderChannelInfo[ch]->granuleLength = self->streamInfo.aacSamplesPerFrame / 8; break; } mdct_init( &self->pAacDecoderStaticChannelInfo[ch]->IMdct, self->pAacDecoderStaticChannelInfo[ch]->pOverlapBuffer, OverlapBufferSize ); /* Reset DRC control data for this channel */ aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[ch]->drcData ); /* Reset concealment only if ASC changed. Otherwise it will be done with any config callback. E.g. every time the LATM SMC is present. */ CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, &self->concealCommonData, self->streamInfo.aacSamplesPerFrame ); } } /* Update externally visible copy of flags */ self->streamInfo.flags = self->flags; return err; bail: aacDecoder_Close( self ); return AAC_DEC_OUT_OF_MEMORY; } LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( HANDLE_AACDECODER self, const UINT flags, INT_PCM *pTimeData, const INT timeDataSize, const INT interleaved ) { AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; CProgramConfig *pce; HANDLE_FDK_BITSTREAM bs = transportDec_GetBitstream(self->hInput, 0); MP4_ELEMENT_ID type = ID_NONE; /* Current element type */ INT aacChannels=0; /* Channel counter for channels found in the bitstream */ INT auStartAnchor = (INT)FDKgetValidBits(bs); /* AU start bit buffer position for AU byte alignment */ self->frameOK = 1; /* Any supported base layer valid AU will require more than 16 bits. */ if ( (transportDec_GetAuBitsRemaining(self->hInput, 0) < 15) && (flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) == 0) { self->frameOK = 0; ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; } /* Reset Program Config structure */ pce = &self->pce; CProgramConfig_Reset(pce); CAacDecoder_AncDataReset(&self->ancData); { int ch; if (self->streamInfo.channelConfig == 0) { /* Init Channel/Element mapping table */ for (ch=0; ch<(6); ch++) { self->chMapping[ch] = 255; } if (!CProgramConfig_IsValid(pce)) { int el; for (el=0; el<7; el++) { self->elements[el] = ID_NONE; } } } } /* Check sampling frequency */ switch ( self->streamInfo.aacSampleRate ) { case 16000: case 12000: case 11025: case 8000: case 7350: case 48000: case 44100: case 32000: case 24000: case 22050: break; default: if ( ! (self->flags & (AC_USAC|AC_RSVD50)) ) { return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; } break; } if ( flags & AACDEC_CLRHIST ) { int ch; /* Clear history */ for (ch = 0; ch < self->aacChannels; ch++) { /* Reset concealment */ CConcealment_InitChannelData(&self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo, &self->concealCommonData, self->streamInfo.aacSamplesPerFrame ); /* Clear concealment buffers to get rid of the complete history */ FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.spectralCoefficient, 1024 * sizeof(FIXP_CNCL)); FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->concealmentInfo.specScale, 8 * sizeof(SHORT)); /* Clear overlap-add buffers to avoid clicks. */ FDKmemclear(self->pAacDecoderStaticChannelInfo[ch]->IMdct.overlap.freq, OverlapBufferSize*sizeof(FIXP_DBL)); } } #ifdef TP_PCE_ENABLE int pceRead = 0; /* Flag indicating a PCE in the current raw_data_block() */ #endif INT hdaacDecoded = 0; MP4_ELEMENT_ID previous_element = ID_END; /* Last element ID (required for extension payload mapping */ UCHAR previous_element_index = 0; /* Canonical index of last element */ int element_count = 0; /* Element counter for elements found in the bitstream */ int el_cnt[ID_LAST] = { 0 }; /* element counter ( robustness ) */ while ( (type != ID_END) && (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH))) && self->frameOK ) { int el_channels; if (! (self->flags & (AC_USAC|AC_RSVD50|AC_ELD|AC_SCALABLE|AC_ER))) type = (MP4_ELEMENT_ID) FDKreadBits(bs,3); else type = self->elements[element_count]; setHcrType(&self->aacCommonData.overlay.aac.erHcrInfo, type); if ((INT)FDKgetValidBits(bs) < 0) self->frameOK = 0; switch (type) { case ID_SCE: case ID_CPE: case ID_LFE: /* Consistency check */ if (type == ID_CPE) { el_channels = 2; } else { el_channels = 1; } if ( (el_cnt[type] >= (self->ascChannels>>(el_channels-1))) || (aacChannels > (self->ascChannels-el_channels)) ) { ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; self->frameOK = 0; break; } if ( !(self->flags & (AC_USAC|AC_RSVD50)) ) { int ch; for (ch=0; ch < el_channels; ch+=1) { CPns_ResetData(&self->pAacDecoderChannelInfo[aacChannels+ch]->data.aac.PnsData, &self->pAacDecoderChannelInfo[aacChannels+ch]->pComData->pnsInterChannelData); } } if(self->frameOK) { ErrorStatus = CChannelElement_Read( bs, &self->pAacDecoderChannelInfo[aacChannels], &self->pAacDecoderStaticChannelInfo[aacChannels], self->streamInfo.aot, &self->samplingRateInfo, self->flags, self->streamInfo.aacSamplesPerFrame, el_channels, self->streamInfo.epConfig, self->hInput ); if (ErrorStatus) { self->frameOK = 0; } } if ( self->frameOK) { /* Lookup the element and decode it only if it belongs to the current program */ if ( CProgramConfig_LookupElement( pce, self->streamInfo.channelConfig, self->pAacDecoderChannelInfo[aacChannels]->ElementInstanceTag, aacChannels, self->chMapping, self->channelType, self->channelIndices, &previous_element_index, self->elements, type) ) { if ( !hdaacDecoded ) { CChannelElement_Decode( &self->pAacDecoderChannelInfo[aacChannels], &self->pAacDecoderStaticChannelInfo[aacChannels], &self->samplingRateInfo, self->flags, el_channels ); } aacChannels += 1; if (type == ID_CPE) { aacChannels += 1; } } else { self->frameOK = 0; } /* Create SBR element for SBR for upsampling for LFE elements, and if SBR was explicitly signaled, because the first frame(s) may not contain SBR payload (broken encoder, bit errors). */ if ( (self->flags & AC_SBR_PRESENT) || (self->sbrEnabled == 1) ) { SBR_ERROR sbrError; sbrError = sbrDecoder_InitElement( self->hSbrDecoder, self->streamInfo.aacSampleRate, self->streamInfo.extSamplingRate, self->streamInfo.aacSamplesPerFrame, self->streamInfo.aot, type, previous_element_index ); if (sbrError != SBRDEC_OK) { /* Do not try to apply SBR because initializing the element failed. */ self->sbrEnabled = 0; } } } el_cnt[type]++; break; case ID_CCE: /* Consistency check */ if ( el_cnt[type] > self->ascChannels ) { ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; self->frameOK = 0; break; } if (self->frameOK) { /* memory for spectral lines temporal on scratch */ C_ALLOC_SCRATCH_START(mdctSpec, FIXP_DBL, 1024); /* create dummy channel for CCE parsing on stack */ CAacDecoderChannelInfo tmpAacDecoderChannelInfo, *pTmpAacDecoderChannelInfo; FDKmemclear(mdctSpec, 1024*sizeof(FIXP_DBL)); tmpAacDecoderChannelInfo.pDynData = self->aacCommonData.workBufferCore1->pAacDecoderDynamicData; tmpAacDecoderChannelInfo.pComData = &self->aacCommonData; tmpAacDecoderChannelInfo.pSpectralCoefficient = (SPECTRAL_PTR)mdctSpec; /* Assume AAC-LC */ tmpAacDecoderChannelInfo.granuleLength = self->streamInfo.aacSamplesPerFrame / 8; /* Reset PNS data. */ CPns_ResetData(&tmpAacDecoderChannelInfo.data.aac.PnsData, &tmpAacDecoderChannelInfo.pComData->pnsInterChannelData); pTmpAacDecoderChannelInfo = &tmpAacDecoderChannelInfo; /* do CCE parsing */ ErrorStatus = CChannelElement_Read( bs, &pTmpAacDecoderChannelInfo, NULL, self->streamInfo.aot, &self->samplingRateInfo, self->flags, self->streamInfo.aacSamplesPerFrame, 1, self->streamInfo.epConfig, self->hInput ); C_ALLOC_SCRATCH_END(mdctSpec, FIXP_DBL, 1024); if (ErrorStatus) { self->frameOK = 0; } if (self->frameOK) { /* Lookup the element and decode it only if it belongs to the current program */ if (CProgramConfig_LookupElement( pce, self->streamInfo.channelConfig, pTmpAacDecoderChannelInfo->ElementInstanceTag, 0, self->chMapping, self->channelType, self->channelIndices, &previous_element_index, self->elements, type) ) { /* decoding of CCE not supported */ } else { self->frameOK = 0; } } } el_cnt[type]++; break; case ID_DSE: { UCHAR element_instance_tag; CDataStreamElement_Read( bs, &self->ancData, self->hDrcInfo, self->hInput, &element_instance_tag, auStartAnchor ); if (!CProgramConfig_LookupElement( pce, self->streamInfo.channelConfig, element_instance_tag, 0, self->chMapping, self->channelType, self->channelIndices, &previous_element_index, self->elements, type) ) { /* most likely an error in bitstream occured */ //self->frameOK = 0; } } { UCHAR *pDvbAncData = NULL; AAC_DECODER_ERROR ancErr; int ancIndex; int dvbAncDataSize = 0; /* Ask how many anc data elements are in buffer */ ancIndex = self->ancData.nrElements - 1; /* Get the last one (if available) */ ancErr = CAacDecoder_AncDataGet( &self->ancData, ancIndex, &pDvbAncData, &dvbAncDataSize ); if (ancErr == AAC_DEC_OK) { pcmDmx_ReadDvbAncData ( self->hPcmUtils, pDvbAncData, dvbAncDataSize, 0 /* not mpeg2 */ ); } } break; #ifdef TP_PCE_ENABLE case ID_PCE: { int result = CProgramConfigElement_Read( bs, self->hInput, pce, self->streamInfo.channelConfig, auStartAnchor ); if ( result < 0 ) { /* Something went wrong */ ErrorStatus = AAC_DEC_PARSE_ERROR; self->frameOK = 0; } else if ( result > 1 ) { /* Built element table */ int elIdx = CProgramConfig_GetElementTable(pce, self->elements, 7); /* Reset the remaining tabs */ for ( ; elIdx<7; elIdx++) { self->elements[elIdx] = ID_NONE; } /* Make new number of channel persistant */ self->ascChannels = pce->NumChannels; /* If PCE is not first element conceal this frame to avoid inconsistencies */ if ( element_count != 0 ) { self->frameOK = 0; } } pceRead = (result>=0) ? 1 : 0; } break; #endif /* TP_PCE_ENABLE */ case ID_FIL: { int bitCnt = FDKreadBits(bs,4); /* bs_count */ if (bitCnt == 15) { int esc_count = FDKreadBits(bs,8); /* bs_esc_count */ bitCnt = esc_count + 14; } /* Convert to bits */ bitCnt <<= 3; while (bitCnt > 0) { ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 1); if (ErrorStatus != AAC_DEC_OK) { self->frameOK = 0; break; } } } break; case ID_EXT: { INT bitCnt = 0; /* get the remaining bits of this frame */ bitCnt = transportDec_GetAuBitsRemaining(self->hInput, 0); if ( (bitCnt > 0) && (self->flags & AC_SBR_PRESENT) && (self->flags & (AC_USAC|AC_RSVD50|AC_ELD)) ) { SBR_ERROR err = SBRDEC_OK; int elIdx, numChElements = el_cnt[ID_SCE] + el_cnt[ID_CPE]; for (elIdx = 0; elIdx < numChElements; elIdx += 1) { err = sbrDecoder_Parse ( self->hSbrDecoder, bs, &bitCnt, -1, self->flags & AC_SBRCRC, self->elements[elIdx], elIdx, self->flags & AC_INDEP ); if (err != SBRDEC_OK) { break; } } if (err == SBRDEC_OK) { self->sbrEnabled = 1; } else { self->frameOK = 0; } } if ( ! (self->flags & (AC_USAC|AC_RSVD50|AC_DRM)) ) { while ( bitCnt > 7 ) { ErrorStatus = CAacDecoder_ExtPayloadParse(self, bs, &bitCnt, previous_element, previous_element_index, 0); if (ErrorStatus != AAC_DEC_OK) { self->frameOK = 0; ErrorStatus = AAC_DEC_PARSE_ERROR; break; } } } } break; case ID_END: break; default: ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; self->frameOK = 0; break; } previous_element = type; element_count++; } /* while ( (type != ID_END) ... ) */ if ( !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) { /* Byte alignment with respect to the first bit of the raw_data_block(). */ { FDKbyteAlign(bs, auStartAnchor); } /* Check if all bits of the raw_data_block() have been read. */ if ( transportDec_GetAuBitsTotal(self->hInput, 0) > 0 ) { INT unreadBits = transportDec_GetAuBitsRemaining(self->hInput, 0); if ( unreadBits != 0 ) { self->frameOK = 0; /* Do not overwrite current error */ if (ErrorStatus == AAC_DEC_OK && self->frameOK == 0) { ErrorStatus = AAC_DEC_PARSE_ERROR; } /* Always put the bitbuffer at the right position after the current Access Unit. */ FDKpushBiDirectional(bs, unreadBits); } } /* Check the last element. The terminator (ID_END) has to be the last one (even if ER syntax is used). */ if ( self->frameOK && type != ID_END ) { /* Do not overwrite current error */ if (ErrorStatus == AAC_DEC_OK) { ErrorStatus = AAC_DEC_PARSE_ERROR; } self->frameOK = 0; } } /* More AAC channels than specified by the ASC not allowed. */ if ( (aacChannels == 0 || aacChannels > self->aacChannels) && !(flags & (AACDEC_CONCEAL|AACDEC_FLUSH)) ) { { /* Do not overwrite current error */ if (ErrorStatus == AAC_DEC_OK) { ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; } self->frameOK = 0; } aacChannels = 0; } else if ( aacChannels > self->ascChannels ) { /* Do not overwrite current error */ if (ErrorStatus == AAC_DEC_OK) { ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT; } self->frameOK = 0; aacChannels = 0; } if ( TRANSPORTDEC_OK != transportDec_CrcCheck(self->hInput) ) { self->frameOK=0; } /* store or restore the number of channels */ if ( self->frameOK && !(flags &(AACDEC_CONCEAL|AACDEC_FLUSH)) ) { self->concealChannels = aacChannels; /* store */ self->sbrEnabledPrev = self->sbrEnabled; } else { if (self->aacChannels > 0) { aacChannels = self->concealChannels; /* restore */ self->sbrEnabled = self->sbrEnabledPrev; } } /* Update number of output channels */ self->streamInfo.aacNumChannels = aacChannels; #ifdef TP_PCE_ENABLE if (pceRead == 1 && CProgramConfig_IsValid(pce)) { /* Set matrix mixdown infos if available from PCE. */ pcmDmx_SetMatrixMixdownFromPce ( self->hPcmUtils, pce->MatrixMixdownIndexPresent, pce->MatrixMixdownIndex, pce->PseudoSurroundEnable ); } #endif /* If there is no valid data to transfrom into time domain, return. */ if ( ! IS_OUTPUT_VALID(ErrorStatus) ) { return ErrorStatus; } /* Inverse transform */ { int stride, offset, c; /* Extract DRC control data and map it to channels (without bitstream delay) */ aacDecoder_drcProlog ( self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo, self->pce.ElementInstanceTag, self->chMapping, aacChannels ); /* "c" iterates in canonical MPEG channel order */ for (c=0; c < aacChannels; c++) { CAacDecoderChannelInfo *pAacDecoderChannelInfo; /* Select correct pAacDecoderChannelInfo for current channel */ if (self->chMapping[c] >= aacChannels) { pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[c]; } else { pAacDecoderChannelInfo = self->pAacDecoderChannelInfo[self->chMapping[c]]; } /* Setup offset and stride for time buffer traversal. */ if (interleaved) { stride = aacChannels; offset = self->channelOutputMapping[aacChannels-1][c]; } else { stride = 1; offset = self->channelOutputMapping[aacChannels-1][c] * self->streamInfo.aacSamplesPerFrame; } /* Conceal defective spectral data */ CConcealment_Apply(&self->pAacDecoderStaticChannelInfo[c]->concealmentInfo, pAacDecoderChannelInfo, self->pAacDecoderStaticChannelInfo[c], &self->samplingRateInfo, self->streamInfo.aacSamplesPerFrame, 0, (self->frameOK && !(flags&AACDEC_CONCEAL)), self->flags ); if (flags & (AACDEC_INTR|AACDEC_CLRHIST)) { /* Reset DRC control data for this channel */ aacDecoder_drcInitChannelData ( &self->pAacDecoderStaticChannelInfo[c]->drcData ); } /* DRC processing */ aacDecoder_drcApply ( self->hDrcInfo, self->hSbrDecoder, pAacDecoderChannelInfo, &self->pAacDecoderStaticChannelInfo[c]->drcData, c, self->streamInfo.aacSamplesPerFrame, self->sbrEnabled ); switch (pAacDecoderChannelInfo->renderMode) { case AACDEC_RENDER_IMDCT: CBlock_FrequencyToTime( self->pAacDecoderStaticChannelInfo[c], pAacDecoderChannelInfo, pTimeData + offset, self->streamInfo.aacSamplesPerFrame, stride, (self->frameOK && !(flags&AACDEC_CONCEAL)), self->aacCommonData.workBufferCore1->mdctOutTemp ); break; case AACDEC_RENDER_ELDFB: CBlock_FrequencyToTimeLowDelay( self->pAacDecoderStaticChannelInfo[c], pAacDecoderChannelInfo, pTimeData + offset, self->streamInfo.aacSamplesPerFrame, stride ); break; default: ErrorStatus = AAC_DEC_UNKNOWN; break; } if ( flags&AACDEC_FLUSH ) { FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame); FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); } } /* Extract DRC control data and map it to channels (with bitstream delay) */ aacDecoder_drcEpilog ( self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo, self->pce.ElementInstanceTag, self->chMapping, aacChannels ); } /* Reorder channel type information tables. */ { AUDIO_CHANNEL_TYPE types[(6)]; UCHAR idx[(6)]; int c; FDK_ASSERT(sizeof(self->channelType) == sizeof(types)); FDK_ASSERT(sizeof(self->channelIndices) == sizeof(idx)); FDKmemcpy(types, self->channelType, sizeof(types)); FDKmemcpy(idx, self->channelIndices, sizeof(idx)); for (c=0; cchannelType[self->channelOutputMapping[aacChannels-1][c]] = types[c]; self->channelIndices[self->channelOutputMapping[aacChannels-1][c]] = idx[c]; } } self->blockNumber++; return ErrorStatus; } /*! \brief returns the streaminfo pointer The function hands back a pointer to the streaminfo structure \return pointer to the struct */ LINKSPEC_CPP CStreamInfo* CAacDecoder_GetStreamInfo ( HANDLE_AACDECODER self ) { if (!self) { return NULL; } return &self->streamInfo; } fdk-aac-0.1.3/libAACdec/src/debug.h0000644000175000017500000001153612372261464017175 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: debug output ******************************************************************************/ #ifndef DEBUG_H #define DEBUG_H #include "machine_type.h" #endif fdk-aac-0.1.3/libAACdec/src/stereo.cpp0000644000175000017500000002743312372261464017746 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: joint stereo processing ******************************************************************************/ #include "stereo.h" #include "aac_rom.h" #include "FDK_bitstream.h" #include "channelinfo.h" enum { L = 0, R = 1 }; int CJointStereo_Read( HANDLE_FDK_BITSTREAM bs, CJointStereoData *pJointStereoData, const int windowGroups, const int scaleFactorBandsTransmitted, const UINT flags ) { int group,band; pJointStereoData->MsMaskPresent = (UCHAR) FDKreadBits(bs,2); FDKmemclear(pJointStereoData->MsUsed, scaleFactorBandsTransmitted*sizeof(UCHAR)); switch (pJointStereoData->MsMaskPresent) { case 0 : /* no M/S */ /* all flags are already cleared */ break ; case 1 : /* read ms_used */ for (group=0; groupMsUsed[band] |= (FDKreadBits(bs,1) << group); } } break ; case 2 : /* full spectrum M/S */ for (band=0; bandMsUsed[band] = 255 ; /* set all flags to 1 */ } break ; } return 0; } void CJointStereo_ApplyMS( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, const int windowGroups, const int scaleFactorBandsTransmittedL, const int scaleFactorBandsTransmittedR ) { CJointStereoData *pJointStereoData = &pAacDecoderChannelInfo[L]->pComData->jointStereoData; int window, group, scaleFactorBandsTransmitted; FDK_ASSERT(scaleFactorBandsTransmittedL == scaleFactorBandsTransmittedR); scaleFactorBandsTransmitted = scaleFactorBandsTransmittedL; for (window = 0, group = 0; group < windowGroups; group++) { UCHAR groupMask = 1 << group; for (int groupwin=0; groupwinpDynData->aSfbScale[window*16]; SHORT *rightScale = &pAacDecoderChannelInfo[R]->pDynData->aSfbScale[window*16]; leftSpectrum = SPEC(pAacDecoderChannelInfo[L]->pSpectralCoefficient, window, pAacDecoderChannelInfo[L]->granuleLength); rightSpectrum = SPEC(pAacDecoderChannelInfo[R]->pSpectralCoefficient, window, pAacDecoderChannelInfo[R]->granuleLength); for (band=0; bandMsUsed[band] & groupMask) { int lScale=leftScale[band]; int rScale=rightScale[band]; int commonScale=lScale > rScale ? lScale:rScale; /* ISO/IEC 14496-3 Chapter 4.6.8.1.1 : M/S joint channel coding can only be used if common_window is ‘1’. */ FDK_ASSERT(GetWindowSequence(&pAacDecoderChannelInfo[L]->icsInfo) == GetWindowSequence(&pAacDecoderChannelInfo[R]->icsInfo)); FDK_ASSERT(GetWindowShape(&pAacDecoderChannelInfo[L]->icsInfo) == GetWindowShape(&pAacDecoderChannelInfo[R]->icsInfo)); commonScale++; leftScale[band]=commonScale; rightScale[band]=commonScale; lScale = fMin(DFRACT_BITS-1, commonScale - lScale); rScale = fMin(DFRACT_BITS-1, commonScale - rScale); FDK_ASSERT(lScale >= 0 && rScale >= 0); for (int index=pScaleFactorBandOffsets[band]; index>= lScale ; rightCoefficient >>= rScale ; leftSpectrum [index] = leftCoefficient + rightCoefficient ; rightSpectrum [index] = leftCoefficient - rightCoefficient ; } } } } } /* Reset MsUsed flags if no explicit signalling was transmitted. Necessary for intensity coding. PNS correlation signalling was mapped before calling CJointStereo_ApplyMS(). */ if (pJointStereoData->MsMaskPresent == 2) { FDKmemclear(pJointStereoData->MsUsed, JointStereoMaximumBands * sizeof(UCHAR)); } } void CJointStereo_ApplyIS( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], const SHORT *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, const int windowGroups, const int scaleFactorBandsTransmitted, const UINT CommonWindow ) { CJointStereoData *pJointStereoData = &pAacDecoderChannelInfo[L]->pComData->jointStereoData; for (int window=0,group=0; grouppDynData->aCodeBook[group*16]; ScaleFactor = &pAacDecoderChannelInfo[R]->pDynData->aScaleFactor[group*16]; for (int groupwin=0; groupwinpDynData->aSfbScale[window*16]; SHORT *rightScale = &pAacDecoderChannelInfo[R]->pDynData->aSfbScale[window*16]; int band; leftSpectrum = SPEC(pAacDecoderChannelInfo[L]->pSpectralCoefficient, window, pAacDecoderChannelInfo[L]->granuleLength); rightSpectrum = SPEC(pAacDecoderChannelInfo[R]->pSpectralCoefficient, window, pAacDecoderChannelInfo[R]->granuleLength); for (band=0; band> 2 ; int lsb = bandScale & 0x03 ; /* exponent of MantissaTable[lsb][0] is 1, thus msb+1 below. */ FIXP_DBL scale = MantissaTable[lsb][0]; /* ISO/IEC 14496-3 Chapter 4.6.8.2.3 : The use of intensity stereo coding is signaled by the use of the pseudo codebooks INTENSITY_HCB and INTENSITY_HCB2 (15 and 14) only in the right channel of a channel_pair_element() having a common ics_info() (common_window == 1). */ FDK_ASSERT(GetWindowSequence(&pAacDecoderChannelInfo[L]->icsInfo) == GetWindowSequence(&pAacDecoderChannelInfo[R]->icsInfo)); FDK_ASSERT(GetWindowShape(&pAacDecoderChannelInfo[L]->icsInfo) == GetWindowShape(&pAacDecoderChannelInfo[R]->icsInfo)); rightScale[band] = leftScale[band]+msb+1; if (CommonWindow && (pJointStereoData->MsUsed[band] & groupMask)) { if (CodeBook[band] == INTENSITY_HCB) /* _NOT_ in-phase */ { scale = -scale ; } } else { if (CodeBook[band] == INTENSITY_HCB2) /* out-of-phase */ { scale = -scale ; } } for (int index=pScaleFactorBandOffsets[band]; index> 19) ; UINT tableIndex = (x & 0x0FFF) >> 4 ; FIXP_DBL invQVal ; x = x & 0x0F; UINT r0=(LONG)InverseQuantTable [tableIndex+0]; UINT r1=(LONG)InverseQuantTable [tableIndex+1]; USHORT nx=16-x; UINT temp=(r0)*nx+(r1)*x; invQVal = (FIXP_DBL)temp; FDK_ASSERT(lsb < 4); *pValue = fMultDiv2 (invQVal, MantissaTable [lsb][exponent]) ; /* + 1 compensates fMultDiv2(). */ return ExponentTable [lsb][exponent] + 1; } /** * \brief determine the required shift scale for the given quantized value and scale (factor % 4) value. */ FDK_INLINE int GetScaleFromValue (FIXP_DBL value, unsigned int lsb) { if (value!=(FIXP_DBL)0) { int scale = EvaluatePower43 (&value, lsb) ; return CntLeadingZeros (value) - scale - 2 ; } else return 0; /* Return zero, because its useless to scale a zero value, saves workload and avoids scaling overshifts. */ } //#ifdef AACDEC_HUFFMANDECODER_ENABLE /*! \brief Read huffman codeword The function reads the huffman codeword from the bitstream and returns the index value. \return index value */ inline int CBlock_DecodeHuffmanWord( HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */ const CodeBookDescription *hcb ) /*!< pointer to codebook description */ { UINT val; UINT index = 0; const USHORT (*CodeBook) [HuffmanEntries] = hcb->CodeBook; while (1) { val = CodeBook[index][FDKreadBits(bs,HuffmanBits)]; /* Expensive memory access */ if ((val & 1) == 0) { index = val>>2; continue; } else { if (val & 2) { FDKpushBackCache(bs,1); } val >>= 2; break; } } return val; } //#endif /* AACDEC_HUFFMANDECODER_ENABLE */ #endif /* #ifndef BLOCK_H */ fdk-aac-0.1.3/libAACdec/src/conceal_types.h0000644000175000017500000001462712372261464020743 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Error concealment structs and types ******************************************************************************/ #ifndef CONCEAL_TYPES_H #define CONCEAL_TYPES_H #include "machine_type.h" #include "common_fix.h" #include "rvlc_info.h" #define CONCEAL_MAX_NUM_FADE_FACTORS ( 16 ) #define FIXP_CNCL FIXP_DBL #define FL2FXCONST_CNCL FL2FXCONST_DBL #define FX_DBL2FX_CNCL #define FX_CNCL2FX_DBL #define CNCL_FRACT_BITS DFRACT_BITS /* Warning: Do not ever change these values. */ typedef enum { ConcealMethodNone = -1, ConcealMethodMute = 0, ConcealMethodNoise = 1, ConcealMethodInter = 2, ConcealMethodTonal = 3 } CConcealmentMethod; typedef enum { ConcealState_Ok, ConcealState_Single, ConcealState_FadeIn, ConcealState_Mute, ConcealState_FadeOut } CConcealmentState; typedef struct { FIXP_SGL fadeOutFactor[CONCEAL_MAX_NUM_FADE_FACTORS]; FIXP_SGL fadeInFactor [CONCEAL_MAX_NUM_FADE_FACTORS]; CConcealmentMethod method; int numFadeOutFrames; int numFadeInFrames; int numMuteReleaseFrames; int comfortNoiseLevel; } CConcealParams; typedef struct { CConcealParams *pConcealParams; FIXP_CNCL spectralCoefficient[1024]; SHORT specScale[8]; INT iRandomPhase; INT prevFrameOk[2]; INT cntFadeFrames; INT cntValidFrames; SHORT aRvlcPreviousScaleFactor[RVLC_MAX_SFB]; /* needed once per channel */ UCHAR aRvlcPreviousCodebook[RVLC_MAX_SFB]; /* needed once per channel */ SCHAR rvlcPreviousScaleFactorOK; SCHAR rvlcPreviousBlockType; SCHAR lastRenderMode; UCHAR windowShape; UCHAR windowSequence; UCHAR lastWinGrpLen; CConcealmentState concealState; } CConcealmentInfo; #endif /* #ifndef CONCEAL_TYPES_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcr.h0000644000175000017500000001363212372261464020142 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Interface function declaration; common defines and structures; defines for switching error-generator, -detector, and -concealment *******************************************************************************/ #ifndef _AACDEC_HCR_H_ #define _AACDEC_HCR_H_ #include "channelinfo.h" #include "FDK_bitstream.h" void HcrInitRom (H_HCR_INFO hHcr); UINT HcrInit(H_HCR_INFO pHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, HANDLE_FDK_BITSTREAM bs); UINT HcrDecoder (H_HCR_INFO hHcr, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, HANDLE_FDK_BITSTREAM bs); void CarryBitToBranchValue( UCHAR carryBit, UINT treeNode, UINT *branchValue, UINT *branchNode ); void CHcr_Read (HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo); void HcrMuteErroneousLines(H_HCR_INFO hHcr); void setHcrType(H_HCR_INFO hHcr, MP4_ELEMENT_ID type); INT getHcrType(H_HCR_INFO hHcr); #endif /* _AACDEC_HCR_H_ */ fdk-aac-0.1.3/libAACdec/src/channel.cpp0000644000175000017500000004021512372261464020046 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: ******************************************************************************/ #include "channel.h" #include "aacdecoder.h" #include "block.h" #include "aacdec_tns.h" #include "FDK_bitstream.h" #include "FDK_tools_rom.h" #include "conceal.h" #include "rvlc.h" #include "aacdec_hcr.h" static void MapMidSideMaskToPnsCorrelation (CAacDecoderChannelInfo *pAacDecoderChannelInfo[2]) { int group; for (group = 0 ; group < pAacDecoderChannelInfo[L]->icsInfo.WindowGroups; group++) { UCHAR groupMask = 1 << group; for (UCHAR band = 0 ; band < pAacDecoderChannelInfo[L]->icsInfo.MaxSfBands; band++) { if (pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] & groupMask) { /* channels are correlated */ CPns_SetCorrelation(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group, band, 0); if (CPns_IsPnsUsed(&pAacDecoderChannelInfo[L]->data.aac.PnsData, group, band) && CPns_IsPnsUsed(&pAacDecoderChannelInfo[R]->data.aac.PnsData, group, band)) pAacDecoderChannelInfo[L]->pComData->jointStereoData.MsUsed[band] ^= groupMask; /* clear the groupMask-bit */ } } } } /*! \brief Decode channel pair element The function decodes a channel pair element. \return none */ void CChannelElement_Decode( CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], /*!< pointer to aac decoder channel info */ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[2], SamplingRateInfo *pSamplingRateInfo, UINT flags, int el_channels) { int ch, maybe_jstereo = 0; maybe_jstereo = (el_channels > 1); for (ch = 0; ch < el_channels; ch++) { if ( pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_IMDCT || pAacDecoderChannelInfo[ch]->renderMode == AACDEC_RENDER_ELDFB ) { CBlock_InverseQuantizeSpectralData(pAacDecoderChannelInfo[ch], pSamplingRateInfo); } } if (maybe_jstereo) { /* apply ms */ if (pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow) { int maxSfBandsL = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo); int maxSfBandsR = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[R]->icsInfo); if (pAacDecoderChannelInfo[L]->data.aac.PnsData.PnsActive || pAacDecoderChannelInfo[R]->data.aac.PnsData.PnsActive) { MapMidSideMaskToPnsCorrelation(pAacDecoderChannelInfo); } CJointStereo_ApplyMS(pAacDecoderChannelInfo, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), maxSfBandsL, maxSfBandsR); } /* apply intensity stereo */ /* modifies pAacDecoderChannelInfo[]->aSpecSfb */ CJointStereo_ApplyIS(pAacDecoderChannelInfo, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo[L]->icsInfo, pSamplingRateInfo), GetWindowGroupLengthTable(&pAacDecoderChannelInfo[L]->icsInfo), GetWindowGroups(&pAacDecoderChannelInfo[L]->icsInfo), GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo[L]->icsInfo), pAacDecoderChannelInfo[L]->pDynData->RawDataInfo.CommonWindow ? 1 : 0); } for (ch = 0; ch < el_channels; ch++) { { /* write pAacDecoderChannelInfo[ch]->specScale */ CBlock_ScaleSpectralData(pAacDecoderChannelInfo[ch], pSamplingRateInfo); ApplyTools (pAacDecoderChannelInfo, pSamplingRateInfo, flags, ch); } } CRvlc_ElementCheck( pAacDecoderChannelInfo, pAacDecoderStaticChannelInfo, flags, el_channels ); } void CChannel_CodebookTableInit(CAacDecoderChannelInfo *pAacDecoderChannelInfo) { int b, w, maxBands, maxWindows; int maxSfb = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; if ( IsLongBlock(&pAacDecoderChannelInfo->icsInfo) ) { maxBands = 64; maxWindows = 1; } else { maxBands = 16; maxWindows = 8; } for (w = 0; wpDynData->TnsData); if (numberOfChannels == 2) { CTns_Reset(&pAacDecoderChannelInfo[1]->pDynData->TnsData); } if (flags & (AC_ELD|AC_SCALABLE)) { pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow = 1; if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow; } if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow; } } /* Iterate through sequence table */ i = 0; ch = 0; decision_bit = 0; do { switch (list->id[i]) { case element_instance_tag: pAacDecoderChannelInfo[0]->ElementInstanceTag = FDKreadBits(hBs, 4); if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->ElementInstanceTag = pAacDecoderChannelInfo[0]->ElementInstanceTag; } break; case common_window: decision_bit = pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.CommonWindow = FDKreadBits(hBs, 1); if (numberOfChannels == 2) { pAacDecoderChannelInfo[1]->pDynData->RawDataInfo.CommonWindow = pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow; } break; case ics_info: /* Read individual channel info */ error = IcsRead( hBs, &pAacDecoderChannelInfo[ch]->icsInfo, pSamplingRateInfo, flags ); if (numberOfChannels == 2 && pAacDecoderChannelInfo[0]->pDynData->RawDataInfo.CommonWindow) { pAacDecoderChannelInfo[1]->icsInfo = pAacDecoderChannelInfo[0]->icsInfo; } break; case ltp_data_present: if (FDKreadBits(hBs, 1) != 0) { error = AAC_DEC_UNSUPPORTED_PREDICTION; } break; case ms: if ( CJointStereo_Read( hBs, &pAacDecoderChannelInfo[0]->pComData->jointStereoData, GetWindowGroups(&pAacDecoderChannelInfo[0]->icsInfo), GetScaleMaxFactorBandsTransmitted(&pAacDecoderChannelInfo[0]->icsInfo, &pAacDecoderChannelInfo[1]->icsInfo), flags) ) { error = AAC_DEC_PARSE_ERROR; } break; case global_gain: pAacDecoderChannelInfo[ch]->pDynData->RawDataInfo.GlobalGain = (UCHAR) FDKreadBits(hBs,8); break; case section_data: error = CBlock_ReadSectionData( hBs, pAacDecoderChannelInfo[ch], pSamplingRateInfo, flags ); break; case scale_factor_data: if (flags & AC_ER_RVLC) { /* read RVLC data from bitstream (error sens. cat. 1) */ CRvlc_Read(pAacDecoderChannelInfo[ch], hBs); } else { error = CBlock_ReadScaleFactorData(pAacDecoderChannelInfo[ch], hBs, flags); } break; case pulse: if ( CPulseData_Read( hBs, &pAacDecoderChannelInfo[ch]->pDynData->specificTo.aac.PulseData, pSamplingRateInfo->ScaleFactorBands_Long, /* pulse data is only allowed to be present in long blocks! */ (void*)&pAacDecoderChannelInfo[ch]->icsInfo, frame_length ) != 0 ) { error = AAC_DEC_DECODE_FRAME_ERROR; } break; case tns_data_present: CTns_ReadDataPresentFlag(hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData); break; case tns_data: /* tns_data_present is checked inside CTns_Read(). */ error = CTns_Read(hBs, &pAacDecoderChannelInfo[ch]->pDynData->TnsData, &pAacDecoderChannelInfo[ch]->icsInfo, flags); break; case gain_control_data: break; case gain_control_data_present: if (FDKreadBits(hBs, 1)) { error = AAC_DEC_UNSUPPORTED_GAIN_CONTROL_DATA; } break; case esc2_rvlc: if (flags & AC_ER_RVLC) { CRvlc_Decode( pAacDecoderChannelInfo[ch], pAacDecoderStaticChannelInfo[ch], hBs ); } break; case esc1_hcr: if (flags & AC_ER_HCR) { CHcr_Read(hBs, pAacDecoderChannelInfo[ch] ); } break; case spectral_data: error = CBlock_ReadSpectralData( hBs, pAacDecoderChannelInfo[ch], pSamplingRateInfo, flags ); if (flags & AC_ELD) { pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_ELDFB; } else { pAacDecoderChannelInfo[ch]->renderMode = AACDEC_RENDER_IMDCT; } break; /* CRC handling */ case adtscrc_start_reg1: if (pTpDec != NULL) { crcReg1 = transportDec_CrcStartReg(pTpDec, 192); } break; case adtscrc_start_reg2: if (pTpDec != NULL) { crcReg2 = transportDec_CrcStartReg(pTpDec, 128); } break; case adtscrc_end_reg1: case drmcrc_end_reg: if (pTpDec != NULL) { transportDec_CrcEndReg(pTpDec, crcReg1); } break; case adtscrc_end_reg2: if (pTpDec != NULL) { transportDec_CrcEndReg(pTpDec, crcReg2); } break; case drmcrc_start_reg: if (pTpDec != NULL) { crcReg1 = transportDec_CrcStartReg(pTpDec, 0); } break; /* Non data cases */ case next_channel: ch = (ch + 1) % numberOfChannels; break; case link_sequence: list = list->next[decision_bit]; i=-1; break; default: error = AAC_DEC_UNSUPPORTED_FORMAT; break; } if (error != AAC_DEC_OK) { goto bail; } i++; } while (list->id[i] != end_of_sequence); bail: return error; } fdk-aac-0.1.3/libAACdec/src/block.cpp0000644000175000017500000006431312372261464017535 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: long/short-block decoding ******************************************************************************/ #include "block.h" #include "aac_rom.h" #include "FDK_bitstream.h" #include "FDK_tools_rom.h" #include "aacdec_hcr.h" #include "rvlc.h" #if defined(__arm__) #include "arm/block_arm.cpp" #endif /*! \brief Read escape sequence of codeword The function reads the escape sequence from the bitstream, if the absolute value of the quantized coefficient has the value 16. \return quantized coefficient */ LONG CBlock_GetEscape(HANDLE_FDK_BITSTREAM bs, /*!< pointer to bitstream */ const LONG q) /*!< quantized coefficient */ { LONG i, off, neg ; if (q < 0) { if (q != -16) return q; neg = 1; } else { if (q != +16) return q; neg = 0; } for (i=4; ; i++) { if (FDKreadBits(bs,1) == 0) break; } if (i > 16) { if (i - 16 > CACHE_BITS) { /* cannot read more than "CACHE_BITS" bits at once in the function FDKreadBits() */ return (MAX_QUANTIZED_VALUE + 1); /* returning invalid value that will be captured later */ } off = FDKreadBits(bs,i-16) << 16; off |= FDKreadBits(bs,16); } else { off = FDKreadBits(bs,i); } i = off + (1 << i); if (neg) i = -i; return i; } AAC_DECODER_ERROR CBlock_ReadScaleFactorData( CAacDecoderChannelInfo *pAacDecoderChannelInfo, HANDLE_FDK_BITSTREAM bs, UINT flags ) { int temp; int band; int group; int position = 0; /* accu for intensity delta coding */ int factor = pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain; /* accu for scale factor delta coding */ UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; SHORT *pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; const CodeBookDescription *hcb =&AACcodeBookDescriptionTable[BOOKSCL]; int ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (band=0; band < ScaleFactorBandsTransmitted; band++) { switch (pCodeBook[group*16+band]) { case ZERO_HCB: /* zero book */ pScaleFactor[group*16+band] = 0; break; default: /* decode scale factor */ { temp = CBlock_DecodeHuffmanWord(bs,hcb); factor += temp - 60; /* MIDFAC 1.5 dB */ } pScaleFactor[group*16+band] = factor - 100; break; case INTENSITY_HCB: /* intensity steering */ case INTENSITY_HCB2: temp = CBlock_DecodeHuffmanWord(bs,hcb); position += temp - 60; pScaleFactor[group*16+band] = position - 100; break; case NOISE_HCB: /* PNS */ if (flags & (AC_MPS_RES|AC_USAC|AC_RSVD50)) { return AAC_DEC_PARSE_ERROR; } CPns_Read( &pAacDecoderChannelInfo->data.aac.PnsData, bs, hcb, pAacDecoderChannelInfo->pDynData->aScaleFactor, pAacDecoderChannelInfo->pDynData->RawDataInfo.GlobalGain, band, group); break; } } } return AAC_DEC_OK; } void CBlock_ScaleSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo, SamplingRateInfo *pSamplingRateInfo) { int band; int window; const SHORT * RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale; SHORT * RESTRICT pSpecScale = pAacDecoderChannelInfo->specScale; int groupwin,group; const SHORT * RESTRICT BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); SPECTRAL_PTR RESTRICT pSpectralCoefficient = pAacDecoderChannelInfo->pSpectralCoefficient; FDKmemclear(pSpecScale, 8*sizeof(SHORT)); int max_band = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (window=0, group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (groupwin=0; groupwin < GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); groupwin++, window++) { int SpecScale_window = pSpecScale[window]; FIXP_DBL *pSpectrum = SPEC(pSpectralCoefficient, window, pAacDecoderChannelInfo->granuleLength); /* find scaling for current window */ for (band=0; band < max_band; band++) { SpecScale_window = fMax(SpecScale_window, (int)pSfbScale[window*16+band]); } if (pAacDecoderChannelInfo->pDynData->TnsData.Active) { SpecScale_window += TNS_SCALE; } /* store scaling of current window */ pSpecScale[window] = SpecScale_window; #ifdef FUNCTION_CBlock_ScaleSpectralData_func1 CBlock_ScaleSpectralData_func1(pSpectrum, max_band, BandOffsets, SpecScale_window, pSfbScale, window); #else /* FUNCTION_CBlock_ScaleSpectralData_func1 */ for (band=0; band < max_band; band++) { int scale = SpecScale_window - pSfbScale[window*16+band]; if (scale) { /* following relation can be used for optimizations: (BandOffsets[i]%4) == 0 for all i */ int max_index = BandOffsets[band+1]; for (int index = BandOffsets[band]; index < max_index; index++) { pSpectrum[index] >>= scale; } } } #endif /* FUNCTION_CBlock_ScaleSpectralData_func1 */ } } } AAC_DECODER_ERROR CBlock_ReadSectionData(HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const UINT flags) { int top, band; int sect_len, sect_len_incr; int group; UCHAR sect_cb; UCHAR *pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; /* HCR input (long) */ SHORT *pNumLinesInSec = pAacDecoderChannelInfo->pDynData->specificTo.aac.aNumLineInSec4Hcr; int numLinesInSecIdx = 0; UCHAR *pHcrCodeBook = pAacDecoderChannelInfo->pDynData->specificTo.aac.aCodeBooks4Hcr; const SHORT *BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection = 0; AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; FDKmemclear(pCodeBook, sizeof(UCHAR)*(8*16)); const int nbits = (IsLongBlock(&pAacDecoderChannelInfo->icsInfo) == 1) ? 5 : 3; int sect_esc_val = (1 << nbits) - 1 ; UCHAR ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); for (group=0; groupicsInfo); group++) { for (band=0; band < ScaleFactorBandsTransmitted; ) { sect_len = 0; if ( flags & AC_ER_VCB11 ) { sect_cb = (UCHAR) FDKreadBits(bs,5); } else sect_cb = (UCHAR) FDKreadBits(bs,4); if ( ((flags & AC_ER_VCB11) == 0) || ( sect_cb < 11 ) || ((sect_cb > 11) && (sect_cb < 16)) ) { sect_len_incr = FDKreadBits(bs, nbits); while (sect_len_incr == sect_esc_val) { sect_len += sect_esc_val; sect_len_incr = FDKreadBits(bs, nbits); } } else { sect_len_incr = 1; } sect_len += sect_len_incr; top = band + sect_len; if (flags & AC_ER_HCR) { /* HCR input (long) -- collecting sideinfo (for HCR-_long_ only) */ pNumLinesInSec[numLinesInSecIdx] = BandOffsets[top] - BandOffsets[band]; numLinesInSecIdx++; if (numLinesInSecIdx >= MAX_SFB_HCR) { return AAC_DEC_PARSE_ERROR; } if ( (sect_cb == BOOKSCL) ) { return AAC_DEC_INVALID_CODE_BOOK; } else { *pHcrCodeBook++ = sect_cb; } pAacDecoderChannelInfo->pDynData->specificTo.aac.numberSection++; } /* Check spectral line limits */ if (IsLongBlock( &(pAacDecoderChannelInfo->icsInfo) )) { if (top > 64) { return AAC_DEC_DECODE_FRAME_ERROR; } } else { /* short block */ if (top + group*16 > (8 * 16)) { return AAC_DEC_DECODE_FRAME_ERROR; } } /* Check if decoded codebook index is feasible */ if ( (sect_cb == BOOKSCL) || ( (sect_cb == INTENSITY_HCB || sect_cb == INTENSITY_HCB2) && pAacDecoderChannelInfo->pDynData->RawDataInfo.CommonWindow == 0) ) { return AAC_DEC_INVALID_CODE_BOOK; } /* Store codebook index */ for (; band < top; band++) { pCodeBook[group*16+band] = sect_cb; } } } return ErrorStatus; } /* mso: provides a faster way to i-quantize a whole band in one go */ /** * \brief inverse quantize one sfb. Each value of the sfb is processed according to the * formula: spectrum[i] = Sign(spectrum[i]) * Matissa(spectrum[i])^(4/3) * 2^(lsb/4). * \param spectrum pointer to first line of the sfb to be inverse quantized. * \param noLines number of lines belonging to the sfb. * \param lsb last 2 bits of the scale factor of the sfb. * \param scale max allowed shift scale for the sfb. */ static void InverseQuantizeBand( FIXP_DBL * RESTRICT spectrum, INT noLines, INT lsb, INT scale ) { const FIXP_DBL * RESTRICT InverseQuantTabler=(FIXP_DBL *)InverseQuantTable; const FIXP_DBL * RESTRICT MantissaTabler=(FIXP_DBL *)MantissaTable[lsb]; const SCHAR* RESTRICT ExponentTabler=(SCHAR*)ExponentTable[lsb]; FIXP_DBL *ptr = spectrum; FIXP_DBL signedValue; FDK_ASSERT(noLines>2); for (INT i=noLines; i--; ) { if ((signedValue = *ptr++) != FL2FXCONST_DBL(0)) { FIXP_DBL value = fAbs(signedValue); UINT freeBits = CntLeadingZeros(value); UINT exponent = 32 - freeBits; UINT x = (UINT) (LONG)value << (INT) freeBits; x <<= 1; /* shift out sign bit to avoid masking later on */ UINT tableIndex = x >> 24; x = (x >> 20) & 0x0F; UINT r0=(UINT)(LONG)InverseQuantTabler[tableIndex+0]; UINT r1=(UINT)(LONG)InverseQuantTabler[tableIndex+1]; UINT temp= (r1 - r0)*x + (r0 << 4); value = fMultDiv2((FIXP_DBL)temp, MantissaTabler[exponent]); /* + 1 compensates fMultDiv2() */ scaleValueInPlace(&value, scale + ExponentTabler[exponent] + 1); signedValue = (signedValue < (FIXP_DBL)0) ? -value : value; ptr[-1] = signedValue; } } } AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData(CAacDecoderChannelInfo *pAacDecoderChannelInfo, SamplingRateInfo *pSamplingRateInfo) { int window, group, groupwin, band; int ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; SHORT *RESTRICT pSfbScale = pAacDecoderChannelInfo->pDynData->aSfbScale; SHORT *RESTRICT pScaleFactor = pAacDecoderChannelInfo->pDynData->aScaleFactor; const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); FDKmemclear(pAacDecoderChannelInfo->pDynData->aSfbScale, (8*16)*sizeof(SHORT)); for (window=0, group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (groupwin=0; groupwin < GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); groupwin++, window++) { /* inverse quantization */ for (band=0; band < ScaleFactorBandsTransmitted; band++) { FIXP_DBL *pSpectralCoefficient = SPEC(pAacDecoderChannelInfo->pSpectralCoefficient, window, pAacDecoderChannelInfo->granuleLength) + BandOffsets[band]; int noLines = BandOffsets[band+1] - BandOffsets[band]; int bnds = group*16+band; int i; if ((pCodeBook[bnds] == ZERO_HCB) || (pCodeBook[bnds] == INTENSITY_HCB) || (pCodeBook[bnds] == INTENSITY_HCB2) ) continue; if (pCodeBook[bnds] == NOISE_HCB) { /* Leave headroom for PNS values. + 1 because ceil(log2(2^(0.25*3))) = 1, worst case of additional headroom required because of the scalefactor. */ pSfbScale[window*16+band] = (pScaleFactor [bnds] >> 2) + 1 ; continue; } /* Find max spectral line value of the current sfb */ FIXP_DBL locMax = (FIXP_DBL)0; for (i = noLines; i-- ; ) { /* Expensive memory access */ locMax = fMax(fixp_abs(pSpectralCoefficient[i]), locMax); } /* Cheap robustness improvement - Do not remove!!! */ if (fixp_abs(locMax) > (FIXP_DBL)MAX_QUANTIZED_VALUE) { return AAC_DEC_DECODE_FRAME_ERROR; } /* The inverse quantized spectral lines are defined by: pSpectralCoefficient[i] = Sign(pSpectralCoefficient[i]) * 2^(0.25*pScaleFactor[bnds]) * pSpectralCoefficient[i]^(4/3) This is equivalent to: pSpectralCoefficient[i] = Sign(pSpectralCoefficient[i]) * (2^(pScaleFactor[bnds] % 4) * pSpectralCoefficient[i]^(4/3)) pSpectralCoefficient_e[i] += pScaleFactor[bnds]/4 */ { int msb = pScaleFactor [bnds] >> 2 ; int lsb = pScaleFactor [bnds] & 0x03 ; int scale = GetScaleFromValue(locMax, lsb); pSfbScale[window*16+band] = msb - scale; InverseQuantizeBand(pSpectralCoefficient, noLines, lsb, scale); } } } } return AAC_DEC_OK; } AAC_DECODER_ERROR CBlock_ReadSpectralData(HANDLE_FDK_BITSTREAM bs, CAacDecoderChannelInfo *pAacDecoderChannelInfo, const SamplingRateInfo *pSamplingRateInfo, const UINT flags) { int i,index; int window,group,groupwin,groupoffset,band; UCHAR *RESTRICT pCodeBook = pAacDecoderChannelInfo->pDynData->aCodeBook; const SHORT *RESTRICT BandOffsets = GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo); SPECTRAL_PTR pSpectralCoefficient = pAacDecoderChannelInfo->pSpectralCoefficient; FIXP_DBL locMax; int ScaleFactorBandsTransmitted = GetScaleFactorBandsTransmitted(&pAacDecoderChannelInfo->icsInfo); FDK_ASSERT(BandOffsets != NULL); FDKmemclear(pSpectralCoefficient, sizeof(SPECTRUM)); if ( (flags & AC_ER_HCR) == 0 ) { groupoffset = 0; /* plain huffman decoder short */ for (group=0; group < GetWindowGroups(&pAacDecoderChannelInfo->icsInfo); group++) { for (band=0; band < ScaleFactorBandsTransmitted; band++) { int bnds = group*16+band; UCHAR currentCB = pCodeBook[bnds]; /* patch to run plain-huffman-decoder with vcb11 input codebooks (LAV-checking might be possible below using the virtual cb and a LAV-table) */ if ((currentCB >= 16) && (currentCB <= 31)) { pCodeBook[bnds] = currentCB = 11; } if ( !((currentCB == ZERO_HCB) || (currentCB == NOISE_HCB) || (currentCB == INTENSITY_HCB) || (currentCB == INTENSITY_HCB2)) ) { const CodeBookDescription *hcb = &AACcodeBookDescriptionTable[currentCB]; int step = hcb->Dimension; int offset = hcb->Offset; int bits = hcb->numBits; int mask = (1<icsInfo,group); groupwin++) { window = groupoffset + groupwin; FIXP_DBL *mdctSpectrum = SPEC(pSpectralCoefficient, window, pAacDecoderChannelInfo->granuleLength); locMax = (FIXP_DBL)0 ; for (index=BandOffsets[band]; index < BandOffsets[band+1]; index+=step) { int idx = CBlock_DecodeHuffmanWord(bs,hcb); for (i=0; i>= bits; if (offset == 0) { if (tmp != FIXP_DBL(0)) tmp = (FDKreadBits(bs,1))? -tmp : tmp; } mdctSpectrum[index+i] = tmp; } if (currentCB == ESCBOOK) { mdctSpectrum[index+0] = (FIXP_DBL)CBlock_GetEscape(bs, (LONG)mdctSpectrum[index+0]); mdctSpectrum[index+1] = (FIXP_DBL)CBlock_GetEscape(bs, (LONG)mdctSpectrum[index+1]); } } } } } groupoffset += GetWindowGroupLength(&pAacDecoderChannelInfo->icsInfo,group); } /* plain huffman decoding (short) finished */ } /* HCR - Huffman Codeword Reordering short */ else /* if ( flags & AC_ER_HCR ) */ { H_HCR_INFO hHcr = &pAacDecoderChannelInfo->pComData->overlay.aac.erHcrInfo; int hcrStatus = 0; /* advanced Huffman decoding starts here (HCR decoding :) */ if ( pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData != 0 ) { /* HCR initialization short */ hcrStatus = HcrInit(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); if (hcrStatus != 0) { return AAC_DEC_DECODE_FRAME_ERROR; } /* HCR decoding short */ hcrStatus = HcrDecoder(hHcr, pAacDecoderChannelInfo, pSamplingRateInfo, bs); if (hcrStatus != 0) { #if HCR_ERROR_CONCEALMENT HcrMuteErroneousLines(hHcr); #else return AAC_DEC_DECODE_FRAME_ERROR; #endif /* HCR_ERROR_CONCEALMENT */ } FDKpushFor (bs, pAacDecoderChannelInfo->pDynData->specificTo.aac.lenOfReorderedSpectralData); } } /* HCR - Huffman Codeword Reordering short finished */ if ( IsLongBlock(&pAacDecoderChannelInfo->icsInfo) && !(flags & (AC_ELD|AC_SCALABLE)) ) { /* apply pulse data */ CPulseData_Apply(&pAacDecoderChannelInfo->pDynData->specificTo.aac.PulseData, GetScaleFactorBandOffsets(&pAacDecoderChannelInfo->icsInfo, pSamplingRateInfo), SPEC_LONG(pSpectralCoefficient)); } return AAC_DEC_OK; } void ApplyTools ( CAacDecoderChannelInfo *pAacDecoderChannelInfo[], const SamplingRateInfo *pSamplingRateInfo, const UINT flags, const int channel ) { if ( !(flags & (AC_USAC|AC_RSVD50|AC_MPS_RES)) ) { CPns_Apply( &pAacDecoderChannelInfo[channel]->data.aac.PnsData, &pAacDecoderChannelInfo[channel]->icsInfo, pAacDecoderChannelInfo[channel]->pSpectralCoefficient, pAacDecoderChannelInfo[channel]->specScale, pAacDecoderChannelInfo[channel]->pDynData->aScaleFactor, pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength, channel ); } CTns_Apply ( &pAacDecoderChannelInfo[channel]->pDynData->TnsData, &pAacDecoderChannelInfo[channel]->icsInfo, pAacDecoderChannelInfo[channel]->pSpectralCoefficient, pSamplingRateInfo, pAacDecoderChannelInfo[channel]->granuleLength ); } static int getWindow2Nr(int length, int shape) { int nr = 0; if (shape == 2) { /* Low Overlap, 3/4 zeroed */ nr = (length * 3)>>2; } return nr; } void CBlock_FrequencyToTime(CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, CAacDecoderChannelInfo *pAacDecoderChannelInfo, INT_PCM outSamples[], const SHORT frameLen, const int stride, const int frameOk, FIXP_DBL *pWorkBuffer1 ) { int fr, fl, tl, nSamples, nSpec; /* Determine left slope length (fl), right slope length (fr) and transform length (tl). USAC: The slope length may mismatch with the previous frame in case of LPD / FD transitions. The adjustment is handled by the imdct implementation. */ tl = frameLen; nSpec = 1; switch( pAacDecoderChannelInfo->icsInfo.WindowSequence ) { default: case OnlyLongSequence: fl = frameLen; fr = frameLen - getWindow2Nr(frameLen, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)); break; case LongStopSequence: fl = frameLen >> 3; fr = frameLen; break; case LongStartSequence: /* or StopStartSequence */ fl = frameLen; fr = frameLen >> 3; break; case EightShortSequence: fl = fr = frameLen >> 3; tl >>= 3; nSpec = 8; break; } { int i; { FIXP_DBL *tmp = pAacDecoderChannelInfo->pComData->workBufferCore1->mdctOutTemp; nSamples = imdct_block( &pAacDecoderStaticChannelInfo->IMdct, tmp, SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), pAacDecoderChannelInfo->specScale, nSpec, frameLen, tl, FDKgetWindowSlope(fl, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), fl, FDKgetWindowSlope(fr, GetWindowShape(&pAacDecoderChannelInfo->icsInfo)), fr, (FIXP_DBL)0 ); for (i=0; ipSpectralCoefficient), pAacDecoderChannelInfo->specScale[0], outSamples, pAacDecoderStaticChannelInfo->pOverlapBuffer, stride, frameLen ); } fdk-aac-0.1.3/libAACdec/src/channelinfo.h0000644000175000017500000003471512372261464020377 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: individual channel stream info ******************************************************************************/ #ifndef CHANNELINFO_H #define CHANNELINFO_H #include "common_fix.h" #include "aac_rom.h" #include "aacdecoder_lib.h" #include "FDK_bitstream.h" #include "overlapadd.h" #include "mdct.h" #include "stereo.h" #include "pulsedata.h" #include "aacdec_tns.h" #include "aacdec_pns.h" #include "aacdec_hcr_types.h" #include "rvlc_info.h" #include "conceal_types.h" #include "aacdec_drc_types.h" /* Output rendering mode */ typedef enum { AACDEC_RENDER_INVALID = 0, AACDEC_RENDER_IMDCT, AACDEC_RENDER_ELDFB, AACDEC_RENDER_LPD, AACDEC_RENDER_INTIMDCT } AACDEC_RENDER_MODE; enum { MAX_QUANTIZED_VALUE = 8191 }; enum { OnlyLongSequence = 0, LongStartSequence, EightShortSequence, LongStopSequence }; typedef struct { const SHORT *ScaleFactorBands_Long; const SHORT *ScaleFactorBands_Short; UCHAR NumberOfScaleFactorBands_Long; UCHAR NumberOfScaleFactorBands_Short; UINT samplingRateIndex; UINT samplingRate; } SamplingRateInfo; typedef struct { UCHAR CommonWindow; UCHAR GlobalGain; } CRawDataInfo; typedef struct { UCHAR WindowGroupLength[8]; UCHAR WindowGroups; UCHAR Valid; UCHAR WindowShape; /* 0: sine window, 1: KBD, 2: low overlap */ UCHAR WindowSequence; /* See enum above, 0: long, 1: start, 2: short, 3: stop */ UCHAR MaxSfBands; UCHAR ScaleFactorGrouping; UCHAR TotalSfBands; } CIcsInfo; enum { ZERO_HCB = 0, ESCBOOK = 11, NSPECBOOKS = ESCBOOK + 1, BOOKSCL = NSPECBOOKS, NOISE_HCB = 13, INTENSITY_HCB2 = 14, INTENSITY_HCB = 15, LAST_HCB }; #define TNS_SCALE 3 /* * This struct must be allocated one for every channel and must be persistent. */ typedef struct { FIXP_DBL *pOverlapBuffer; mdct_t IMdct; CDrcChannelData drcData; CConcealmentInfo concealmentInfo; } CAacDecoderStaticChannelInfo; /* * This union must be allocated for every element (up to 2 channels). */ typedef struct { /* Common bit stream data */ SHORT aScaleFactor[(8*16)]; /* Spectral scale factors for each sfb in each window. */ SHORT aSfbScale[(8*16)]; /* could be free after ApplyTools() */ UCHAR aCodeBook[(8*16)]; /* section data: codebook for each window and sfb. */ CTnsData TnsData; CRawDataInfo RawDataInfo; shouldBeUnion { struct { CPulseData PulseData; SHORT aNumLineInSec4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for Drm syntax */ UCHAR aCodeBooks4Hcr[MAX_SFB_HCR]; /* needed once for all channels except for Drm syntax. Same as "aCodeBook" ? */ SHORT lenOfReorderedSpectralData; SCHAR lenOfLongestCodeword; SCHAR numberSection; SCHAR rvlcCurrentScaleFactorOK; SCHAR rvlcIntensityUsed; } aac; } specificTo; } CAacDecoderDynamicData; typedef shouldBeUnion { CAacDecoderDynamicData pAacDecoderDynamicData[2]; /* Common signal data, can be used once the bit stream data from above is not used anymore. */ FIXP_DBL mdctOutTemp[1024]; FIXP_DBL sbrWorkBuffer[1024*2]; } CWorkBufferCore1; /* Common data referenced by all channels */ typedef struct { CWorkBufferCore1 *workBufferCore1; FIXP_DBL* workBufferCore2; CPnsInterChannelData pnsInterChannelData; INT pnsCurrentSeed; INT pnsRandomSeed[(8*16)]; CJointStereoData jointStereoData; /* One for one element */ shouldBeUnion { struct { CErHcrInfo erHcrInfo; CErRvlcInfo erRvlcInfo; SHORT aRvlcScfEsc[RVLC_MAX_SFB]; /* needed once for all channels */ SHORT aRvlcScfFwd[RVLC_MAX_SFB]; /* needed once for all channels */ SHORT aRvlcScfBwd[RVLC_MAX_SFB]; /* needed once for all channels */ } aac; } overlay; } CAacDecoderCommonData; /* * This struct must be allocated one for every channels of every element and must be persistent. * Among its members, the following memory areas can be overwritten under the given conditions: * - pSpectralCoefficient The memory pointed to can be overwritten after time signal rendering. * - data can be overwritten after time signal rendering. * - pDynData memory pointed to can be overwritten after each CChannelElement_Decode() call. * - pComData->overlay memory pointed to can be overwritten after each CChannelElement_Decode() call.. */ typedef struct { SPECTRAL_PTR pSpectralCoefficient; /* Spectral coefficients of each window */ SHORT specScale[8]; /* Scale shift values of each spectrum window */ CIcsInfo icsInfo; INT granuleLength; /* Size of smallest spectrum piece */ UCHAR ElementInstanceTag; AACDEC_RENDER_MODE renderMode; /* Output signal rendering mode */ shouldBeUnion { struct { CPnsData PnsData; /* Not required for USAC */ } aac; struct { } usac; } data; CAacDecoderDynamicData *pDynData; /* Data required for one element and discarded after decoding */ CAacDecoderCommonData *pComData; /* Data required for one channel at a time during decode */ } CAacDecoderChannelInfo; /* channelinfo.cpp */ AAC_DECODER_ERROR getSamplingRateInfo(SamplingRateInfo *t, UINT samplesPerFrame, UINT samplingRateIndex, UINT samplingRate); /** * \brief Read max SFB from bit stream and assign TotalSfBands according * to the window sequence and sample rate. * \param hBs bit stream handle as data source * \param pIcsInfo IcsInfo structure to read the window sequence and store MaxSfBands and TotalSfBands * \param pSamplingRateInfo read only */ AAC_DECODER_ERROR IcsReadMaxSfb ( HANDLE_FDK_BITSTREAM hBs, CIcsInfo *pIcsInfo, const SamplingRateInfo *pSamplingRateInfo ); AAC_DECODER_ERROR IcsRead( HANDLE_FDK_BITSTREAM bs, CIcsInfo *pIcsInfo, const SamplingRateInfo* SamplingRateInfoTable, const UINT flags ); /* stereo.cpp, only called from this file */ /*! \brief Applies MS stereo. The function applies MS stereo. \param pAacDecoderChannelInfo aac channel info. \param pScaleFactorBandOffsets pointer to scalefactor band offsets. \param pWindowGroupLength pointer to window group length array. \param windowGroups number of window groups. \param scaleFactorBandsTransmittedL number of transmitted scalefactor bands in left channel. \param scaleFactorBandsTransmittedR number of transmitted scalefactor bands in right channel. May differ from scaleFactorBandsTransmittedL only for USAC. \return none */ void CJointStereo_ApplyMS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], const short *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, const int windowGroups, const int scaleFactorBandsTransmittedL, const int scaleFactorBandsTransmittedR); /*! \brief Applies intensity stereo The function applies intensity stereo. \param pAacDecoderChannelInfo aac channel info. \param pScaleFactorBandOffsets pointer to scalefactor band offsets. \param pWindowGroupLength pointer to window group length array. \param windowGroups number of window groups. \param scaleFactorBandsTransmitted number of transmitted scalefactor bands. \param CommonWindow common window bit. \return none */ void CJointStereo_ApplyIS(CAacDecoderChannelInfo *pAacDecoderChannelInfo[2], const short *pScaleFactorBandOffsets, const UCHAR *pWindowGroupLength, const int windowGroups, const int scaleFactorBandsTransmitted, const UINT CommonWindow); /* aacdec_pns.cpp */ int CPns_IsPnsUsed (const CPnsData *pPnsData, const int group, const int band); void CPns_SetCorrelation(CPnsData *pPnsData, const int group, const int band, const int outofphase); /****************** inline functions ******************/ inline UCHAR IsValid(const CIcsInfo *pIcsInfo) { return pIcsInfo->Valid; } inline UCHAR IsLongBlock(const CIcsInfo *pIcsInfo) { return (pIcsInfo->WindowSequence != EightShortSequence); } inline UCHAR GetWindowShape(const CIcsInfo *pIcsInfo) { return pIcsInfo->WindowShape; } inline UCHAR GetWindowSequence(const CIcsInfo *pIcsInfo) { return pIcsInfo->WindowSequence; } inline const SHORT *GetScaleFactorBandOffsets(const CIcsInfo *pIcsInfo, const SamplingRateInfo* samplingRateInfo) { if (IsLongBlock(pIcsInfo)) { return samplingRateInfo->ScaleFactorBands_Long; } else { return samplingRateInfo->ScaleFactorBands_Short; } } inline int GetWindowsPerFrame(const CIcsInfo *pIcsInfo) { return (pIcsInfo->WindowSequence == EightShortSequence) ? 8 : 1; } inline UCHAR GetWindowGroups(const CIcsInfo *pIcsInfo) { return pIcsInfo->WindowGroups; } inline UCHAR GetWindowGroupLength(const CIcsInfo *pIcsInfo, const INT index) { return pIcsInfo->WindowGroupLength[index]; } inline const UCHAR *GetWindowGroupLengthTable(const CIcsInfo *pIcsInfo) { return pIcsInfo->WindowGroupLength; } inline UCHAR GetScaleFactorBandsTransmitted(const CIcsInfo *pIcsInfo) { return pIcsInfo->MaxSfBands; } inline UCHAR GetScaleMaxFactorBandsTransmitted(const CIcsInfo *pIcsInfo0, const CIcsInfo *pIcsInfo1) { return fMax(pIcsInfo0->MaxSfBands, pIcsInfo1->MaxSfBands); } inline UCHAR GetScaleFactorBandsTotal(const CIcsInfo *pIcsInfo) { return pIcsInfo->TotalSfBands; } /* Note: This function applies to AAC-LC only ! */ inline UCHAR GetMaximumTnsBands(const CIcsInfo *pIcsInfo, const int samplingRateIndex) { return tns_max_bands_tbl[samplingRateIndex][!IsLongBlock(pIcsInfo)]; } #endif /* #ifndef CHANNELINFO_H */ fdk-aac-0.1.3/libAACdec/src/aacdecoder_lib.cpp0000644000175000017500000006732212372261464021346 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander Description: ******************************************************************************/ #include "aacdecoder_lib.h" #include "aac_ram.h" #include "aacdecoder.h" #include "tpdec_lib.h" #include "FDK_core.h" /* FDK_tools version info */ #include "sbrdecoder.h" #include "conceal.h" #include "aacdec_drc.h" /* Decoder library info */ #define AACDECODER_LIB_VL0 2 #define AACDECODER_LIB_VL1 5 #define AACDECODER_LIB_VL2 5 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" #define AACDECODER_LIB_BUILD_DATE __DATE__ #define AACDECODER_LIB_BUILD_TIME __TIME__ static AAC_DECODER_ERROR setConcealMethod ( const HANDLE_AACDECODER self, const INT method ); LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_GetFreeBytes ( const HANDLE_AACDECODER self, UINT *pFreeBytes){ /* reset free bytes */ *pFreeBytes = 0; /* check handle */ if(!self) return AAC_DEC_INVALID_HANDLE; /* return nr of free bytes */ HANDLE_FDK_BITSTREAM hBs = transportDec_GetBitstream(self->hInput, 0); *pFreeBytes = FDKgetFreeBits(hBs) >> 3; /* success */ return AAC_DEC_OK; } /** * Config Decoder using a CSAudioSpecificConfig struct. */ static LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Config(HANDLE_AACDECODER self, const CSAudioSpecificConfig *pAscStruct) { AAC_DECODER_ERROR err; /* Initialize AAC core decoder, and update self->streaminfo */ err = CAacDecoder_Init(self, pAscStruct); return err; } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_ConfigRaw ( HANDLE_AACDECODER self, UCHAR *conf[], const UINT length[] ) { AAC_DECODER_ERROR err = AAC_DEC_OK; TRANSPORTDEC_ERROR errTp; UINT layer, nrOfLayers = self->nrOfLayers; for(layer = 0; layer < nrOfLayers; layer++){ if(length[layer] > 0){ errTp = transportDec_OutOfBandConfig(self->hInput, conf[layer], length[layer], layer); if (errTp != TRANSPORTDEC_OK) { switch (errTp) { case TRANSPORTDEC_NEED_TO_RESTART: err = AAC_DEC_NEED_TO_RESTART; break; case TRANSPORTDEC_UNSUPPORTED_FORMAT: err = AAC_DEC_UNSUPPORTED_FORMAT; break; default: err = AAC_DEC_UNKNOWN; break; } /* if baselayer is OK we continue decoding */ if(layer >= 1){ self->nrOfLayers = layer; } break; } } } return err; } static INT aacDecoder_ConfigCallback(void *handle, const CSAudioSpecificConfig *pAscStruct) { HANDLE_AACDECODER self = (HANDLE_AACDECODER)handle; AAC_DECODER_ERROR err = AAC_DEC_OK; TRANSPORTDEC_ERROR errTp; { { err = aacDecoder_Config(self, pAscStruct); } } if (err == AAC_DEC_OK) { if ( self->flags & (AC_USAC|AC_RSVD50|AC_LD|AC_ELD) && CConcealment_GetDelay(&self->concealCommonData) > 0 ) { /* Revert to error concealment method Noise Substitution. Because interpolation is not implemented for USAC/RSVD50 or the additional delay is unwanted for low delay codecs. */ setConcealMethod(self, 1); #ifdef DEBUG FDKprintf(" Concealment method was reverted to 1 !\n"); #endif } errTp = TRANSPORTDEC_OK; } else { if (IS_INIT_ERROR(err)) { errTp = TRANSPORTDEC_UNSUPPORTED_FORMAT; } /* Fatal errors */ else if (err == AAC_DEC_NEED_TO_RESTART) { errTp = TRANSPORTDEC_NEED_TO_RESTART; } else { errTp = TRANSPORTDEC_UNKOWN_ERROR; } } return errTp; } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_AncDataInit ( HANDLE_AACDECODER self, UCHAR *buffer, int size ) { CAncData *ancData = &self->ancData; return CAacDecoder_AncDataInit(ancData, buffer, size); } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_AncDataGet ( HANDLE_AACDECODER self, int index, UCHAR **ptr, int *size ) { CAncData *ancData = &self->ancData; return CAacDecoder_AncDataGet(ancData, index, ptr, size); } static AAC_DECODER_ERROR setConcealMethod ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */ const INT method ) { AAC_DECODER_ERROR errorStatus = AAC_DEC_OK; CConcealParams *pConcealData = NULL; HANDLE_SBRDECODER hSbrDec = NULL; HANDLE_AAC_DRC hDrcInfo = NULL; HANDLE_PCM_DOWNMIX hPcmDmx = NULL; CConcealmentMethod backupMethod = ConcealMethodNone; int backupDelay = 0; int bsDelay = 0; /* check decoder handle */ if (self != NULL) { pConcealData = &self->concealCommonData; hSbrDec = self->hSbrDecoder; hDrcInfo = self->hDrcInfo; hPcmDmx = self->hPcmUtils; } /* Get current method/delay */ backupMethod = CConcealment_GetMethod(pConcealData); backupDelay = CConcealment_GetDelay(pConcealData); /* Be sure to set AAC and SBR concealment method simultaneously! */ errorStatus = CConcealment_SetParams( pConcealData, (int)method, // concealMethod AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeOutSlope AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealFadeInSlope AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, // concealMuteRelease AACDEC_CONCEAL_PARAM_NOT_SPECIFIED // concealComfNoiseLevel ); if ( (errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE) ) { goto bail; } /* Get new delay */ bsDelay = CConcealment_GetDelay(pConcealData); { SBR_ERROR sbrErr = SBRDEC_OK; /* set SBR bitstream delay */ sbrErr = sbrDecoder_SetParam ( hSbrDec, SBR_SYSTEM_BITSTREAM_DELAY, bsDelay ); switch (sbrErr) { case SBRDEC_OK: case SBRDEC_NOT_INITIALIZED: if (self != NULL) { /* save the param value and set later (when SBR has been initialized) */ self->sbrParams.bsDelay = bsDelay; } break; default: errorStatus = AAC_DEC_SET_PARAM_FAIL; goto bail; } } errorStatus = aacDecoder_drcSetParam ( hDrcInfo, DRC_BS_DELAY, bsDelay ); if ( (errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE) ) { goto bail; } if (errorStatus == AAC_DEC_OK) { PCMDMX_ERROR err = pcmDmx_SetParam ( hPcmDmx, DMX_BS_DATA_DELAY, bsDelay ); switch (err) { case PCMDMX_INVALID_HANDLE: errorStatus = AAC_DEC_INVALID_HANDLE; case PCMDMX_OK: break; default: errorStatus = AAC_DEC_SET_PARAM_FAIL; goto bail; } } bail: if ( (errorStatus != AAC_DEC_OK) && (errorStatus != AAC_DEC_INVALID_HANDLE) ) { /* Revert to the initial state */ CConcealment_SetParams ( pConcealData, (int)backupMethod, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED, AACDEC_CONCEAL_PARAM_NOT_SPECIFIED ); /* Revert SBR bitstream delay */ sbrDecoder_SetParam ( hSbrDec, SBR_SYSTEM_BITSTREAM_DELAY, backupDelay ); /* Revert DRC bitstream delay */ aacDecoder_drcSetParam ( hDrcInfo, DRC_BS_DELAY, backupDelay ); /* Revert PCM mixdown bitstream delay */ pcmDmx_SetParam ( hPcmDmx, DMX_BS_DATA_DELAY, backupDelay ); } return errorStatus; } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_SetParam ( const HANDLE_AACDECODER self, /*!< Handle of the decoder instance */ const AACDEC_PARAM param, /*!< Parameter to set */ const INT value) /*!< Parameter valued */ { AAC_DECODER_ERROR errorStatus = AAC_DEC_OK; CConcealParams *pConcealData = NULL; HANDLE_AAC_DRC hDrcInfo = NULL; HANDLE_PCM_DOWNMIX hPcmDmx = NULL; /* check decoder handle */ if (self != NULL) { pConcealData = &self->concealCommonData; hDrcInfo = self->hDrcInfo; hPcmDmx = self->hPcmUtils; } else { errorStatus = AAC_DEC_INVALID_HANDLE; } /* configure the subsystems */ switch (param) { case AAC_PCM_OUTPUT_INTERLEAVED: if (value < 0 || value > 1) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } self->outputInterleaved = value; break; case AAC_PCM_OUTPUT_CHANNELS: if (value < -1 || value > (6)) { return AAC_DEC_SET_PARAM_FAIL; } { PCMDMX_ERROR err; err = pcmDmx_SetParam ( hPcmDmx, NUMBER_OF_OUTPUT_CHANNELS, value ); switch (err) { case PCMDMX_OK: break; case PCMDMX_INVALID_HANDLE: return AAC_DEC_INVALID_HANDLE; default: return AAC_DEC_SET_PARAM_FAIL; } } break; case AAC_PCM_DUAL_CHANNEL_OUTPUT_MODE: { PCMDMX_ERROR err; err = pcmDmx_SetParam ( hPcmDmx, DUAL_CHANNEL_DOWNMIX_MODE, value ); switch (err) { case PCMDMX_OK: break; case PCMDMX_INVALID_HANDLE: return AAC_DEC_INVALID_HANDLE; default: return AAC_DEC_SET_PARAM_FAIL; } } break; case AAC_PCM_OUTPUT_CHANNEL_MAPPING: switch (value) { case 0: if (self != NULL) { self->channelOutputMapping = channelMappingTablePassthrough; } break; case 1: if (self != NULL) { self->channelOutputMapping = channelMappingTableWAV; } break; default: errorStatus = AAC_DEC_SET_PARAM_FAIL; break; } break; case AAC_QMF_LOWPOWER: if (value < -1 || value > 1) { return AAC_DEC_SET_PARAM_FAIL; } if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } /** * Set QMF mode (might be overriden) * 0:HQ (complex) * 1:LP (partially complex) */ self->qmfModeUser = (QMF_MODE)value; break; case AAC_DRC_ATTENUATION_FACTOR: /* DRC compression factor (where 0 is no and 127 is max compression) */ errorStatus = aacDecoder_drcSetParam ( hDrcInfo, DRC_CUT_SCALE, value ); break; case AAC_DRC_BOOST_FACTOR: /* DRC boost factor (where 0 is no and 127 is max boost) */ errorStatus = aacDecoder_drcSetParam ( hDrcInfo, DRC_BOOST_SCALE, value ); break; case AAC_DRC_REFERENCE_LEVEL: /* DRC reference level quantized in 0.25dB steps using values [0..127] it is '-' for analog scaling */ errorStatus = aacDecoder_drcSetParam ( hDrcInfo, TARGET_REF_LEVEL, value ); break; case AAC_DRC_HEAVY_COMPRESSION: /* Don't need to overwrite cut/boost values */ errorStatus = aacDecoder_drcSetParam ( hDrcInfo, APPLY_HEAVY_COMPRESSION, value ); break; case AAC_TPDEC_CLEAR_BUFFER: transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1); self->streamInfo.numLostAccessUnits = 0; self->streamInfo.numBadBytes = 0; self->streamInfo.numTotalBytes = 0; /* aacDecoder_SignalInterruption(self); */ break; case AAC_CONCEAL_METHOD: /* Changing the concealment method can introduce additional bitstream delay. And that in turn affects sub libraries and modules which makes the whole thing quite complex. So the complete changing routine is packed into a helper function which keeps all modules and libs in a consistent state even in the case an error occures. */ errorStatus = setConcealMethod ( self, value ); break; default: return AAC_DEC_SET_PARAM_FAIL; } /* switch(param) */ return (errorStatus); } LINKSPEC_CPP HANDLE_AACDECODER aacDecoder_Open(TRANSPORT_TYPE transportFmt, UINT nrOfLayers) { AAC_DECODER_INSTANCE *aacDec = NULL; HANDLE_TRANSPORTDEC pIn; int err = 0; /* Allocate transport layer struct. */ pIn = transportDec_Open(transportFmt, TP_FLAG_MPEG4); if (pIn == NULL) { return NULL; } transportDec_SetParam(pIn, TPDEC_PARAM_IGNORE_BUFFERFULLNESS, 1); /* Allocate AAC decoder core struct. */ aacDec = CAacDecoder_Open(transportFmt); if (aacDec == NULL) { transportDec_Close(&pIn); goto bail; } aacDec->hInput = pIn; aacDec->nrOfLayers = nrOfLayers; aacDec->channelOutputMapping = channelMappingTableWAV; /* Register Config Update callback. */ transportDec_RegisterAscCallback(pIn, aacDecoder_ConfigCallback, (void*)aacDec); /* open SBR decoder */ if ( SBRDEC_OK != sbrDecoder_Open ( &aacDec->hSbrDecoder )) { err = -1; goto bail; } aacDec->qmfModeUser = NOT_DEFINED; transportDec_RegisterSbrCallback(aacDec->hInput, (cbSbr_t)sbrDecoder_Header, (void*)aacDec->hSbrDecoder); pcmDmx_Open( &aacDec->hPcmUtils ); if (aacDec->hPcmUtils == NULL) { err = -1; goto bail; } /* Assure that all modules have same delay */ if ( setConcealMethod(aacDec, CConcealment_GetMethod(&aacDec->concealCommonData)) ) { err = -1; goto bail; } bail: if (err == -1) { aacDecoder_Close(aacDec); aacDec = NULL; } return aacDec; } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_Fill( HANDLE_AACDECODER self, UCHAR *pBuffer[], const UINT bufferSize[], UINT *pBytesValid ) { TRANSPORTDEC_ERROR tpErr; /* loop counter for layers; if not TT_MP4_RAWPACKETS used as index for only available layer */ INT layer = 0; INT nrOfLayers = self->nrOfLayers; { for (layer = 0; layer < nrOfLayers; layer++){ { tpErr = transportDec_FillData( self->hInput, pBuffer[layer], bufferSize[layer], &pBytesValid[layer], layer ); if (tpErr != TRANSPORTDEC_OK) { return AAC_DEC_UNKNOWN; /* Must be an internal error */ } } } } return AAC_DEC_OK; } static void aacDecoder_SignalInterruption(HANDLE_AACDECODER self) { CAacDecoder_SignalInterruption(self); if ( self->hSbrDecoder != NULL ) { sbrDecoder_SetParam(self->hSbrDecoder, SBR_BS_INTERRUPTION, 0); } } static void aacDecoder_UpdateBitStreamCounters(CStreamInfo *pSi, HANDLE_FDK_BITSTREAM hBs, int nBits, AAC_DECODER_ERROR ErrorStatus) { /* calculate bit difference (amount of bits moved forward) */ nBits = nBits - FDKgetValidBits(hBs); /* Note: The amount of bits consumed might become negative when parsing a bit stream with several sub frames, and we find out at the last sub frame that the total frame length does not match the sum of sub frame length. If this happens, the transport decoder might want to rewind to the supposed ending of the transport frame, and this position might be before the last access unit beginning. */ /* Calc bitrate. */ if (pSi->frameSize > 0) { pSi->bitRate = (nBits * pSi->sampleRate)/pSi->frameSize; } /* bit/byte counters */ { int nBytes; nBytes = nBits>>3; pSi->numTotalBytes += nBytes; if (IS_OUTPUT_VALID(ErrorStatus)) { pSi->numTotalAccessUnits++; } if (IS_DECODE_ERROR(ErrorStatus)) { pSi->numBadBytes += nBytes; pSi->numBadAccessUnits++; } } } static INT aacDecoder_EstimateNumberOfLostFrames(HANDLE_AACDECODER self) { INT n; transportDec_GetMissingAccessUnitCount( &n, self->hInput); return n; } LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame( HANDLE_AACDECODER self, INT_PCM *pTimeData, const INT timeDataSize, const UINT flags) { AAC_DECODER_ERROR ErrorStatus; INT layer; INT nBits; INT interleaved = self->outputInterleaved; HANDLE_FDK_BITSTREAM hBs; int fTpInterruption = 0; /* Transport originated interruption detection. */ int fTpConceal = 0; /* Transport originated concealment. */ if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } if (flags & AACDEC_INTR) { self->streamInfo.numLostAccessUnits = 0; } hBs = transportDec_GetBitstream(self->hInput, 0); /* Get current bits position for bitrate calculation. */ nBits = FDKgetValidBits(hBs); if (! (flags & (AACDEC_CONCEAL | AACDEC_FLUSH) ) ) { TRANSPORTDEC_ERROR err; for(layer = 0; layer < self->nrOfLayers; layer++) { err = transportDec_ReadAccessUnit(self->hInput, layer); if (err != TRANSPORTDEC_OK) { switch (err) { case TRANSPORTDEC_NOT_ENOUGH_BITS: ErrorStatus = AAC_DEC_NOT_ENOUGH_BITS; goto bail; case TRANSPORTDEC_SYNC_ERROR: self->streamInfo.numLostAccessUnits = aacDecoder_EstimateNumberOfLostFrames(self); fTpInterruption = 1; break; case TRANSPORTDEC_NEED_TO_RESTART: ErrorStatus = AAC_DEC_NEED_TO_RESTART; goto bail; case TRANSPORTDEC_CRC_ERROR: fTpConceal = 1; break; default: ErrorStatus = AAC_DEC_UNKNOWN; goto bail; } } } } else { if (self->streamInfo.numLostAccessUnits > 0) { self->streamInfo.numLostAccessUnits--; } } /* Signal bit stream interruption to other modules if required. */ if ( fTpInterruption || (flags & (AACDEC_INTR|AACDEC_CLRHIST)) ) { aacDecoder_SignalInterruption(self); if ( ! (flags & AACDEC_INTR) ) { ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR; goto bail; } } /* Empty bit buffer in case of flush request. */ if (flags & AACDEC_FLUSH) { transportDec_SetParam(self->hInput, TPDEC_PARAM_RESET, 1); self->streamInfo.numLostAccessUnits = 0; self->streamInfo.numBadBytes = 0; self->streamInfo.numTotalBytes = 0; } ErrorStatus = CAacDecoder_DecodeFrame(self, flags | (fTpConceal ? AACDEC_CONCEAL : 0), pTimeData, timeDataSize, interleaved); if (!(flags & (AACDEC_CONCEAL|AACDEC_FLUSH))) { TRANSPORTDEC_ERROR tpErr; tpErr = transportDec_EndAccessUnit(self->hInput); if (tpErr != TRANSPORTDEC_OK) { self->frameOK = 0; } } /* If the current pTimeData does not contain a valid signal, there nothing else we can do, so bail. */ if ( ! IS_OUTPUT_VALID(ErrorStatus) ) { goto bail; } { /* Export data into streaminfo structure */ self->streamInfo.sampleRate = self->streamInfo.aacSampleRate; self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame; } self->streamInfo.numChannels = self->streamInfo.aacNumChannels; CAacDecoder_SyncQmfMode(self); /* sbr decoder */ if (ErrorStatus || (flags & AACDEC_CONCEAL) || self->pAacDecoderStaticChannelInfo[0]->concealmentInfo.concealState > ConcealState_FadeIn) { self->frameOK = 0; /* if an error has occured do concealment in the SBR decoder too */ } if (self->sbrEnabled) { SBR_ERROR sbrError = SBRDEC_OK; /* set params */ sbrDecoder_SetParam ( self->hSbrDecoder, SBR_SYSTEM_BITSTREAM_DELAY, self->sbrParams.bsDelay); if ( self->streamInfo.aot == AOT_ER_AAC_ELD ) { /* Configure QMF */ sbrDecoder_SetParam ( self->hSbrDecoder, SBR_LD_QMF_TIME_ALIGN, (self->flags & AC_LD_MPS) ? 1 : 0 ); } /* apply SBR processing */ sbrError = sbrDecoder_Apply ( self->hSbrDecoder, pTimeData, &self->streamInfo.numChannels, &self->streamInfo.sampleRate, self->channelOutputMapping[self->streamInfo.numChannels-1], interleaved, self->frameOK, &self->psPossible); if (sbrError == SBRDEC_OK) { /* Update data in streaminfo structure. Assume that the SBR upsampling factor is either 1 or 2 */ self->flags |= AC_SBR_PRESENT; if (self->streamInfo.aacSampleRate != self->streamInfo.sampleRate) { if (self->streamInfo.frameSize == 768) { self->streamInfo.frameSize = (self->streamInfo.aacSamplesPerFrame * 8) / 3; } else { self->streamInfo.frameSize = self->streamInfo.aacSamplesPerFrame << 1; } } if (self->psPossible) { self->flags |= AC_PS_PRESENT; self->channelType[0] = ACT_FRONT; self->channelType[1] = ACT_FRONT; self->channelIndices[0] = 0; self->channelIndices[1] = 1; } else { self->flags &= ~AC_PS_PRESENT; } } } if ( flags & (AACDEC_INTR | AACDEC_CLRHIST) ) { /* delete data from the past (e.g. mixdown coeficients) */ pcmDmx_Reset( self->hPcmUtils, PCMDMX_RESET_BS_DATA ); } /* do PCM post processing */ pcmDmx_ApplyFrame ( self->hPcmUtils, pTimeData, self->streamInfo.frameSize, &self->streamInfo.numChannels, interleaved, self->channelType, self->channelIndices, self->channelOutputMapping ); /* Signal interruption to take effect in next frame. */ if ( flags & AACDEC_FLUSH ) { aacDecoder_SignalInterruption(self); } /* Update externally visible copy of flags */ self->streamInfo.flags = self->flags; bail: /* Update Statistics */ aacDecoder_UpdateBitStreamCounters(&self->streamInfo, hBs, nBits, ErrorStatus); return ErrorStatus; } LINKSPEC_CPP void aacDecoder_Close ( HANDLE_AACDECODER self ) { if (self == NULL) return; if (self->hPcmUtils != NULL) { pcmDmx_Close( &self->hPcmUtils ); } if (self->hSbrDecoder != NULL) { sbrDecoder_Close(&self->hSbrDecoder); } if (self->hInput != NULL) { transportDec_Close(&self->hInput); } CAacDecoder_Close(self); } LINKSPEC_CPP CStreamInfo* aacDecoder_GetStreamInfo ( HANDLE_AACDECODER self ) { return CAacDecoder_GetStreamInfo(self); } LINKSPEC_CPP INT aacDecoder_GetLibInfo ( LIB_INFO *info ) { int i; if (info == NULL) { return -1; } sbrDecoder_GetLibInfo( info ); transportDec_GetLibInfo( info ); FDK_toolsGetLibInfo( info ); pcmDmx_GetLibInfo( info ); /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) { return -1; } info += i; info->module_id = FDK_AACDEC; /* build own library info */ info->version = LIB_VERSION(AACDECODER_LIB_VL0, AACDECODER_LIB_VL1, AACDECODER_LIB_VL2); LIB_VERSION_STRING(info); info->build_date = AACDECODER_LIB_BUILD_DATE; info->build_time = AACDECODER_LIB_BUILD_TIME; info->title = AACDECODER_LIB_TITLE; /* Set flags */ info->flags = 0 | CAPF_AAC_LC | CAPF_AAC_VCB11 | CAPF_AAC_HCR | CAPF_AAC_RVLC | CAPF_ER_AAC_LD | CAPF_ER_AAC_ELD | CAPF_AAC_CONCEALMENT | CAPF_AAC_DRC | CAPF_AAC_MPEG4 | CAPF_AAC_1024 | CAPF_AAC_960 | CAPF_AAC_512 | CAPF_AAC_480 ; /* End of flags */ return 0; } fdk-aac-0.1.3/libAACdec/src/aacdec_hcrs.h0000644000175000017500000002123112372261464020317 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Defines of state-constants, masks and state-prototypes *******************************************************************************/ #ifndef _AACDEC_HCRS_H_ #define _AACDEC_HCRS_H_ #include "FDK_bitstream.h" #include "aacdec_hcr_types.h" /* The four different kinds of types of states are: */ /* different states are defined as constants */ /* start middle=self next stop */ #define STOP_THIS_STATE 0 /* */ #define BODY_ONLY 1 /* X X X */ #define BODY_SIGN__BODY 2 /* X X X X [stop if no sign] */ #define BODY_SIGN__SIGN 3 /* X X [stop if sign bits decoded] */ #define BODY_SIGN_ESC__BODY 4 /* X X X X [stop if no sign] */ #define BODY_SIGN_ESC__SIGN 5 /* X X X [stop if no escape sequence] */ #define BODY_SIGN_ESC__ESC_PREFIX 6 /* X X */ #define BODY_SIGN_ESC__ESC_WORD 7 /* X X X [stop if abs(second qsc) != 16] */ /* examples: */ /* BODY_ONLY means only the codeword body will be decoded; no sign bits will follow and no escapesequence will follow */ /* BODY_SIGN__BODY means that the codeword consists of two parts; body and sign part. The part '__BODY' after the two underscores shows */ /* that the bits which are currently decoded belong to the '__BODY' of the codeword and not to the sign part. */ /* BODY_SIGN_ESC__ESC_PB means that the codeword consists of three parts; body, sign and (here: two) escape sequences; */ /* P = Prefix = ones */ /* W = Escape Word */ /* A = first possible (of two) Escape sequeces */ /* B = second possible (of two) Escape sequeces */ /* The part after the two underscores shows that the current bits which are decoded belong to the '__ESC_PB' - part of the */ /* codeword. That means the body and the sign bits are decoded completely and the bits which are decoded now belong to */ /* the escape sequence [P = prefix; B=second possible escape sequence] */ #define MSB_31_MASK 0x80000000 /* masks MSB (= Bit 31) in a 32 bit word */ #define DIMENSION_OF_ESCAPE_CODEBOOK 2 /* for cb >= 11 is dimension 2 */ #define ESCAPE_CODEBOOK 11 #define MASK_ESCAPE_PREFIX_UP 0x000F0000 #define LSB_ESCAPE_PREFIX_UP 16 #define MASK_ESCAPE_PREFIX_DOWN 0x0000F000 #define LSB_ESCAPE_PREFIX_DOWN 12 #define MASK_ESCAPE_WORD 0x00000FFF #define MASK_FLAG_A 0x00200000 #define MASK_FLAG_B 0x00100000 extern void DecodeNonPCWs(HANDLE_FDK_BITSTREAM bs, H_HCR_INFO hHcr); UINT Hcr_State_BODY_ONLY (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN__BODY (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN__SIGN (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN_ESC__BODY (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN_ESC__SIGN (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN_ESC__ESC_PREFIX (HANDLE_FDK_BITSTREAM, void*); UINT Hcr_State_BODY_SIGN_ESC__ESC_WORD (HANDLE_FDK_BITSTREAM, void*); #endif /* _AACDEC_HCRS_H_ */ fdk-aac-0.1.3/libAACdec/src/aacdec_drc.h0000644000175000017500000001620712372261464020137 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Dynamic range control (DRC) decoder tool for AAC ******************************************************************************/ #ifndef AACDEC_DRC_H #define AACDEC_DRC_H #include "tp_data.h" /* for program config element support */ #include "aacdec_drc_types.h" #include "channel.h" #include "FDK_bitstream.h" #define AACDEC_DRC_DEFAULT_REF_LEVEL ( 108 ) /* -27 dB below full scale (typical for movies) */ #define AACDEC_DRC_DFLT_EXPIRY_FRAMES ( 50 ) /* Default DRC data expiry time in AAC frames */ /** * \brief DRC module setting parameters */ typedef enum { DRC_CUT_SCALE = 0, DRC_BOOST_SCALE, TARGET_REF_LEVEL, DRC_BS_DELAY, DRC_DATA_EXPIRY_FRAME, APPLY_HEAVY_COMPRESSION } AACDEC_DRC_PARAM; /** * \brief DRC module interface functions */ void aacDecoder_drcInit ( HANDLE_AAC_DRC self ); void aacDecoder_drcInitChannelData ( CDrcChannelData *pDrcChannel ); AAC_DECODER_ERROR aacDecoder_drcSetParam ( HANDLE_AAC_DRC self, AACDEC_DRC_PARAM param, INT value ); int aacDecoder_drcMarkPayload ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, AACDEC_DRC_PAYLOAD_TYPE type ); int aacDecoder_drcProlog ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], UCHAR pceInstanceTag, UCHAR channelMapping[], int numChannels ); /** * \brief Apply DRC. If SBR is present, DRC data is handed over to the SBR decoder. * \param self AAC decoder instance * \param pSbrDec pointer to SBR decoder instance * \param pAacDecoderChannelInfo AAC decoder channel instance to be processed * \param pDrcDat DRC channel data * \param ch channel index * \param aacFrameSize AAC frame size * \param bSbrPresent flag indicating that SBR is present, in which case DRC is handed over to the SBR instance pSbrDec */ void aacDecoder_drcApply ( HANDLE_AAC_DRC self, void *pSbrDec, CAacDecoderChannelInfo *pAacDecoderChannelInfo, CDrcChannelData *pDrcDat, int ch, int aacFrameSize, int bSbrPresent ); int aacDecoder_drcEpilog ( HANDLE_AAC_DRC self, HANDLE_FDK_BITSTREAM hBs, CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[], UCHAR pceInstanceTag, UCHAR channelMapping[], int validChannels ); #endif /* AACDEC_DRC_H */ fdk-aac-0.1.3/libAACdec/src/ldfiltbank.h0000644000175000017500000001220512372261464020213 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************************************************************\ * * filename: ldfiltbank.h * project : MPEG-4 Audio Decoder * contents/description: low delay filterbank interface * \***************************************************************************/ #ifndef _LDFILTBANK_H #define _LDFILTBANK_H #include "common_fix.h" int InvMdctTransformLowDelay_fdk ( FIXP_DBL *mdctdata_m, const int mdctdata_e, INT_PCM *mdctOut, FIXP_DBL *fs_buffer, const int stride, const int frameLength ); #endif fdk-aac-0.1.3/libAACdec/src/ldfiltbank.cpp0000644000175000017500000002055412372261464020554 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************************************************************\ * * filename: ldfiltbank.c * project : MPEG-4 Audio Decoder * contents/description: low delay filterbank * \***************************************************************************/ #include "ldfiltbank.h" #include "aac_rom.h" #include "dct.h" #include "FDK_tools_rom.h" #include "mdct.h" #define LDFB_HEADROOM 2 static void multE2_DinvF_fdk(INT_PCM *output, FIXP_DBL* x, const FIXP_WTB* fb, FIXP_DBL* z, const int N, const int stride) { int i, scale; /* scale for FIXP_DBL -> INT_PCM conversion. */ scale = (DFRACT_BITS - SAMPLE_BITS) - LDFB_HEADROOM; for(i=0;i> (-WTS2-1) ); z[N/2+i] = x[N/2-1-i] + ( fMultDiv2(z[N + i], fb[2*N + N/2 + i]) >> (-WTS2-1) ); tmp = ( fMultDiv2(z[N/2+i], fb[N+N/2-1-i]) + fMultDiv2(z[i], fb[N+N/2+i]) ) ; #if (SAMPLE_BITS <= 16) FDK_ASSERT( (-WTS1-1 + scale) >= 0); output[(N*3/4-1-i)*stride] = (INT_PCM)SATURATE_RIGHT_SHIFT(tmp, -WTS1-1 + scale, SAMPLE_BITS); #else FDK_ASSERT( (WTS1+1 - scale) >= 0); output[(N*3/4-1-i)*stride] = (INT_PCM)SATURATE_LEFT_SHIFT(tmp, WTS1+1 - scale, SAMPLE_BITS); #endif z[i] = z0; z[N + i] = z2; } for(i=N/4;i> (-WTS2-1) ); z[N/2+i] = x[N/2-1-i] + ( fMultDiv2(z[N + i], fb[2*N + N/2 + i]) >> (-WTS2-1) ); tmp0 = ( fMultDiv2(z[N/2+i], fb[N/2-1-i]) + fMultDiv2(z[i], fb[N/2+i]) ) ; tmp1 = ( fMultDiv2(z[N/2+i], fb[N+N/2-1-i]) + fMultDiv2(z[i], fb[N+N/2+i]) ) ; #if (SAMPLE_BITS <= 16) FDK_ASSERT( (-WTS0-1 + scale) >= 0); output[(i-N/4)*stride] = (INT_PCM)SATURATE_RIGHT_SHIFT(tmp0, -WTS0-1 + scale, SAMPLE_BITS); output[(N*3/4-1-i)*stride] = (INT_PCM)SATURATE_RIGHT_SHIFT(tmp1, -WTS1-1 + scale, SAMPLE_BITS); #else FDK_ASSERT( (WTS0+1 - scale) >= 0); output[(i-N/4)*stride] = (INT_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0+1 - scale, SAMPLE_BITS); output[(N*3/4-1-i)*stride] = (INT_PCM)SATURATE_LEFT_SHIFT(tmp1, WTS1+1 - scale, SAMPLE_BITS); #endif z[i] = z0; z[N + i] = z2; } /* Exchange quarter parts of x to bring them in the "right" order */ for(i=0;i= 0); output[(N*3/4 + i)*stride] = (INT_PCM)SATURATE_RIGHT_SHIFT(tmp0, -WTS0-1 + scale, SAMPLE_BITS); #else FDK_ASSERT( (WTS0+1 - scale) >= 0); output[(N*3/4 + i)*stride] = (INT_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0+1 - scale, SAMPLE_BITS); #endif } } int InvMdctTransformLowDelay_fdk (FIXP_DBL *mdctData, const int mdctData_e, INT_PCM *output, FIXP_DBL *fs_buffer, const int stride, const int N) { const FIXP_WTB *coef; FIXP_DBL gain = (FIXP_DBL)0; int scale = mdctData_e + MDCT_OUT_HEADROOM - LDFB_HEADROOM; /* The LDFB_HEADROOM is compensated inside multE2_DinvF_fdk() below */ /* Select LD window slope */ if (N == 512) coef = (FIXP_WTB*)LowDelaySynthesis512; else coef = (FIXP_WTB*)LowDelaySynthesis480; /* Apply exponent and 1/N factor. Note: "scale" is off by one because for LD_MDCT the window length is twice the window length of a regular MDCT. This is corrected inside multE2_DinvF_fdk(). Refer to ISO/IEC 14496-3:2009 page 277, chapter 4.6.20.2 "Low Delay Window". */ imdct_gain(&gain, &scale, N); dct_IV(mdctData, N, &scale); if (gain != (FIXP_DBL)0) { scaleValuesWithFactor(mdctData, gain, N, scale); } else { scaleValues(mdctData, N, scale); } /* Since all exponent and factors have been applied, current exponent is zero. */ multE2_DinvF_fdk(output, mdctData, coef, fs_buffer, N, stride); return (1); } fdk-aac-0.1.3/libAACdec/src/aac_ram.cpp0000644000175000017500000001425512372261464020026 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl ******************************************************************************/ #include "aac_ram.h" #include "aac_rom.h" #define WORKBUFFER1_TAG 0 #define WORKBUFFER2_TAG 1 /*! The structure AAC_DECODER_INSTANCE is the top level structure holding all decoder configurations, handles and structs. */ C_ALLOC_MEM(AacDecoder, AAC_DECODER_INSTANCE, 1) /*! \name StaticAacData Static memory areas, must not be overwritten in other sections of the decoder */ /* @{ */ /*! The structure CAacDecoderStaticChannelInfo contains the static sideinfo which is needed for the decoding of one aac channel.
Dimension: #AacDecoderChannels */ C_ALLOC_MEM2(AacDecoderStaticChannelInfo, CAacDecoderStaticChannelInfo, 1, (6)) /*! The structure CAacDecoderChannelInfo contains the dynamic sideinfo which is needed for the decoding of one aac channel.
Dimension: #AacDecoderChannels */ C_ALLOC_MEM2(AacDecoderChannelInfo, CAacDecoderChannelInfo, 1, (6)) /*! Overlap buffer */ C_ALLOC_MEM2(OverlapBuffer, FIXP_DBL, OverlapBufferSize, (6)) C_ALLOC_MEM(DrcInfo, CDrcInfo, 1) /* @} */ /*! \name DynamicAacData Dynamic memory areas, might be reused in other algorithm sections, e.g. the sbr decoder */ C_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL, ((6)*1024), SECT_DATA_L2, WORKBUFFER2_TAG) C_ALLOC_MEM_OVERLAY(WorkBufferCore1, CWorkBufferCore1, 1, SECT_DATA_L1, WORKBUFFER1_TAG) /* @{ */ /* @} */ fdk-aac-0.1.3/libAACdec/src/aac_rom.cpp0000644000175000017500000045453112372261464020051 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: Definition of constant tables ******************************************************************************/ #include "aac_rom.h" /* Prescale InverseQuantTable by 4 to save redundant shifts in invers quantization */ #define SCL_TAB(a) (a>>4) const FIXP_DBL InverseQuantTable [INV_QUANT_TABLESIZE + 1] = { SCL_TAB(0x32CBFD40), SCL_TAB(0x330FC340), SCL_TAB(0x33539FC0), SCL_TAB(0x33979280), SCL_TAB(0x33DB9BC0), SCL_TAB(0x341FBB80), SCL_TAB(0x3463F180), SCL_TAB(0x34A83DC0), SCL_TAB(0x34ECA000), SCL_TAB(0x35311880), SCL_TAB(0x3575A700), SCL_TAB(0x35BA4B80), SCL_TAB(0x35FF0600), SCL_TAB(0x3643D680), SCL_TAB(0x3688BCC0), SCL_TAB(0x36CDB880), SCL_TAB(0x3712CA40), SCL_TAB(0x3757F1C0), SCL_TAB(0x379D2F00), SCL_TAB(0x37E28180), SCL_TAB(0x3827E9C0), SCL_TAB(0x386D6740), SCL_TAB(0x38B2FA40), SCL_TAB(0x38F8A2C0), SCL_TAB(0x393E6080), SCL_TAB(0x39843380), SCL_TAB(0x39CA1BC0), SCL_TAB(0x3A101940), SCL_TAB(0x3A562BC0), SCL_TAB(0x3A9C5340), SCL_TAB(0x3AE28FC0), SCL_TAB(0x3B28E180), SCL_TAB(0x3B6F4800), SCL_TAB(0x3BB5C340), SCL_TAB(0x3BFC5380), SCL_TAB(0x3C42F880), SCL_TAB(0x3C89B200), SCL_TAB(0x3CD08080), SCL_TAB(0x3D176340), SCL_TAB(0x3D5E5B00), SCL_TAB(0x3DA56700), SCL_TAB(0x3DEC87C0), SCL_TAB(0x3E33BCC0), SCL_TAB(0x3E7B0640), SCL_TAB(0x3EC26400), SCL_TAB(0x3F09D640), SCL_TAB(0x3F515C80), SCL_TAB(0x3F98F740), SCL_TAB(0x3FE0A600), SCL_TAB(0x40286900), SCL_TAB(0x40704000), SCL_TAB(0x40B82B00), SCL_TAB(0x41002A00), SCL_TAB(0x41483D00), SCL_TAB(0x41906400), SCL_TAB(0x41D89F00), SCL_TAB(0x4220ED80), SCL_TAB(0x42695000), SCL_TAB(0x42B1C600), SCL_TAB(0x42FA5000), SCL_TAB(0x4342ED80), SCL_TAB(0x438B9E80), SCL_TAB(0x43D46380), SCL_TAB(0x441D3B80), SCL_TAB(0x44662780), SCL_TAB(0x44AF2680), SCL_TAB(0x44F83900), SCL_TAB(0x45415F00), SCL_TAB(0x458A9880), SCL_TAB(0x45D3E500), SCL_TAB(0x461D4500), SCL_TAB(0x4666B800), SCL_TAB(0x46B03E80), SCL_TAB(0x46F9D800), SCL_TAB(0x47438480), SCL_TAB(0x478D4400), SCL_TAB(0x47D71680), SCL_TAB(0x4820FC00), SCL_TAB(0x486AF500), SCL_TAB(0x48B50000), SCL_TAB(0x48FF1E80), SCL_TAB(0x49494F80), SCL_TAB(0x49939380), SCL_TAB(0x49DDEA80), SCL_TAB(0x4A285400), SCL_TAB(0x4A72D000), SCL_TAB(0x4ABD5E80), SCL_TAB(0x4B080000), SCL_TAB(0x4B52B400), SCL_TAB(0x4B9D7A80), SCL_TAB(0x4BE85380), SCL_TAB(0x4C333F00), SCL_TAB(0x4C7E3D00), SCL_TAB(0x4CC94D00), SCL_TAB(0x4D146F80), SCL_TAB(0x4D5FA500), SCL_TAB(0x4DAAEC00), SCL_TAB(0x4DF64580), SCL_TAB(0x4E41B180), SCL_TAB(0x4E8D2F00), SCL_TAB(0x4ED8BF80), SCL_TAB(0x4F246180), SCL_TAB(0x4F701600), SCL_TAB(0x4FBBDC00), SCL_TAB(0x5007B480), SCL_TAB(0x50539F00), SCL_TAB(0x509F9B80), SCL_TAB(0x50EBA980), SCL_TAB(0x5137C980), SCL_TAB(0x5183FB80), SCL_TAB(0x51D03F80), SCL_TAB(0x521C9500), SCL_TAB(0x5268FC80), SCL_TAB(0x52B57580), SCL_TAB(0x53020000), SCL_TAB(0x534E9C80), SCL_TAB(0x539B4A80), SCL_TAB(0x53E80A80), SCL_TAB(0x5434DB80), SCL_TAB(0x5481BE80), SCL_TAB(0x54CEB280), SCL_TAB(0x551BB880), SCL_TAB(0x5568CF80), SCL_TAB(0x55B5F800), SCL_TAB(0x56033200), SCL_TAB(0x56507D80), SCL_TAB(0x569DDA00), SCL_TAB(0x56EB4800), SCL_TAB(0x5738C700), SCL_TAB(0x57865780), SCL_TAB(0x57D3F900), SCL_TAB(0x5821AC00), SCL_TAB(0x586F7000), SCL_TAB(0x58BD4500), SCL_TAB(0x590B2B00), SCL_TAB(0x59592200), SCL_TAB(0x59A72A80), SCL_TAB(0x59F54380), SCL_TAB(0x5A436D80), SCL_TAB(0x5A91A900), SCL_TAB(0x5ADFF500), SCL_TAB(0x5B2E5180), SCL_TAB(0x5B7CBF80), SCL_TAB(0x5BCB3E00), SCL_TAB(0x5C19CD00), SCL_TAB(0x5C686D80), SCL_TAB(0x5CB71E00), SCL_TAB(0x5D05DF80), SCL_TAB(0x5D54B200), SCL_TAB(0x5DA39500), SCL_TAB(0x5DF28880), SCL_TAB(0x5E418C80), SCL_TAB(0x5E90A100), SCL_TAB(0x5EDFC680), SCL_TAB(0x5F2EFC00), SCL_TAB(0x5F7E4280), SCL_TAB(0x5FCD9900), SCL_TAB(0x601D0080), SCL_TAB(0x606C7800), SCL_TAB(0x60BC0000), SCL_TAB(0x610B9800), SCL_TAB(0x615B4100), SCL_TAB(0x61AAF980), SCL_TAB(0x61FAC300), SCL_TAB(0x624A9C80), SCL_TAB(0x629A8600), SCL_TAB(0x62EA8000), SCL_TAB(0x633A8A00), SCL_TAB(0x638AA480), SCL_TAB(0x63DACF00), SCL_TAB(0x642B0980), SCL_TAB(0x647B5400), SCL_TAB(0x64CBAE80), SCL_TAB(0x651C1900), SCL_TAB(0x656C9400), SCL_TAB(0x65BD1E80), SCL_TAB(0x660DB900), SCL_TAB(0x665E6380), SCL_TAB(0x66AF1E00), SCL_TAB(0x66FFE880), SCL_TAB(0x6750C280), SCL_TAB(0x67A1AC80), SCL_TAB(0x67F2A600), SCL_TAB(0x6843B000), SCL_TAB(0x6894C900), SCL_TAB(0x68E5F200), SCL_TAB(0x69372B00), SCL_TAB(0x69887380), SCL_TAB(0x69D9CB80), SCL_TAB(0x6A2B3300), SCL_TAB(0x6A7CAA80), SCL_TAB(0x6ACE3180), SCL_TAB(0x6B1FC800), SCL_TAB(0x6B716E00), SCL_TAB(0x6BC32400), SCL_TAB(0x6C14E900), SCL_TAB(0x6C66BD80), SCL_TAB(0x6CB8A180), SCL_TAB(0x6D0A9500), SCL_TAB(0x6D5C9800), SCL_TAB(0x6DAEAA00), SCL_TAB(0x6E00CB80), SCL_TAB(0x6E52FC80), SCL_TAB(0x6EA53D00), SCL_TAB(0x6EF78C80), SCL_TAB(0x6F49EB80), SCL_TAB(0x6F9C5980), SCL_TAB(0x6FEED700), SCL_TAB(0x70416380), SCL_TAB(0x7093FF00), SCL_TAB(0x70E6AA00), SCL_TAB(0x71396400), SCL_TAB(0x718C2D00), SCL_TAB(0x71DF0580), SCL_TAB(0x7231ED00), SCL_TAB(0x7284E300), SCL_TAB(0x72D7E880), SCL_TAB(0x732AFD00), SCL_TAB(0x737E2080), SCL_TAB(0x73D15300), SCL_TAB(0x74249480), SCL_TAB(0x7477E480), SCL_TAB(0x74CB4400), SCL_TAB(0x751EB200), SCL_TAB(0x75722F00), SCL_TAB(0x75C5BB00), SCL_TAB(0x76195580), SCL_TAB(0x766CFF00), SCL_TAB(0x76C0B700), SCL_TAB(0x77147E00), SCL_TAB(0x77685400), SCL_TAB(0x77BC3880), SCL_TAB(0x78102B80), SCL_TAB(0x78642D80), SCL_TAB(0x78B83E00), SCL_TAB(0x790C5D00), SCL_TAB(0x79608B00), SCL_TAB(0x79B4C780), SCL_TAB(0x7A091280), SCL_TAB(0x7A5D6C00), SCL_TAB(0x7AB1D400), SCL_TAB(0x7B064A80), SCL_TAB(0x7B5ACF80), SCL_TAB(0x7BAF6380), SCL_TAB(0x7C040580), SCL_TAB(0x7C58B600), SCL_TAB(0x7CAD7500), SCL_TAB(0x7D024200), SCL_TAB(0x7D571E00), SCL_TAB(0x7DAC0800), SCL_TAB(0x7E010080), SCL_TAB(0x7E560780), SCL_TAB(0x7EAB1C80), SCL_TAB(0x7F004000), SCL_TAB(0x7F557200), SCL_TAB(0x7FAAB200), SCL_TAB(0x7FFFFFFF) } ; /** * \brief Table representing scale factor gains. Given a scale factor sf, and a value pSpec[i] the * gain is given by: MantissaTable[sf % 4][msb] = 2^(sf % 4) / (1<> 2)) * The corresponding exponents for the values in this tables are stored in ExponentTable[sf % 4][msb] below. */ const FIXP_DBL MantissaTable [4][14] = { { 0x40000000, 0x50A28C00, 0x6597FA80, 0x40000000, 0x50A28C00, 0x6597FA80, 0x40000000, 0x50A28C00, 0x6597FA80, 0x40000000, 0x50A28C00, 0x6597FA80, 0x40000000, 0x50A28C00 }, { 0x4C1BF800, 0x5FE44380, 0x78D0DF80, 0x4C1BF800, 0x5FE44380, 0x78D0DF80, 0x4C1BF800, 0x5FE44380, 0x78D0DF80, 0x4C1BF800, 0x5FE44380, 0x78D0DF80, 0x4C1BF800, 0x5FE44380 }, { 0x5A827980, 0x7208F800, 0x47D66B00, 0x5A827980, 0x7208F800, 0x47D66B00, 0x5A827980, 0x7208F800, 0x47D66B00, 0x5A827980, 0x7208F800, 0x47D66B00, 0x5A827980, 0x7208F800 }, { 0x6BA27E80, 0x43CE3E80, 0x556E0400, 0x6BA27E80, 0x43CE3E80, 0x556E0400, 0x6BA27E80, 0x43CE3E80, 0x556E0400, 0x6BA27E80, 0x43CE3E80, 0x556E0400, 0x6BA27E80, 0x43CE3E80 } } ; const SCHAR ExponentTable [4][14] = { { 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18 }, { 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18 }, { 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18 }, { 1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19 } } ; /* 49 scfbands */ static const SHORT sfb_48_1024[50] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 1024 }; /* 14 scfbands */ static const SHORT sfb_48_128[15] = { 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 }; /* 51 scfbands */ static const SHORT sfb_32_1024[52] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960, 992,1024 }; /* 47 scfbands */ static const SHORT sfb_24_1024[48] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960,1024 }; /* 15 scfbands */ static const SHORT sfb_24_128[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 }; /* 43 scfbands */ static const SHORT sfb_16_1024[44] = { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960,1024 }; /* 15 scfbands */ static const SHORT sfb_16_128[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 }; /* 40 scfbands */ static const SHORT sfb_8_1024[41] = { 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944,1024 }; /* 15 scfbands */ static const SHORT sfb_8_128[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 }; static const SHORT sfb_48_960[50] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960 }; /* 49 scfbands */ static const SHORT sfb_48_120[15] = { 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 120 }; /* 14 scfbands */ static const SHORT sfb_32_960[50] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800, 832, 864, 896, 928, 960 }; /* 49 scfbands */ static const SHORT sfb_24_960[47] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, 768, 832, 896, 960 }; /* 46 scfbands */ static const SHORT sfb_24_120[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 120 }; /* 15 scfbands */ static const SHORT sfb_16_960[43] = { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960 }; /* 42 scfbands */ static const SHORT sfb_16_120[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 120 }; /* 15 scfbands */ static const SHORT sfb_8_960[41] = { 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 960 }; /* 40 scfbands */ static const SHORT sfb_8_120[16] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 120 }; /* 15 scfbands */ static const SHORT sfb_48_512[37] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 512 }; /* 36 scfbands */ static const SHORT sfb_32_512[38] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, 384, 416, 448, 480, 512 }; /* 37 scfbands */ static const SHORT sfb_24_512[32] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512 }; /* 31 scfbands */ static const SHORT sfb_48_480[36] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, 432, 480 }; /* 35 scfbands */ static const SHORT sfb_32_480[38] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, 384, 416, 448, 480 }; /* 37 scfbands */ static const SHORT sfb_24_480[31] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 }; /* 30 scfbands */ const SFB_INFO sfbOffsetTables[5][16] = { { { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { sfb_48_1024, sfb_48_128, 49, 14 }, { sfb_48_1024, sfb_48_128, 49, 14 }, { sfb_32_1024, sfb_48_128, 51, 14 }, { sfb_24_1024, sfb_24_128, 47, 15 }, { sfb_24_1024, sfb_24_128, 47, 15 }, { sfb_16_1024, sfb_16_128, 43, 15 }, { sfb_16_1024, sfb_16_128, 43, 15 }, { sfb_16_1024, sfb_16_128, 43, 15 }, { sfb_8_1024, sfb_8_128, 40, 15 }, { sfb_8_1024, sfb_8_128, 40, 15 }, }, { { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { sfb_48_960, sfb_48_120, 49, 14 }, { sfb_48_960, sfb_48_120, 49, 14 }, { sfb_32_960, sfb_48_120, 49, 14 }, { sfb_24_960, sfb_24_120, 46, 15 }, { sfb_24_960, sfb_24_120, 46, 15 }, { sfb_16_960, sfb_16_120, 42, 15 }, { sfb_16_960, sfb_16_120, 42, 15 }, { sfb_16_960, sfb_16_120, 42, 15 }, { sfb_8_960, sfb_8_120, 40, 15 }, { sfb_8_960, sfb_8_120, 40, 15 }, }, { { NULL, NULL, 0, 0 }, }, { { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { sfb_48_512, NULL, 36, 0 }, { sfb_48_512, NULL, 36, 0}, { sfb_32_512, NULL, 37, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, { sfb_24_512, NULL, 31, 0 }, }, { { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, { sfb_48_480, NULL, 35, 0 }, { sfb_48_480, NULL, 35, 0 }, { sfb_32_480, NULL, 37, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, { sfb_24_480, NULL, 30, 0 }, } }; /*# don't use 1 bit hufman tables */ /* MPEG-2 AAC 2 BITS parallel Hufman Tables Bit 0: = 1=ENDNODE, 0=INDEX Bit 1: = CODEWORD LEN MOD 2 Bit 2..9: = VALUE/REF Tables 1..10,SCL Bit 2..11: = VALUE/REF Table 11 */ const USHORT HuffmanCodeBook_1[51][4] = { {0x0157,0x0157,0x0004,0x0018}, {0x0008,0x000c,0x0010,0x0014}, {0x015b,0x015b,0x0153,0x0153}, {0x0057,0x0057,0x0167,0x0167}, {0x0257,0x0257,0x0117,0x0117}, {0x0197,0x0197,0x0147,0x0147}, {0x001c,0x0030,0x0044,0x0058}, {0x0020,0x0024,0x0028,0x002c}, {0x014b,0x014b,0x0163,0x0163}, {0x0217,0x0217,0x0127,0x0127}, {0x0187,0x0187,0x0097,0x0097}, {0x016b,0x016b,0x0017,0x0017}, {0x0034,0x0038,0x003c,0x0040}, {0x0143,0x0143,0x0107,0x0107}, {0x011b,0x011b,0x0067,0x0067}, {0x0193,0x0193,0x0297,0x0297}, {0x019b,0x019b,0x0247,0x0247}, {0x0048,0x004c,0x0050,0x0054}, {0x01a7,0x01a7,0x0267,0x0267}, {0x0113,0x0113,0x025b,0x025b}, {0x0053,0x0053,0x005b,0x005b}, {0x0253,0x0253,0x0047,0x0047}, {0x005c,0x0070,0x0084,0x0098}, {0x0060,0x0064,0x0068,0x006c}, {0x012b,0x012b,0x0123,0x0123}, {0x018b,0x018b,0x00a7,0x00a7}, {0x0227,0x0227,0x0287,0x0287}, {0x0087,0x0087,0x010b,0x010b}, {0x0074,0x0078,0x007c,0x0080}, {0x021b,0x021b,0x0027,0x0027}, {0x01a3,0x01a3,0x0093,0x0093}, {0x0183,0x0183,0x0207,0x0207}, {0x024b,0x024b,0x004b,0x004b}, {0x0088,0x008c,0x0090,0x0094}, {0x0063,0x0063,0x0103,0x0103}, {0x0007,0x0007,0x02a7,0x02a7}, {0x009b,0x009b,0x026b,0x026b}, {0x0263,0x0263,0x01ab,0x01ab}, {0x009c,0x00a0,0x00a4,0x00b8}, {0x0241,0x0011,0x0069,0x0019}, {0x0211,0x0041,0x0291,0x0299}, {0x00a8,0x00ac,0x00b0,0x00b4}, {0x008b,0x008b,0x0223,0x0223}, {0x00a3,0x00a3,0x020b,0x020b}, {0x02ab,0x02ab,0x0283,0x0283}, {0x002b,0x002b,0x0083,0x0083}, {0x00bc,0x00c0,0x00c4,0x00c8}, {0x0003,0x0003,0x022b,0x022b}, {0x028b,0x028b,0x02a3,0x02a3}, {0x0023,0x0023,0x0203,0x0203}, {0x000b,0x000b,0x00ab,0x00ab} }; const USHORT HuffmanCodeBook_2[39][4] = { {0x0004,0x000c,0x0020,0x0034}, {0x0157,0x0157,0x0159,0x0008}, {0x0153,0x0153,0x0257,0x0257}, {0x0010,0x0014,0x0018,0x001c}, {0x0117,0x0117,0x0057,0x0057}, {0x0147,0x0147,0x0197,0x0197}, {0x0167,0x0167,0x0185,0x0161}, {0x0125,0x0095,0x0065,0x0215}, {0x0024,0x0028,0x002c,0x0030}, {0x0051,0x0149,0x0119,0x0141}, {0x0015,0x0199,0x0259,0x0245}, {0x0191,0x0265,0x0105,0x0251}, {0x0045,0x0111,0x0169,0x01a5}, {0x0038,0x0044,0x0058,0x006c}, {0x0295,0x0059,0x003c,0x0040}, {0x0227,0x0227,0x021b,0x021b}, {0x0123,0x0123,0x0087,0x0087}, {0x0048,0x004c,0x0050,0x0054}, {0x018b,0x018b,0x006b,0x006b}, {0x029b,0x029b,0x01a3,0x01a3}, {0x0207,0x0207,0x01ab,0x01ab}, {0x0093,0x0093,0x0103,0x0103}, {0x005c,0x0060,0x0064,0x0068}, {0x0213,0x0213,0x010b,0x010b}, {0x012b,0x012b,0x0249,0x0061}, {0x0181,0x0291,0x0241,0x0041}, {0x0005,0x0099,0x0019,0x0025}, {0x0070,0x0074,0x0078,0x0088}, {0x02a5,0x0261,0x0011,0x00a5}, {0x0049,0x0285,0x0269,0x0089}, {0x0221,0x007c,0x0080,0x0084}, {0x020b,0x020b,0x0003,0x0003}, {0x00a3,0x00a3,0x02a3,0x02a3}, {0x02ab,0x02ab,0x0083,0x0083}, {0x008c,0x0090,0x0094,0x0098}, {0x028b,0x028b,0x0023,0x0023}, {0x0283,0x0283,0x002b,0x002b}, {0x000b,0x000b,0x0203,0x0203}, {0x022b,0x022b,0x00ab,0x00ab} }; const USHORT HuffmanCodeBook_3[39][4] = { {0x0003,0x0003,0x0004,0x0008}, {0x0005,0x0101,0x0011,0x0041}, {0x000c,0x0010,0x0014,0x0020}, {0x0017,0x0017,0x0143,0x0143}, {0x0051,0x0111,0x0045,0x0151}, {0x0105,0x0055,0x0018,0x001c}, {0x0157,0x0157,0x0147,0x0147}, {0x0117,0x0117,0x0009,0x0201}, {0x0024,0x002c,0x0040,0x0054}, {0x0241,0x0019,0x0065,0x0028}, {0x0183,0x0183,0x0193,0x0193}, {0x0030,0x0034,0x0038,0x003c}, {0x0027,0x0027,0x0253,0x0253}, {0x005b,0x005b,0x0083,0x0083}, {0x0063,0x0063,0x0093,0x0093}, {0x0023,0x0023,0x0213,0x0213}, {0x0044,0x0048,0x004c,0x0050}, {0x004b,0x004b,0x0167,0x0167}, {0x0163,0x0163,0x0097,0x0097}, {0x0197,0x0197,0x0125,0x0085}, {0x0185,0x0121,0x0159,0x0255}, {0x0058,0x005c,0x0060,0x0070}, {0x0119,0x0245,0x0281,0x0291}, {0x0069,0x00a5,0x0205,0x0109}, {0x01a1,0x0064,0x0068,0x006c}, {0x002b,0x002b,0x01a7,0x01a7}, {0x0217,0x0217,0x014b,0x014b}, {0x0297,0x0297,0x016b,0x016b}, {0x0074,0x0078,0x007c,0x0080}, {0x00a3,0x00a3,0x0263,0x0263}, {0x0285,0x0129,0x0099,0x00a9}, {0x02a1,0x01a9,0x0199,0x0265}, {0x02a5,0x0084,0x0088,0x008c}, {0x0223,0x0223,0x008b,0x008b}, {0x0227,0x0227,0x0189,0x0259}, {0x0219,0x0090,0x0094,0x0098}, {0x02ab,0x02ab,0x026b,0x026b}, {0x029b,0x029b,0x024b,0x024b}, {0x020b,0x020b,0x0229,0x0289} }; const USHORT HuffmanCodeBook_4[38][4] = { {0x0004,0x0008,0x000c,0x0018}, {0x0155,0x0151,0x0115,0x0055}, {0x0145,0x0005,0x0015,0x0001}, {0x0141,0x0045,0x0010,0x0014}, {0x0107,0x0107,0x0053,0x0053}, {0x0103,0x0103,0x0113,0x0113}, {0x001c,0x0020,0x0034,0x0048}, {0x0043,0x0043,0x0013,0x0013}, {0x0024,0x0028,0x002c,0x0030}, {0x015b,0x015b,0x0197,0x0197}, {0x0167,0x0167,0x0257,0x0257}, {0x005b,0x005b,0x011b,0x011b}, {0x0067,0x0067,0x014b,0x014b}, {0x0038,0x003c,0x0040,0x0044}, {0x0193,0x0193,0x0251,0x0095}, {0x0161,0x0245,0x0125,0x0215}, {0x0185,0x0019,0x0049,0x0025}, {0x0109,0x0211,0x0061,0x0241}, {0x004c,0x0050,0x0058,0x006c}, {0x0091,0x0121,0x0205,0x0181}, {0x0085,0x0009,0x0201,0x0054}, {0x0023,0x0023,0x0083,0x0083}, {0x005c,0x0060,0x0064,0x0068}, {0x01a7,0x01a7,0x016b,0x016b}, {0x019b,0x019b,0x0297,0x0297}, {0x0267,0x0267,0x025b,0x025b}, {0x00a5,0x0069,0x0099,0x01a1}, {0x0070,0x0074,0x0078,0x0084}, {0x0291,0x0129,0x0261,0x0189}, {0x0285,0x01a9,0x0225,0x0249}, {0x0219,0x02a5,0x007c,0x0080}, {0x029b,0x029b,0x026b,0x026b}, {0x00a3,0x00a3,0x002b,0x002b}, {0x0088,0x008c,0x0090,0x0094}, {0x0283,0x0283,0x008b,0x008b}, {0x0223,0x0223,0x020b,0x020b}, {0x02ab,0x02ab,0x02a3,0x02a3}, {0x00ab,0x00ab,0x0229,0x0289} }; const USHORT HuffmanCodeBook_5[41][4] = { {0x0113,0x0113,0x0004,0x0008}, {0x010d,0x0115,0x0151,0x00d1}, {0x000c,0x0010,0x0014,0x0028}, {0x00d7,0x00d7,0x014f,0x014f}, {0x00cf,0x00cf,0x0157,0x0157}, {0x0018,0x001c,0x0020,0x0024}, {0x010b,0x010b,0x0193,0x0193}, {0x011b,0x011b,0x0093,0x0093}, {0x00c9,0x0159,0x008d,0x0195}, {0x0149,0x00d9,0x018d,0x0095}, {0x002c,0x0030,0x0044,0x0058}, {0x0105,0x011d,0x0051,0x01d1}, {0x0034,0x0038,0x003c,0x0040}, {0x00c7,0x00c7,0x01d7,0x01d7}, {0x015f,0x015f,0x004f,0x004f}, {0x0147,0x0147,0x00df,0x00df}, {0x0057,0x0057,0x01cf,0x01cf}, {0x0048,0x004c,0x0050,0x0054}, {0x018b,0x018b,0x019b,0x019b}, {0x008b,0x008b,0x009b,0x009b}, {0x0085,0x009d,0x01c9,0x0059}, {0x019d,0x01d9,0x0185,0x0049}, {0x005c,0x0060,0x0074,0x0088}, {0x0011,0x0101,0x0161,0x0121}, {0x0064,0x0068,0x006c,0x0070}, {0x00c3,0x00c3,0x0213,0x0213}, {0x00e3,0x00e3,0x000f,0x000f}, {0x0217,0x0217,0x020f,0x020f}, {0x0143,0x0143,0x0017,0x0017}, {0x0078,0x007c,0x0080,0x0084}, {0x005f,0x005f,0x0047,0x0047}, {0x01c7,0x01c7,0x020b,0x020b}, {0x0083,0x0083,0x01a3,0x01a3}, {0x001b,0x001b,0x021b,0x021b}, {0x008c,0x0090,0x0094,0x0098}, {0x01df,0x01df,0x0183,0x0183}, {0x0009,0x00a1,0x001d,0x0041}, {0x01c1,0x021d,0x0205,0x01e1}, {0x0061,0x0005,0x009c,0x00a0}, {0x0023,0x0023,0x0203,0x0203}, {0x0223,0x0223,0x0003,0x0003} }; const USHORT HuffmanCodeBook_6[40][4] = { {0x0004,0x0008,0x000c,0x001c}, {0x0111,0x0115,0x00d1,0x0151}, {0x010d,0x0155,0x014d,0x00d5}, {0x00cd,0x0010,0x0014,0x0018}, {0x00d9,0x0159,0x0149,0x00c9}, {0x0109,0x018d,0x0119,0x0095}, {0x0195,0x0091,0x008d,0x0191}, {0x0020,0x0024,0x0038,0x004c}, {0x0099,0x0189,0x0089,0x0199}, {0x0028,0x002c,0x0030,0x0034}, {0x0147,0x0147,0x015f,0x015f}, {0x00df,0x00df,0x01cf,0x01cf}, {0x00c7,0x00c7,0x01d7,0x01d7}, {0x0057,0x0057,0x004f,0x004f}, {0x003c,0x0040,0x0044,0x0048}, {0x011f,0x011f,0x0107,0x0107}, {0x0053,0x0053,0x01d3,0x01d3}, {0x019f,0x019f,0x0085,0x01c9}, {0x01d9,0x009d,0x0059,0x0049}, {0x0050,0x005c,0x0070,0x0084}, {0x0185,0x01dd,0x0054,0x0058}, {0x005f,0x005f,0x0047,0x0047}, {0x01c7,0x01c7,0x0017,0x0017}, {0x0060,0x0064,0x0068,0x006c}, {0x000f,0x000f,0x0163,0x0163}, {0x0143,0x0143,0x00c3,0x00c3}, {0x0217,0x0217,0x00e3,0x00e3}, {0x020f,0x020f,0x0013,0x0013}, {0x0074,0x0078,0x007c,0x0080}, {0x0183,0x0183,0x0083,0x0083}, {0x021b,0x021b,0x000b,0x000b}, {0x0103,0x0103,0x01a3,0x01a3}, {0x00a3,0x00a3,0x020b,0x020b}, {0x0088,0x008c,0x0090,0x0094}, {0x0123,0x0123,0x001b,0x001b}, {0x0213,0x0213,0x0005,0x0205}, {0x001d,0x0061,0x021d,0x01e1}, {0x01c1,0x0041,0x0098,0x009c}, {0x0223,0x0223,0x0203,0x0203}, {0x0003,0x0003,0x0023,0x0023} }; const USHORT HuffmanCodeBook_7[31][4] = { {0x0003,0x0003,0x0004,0x0008}, {0x0007,0x0007,0x0043,0x0043}, {0x0045,0x000c,0x0010,0x0024}, {0x0049,0x0085,0x0009,0x0081}, {0x0014,0x0018,0x001c,0x0020}, {0x004f,0x004f,0x00c7,0x00c7}, {0x008b,0x008b,0x000f,0x000f}, {0x00c3,0x00c3,0x00c9,0x008d}, {0x0105,0x0051,0x0145,0x0055}, {0x0028,0x002c,0x0040,0x0054}, {0x00cd,0x0109,0x0101,0x0011}, {0x0030,0x0034,0x0038,0x003c}, {0x0093,0x0093,0x014b,0x014b}, {0x0097,0x0097,0x0143,0x0143}, {0x005b,0x005b,0x0017,0x0017}, {0x0187,0x0187,0x00d3,0x00d3}, {0x0044,0x0048,0x004c,0x0050}, {0x014f,0x014f,0x010f,0x010f}, {0x00d7,0x00d7,0x018b,0x018b}, {0x009b,0x009b,0x01c7,0x01c7}, {0x018d,0x0181,0x0019,0x0111}, {0x0058,0x005c,0x0060,0x0068}, {0x005d,0x0151,0x009d,0x0115}, {0x00d9,0x01c9,0x00dd,0x0119}, {0x0155,0x0191,0x01cd,0x0064}, {0x001f,0x001f,0x01c3,0x01c3}, {0x006c,0x0070,0x0074,0x0078}, {0x015b,0x015b,0x0197,0x0197}, {0x011f,0x011f,0x01d3,0x01d3}, {0x01d7,0x01d7,0x015f,0x015f}, {0x019d,0x0199,0x01d9,0x01dd} }; const USHORT HuffmanCodeBook_8[31][4] = { {0x0004,0x0008,0x0010,0x0024}, {0x0047,0x0047,0x0049,0x0005}, {0x0085,0x0041,0x0089,0x000c}, {0x0003,0x0003,0x000b,0x000b}, {0x0014,0x0018,0x001c,0x0020}, {0x0083,0x0083,0x004f,0x004f}, {0x00c7,0x00c7,0x008f,0x008f}, {0x00cb,0x00cb,0x00cd,0x0051}, {0x0105,0x0091,0x0109,0x000d}, {0x0028,0x002c,0x0040,0x0054}, {0x00c1,0x00d1,0x010d,0x0095}, {0x0030,0x0034,0x0038,0x003c}, {0x0057,0x0057,0x014b,0x014b}, {0x0147,0x0147,0x00d7,0x00d7}, {0x014f,0x014f,0x0113,0x0113}, {0x0117,0x0117,0x0103,0x0103}, {0x0044,0x0048,0x004c,0x0050}, {0x0153,0x0153,0x0013,0x0013}, {0x018b,0x018b,0x009b,0x009b}, {0x005b,0x005b,0x0187,0x0187}, {0x018d,0x00d9,0x0155,0x0015}, {0x0058,0x005c,0x0060,0x0068}, {0x0119,0x0141,0x0191,0x005d}, {0x009d,0x01c9,0x0159,0x00dd}, {0x01c5,0x0195,0x01cd,0x0064}, {0x019b,0x019b,0x011f,0x011f}, {0x006c,0x0070,0x0074,0x0078}, {0x001b,0x001b,0x01d3,0x01d3}, {0x0183,0x0183,0x015f,0x015f}, {0x019f,0x019f,0x01db,0x01db}, {0x01d5,0x001d,0x01c1,0x01dd} }; const USHORT HuffmanCodeBook_9[84][4] = { {0x0003,0x0003,0x0004,0x0008}, {0x0007,0x0007,0x0043,0x0043}, {0x0045,0x000c,0x0010,0x002c}, {0x0049,0x0085,0x0009,0x0081}, {0x0014,0x0018,0x001c,0x0020}, {0x004f,0x004f,0x008b,0x008b}, {0x00c7,0x00c7,0x000d,0x00c1}, {0x00c9,0x008d,0x0105,0x0051}, {0x0109,0x0145,0x0024,0x0028}, {0x0093,0x0093,0x00cf,0x00cf}, {0x0103,0x0103,0x0013,0x0013}, {0x0030,0x0044,0x0058,0x00a4}, {0x0034,0x0038,0x003c,0x0040}, {0x0057,0x0057,0x014b,0x014b}, {0x0187,0x0187,0x010f,0x010f}, {0x0097,0x0097,0x005b,0x005b}, {0x00d3,0x00d3,0x0141,0x0189}, {0x0048,0x004c,0x0050,0x0054}, {0x0015,0x01c5,0x014d,0x0205}, {0x0061,0x0111,0x00d5,0x0099}, {0x005d,0x0181,0x00a1,0x0209}, {0x018d,0x01c9,0x0151,0x0065}, {0x005c,0x0068,0x007c,0x0090}, {0x0245,0x009d,0x0060,0x0064}, {0x001b,0x001b,0x0117,0x0117}, {0x00db,0x00db,0x00e3,0x00e3}, {0x006c,0x0070,0x0074,0x0078}, {0x01c3,0x01c3,0x00a7,0x00a7}, {0x020f,0x020f,0x0193,0x0193}, {0x01cf,0x01cf,0x0203,0x0203}, {0x006b,0x006b,0x011b,0x011b}, {0x0080,0x0084,0x0088,0x008c}, {0x024b,0x024b,0x0157,0x0157}, {0x0023,0x0023,0x001f,0x001f}, {0x00df,0x00df,0x00ab,0x00ab}, {0x00e7,0x00e7,0x0123,0x0123}, {0x0094,0x0098,0x009c,0x00a0}, {0x0287,0x0287,0x011f,0x011f}, {0x015b,0x015b,0x0197,0x0197}, {0x0213,0x0213,0x01d3,0x01d3}, {0x024f,0x024f,0x006f,0x006f}, {0x00a8,0x00bc,0x00d0,0x00f4}, {0x00ac,0x00b0,0x00b4,0x00b8}, {0x0217,0x0217,0x0027,0x0027}, {0x0163,0x0163,0x00e9,0x0289}, {0x0241,0x00ad,0x0125,0x0199}, {0x0071,0x0251,0x01a1,0x02c5}, {0x00c0,0x00c4,0x00c8,0x00cc}, {0x0165,0x0129,0x01d5,0x015d}, {0x02c9,0x0305,0x00b1,0x00ed}, {0x028d,0x0255,0x01d9,0x01e1}, {0x012d,0x0281,0x019d,0x00f1}, {0x00d4,0x00d8,0x00dc,0x00e0}, {0x0029,0x0169,0x0291,0x0219}, {0x0309,0x01a5,0x01e5,0x02d1}, {0x002d,0x0259,0x02cd,0x0295}, {0x00e4,0x00e8,0x00ec,0x00f0}, {0x0223,0x0223,0x021f,0x021f}, {0x0173,0x0173,0x030f,0x030f}, {0x016f,0x016f,0x01df,0x01df}, {0x0133,0x0133,0x01af,0x01af}, {0x00f8,0x010c,0x0120,0x0134}, {0x00fc,0x0100,0x0104,0x0108}, {0x01ab,0x01ab,0x0313,0x0313}, {0x025f,0x025f,0x02d7,0x02d7}, {0x02c3,0x02c3,0x01b3,0x01b3}, {0x029b,0x029b,0x0033,0x0033}, {0x0110,0x0114,0x0118,0x011c}, {0x01eb,0x01eb,0x0317,0x0317}, {0x029f,0x029f,0x0227,0x0227}, {0x0303,0x0303,0x01ef,0x01ef}, {0x0263,0x0263,0x0267,0x0267}, {0x0124,0x0128,0x012c,0x0130}, {0x022b,0x022b,0x02df,0x02df}, {0x01f3,0x01f3,0x02db,0x02db}, {0x02e3,0x02e3,0x022f,0x022f}, {0x031f,0x031f,0x031b,0x031b}, {0x0138,0x013c,0x0140,0x0144}, {0x02a1,0x0269,0x0321,0x02a5}, {0x02e5,0x0325,0x02e9,0x0271}, {0x02a9,0x026d,0x0231,0x02ad}, {0x02b1,0x02f1,0x0148,0x014c}, {0x032b,0x032b,0x02ef,0x02ef}, {0x032f,0x032f,0x0333,0x0333} }; const USHORT HuffmanCodeBook_10[82][4] = { {0x0004,0x000c,0x0020,0x004c}, {0x0045,0x0085,0x0049,0x0008}, {0x008b,0x008b,0x0007,0x0007}, {0x0010,0x0014,0x0018,0x001c}, {0x0043,0x0043,0x00c7,0x00c7}, {0x008f,0x008f,0x004f,0x004f}, {0x00cb,0x00cb,0x00cf,0x00cf}, {0x0009,0x0081,0x0109,0x0091}, {0x0024,0x0028,0x002c,0x0038}, {0x0105,0x0051,0x0001,0x00d1}, {0x010d,0x000d,0x00c1,0x0111}, {0x0149,0x0095,0x0030,0x0034}, {0x0147,0x0147,0x0057,0x0057}, {0x00d7,0x00d7,0x014f,0x014f}, {0x003c,0x0040,0x0044,0x0048}, {0x0117,0x0117,0x0153,0x0153}, {0x009b,0x009b,0x018b,0x018b}, {0x00db,0x00db,0x0013,0x0013}, {0x005b,0x005b,0x0103,0x0103}, {0x0050,0x0064,0x0078,0x00c0}, {0x0054,0x0058,0x005c,0x0060}, {0x0187,0x0187,0x018f,0x018f}, {0x0157,0x0157,0x011b,0x011b}, {0x0193,0x0193,0x0159,0x009d}, {0x01cd,0x01c9,0x0195,0x00a1}, {0x0068,0x006c,0x0070,0x0074}, {0x00dd,0x0015,0x005d,0x0141}, {0x0061,0x01c5,0x00e1,0x011d}, {0x01d1,0x0209,0x0199,0x015d}, {0x0205,0x020d,0x0121,0x0211}, {0x007c,0x0084,0x0098,0x00ac}, {0x01d5,0x0161,0x0215,0x0080}, {0x019f,0x019f,0x01db,0x01db}, {0x0088,0x008c,0x0090,0x0094}, {0x00a7,0x00a7,0x001b,0x001b}, {0x021b,0x021b,0x00e7,0x00e7}, {0x024f,0x024f,0x0067,0x0067}, {0x024b,0x024b,0x0183,0x0183}, {0x009c,0x00a0,0x00a4,0x00a8}, {0x01a3,0x01a3,0x0127,0x0127}, {0x0253,0x0253,0x00ab,0x00ab}, {0x0247,0x0247,0x01df,0x01df}, {0x01e3,0x01e3,0x0167,0x0167}, {0x00b0,0x00b4,0x00b8,0x00bc}, {0x021f,0x021f,0x00eb,0x00eb}, {0x0257,0x0257,0x012b,0x012b}, {0x028b,0x028b,0x006b,0x006b}, {0x028f,0x028f,0x01a7,0x01a7}, {0x00c4,0x00d8,0x00ec,0x0100}, {0x00c8,0x00cc,0x00d0,0x00d4}, {0x025b,0x025b,0x0023,0x0023}, {0x0293,0x0293,0x001f,0x001f}, {0x00af,0x00af,0x025d,0x00ed}, {0x01a9,0x0285,0x006d,0x01e5}, {0x00dc,0x00e0,0x00e4,0x00e8}, {0x01c1,0x0221,0x0169,0x02cd}, {0x0295,0x0261,0x016d,0x0201}, {0x012d,0x02c9,0x029d,0x0299}, {0x01e9,0x02d1,0x02c5,0x00b1}, {0x00f0,0x00f4,0x00f8,0x00fc}, {0x0225,0x00f1,0x01ad,0x02d5}, {0x0131,0x01ed,0x0171,0x030d}, {0x02d9,0x0025,0x0229,0x0029}, {0x0071,0x0241,0x0311,0x0265}, {0x0104,0x010c,0x0120,0x0134}, {0x01b1,0x0309,0x02a1,0x0108}, {0x02a7,0x02a7,0x0307,0x0307}, {0x0110,0x0114,0x0118,0x011c}, {0x022f,0x022f,0x01f3,0x01f3}, {0x02df,0x02df,0x0317,0x0317}, {0x031b,0x031b,0x026b,0x026b}, {0x02e3,0x02e3,0x0233,0x0233}, {0x0124,0x0128,0x012c,0x0130}, {0x0283,0x0283,0x031f,0x031f}, {0x002f,0x002f,0x02ab,0x02ab}, {0x026f,0x026f,0x02af,0x02af}, {0x02c3,0x02c3,0x02ef,0x02ef}, {0x0138,0x013c,0x0140,0x0144}, {0x02e7,0x02e7,0x02eb,0x02eb}, {0x0033,0x0033,0x0323,0x0323}, {0x0271,0x0329,0x0325,0x032d}, {0x02f1,0x0301,0x02b1,0x0331} }; const USHORT HuffmanCodeBook_11[152][4] = { {0x0004,0x0010,0x0038,0x008c}, {0x0001,0x0085,0x0008,0x000c}, {0x0843,0x0843,0x0007,0x0007}, {0x0083,0x0083,0x008b,0x008b}, {0x0014,0x0018,0x001c,0x0024}, {0x0107,0x0107,0x010b,0x010b}, {0x0185,0x008d,0x010d,0x0009}, {0x0189,0x0101,0x018d,0x0020}, {0x0093,0x0093,0x0207,0x0207}, {0x0028,0x002c,0x0030,0x0034}, {0x0113,0x0113,0x020b,0x020b}, {0x0193,0x0193,0x020f,0x020f}, {0x000f,0x000f,0x0183,0x0183}, {0x0097,0x0097,0x0117,0x0117}, {0x003c,0x0050,0x0064,0x0078}, {0x0040,0x0044,0x0048,0x004c}, {0x028b,0x028b,0x0213,0x0213}, {0x0287,0x0287,0x0197,0x0197}, {0x028f,0x028f,0x0217,0x0217}, {0x0291,0x0119,0x0309,0x0099}, {0x0054,0x0058,0x005c,0x0060}, {0x0199,0x030d,0x0305,0x0811}, {0x080d,0x02c1,0x01c1,0x0241}, {0x0219,0x0341,0x0011,0x0311}, {0x0201,0x0809,0x0295,0x0815}, {0x0068,0x006c,0x0070,0x0074}, {0x03c1,0x0141,0x0441,0x0389}, {0x011d,0x038d,0x0299,0x0315}, {0x0819,0x0541,0x019d,0x009d}, {0x04c1,0x081d,0x0805,0x0385}, {0x007c,0x0080,0x0084,0x0088}, {0x0391,0x05c1,0x021d,0x0641}, {0x0821,0x00c1,0x0319,0x0825}, {0x0409,0x0395,0x0829,0x06c1}, {0x01a1,0x0121,0x040d,0x0015}, {0x0090,0x00c8,0x011c,0x0170}, {0x0094,0x0098,0x00a0,0x00b4}, {0x0741,0x082d,0x029d,0x0411}, {0x0399,0x031d,0x0281,0x009c}, {0x0223,0x0223,0x07c3,0x07c3}, {0x00a4,0x00a8,0x00ac,0x00b0}, {0x0833,0x0833,0x0407,0x0407}, {0x00a3,0x00a3,0x083b,0x083b}, {0x0417,0x0417,0x0837,0x0837}, {0x048f,0x048f,0x02a3,0x02a3}, {0x00b8,0x00bc,0x00c0,0x00c4}, {0x039f,0x039f,0x048b,0x048b}, {0x0323,0x0323,0x0127,0x0127}, {0x01a7,0x01a7,0x083f,0x083f}, {0x0493,0x0493,0x041b,0x041b}, {0x00cc,0x00e0,0x00f4,0x0108}, {0x00d0,0x00d4,0x00d8,0x00dc}, {0x001b,0x001b,0x0227,0x0227}, {0x0497,0x0497,0x03a3,0x03a3}, {0x041f,0x041f,0x0487,0x0487}, {0x01ab,0x01ab,0x0303,0x0303}, {0x00e4,0x00e8,0x00ec,0x00f0}, {0x012b,0x012b,0x00a7,0x00a7}, {0x02a7,0x02a7,0x0513,0x0513}, {0x050b,0x050b,0x0327,0x0327}, {0x050f,0x050f,0x049b,0x049b}, {0x00f8,0x00fc,0x0100,0x0104}, {0x022b,0x022b,0x0423,0x0423}, {0x02ab,0x02ab,0x03a7,0x03a7}, {0x01af,0x01af,0x0507,0x0507}, {0x001f,0x001f,0x032b,0x032b}, {0x010c,0x0110,0x0114,0x0118}, {0x049f,0x049f,0x058f,0x058f}, {0x0517,0x0517,0x00ab,0x00ab}, {0x0593,0x0593,0x012f,0x012f}, {0x0137,0x0137,0x051b,0x051b}, {0x0120,0x0134,0x0148,0x015c}, {0x0124,0x0128,0x012c,0x0130}, {0x01b7,0x01b7,0x058b,0x058b}, {0x0043,0x0043,0x0597,0x0597}, {0x02af,0x02af,0x022d,0x0425}, {0x051d,0x04a1,0x0801,0x0691}, {0x0138,0x013c,0x0140,0x0144}, {0x0381,0x068d,0x032d,0x00b5}, {0x0235,0x01b1,0x0689,0x02b5}, {0x0521,0x0599,0x0429,0x03a9}, {0x0139,0x0231,0x0585,0x0611}, {0x014c,0x0150,0x0154,0x0158}, {0x00ad,0x060d,0x0685,0x0131}, {0x059d,0x070d,0x0615,0x0695}, {0x0239,0x0711,0x03ad,0x01b9}, {0x02b1,0x0335,0x0331,0x0021}, {0x0160,0x0164,0x0168,0x016c}, {0x042d,0x0609,0x04a5,0x02b9}, {0x0699,0x0529,0x013d,0x05a1}, {0x0525,0x0339,0x04a9,0x0715}, {0x04ad,0x00b9,0x0709,0x0619}, {0x0174,0x0188,0x019c,0x01cc}, {0x0178,0x017c,0x0180,0x0184}, {0x0605,0x0435,0x0401,0x03b5}, {0x061d,0x03b1,0x069d,0x01bd}, {0x00b1,0x0719,0x0789,0x02bd}, {0x023d,0x0705,0x05a5,0x0791}, {0x018c,0x0190,0x0194,0x0198}, {0x03b9,0x06a1,0x04b5,0x0621}, {0x0795,0x078d,0x05a9,0x052d}, {0x0431,0x033d,0x03bd,0x0721}, {0x00bd,0x071d,0x0025,0x0481}, {0x01a0,0x01a4,0x01a8,0x01b8}, {0x06a5,0x0625,0x04b1,0x0439}, {0x06a9,0x04b9,0x0531,0x0799}, {0x079d,0x01ac,0x01b0,0x01b4}, {0x0727,0x0727,0x043f,0x043f}, {0x05af,0x05af,0x072f,0x072f}, {0x0787,0x0787,0x062b,0x062b}, {0x01bc,0x01c0,0x01c4,0x01c8}, {0x072b,0x072b,0x05b7,0x05b7}, {0x0537,0x0537,0x06af,0x06af}, {0x062f,0x062f,0x07a3,0x07a3}, {0x05bb,0x05bb,0x0637,0x0637}, {0x01d0,0x01e4,0x01f8,0x020c}, {0x01d4,0x01d8,0x01dc,0x01e0}, {0x06b3,0x06b3,0x04bf,0x04bf}, {0x053b,0x053b,0x002b,0x002b}, {0x05b3,0x05b3,0x07a7,0x07a7}, {0x0503,0x0503,0x0633,0x0633}, {0x01e8,0x01ec,0x01f0,0x01f4}, {0x002f,0x002f,0x0733,0x0733}, {0x07ab,0x07ab,0x06b7,0x06b7}, {0x0683,0x0683,0x063b,0x063b}, {0x053f,0x053f,0x05bf,0x05bf}, {0x01fc,0x0200,0x0204,0x0208}, {0x07af,0x07af,0x06bb,0x06bb}, {0x0037,0x0037,0x0583,0x0583}, {0x0737,0x0737,0x063f,0x063f}, {0x06bf,0x06bf,0x07b3,0x07b3}, {0x0210,0x0214,0x0218,0x021c}, {0x003b,0x003b,0x073b,0x073b}, {0x07b7,0x07b7,0x0033,0x0033}, {0x07bb,0x07bb,0x0701,0x0601}, {0x073d,0x003d,0x0781,0x07bd}, {0x0118,0x0117,0x0100,0x0109}, {0x05a5,0x05a1,0x05b7,0x0513}, {0x08f9,0x08ff,0x0821,0x08ff}, {0x084f,0x08ff,0x08bc,0x08ff}, {0x0815,0x08ff,0x0837,0x08ff}, {0x080d,0x08ff,0x085f,0x08ff}, {0x084a,0x08ff,0x087d,0x08ff}, {0x08ff,0x08ff,0x08a8,0x08ff}, {0x0815,0x08ff,0x083f,0x08ff}, {0x0830,0x08ff,0x0894,0x08ff}, {0x08d4,0x08ff,0x0825,0x08ff}, {0x08ef,0x08ff,0x083f,0x08ff}, {0x0809,0x08ff,0x08fc,0x08ff}, {0x0842,0x08ff,0x08b3,0x08ff}, {0x070d,0x07a9,0x060e,0x06e2}, {0x06c7,0x06d0,0x04b2,0x0407} }; const USHORT HuffmanCodeBook_SCL[65][4] = { {0x00f3,0x00f3,0x0004,0x0008}, {0x00ef,0x00ef,0x00f5,0x00e9}, {0x00f9,0x000c,0x0010,0x0014}, {0x00e7,0x00e7,0x00ff,0x00ff}, {0x00e1,0x0101,0x00dd,0x0105}, {0x0018,0x001c,0x0020,0x0028}, {0x010b,0x010b,0x00db,0x00db}, {0x010f,0x010f,0x00d5,0x0111}, {0x00d1,0x0115,0x00cd,0x0024}, {0x011b,0x011b,0x00cb,0x00cb}, {0x002c,0x0030,0x0034,0x0040}, {0x00c7,0x00c7,0x011f,0x011f}, {0x0121,0x00c1,0x0125,0x00bd}, {0x0129,0x00b9,0x0038,0x003c}, {0x0133,0x0133,0x012f,0x012f}, {0x0137,0x0137,0x013b,0x013b}, {0x0044,0x0048,0x004c,0x0058}, {0x00b7,0x00b7,0x00af,0x00af}, {0x00b1,0x013d,0x00a9,0x00a5}, {0x0141,0x00a1,0x0050,0x0054}, {0x0147,0x0147,0x009f,0x009f}, {0x014b,0x014b,0x009b,0x009b}, {0x005c,0x0060,0x0064,0x0070}, {0x014f,0x014f,0x0095,0x008d}, {0x0155,0x0085,0x0091,0x0089}, {0x0151,0x0081,0x0068,0x006c}, {0x015f,0x015f,0x0167,0x0167}, {0x007b,0x007b,0x007f,0x007f}, {0x0074,0x0078,0x0080,0x00b0}, {0x0159,0x0075,0x0069,0x006d}, {0x0071,0x0061,0x0161,0x007c}, {0x0067,0x0067,0x005b,0x005b}, {0x0084,0x0088,0x008c,0x009c}, {0x005f,0x005f,0x0169,0x0055}, {0x004d,0x000d,0x0005,0x0009}, {0x0001,0x0090,0x0094,0x0098}, {0x018b,0x018b,0x018f,0x018f}, {0x0193,0x0193,0x0197,0x0197}, {0x019b,0x019b,0x01d7,0x01d7}, {0x00a0,0x00a4,0x00a8,0x00ac}, {0x0187,0x0187,0x016f,0x016f}, {0x0173,0x0173,0x0177,0x0177}, {0x017b,0x017b,0x017f,0x017f}, {0x0183,0x0183,0x01a3,0x01a3}, {0x00b4,0x00c8,0x00dc,0x00f0}, {0x00b8,0x00bc,0x00c0,0x00c4}, {0x01bf,0x01bf,0x01c3,0x01c3}, {0x01c7,0x01c7,0x01cb,0x01cb}, {0x01cf,0x01cf,0x01d3,0x01d3}, {0x01bb,0x01bb,0x01a7,0x01a7}, {0x00cc,0x00d0,0x00d4,0x00d8}, {0x01ab,0x01ab,0x01af,0x01af}, {0x01b3,0x01b3,0x01b7,0x01b7}, {0x01db,0x01db,0x001b,0x001b}, {0x0023,0x0023,0x0027,0x0027}, {0x00e0,0x00e4,0x00e8,0x00ec}, {0x002b,0x002b,0x0017,0x0017}, {0x019f,0x019f,0x01e3,0x01e3}, {0x01df,0x01df,0x0013,0x0013}, {0x001f,0x001f,0x003f,0x003f}, {0x00f4,0x00f8,0x00fc,0x0100}, {0x0043,0x0043,0x004b,0x004b}, {0x0053,0x0053,0x0047,0x0047}, {0x002f,0x002f,0x0033,0x0033}, {0x003b,0x003b,0x0037,0x0037} }; /* .CodeBook = HuffmanCodeBook_x, .Dimension = 4, .numBits = 2, .Offset = 0 */ const CodeBookDescription AACcodeBookDescriptionTable[13] = { { NULL, 0, 0, 0 }, { HuffmanCodeBook_1, 4, 2, 1 }, { HuffmanCodeBook_2, 4, 2, 1 }, { HuffmanCodeBook_3, 4, 2, 0 }, { HuffmanCodeBook_4, 4, 2, 0 }, { HuffmanCodeBook_5, 2, 4, 4 }, { HuffmanCodeBook_6, 2, 4, 4 }, { HuffmanCodeBook_7, 2, 4, 0 }, { HuffmanCodeBook_8, 2, 4, 0 }, { HuffmanCodeBook_9, 2, 4, 0 }, { HuffmanCodeBook_10, 2, 4, 0 }, { HuffmanCodeBook_11, 2, 5, 0 }, { HuffmanCodeBook_SCL, 1, 8, 60 } }; const CodeBookDescription AACcodeBookDescriptionSCL = { HuffmanCodeBook_SCL, 1, 8, 60 }; /* ********************************************************************************************* */ /* Table: HuffTree41 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 1). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 4) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 4 */ /* --------------------------------------------------------------------------------------------- */ /* HuffTree */ const UINT aHuffTree41[80] = {0x4a0001,0x026002,0x013003,0x021004,0x01c005,0x00b006,0x010007,0x019008, 0x00900e,0x00a03a,0x400528,0x00c037,0x00d03b,0x454404,0x00f04c,0x448408, 0x017011,0x01202e,0x42c40c,0x034014,0x01502c,0x016049,0x410470,0x01804e, 0x414424,0x03201a,0x02001b,0x520418,0x02f01d,0x02a01e,0x01f04d,0x41c474, 0x540420,0x022024,0x04a023,0x428510,0x025029,0x430508,0x02703c,0x028047, 0x50c434,0x438478,0x04802b,0x46443c,0x02d03e,0x4404b0,0x44451c,0x03003f, 0x03104b,0x52444c,0x033039,0x4f0450,0x035041,0x036046,0x4e8458,0x04f038, 0x45c53c,0x4604e0,0x4f8468,0x46c4d4,0x04503d,0x4ac47c,0x518480,0x043040, 0x4844dc,0x042044,0x4884a8,0x4bc48c,0x530490,0x4a4494,0x4984b8,0x49c4c4, 0x5044b4,0x5004c0,0x4d04c8,0x4f44cc,0x4d8538,0x4ec4e4,0x52c4fc,0x514534}; /* ********************************************************************************************* */ /* Table: HuffTree42 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 2). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 4) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 4 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree42[80] = {0x026001,0x014002,0x009003,0x010004,0x01d005,0x00600d,0x007018,0x450008, 0x4e0400,0x02e00a,0x03900b,0x03d00c,0x43c404,0x01b00e,0x00f04f,0x4d8408, 0x023011,0x01203b,0x01a013,0x41440c,0x015020,0x016040,0x025017,0x500410, 0x038019,0x540418,0x41c444,0x02d01c,0x420520,0x01e042,0x03701f,0x4244cc, 0x02a021,0x02204c,0x478428,0x024031,0x42c4dc,0x4304e8,0x027033,0x4a0028, 0x50c029,0x4344a4,0x02c02b,0x470438,0x4404c8,0x4f8448,0x04902f,0x04b030, 0x44c484,0x524032,0x4ec454,0x03e034,0x035046,0x4c4036,0x488458,0x4d445c, 0x460468,0x04e03a,0x51c464,0x03c04a,0x46c514,0x47453c,0x04503f,0x47c4ac, 0x044041,0x510480,0x04304d,0x4e448c,0x490518,0x49449c,0x048047,0x4c0498, 0x4b84a8,0x4b0508,0x4fc4b4,0x4bc504,0x5304d0,0x5344f0,0x4f452c,0x528538}; /* ********************************************************************************************* */ /* Table: HuffTree43 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 3). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 4) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 4 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree43[80] = {0x400001,0x002004,0x00300a,0x46c404,0x00b005,0x00600d,0x034007,0x037008, 0x494009,0x4d8408,0x42440c,0x00c01b,0x490410,0x00e016,0x00f011,0x010014, 0x4144fc,0x01201d,0x020013,0x508418,0x4c0015,0x41c440,0x022017,0x018026, 0x019035,0x03801a,0x420444,0x01c01f,0x430428,0x02101e,0x44842c,0x478434, 0x4b4438,0x45443c,0x02c023,0x039024,0x02503f,0x48844c,0x030027,0x02e028, 0x032029,0x02a041,0x4d402b,0x4504f0,0x04302d,0x4584a8,0x02f03b,0x46045c, 0x03103d,0x464046,0x033044,0x46853c,0x47049c,0x045036,0x4744dc,0x4a047c, 0x500480,0x4ac03a,0x4b8484,0x03c04e,0x48c524,0x03e040,0x4984e8,0x50c4a4, 0x4b0530,0x042047,0x4bc04b,0x4e44c4,0x5184c8,0x52c4cc,0x5204d0,0x04d048, 0x04a049,0x4e004c,0x51c4ec,0x4f4510,0x5284f8,0x50404f,0x514538,0x540534}; /* ********************************************************************************************* */ /* Table: HuffTree44 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 4). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 4) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 4 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree44[80] = {0x001004,0x020002,0x036003,0x490400,0x005008,0x010006,0x01f007,0x404428, 0x00e009,0x01100a,0x00b018,0x01600c,0x03700d,0x408015,0x00f03e,0x40c424, 0x410478,0x022012,0x038013,0x01e014,0x454414,0x448418,0x025017,0x47441c, 0x030019,0x02601a,0x02d01b,0x01c034,0x01d029,0x4204f0,0x4dc42c,0x470430, 0x02103c,0x4a0434,0x02302a,0x440024,0x4384a8,0x43c44c,0x02703a,0x02802c, 0x444524,0x4504e0,0x02b03d,0x458480,0x45c4f4,0x04b02e,0x04f02f,0x460520, 0x042031,0x048032,0x049033,0x514464,0x03504c,0x540468,0x47c46c,0x4844d8, 0x039044,0x4884fc,0x03b045,0x48c53c,0x49449c,0x4b8498,0x03f046,0x041040, 0x4c44a4,0x50c4ac,0x04a043,0x5184b0,0x4e44b4,0x4bc4ec,0x04e047,0x4c04e8, 0x4c8510,0x4cc52c,0x4d0530,0x5044d4,0x53804d,0x5284f8,0x508500,0x51c534}; /* ********************************************************************************************* */ /* Table: HuffTree21 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 5). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree21[80] = {0x450001,0x044002,0x042003,0x035004,0x026005,0x022006,0x013007,0x010008, 0x00d009,0x01c00a,0x01f00b,0x01e00c,0x4a0400,0x01b00e,0x03200f,0x47e402, 0x020011,0x01204d,0x40449c,0x017014,0x015019,0x01603f,0x406458,0x01804f, 0x448408,0x04901a,0x40a45a,0x48c40c,0x01d031,0x40e48e,0x490410,0x492412, 0x021030,0x480414,0x033023,0x02402e,0x02503e,0x416482,0x02a027,0x02802c, 0x029040,0x418468,0x02b04a,0x41a486,0x02d048,0x41c484,0x04e02f,0x41e426, 0x420434,0x42249e,0x424494,0x03d034,0x428470,0x039036,0x03703b,0x038041, 0x42a476,0x03a04b,0x42c454,0x03c047,0x42e472,0x430478,0x43246e,0x496436, 0x488438,0x43a466,0x046043,0x43c464,0x04504c,0x43e462,0x460440,0x44245e, 0x45c444,0x46a446,0x44a456,0x47444c,0x45244e,0x46c47c,0x48a47a,0x49a498}; /* ********************************************************************************************* */ /* Table: HuffTree22 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 6). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree22[80] = {0x03c001,0x02f002,0x020003,0x01c004,0x00f005,0x00c006,0x016007,0x04d008, 0x00b009,0x01500a,0x400490,0x40e402,0x00d013,0x00e02a,0x40c404,0x019010, 0x011041,0x038012,0x40a406,0x014037,0x40849c,0x4a0410,0x04a017,0x458018, 0x412422,0x02801a,0x01b029,0x480414,0x02401d,0x01e02b,0x48a01f,0x416432, 0x02d021,0x026022,0x023039,0x418468,0x025043,0x48641a,0x027040,0x41c488, 0x41e48c,0x42045a,0x47c424,0x04c02c,0x46e426,0x03602e,0x428478,0x030033, 0x43c031,0x04b032,0x42e42a,0x03403a,0x035048,0x42c442,0x470430,0x494434, 0x43649a,0x45c438,0x04403b,0x43a454,0x04503d,0x03e03f,0x43e464,0x440460, 0x484444,0x049042,0x446448,0x44a456,0x46644c,0x047046,0x44e452,0x450462, 0x47445e,0x46a496,0x49846c,0x472476,0x47a482,0x04e04f,0x47e492,0x48e49e}; /* ********************************************************************************************* */ /* Table: HuffTree23 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 7). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree23[63] = {0x400001,0x002003,0x410402,0x004007,0x412005,0x01c006,0x420404,0x00800b, 0x01d009,0x00a01f,0x406026,0x00c012,0x00d00f,0x02700e,0x408440,0x010022, 0x028011,0x45440a,0x013017,0x029014,0x024015,0x01602f,0x43c40c,0x02b018, 0x019033,0x03201a,0x43e01b,0x47040e,0x422414,0x01e025,0x432416,0x020021, 0x418442,0x41a452,0x036023,0x41c446,0x46441e,0x424430,0x426434,0x436428, 0x44442a,0x02e02a,0x45642c,0x03002c,0x02d03b,0x46642e,0x43a438,0x460448, 0x031037,0x47244a,0x45a44c,0x034039,0x038035,0x47844e,0x462450,0x474458, 0x46a45c,0x03a03c,0x45e47a,0x476468,0x03d03e,0x47c46c,0x46e47e}; /* ********************************************************************************************* */ /* Table: HuffTree24 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 8). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree24[63] = {0x001006,0x01d002,0x005003,0x424004,0x400420,0x414402,0x00700a,0x008020, 0x00901f,0x404432,0x00b011,0x00c00e,0x00d032,0x406446,0x02300f,0x033010, 0x458408,0x025012,0x013016,0x01402f,0x015038,0x46840a,0x028017,0x01801a, 0x039019,0x40c47a,0x03e01b,0x03b01c,0x40e47e,0x41201e,0x422410,0x416434, 0x02a021,0x02202b,0x418444,0x02c024,0x41a456,0x02d026,0x027034,0x46241c, 0x029036,0x41e45c,0x426031,0x428430,0x45242a,0x03702e,0x42c464,0x03003c, 0x47442e,0x436442,0x438454,0x43a448,0x03503a,0x43c466,0x43e03d,0x44a440, 0x44c472,0x46044e,0x45a450,0x45e470,0x46a476,0x46c478,0x47c46e}; /* ********************************************************************************************* */ /* Table: HuffTree25 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 9). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree25[168] = {0x400001,0x002003,0x41a402,0x004007,0x41c005,0x035006,0x434404,0x008010, 0x00900c,0x04a00a,0x42000b,0x44e406,0x03600d,0x03800e,0x05a00f,0x408468, 0x01101a,0x012016,0x039013,0x070014,0x46e015,0x40a440,0x03b017,0x01804d, 0x01904f,0x4b840c,0x01b022,0x01c041,0x03f01d,0x01e020,0x01f05b,0x40e4ee, 0x02107c,0x45c410,0x02302c,0x024028,0x053025,0x026045,0x02707d,0x412522, 0x047029,0x05e02a,0x02b08a,0x526414,0x05602d,0x02e081,0x02f032,0x06e030, 0x031080,0x416544,0x079033,0x034091,0x41852c,0x43641e,0x04b037,0x42246a, 0x43c424,0x04c03a,0x426456,0x03c066,0x03d03e,0x482428,0x45842a,0x040072, 0x42c4ba,0x050042,0x04305c,0x044074,0x42e4be,0x06a046,0x4dc430,0x075048, 0x0490a3,0x44a432,0x450438,0x43a452,0x48443e,0x04e068,0x45a442,0x4d4444, 0x051088,0x052087,0x44648c,0x077054,0x4da055,0x50a448,0x057060,0x06b058, 0x05906d,0x44c4f6,0x46c454,0x45e474,0x06905d,0x460520,0x05f07e,0x462494, 0x061063,0x07f062,0x464496,0x06408b,0x08d065,0x542466,0x067071,0x4d2470, 0x4724ec,0x478476,0x53a47a,0x09b06c,0x47c4ac,0x4f847e,0x06f078,0x510480, 0x48649e,0x4884a0,0x07307b,0x49c48a,0x4a648e,0x098076,0x4904c0,0x4924ea, 0x4c8498,0x07a08e,0x51249a,0x4a24d6,0x5064a4,0x4f24a8,0x4aa4de,0x51e4ae, 0x4b0538,0x082092,0x083085,0x08f084,0x5464b2,0x096086,0x4ce4b4,0x4d04b6, 0x089090,0x4bc508,0x4c253e,0x08c0a4,0x5284c4,0x4e04c6,0x4ca4fa,0x5144cc, 0x4f04d8,0x4e24fc,0x09309c,0x094099,0x095097,0x4e4516,0x4e652e,0x4e84fe, 0x4f450c,0x09a09f,0x500502,0x50450e,0x09d0a0,0x09e0a5,0x518530,0x51a54a, 0x0a70a1,0x0a20a6,0x51c534,0x53c524,0x54052a,0x548532,0x536550,0x54c54e}; /* ********************************************************************************************* */ /* Table: HuffTree26 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 10). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree26[168] = {0x006001,0x002013,0x00300f,0x00400d,0x03b005,0x40046e,0x037007,0x00800a, 0x009067,0x402420,0x05600b,0x00c057,0x434404,0x06600e,0x406470,0x03c010, 0x059011,0x06f012,0x49e408,0x014019,0x03f015,0x016044,0x017042,0x079018, 0x4b840a,0x01a01f,0x01b047,0x07c01c,0x08701d,0x06901e,0x44640c,0x020027, 0x04b021,0x02204f,0x023025,0x02406b,0x40e4e0,0x081026,0x528410,0x02802c, 0x06c029,0x08f02a,0x02b078,0x53a412,0x05202d,0x02e033,0x02f031,0x0300a2, 0x4144ce,0x0a6032,0x416534,0x09a034,0x09f035,0x0360a7,0x54e418,0x03a038, 0x436039,0x43841a,0x41c41e,0x42246a,0x05803d,0x03e068,0x424484,0x04005b, 0x04107a,0x42645a,0x043093,0x4d2428,0x05e045,0x046072,0x42a45e,0x048060, 0x073049,0x04a098,0x42c4c4,0x07504c,0x09504d,0x04e09c,0x51042e,0x063050, 0x077051,0x43053c,0x053084,0x065054,0x4e4055,0x4fe432,0x43a454,0x43c46c, 0x43e486,0x07005a,0x4a0440,0x07105c,0x05d07b,0x45c442,0x05f08a,0x476444, 0x07f061,0x06206a,0x448506,0x06408e,0x52644a,0x54444c,0x45644e,0x452450, 0x488458,0x4604ec,0x4624f6,0x50e464,0x08206d,0x0a406e,0x542466,0x4a2468, 0x48a472,0x474089,0x4d8478,0x097074,0x47a508,0x08d076,0x47c4b6,0x51247e, 0x4804fc,0x4bc482,0x48c4a4,0x48e4d4,0x07d07e,0x4904da,0x49208b,0x094080, 0x49450c,0x4964e2,0x09d083,0x52a498,0x085091,0x0a5086,0x4cc49a,0x08808c, 0x4ee49c,0x4a64ba,0x4a84c0,0x4c24aa,0x4ac4f0,0x4ae4d0,0x4ca4b0,0x0900a1, 0x4b24ea,0x092099,0x4b4516,0x4d64be,0x4c650a,0x522096,0x4c8524,0x4dc4f2, 0x4de4f4,0x4e6548,0x09e09b,0x5384e8,0x5204f8,0x4fa53e,0x50051a,0x0a30a0, 0x502536,0x514504,0x51e518,0x54a51c,0x54052c,0x52e546,0x530532,0x54c550}; /* ********************************************************************************************* */ /* Table: HuffTree27 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the decode tree for spectral data (Codebook 11). */ /* bit 23 and 11 not used */ /* bit 22 and 10 determine end value */ /* bit 21-12 and 9-0 (offset to next node) or (index value * 2) */ /* --------------------------------------------------------------------------------------------- */ /* input: codeword */ /* --------------------------------------------------------------------------------------------- */ /* output: index * 2 */ /* --------------------------------------------------------------------------------------------- */ const UINT aHuffTree27[288] = {0x00100d,0x002006,0x003004,0x400424,0x047005,0x402446,0x048007,0x00800a, 0x00904c,0x44a404,0x07400b,0x00c0bb,0x466406,0x00e014,0x00f054,0x04e010, 0x051011,0x0a9012,0x0130bc,0x408464,0x01501f,0x01601a,0x017059,0x0af018, 0x0ca019,0x40a0e4,0x01b05e,0x01c084,0x0bf01d,0x05d01e,0x55a40c,0x020026, 0x021066,0x043022,0x023062,0x02408d,0x025108,0x40e480,0x027030,0x02802c, 0x02906b,0x02a0da,0x06502b,0x4105c8,0x0a402d,0x0ec02e,0x0dd02f,0x532412, 0x06e031,0x032036,0x03303e,0x0fd034,0x0fc035,0x4145b0,0x03703a,0x038117, 0x10d039,0x5ba416,0x10f03b,0x03c041,0x5fa03d,0x41c418,0x10403f,0x04011d, 0x41a5f4,0x11c042,0x41e61c,0x087044,0x0f5045,0x0d9046,0x4204a2,0x640422, 0x04904a,0x426448,0x04b073,0x428468,0x46c04d,0x48a42a,0x04f077,0x076050, 0x42c4b0,0x0520a7,0x096053,0x42e4a8,0x05507d,0x07a056,0x0d4057,0x0df058, 0x442430,0x05a081,0x05b09b,0x05c0e2,0x5b8432,0x4fe434,0x05f09e,0x0e6060, 0x0610d6,0x57c436,0x0cc063,0x112064,0x4384a0,0x43a5ca,0x067089,0x0680b7, 0x0690a2,0x0a106a,0x43c59c,0x09206c,0x06d0ba,0x60643e,0x0d106f,0x0700ee, 0x0de071,0x10b072,0x44056c,0x46a444,0x075094,0x48c44c,0x44e490,0x095078, 0x0ab079,0x4504ce,0x07b097,0x11e07c,0x630452,0x0ac07e,0x07f099,0x080106, 0x4544b8,0x0820b1,0x0830e5,0x4fc456,0x0b3085,0x08609d,0x45853e,0x0880c2, 0x5c045a,0x08a08f,0x08b0ce,0x08c0f7,0x58645c,0x11108e,0x45e5c4,0x0c4090, 0x10a091,0x4604e4,0x0d0093,0x462608,0x48e46e,0x4704b2,0x4d2472,0x0980bd, 0x4f2474,0x0e309a,0x4764aa,0x0be09c,0x47851a,0x47a4de,0x09f0b5,0x0a00c1, 0x50047c,0x57847e,0x0a30c3,0x504482,0x0e90a5,0x0a6100,0x4c8484,0x0a811f, 0x48662a,0x0c70aa,0x488494,0x4924d0,0x0ad0c8,0x0ae0d8,0x496636,0x10e0b0, 0x4f8498,0x0f30b2,0x49a4dc,0x0f20b4,0x53c49c,0x0b60cb,0x49e57a,0x0b80e0, 0x0b9109,0x5e44a4,0x5484a6,0x4ac4ae,0x4b44ca,0x4d64b6,0x4ba5da,0x0c60c0, 0x4bc51e,0x4be556,0x6204c0,0x4c24c4,0x0f80c5,0x5664c6,0x4cc53a,0x4d462c, 0x0f10c9,0x4d8552,0x4da4fa,0x5be4e0,0x0cd0ff,0x5244e2,0x0cf0e8,0x4e6568, 0x59a4e8,0x0f90d2,0x1010d3,0x5ac4ea,0x0d50d7,0x4ec634,0x4ee560,0x4f44f0, 0x4f6638,0x502522,0x0db0dc,0x5065a6,0x508604,0x60050a,0x50c0fb,0x63250e, 0x1130e1,0x5a4510,0x5125fc,0x516514,0x51863e,0x51c536,0x0e70f4,0x55c520, 0x602526,0x0eb0ea,0x5cc528,0x5ea52a,0x1140ed,0x60c52c,0x1020ef,0x0f0119, 0x58e52e,0x530622,0x558534,0x53861e,0x55e540,0x5800f6,0x57e542,0x5445e6, 0x5465e8,0x0fa115,0x54c54a,0x54e60e,0x5ae550,0x1160fe,0x5f0554,0x564562, 0x56a58a,0x56e5ee,0x10310c,0x5705d0,0x107105,0x5725d4,0x57463a,0x5765b4, 0x5825bc,0x5845e2,0x5885de,0x58c592,0x5ce590,0x5945f6,0x63c596,0x11b110, 0x5d8598,0x5c259e,0x5e05a0,0x5a25c6,0x5a860a,0x5aa5ec,0x5b2610,0x11a118, 0x6185b6,0x5f25d2,0x5d6616,0x5dc5f8,0x61a5fe,0x612614,0x62e624,0x626628}; /* get starting addresses of huffman tables into an array [convert codebook into starting address] */ /* cb tree */ const UINT *aHuffTable[MAX_CB] = {aHuffTree41, /* 0 - */ /* use tree 1 as dummy here */ aHuffTree41, /* 1 1 */ aHuffTree42, /* 2 2 */ aHuffTree43, /* 3 3 */ aHuffTree44, /* 4 4 */ aHuffTree21, /* 5 5 */ aHuffTree22, /* 6 6 */ aHuffTree23, /* 7 7 */ aHuffTree24, /* 8 8 */ aHuffTree25, /* 9 9 */ aHuffTree26, /* 10 10 */ aHuffTree27, /* 11 11 */ aHuffTree41, /* 12 - */ /* use tree 1 as dummy here */ aHuffTree41, /* 13 - */ /* use tree 1 as dummy here */ aHuffTree41, /* 14 - */ /* use tree 1 as dummy here */ aHuffTree41, /* 15 - */ /* use tree 1 as dummy here */ aHuffTree27, /* 16 11 */ aHuffTree27, /* 17 11 */ aHuffTree27, /* 18 11 */ aHuffTree27, /* 19 11 */ aHuffTree27, /* 20 11 */ aHuffTree27, /* 21 11 */ aHuffTree27, /* 22 11 */ aHuffTree27, /* 23 11 */ aHuffTree27, /* 24 11 */ aHuffTree27, /* 25 11 */ aHuffTree27, /* 26 11 */ aHuffTree27, /* 27 11 */ aHuffTree27, /* 28 11 */ aHuffTree27, /* 29 11 */ aHuffTree27, /* 30 11 */ aHuffTree27}; /* 31 11 */ /*--------------------------------------------------------------------------------------------- data-description: The following tables contain the quantized values. Two or four of the quantized values are indexed by the result of the decoding in the decoding tree (see tables above). -------------------------------------------------------------------------------------------- */ /* ********************************************************************************************* */ /* Table: ValTab41 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 1-2. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab41[324]={-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,1,-1,-1,0,-1, -1,-1,0,0,-1,-1,0,1,-1,-1,1,-1,-1,-1,1,0, -1,-1,1,1,-1,0,-1,-1,-1,0,-1,0,-1,0,-1,1, -1,0,0,-1,-1,0,0,0,-1,0,0,1,-1,0,1,-1, -1,0,1,0,-1,0,1,1,-1,1,-1,-1,-1,1,-1,0, -1,1,-1,1,-1,1,0,-1,-1,1,0,0,-1,1,0,1, -1,1,1,-1,-1,1,1,0,-1,1,1,1,0,-1,-1,-1, 0,-1,-1,0,0,-1,-1,1,0,-1,0,-1,0,-1,0,0, 0,-1,0,1,0,-1,1,-1,0,-1,1,0,0,-1,1,1, 0,0,-1,-1,0,0,-1,0,0,0,-1,1,0,0,0,-1, 0,0,0,0,0,0,0,1,0,0,1,-1,0,0,1,0, 0,0,1,1,0,1,-1,-1,0,1,-1,0,0,1,-1,1, 0,1,0,-1,0,1,0,0,0,1,0,1,0,1,1,-1, 0,1,1,0,0,1,1,1,1,-1,-1,-1,1,-1,-1,0, 1,-1,-1,1,1,-1,0,-1,1,-1,0,0,1,-1,0,1, 1,-1,1,-1,1,-1,1,0,1,-1,1,1,1,0,-1,-1, 1,0,-1,0,1,0,-1,1,1,0,0,-1,1,0,0,0, 1,0,0,1,1,0,1,-1,1,0,1,0,1,0,1,1, 1,1,-1,-1,1,1,-1,0,1,1,-1,1,1,1,0,-1, 1,1,0,0,1,1,0,1,1,1,1,-1,1,1,1,0, 1,1,1,1}; /* ********************************************************************************************* */ /* Table: ValTab42 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 3-4. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab42[324]={0,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, 0,0,1,1,0,0,1,2,0,0,2,0,0,0,2,1, 0,0,2,2,0,1,0,0,0,1,0,1,0,1,0,2, 0,1,1,0,0,1,1,1,0,1,1,2,0,1,2,0, 0,1,2,1,0,1,2,2,0,2,0,0,0,2,0,1, 0,2,0,2,0,2,1,0,0,2,1,1,0,2,1,2, 0,2,2,0,0,2,2,1,0,2,2,2,1,0,0,0, 1,0,0,1,1,0,0,2,1,0,1,0,1,0,1,1, 1,0,1,2,1,0,2,0,1,0,2,1,1,0,2,2, 1,1,0,0,1,1,0,1,1,1,0,2,1,1,1,0, 1,1,1,1,1,1,1,2,1,1,2,0,1,1,2,1, 1,1,2,2,1,2,0,0,1,2,0,1,1,2,0,2, 1,2,1,0,1,2,1,1,1,2,1,2,1,2,2,0, 1,2,2,1,1,2,2,2,2,0,0,0,2,0,0,1, 2,0,0,2,2,0,1,0,2,0,1,1,2,0,1,2, 2,0,2,0,2,0,2,1,2,0,2,2,2,1,0,0, 2,1,0,1,2,1,0,2,2,1,1,0,2,1,1,1, 2,1,1,2,2,1,2,0,2,1,2,1,2,1,2,2, 2,2,0,0,2,2,0,1,2,2,0,2,2,2,1,0, 2,2,1,1,2,2,1,2,2,2,2,0,2,2,2,1, 2,2,2,2}; /* ********************************************************************************************* */ /* Table: ValTab21 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 5-6. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab21[162]={-4,-4,-4,-3,-4,-2,-4,-1,-4,0,-4,1,-4,2,-4,3, -4,4,-3,-4,-3,-3,-3,-2,-3,-1,-3,0,-3,1,-3,2, -3,3,-3,4,-2,-4,-2,-3,-2,-2,-2,-1,-2,0,-2,1, -2,2,-2,3,-2,4,-1,-4,-1,-3,-1,-2,-1,-1,-1,0, -1,1,-1,2,-1,3,-1,4,0,-4,0,-3,0,-2,0,-1, 0,0,0,1,0,2,0,3,0,4,1,-4,1,-3,1,-2, 1,-1,1,0,1,1,1,2,1,3,1,4,2,-4,2,-3, 2,-2,2,-1,2,0,2,1,2,2,2,3,2,4,3,-4, 3,-3,3,-2,3,-1,3,0,3,1,3,2,3,3,3,4, 4,-4,4,-3,4,-2,4,-1,4,0,4,1,4,2,4,3, 4,4}; /* ********************************************************************************************* */ /* Table: ValTab22 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 7-8. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab22[128]={0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7, 1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7, 2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7, 3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7, 4,0,4,1,4,2,4,3,4,4,4,5,4,6,4,7, 5,0,5,1,5,2,5,3,5,4,5,5,5,6,5,7, 6,0,6,1,6,2,6,3,6,4,6,5,6,6,6,7, 7,0,7,1,7,2,7,3,7,4,7,5,7,6,7,7}; /* ********************************************************************************************* */ /* Table: ValTab23 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 9-10. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab23[338]={0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7, 0,8,0,9,0,10,0,11,0,12,1,0,1,1,1,2, 1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10, 1,11,1,12,2,0,2,1,2,2,2,3,2,4,2,5, 2,6,2,7,2,8,2,9,2,10,2,11,2,12,3,0, 3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8, 3,9,3,10,3,11,3,12,4,0,4,1,4,2,4,3, 4,4,4,5,4,6,4,7,4,8,4,9,4,10,4,11, 4,12,5,0,5,1,5,2,5,3,5,4,5,5,5,6, 5,7,5,8,5,9,5,10,5,11,5,12,6,0,6,1, 6,2,6,3,6,4,6,5,6,6,6,7,6,8,6,9, 6,10,6,11,6,12,7,0,7,1,7,2,7,3,7,4, 7,5,7,6,7,7,7,8,7,9,7,10,7,11,7,12, 8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7, 8,8,8,9,8,10,8,11,8,12,9,0,9,1,9,2, 9,3,9,4,9,5,9,6,9,7,9,8,9,9,9,10, 9,11,9,12,10,0,10,1,10,2,10,3,10,4,10,5, 10,6,10,7,10,8,10,9,10,10,10,11,10,12,11,0, 11,1,11,2,11,3,11,4,11,5,11,6,11,7,11,8, 11,9,11,10,11,11,11,12,12,0,12,1,12,2,12,3, 12,4,12,5,12,6,12,7,12,8,12,9,12,10,12,11, 12,12}; /* ********************************************************************************************* */ /* Table: ValTab24 */ /* --------------------------------------------------------------------------------------------- */ /* description: This table contains the quantized values for codebooks 11. */ /* --------------------------------------------------------------------------------------------- */ const SCHAR aValTab24[578]={0,0,0,1,0,2,0,3,0,4,0,5,0,6,0,7, 0,8,0,9,0,10,0,11,0,12,0,13,0,14,0,15, 0,16,1,0,1,1,1,2,1,3,1,4,1,5,1,6, 1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14, 1,15,1,16,2,0,2,1,2,2,2,3,2,4,2,5, 2,6,2,7,2,8,2,9,2,10,2,11,2,12,2,13, 2,14,2,15,2,16,3,0,3,1,3,2,3,3,3,4, 3,5,3,6,3,7,3,8,3,9,3,10,3,11,3,12, 3,13,3,14,3,15,3,16,4,0,4,1,4,2,4,3, 4,4,4,5,4,6,4,7,4,8,4,9,4,10,4,11, 4,12,4,13,4,14,4,15,4,16,5,0,5,1,5,2, 5,3,5,4,5,5,5,6,5,7,5,8,5,9,5,10, 5,11,5,12,5,13,5,14,5,15,5,16,6,0,6,1, 6,2,6,3,6,4,6,5,6,6,6,7,6,8,6,9, 6,10,6,11,6,12,6,13,6,14,6,15,6,16,7,0, 7,1,7,2,7,3,7,4,7,5,7,6,7,7,7,8, 7,9,7,10,7,11,7,12,7,13,7,14,7,15,7,16, 8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7, 8,8,8,9,8,10,8,11,8,12,8,13,8,14,8,15, 8,16,9,0,9,1,9,2,9,3,9,4,9,5,9,6, 9,7,9,8,9,9,9,10,9,11,9,12,9,13,9,14, 9,15,9,16,10,0,10,1,10,2,10,3,10,4,10,5, 10,6,10,7,10,8,10,9,10,10,10,11,10,12,10,13, 10,14,10,15,10,16,11,0,11,1,11,2,11,3,11,4, 11,5,11,6,11,7,11,8,11,9,11,10,11,11,11,12, 11,13,11,14,11,15,11,16,12,0,12,1,12,2,12,3, 12,4,12,5,12,6,12,7,12,8,12,9,12,10,12,11, 12,12,12,13,12,14,12,15,12,16,13,0,13,1,13,2, 13,3,13,4,13,5,13,6,13,7,13,8,13,9,13,10, 13,11,13,12,13,13,13,14,13,15,13,16,14,0,14,1, 14,2,14,3,14,4,14,5,14,6,14,7,14,8,14,9, 14,10,14,11,14,12,14,13,14,14,14,15,14,16,15,0, 15,1,15,2,15,3,15,4,15,5,15,6,15,7,15,8, 15,9,15,10,15,11,15,12,15,13,15,14,15,15,15,16, 16,0,16,1,16,2,16,3,16,4,16,5,16,6,16,7, 16,8,16,9,16,10,16,11,16,12,16,13,16,14,16,15, 16,16}; /* cb quant. val table */ const SCHAR *aQuantTable[] = {aValTab41, /* 0 - */ /* use quant. val talble 1 as dummy here */ aValTab41, /* 1 1 */ aValTab41, /* 2 1 */ aValTab42, /* 3 2 */ aValTab42, /* 4 2 */ aValTab21, /* 5 3 */ aValTab21, /* 6 3 */ aValTab22, /* 7 4 */ aValTab22, /* 8 4 */ aValTab23, /* 9 5 */ aValTab23, /* 10 5 */ aValTab24, /* 11 6 */ aValTab41, /* 12 - */ /* use quant. val talble 1 as dummy here */ aValTab41, /* 13 - */ /* use quant. val talble 1 as dummy here */ aValTab41, /* 14 - */ /* use quant. val talble 1 as dummy here */ aValTab41, /* 15 - */ /* use quant. val talble 1 as dummy here */ aValTab24, /* 16 6 */ aValTab24, /* 17 6 */ aValTab24, /* 18 6 */ aValTab24, /* 19 6 */ aValTab24, /* 20 6 */ aValTab24, /* 21 6 */ aValTab24, /* 22 6 */ aValTab24, /* 23 6 */ aValTab24, /* 24 6 */ aValTab24, /* 25 6 */ aValTab24, /* 26 6 */ aValTab24, /* 27 6 */ aValTab24, /* 28 6 */ aValTab24, /* 29 6 */ aValTab24, /* 30 6 */ aValTab24}; /* 31 6 */ /* arrays for HCR_TABLE_INFO structures */ /* maximum length of codeword in each codebook */ /* codebook: 0,1, 2,3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 */ const UCHAR aMaxCwLen[MAX_CB]={0,11,9,20,16,13,11,14,12,17,14,49,0, 0, 0, 0, 14,17,21,21,25,25,29,29,29,29,33,33,33,37,37,41}; /* 11 13 15 17 19 21 23 25 27 39 31 */ /* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22 24 26 28 30 */ const UCHAR aDimCb[MAX_CB] = {2,4,4,4,4,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; /* codebook dimension - zero cb got a dimension of 2 */ /* 11 13 15 17 19 21 23 25 27 39 31 */ /* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22 24 26 28 30 */ const UCHAR aDimCbShift[MAX_CB]={1,2,2,2,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; /* codebook dimension */ /* 1 -> decode sign bits */ /* 0 -> decode no sign bits 11 13 15 17 19 21 23 25 27 39 31 */ /* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22 24 26 28 30 */ const UCHAR aSignCb[MAX_CB]={0,0,0,1,1,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; /* arrays for HCR_CB_PAIRS structures */ const UCHAR aMinOfCbPair[MAX_CB_PAIRS]={0,1,3,5,7, 9,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,11}; const UCHAR aMaxOfCbPair[MAX_CB_PAIRS]={0,2,4,6,8,10,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,11}; /* priorities of codebooks */ const UCHAR aCbPriority[MAX_CB]={0,1,1,2,2,3,3,4,4,5,5,22,0,0,0,0,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21}; const SCHAR aCodebook2StartInt[] = {STOP_THIS_STATE , /* cb 0 */ BODY_ONLY , /* cb 1 */ BODY_ONLY , /* cb 2 */ BODY_SIGN__BODY , /* cb 3 */ BODY_SIGN__BODY , /* cb 4 */ BODY_ONLY , /* cb 5 */ BODY_ONLY , /* cb 6 */ BODY_SIGN__BODY , /* cb 7 */ BODY_SIGN__BODY , /* cb 8 */ BODY_SIGN__BODY , /* cb 9 */ BODY_SIGN__BODY , /* cb 10 */ BODY_SIGN_ESC__BODY, /* cb 11 */ STOP_THIS_STATE , /* cb 12 */ STOP_THIS_STATE , /* cb 13 */ STOP_THIS_STATE , /* cb 14 */ STOP_THIS_STATE , /* cb 15 */ BODY_SIGN_ESC__BODY, /* cb 16 */ BODY_SIGN_ESC__BODY, /* cb 17 */ BODY_SIGN_ESC__BODY, /* cb 18 */ BODY_SIGN_ESC__BODY, /* cb 19 */ BODY_SIGN_ESC__BODY, /* cb 20 */ BODY_SIGN_ESC__BODY, /* cb 21 */ BODY_SIGN_ESC__BODY, /* cb 22 */ BODY_SIGN_ESC__BODY, /* cb 23 */ BODY_SIGN_ESC__BODY, /* cb 24 */ BODY_SIGN_ESC__BODY, /* cb 25 */ BODY_SIGN_ESC__BODY, /* cb 26 */ BODY_SIGN_ESC__BODY, /* cb 27 */ BODY_SIGN_ESC__BODY, /* cb 28 */ BODY_SIGN_ESC__BODY, /* cb 29 */ BODY_SIGN_ESC__BODY, /* cb 30 */ BODY_SIGN_ESC__BODY}; /* cb 31 */ const STATEFUNC aStateConstant2State[] = {NULL , /* 0 = STOP_THIS_STATE */ Hcr_State_BODY_ONLY , /* 1 = BODY_ONLY */ Hcr_State_BODY_SIGN__BODY , /* 2 = BODY_SIGN__BODY */ Hcr_State_BODY_SIGN__SIGN , /* 3 = BODY_SIGN__SIGN */ Hcr_State_BODY_SIGN_ESC__BODY , /* 4 = BODY_SIGN_ESC__BODY */ Hcr_State_BODY_SIGN_ESC__SIGN , /* 5 = BODY_SIGN_ESC__SIGN */ Hcr_State_BODY_SIGN_ESC__ESC_PREFIX, /* 6 = BODY_SIGN_ESC__ESC_PREFIX */ Hcr_State_BODY_SIGN_ESC__ESC_WORD }; /* 7 = BODY_SIGN_ESC__ESC_WORD */ /* CB: 0 1 2 3 4 5 6 7 8 9 10 12 14 16 18 20 22 24 26 28 30 */ const USHORT aLargestAbsoluteValue[MAX_CB]={0,1,1,2,2,4,4,7,7,12,12,8191, 0, 0, 0, 0,15,31,47,63,95,127,159,191,223,255,319,383,511,767,1023,2047}; /* lav */ /* CB: 11 13 15 17 19 21 23 25 27 39 31 */ /* ------------------------------------------------------------------------------------------ description: The table 'HuffTreeRvlcEscape' contains the decode tree for the rvlc escape sequences. bit 23 and 11 not used bit 22 and 10 determine end value --> if set codeword is decoded bit 21-12 and 9-0 (offset to next node) or (index value) The escape sequence is the index value. input: codeword output: index ------------------------------------------------------------------------------------------ */ const UINT aHuffTreeRvlcEscape[53] = { 0x002001,0x400003,0x401004,0x402005,0x403007,0x404006,0x00a405,0x009008, 0x00b406,0x00c407,0x00d408,0x00e409,0x40b40a,0x40c00f,0x40d010,0x40e011, 0x40f012,0x410013,0x411014,0x412015,0x016413,0x414415,0x017416,0x417018, 0x419019,0x01a418,0x01b41a,0x01c023,0x03201d,0x01e020,0x43501f,0x41b41c, 0x021022,0x41d41e,0x41f420,0x02402b,0x025028,0x026027,0x421422,0x423424, 0x02902a,0x425426,0x427428,0x02c02f,0x02d02e,0x42942a,0x42b42c,0x030031, 0x42d42e,0x42f430,0x033034,0x431432,0x433434 }; /* ------------------------------------------------------------------------------------------ description: The table 'HuffTreeRvlc' contains the huffman decoding tree for the RVLC scale factors. The table contains 15 allowed, symmetric codewords and 8 forbidden codewords, which are used for error detection. usage of bits: bit 23 and 11 not used bit 22 and 10 determine end value --> if set codeword is decoded bit 21-12 and 9-0 (offset to next node within the table) or (index+7). The decoded (index+7) is in the range from 0,1,..,22. If the (index+7) is in the range 15,16,..,22, then a forbidden codeword is decoded. input: A single bit from a RVLC scalefactor codeword output: [if codeword is not completely decoded:] offset to next node within table or [if codeword is decoded:] A dpcm value i.e. (index+7) in range from 0,1,..,22. The differential scalefactor (DPCM value) named 'index' is calculated by subtracting 7 from the decoded value (index+7). ------------------------------------------------------------------------------------------ */ const UINT aHuffTreeRvlCodewds[22] = { 0x407001,0x002009,0x003406,0x004405,0x005404,0x006403,0x007400,0x008402, 0x411401,0x00a408,0x00c00b,0x00e409,0x01000d,0x40f40a,0x41400f,0x01340b, 0x011015,0x410012,0x41240c,0x416014,0x41540d,0x41340e }; const FIXP_WTB LowDelaySynthesis512[1536] = { /* part 0 */ WTC(0xdac984c0), WTC(0xdb100080), WTC(0xdb56cd00), WTC(0xdb9dec40), WTC(0xdbe55fc0), WTC(0xdc2d2880), WTC(0xdc754780), WTC(0xdcbdbd80), WTC(0xdd068a80), WTC(0xdd4fae80), WTC(0xdd992940), WTC(0xdde2f9c0), WTC(0xde2d1fc0), WTC(0xde779a80), WTC(0xdec26a00), WTC(0xdf0d8e00), WTC(0xdf590680), WTC(0xdfa4d540), WTC(0xdff0fc80), WTC(0xe03d7e20), WTC(0xe08a5900), WTC(0xe0d78a20), WTC(0xe1250cc0), WTC(0xe172dcc0), WTC(0xe1c0f7a0), WTC(0xe20f59a0), WTC(0xe25dfea0), WTC(0xe2ace400), WTC(0xe2fc0be0), WTC(0xe34b7bc0), WTC(0xe39b3c80), WTC(0xe3eb5260), WTC(0xe43bbac0), WTC(0xe48c7160), WTC(0xe4dd7140), WTC(0xe52eb600), WTC(0xe5803c00), WTC(0xe5d1fda0), WTC(0xe623f360), WTC(0xe6761700), WTC(0xe6c86400), WTC(0xe71ad500), WTC(0xe76d63e0), WTC(0xe7c00ba0), WTC(0xe812c8e0), WTC(0xe86598e0), WTC(0xe8b878e0), WTC(0xe90b68a0), WTC(0xe95e6c40), WTC(0xe9b18ae0), WTC(0xea04ce80), WTC(0xea583ba0), WTC(0xeaabcda0), WTC(0xeaff7ee0), WTC(0xeb5348e0), WTC(0xeba722c0), WTC(0xebfb0060), WTC(0xec4ed240), WTC(0xeca28540), WTC(0xecf60c20), WTC(0xed496120), WTC(0xed9c7e80), WTC(0xedef5e40), WTC(0xee41fc00), WTC(0xee945600), WTC(0xeee66ac0), WTC(0xef3839a0), WTC(0xef89c0e0), WTC(0xefdafda0), WTC(0xf02bed60), WTC(0xf07c8e80), WTC(0xf0cce000), WTC(0xf11ce220), WTC(0xf16c9620), WTC(0xf1bbfe30), WTC(0xf20b19e0), WTC(0xf259e5a0), WTC(0xf2a85dc0), WTC(0xf2f67ed0), WTC(0xf34445b0), WTC(0xf391aed0), WTC(0xf3deb590), WTC(0xf42b53e0), WTC(0xf4778140), WTC(0xf4c33190), WTC(0xf50e5660), WTC(0xf558df30), WTC(0xf5a2be50), WTC(0xf5ebea10), WTC(0xf6345780), WTC(0xf67bfab0), WTC(0xf6c2cee0), WTC(0xf708d7b0), WTC(0xf74e19c0), WTC(0xf7929a70), WTC(0xf7d66630), WTC(0xf8199268), WTC(0xf85c3860), WTC(0xf89e7480), WTC(0xf8e058c0), WTC(0xf921ec08), WTC(0xf9633800), WTC(0xf9a44980), WTC(0xf9e53158), WTC(0xfa260158), WTC(0xfa66ca18), WTC(0xfaa79ac0), WTC(0xfae87920), WTC(0xfb295fa0), WTC(0xfb6a42b8), WTC(0xfbab1240), WTC(0xfbebd1c0), WTC(0xfc2c9c24), WTC(0xfc6d8d90), WTC(0xfcaec240), WTC(0xfcf05684), WTC(0xfd326a98), WTC(0xfd75254c), WTC(0xfdb8afd4), WTC(0xfdfccdfc), WTC(0xfe40d694), WTC(0xfe84161c), WTC(0xfec5cf5a), WTC(0xff04e7fc), WTC(0xff3fdfe3), WTC(0xff751ddf), WTC(0xffa2fb0f), WTC(0xffc87c42), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0xbffb6081), WTC(0xbff22f81), WTC(0xbfe8fc01), WTC(0xbfdfc781), WTC(0xbfd69101), WTC(0xbfcd5a01), WTC(0xbfc42201), WTC(0xbfbae981), WTC(0xbfb1b101), WTC(0xbfa87901), WTC(0xbf9f4181), WTC(0xbf960b01), WTC(0xbf8cd481), WTC(0xbf839d81), WTC(0xbf7a6681), WTC(0xbf712f01), WTC(0xbf67f801), WTC(0xbf5ec101), WTC(0xbf558b01), WTC(0xbf4c5681), WTC(0xbf432281), WTC(0xbf39ee81), WTC(0xbf30bb01), WTC(0xbf278801), WTC(0xbf1e5501), WTC(0xbf152381), WTC(0xbf0bf381), WTC(0xbf02c581), WTC(0xbef99901), WTC(0xbef06d01), WTC(0xbee74281), WTC(0xbede1901), WTC(0xbed4f081), WTC(0xbecbca81), WTC(0xbec2a781), WTC(0xbeb98681), WTC(0xbeb06881), WTC(0xbea74c81), WTC(0xbe9e3281), WTC(0xbe951a81), WTC(0xbe8c0501), WTC(0xbe82f301), WTC(0xbe79e481), WTC(0xbe70da01), WTC(0xbe67d381), WTC(0xbe5ed081), WTC(0xbe55d001), WTC(0xbe4cd381), WTC(0xbe43da81), WTC(0xbe3ae601), WTC(0xbe31f701), WTC(0xbe290d01), WTC(0xbe202801), WTC(0xbe174781), WTC(0xbe0e6c01), WTC(0xbe059481), WTC(0xbdfcc301), WTC(0xbdf3f701), WTC(0xbdeb3101), WTC(0xbde27201), WTC(0xbdd9b981), WTC(0xbdd10681), WTC(0xbdc85981), WTC(0xbdbfb281), WTC(0xbdb71201), WTC(0xbdae7881), WTC(0xbda5e601), WTC(0xbd9d5b81), WTC(0xbd94d801), WTC(0xbd8c5c01), WTC(0xbd83e681), WTC(0xbd7b7781), WTC(0xbd731081), WTC(0xbd6ab101), WTC(0xbd625981), WTC(0xbd5a0b01), WTC(0xbd51c481), WTC(0xbd498601), WTC(0xbd414f01), WTC(0xbd391f81), WTC(0xbd30f881), WTC(0xbd28d981), WTC(0xbd20c401), WTC(0xbd18b781), WTC(0xbd10b381), WTC(0xbd08b781), WTC(0xbd00c381), WTC(0xbcf8d781), WTC(0xbcf0f381), WTC(0xbce91801), WTC(0xbce14601), WTC(0xbcd97c81), WTC(0xbcd1bb81), WTC(0xbcca0301), WTC(0xbcc25181), WTC(0xbcbaa801), WTC(0xbcb30601), WTC(0xbcab6c01), WTC(0xbca3db01), WTC(0xbc9c5281), WTC(0xbc94d201), WTC(0xbc8d5901), WTC(0xbc85e801), WTC(0xbc7e7e01), WTC(0xbc771c01), WTC(0xbc6fc101), WTC(0xbc686e01), WTC(0xbc612301), WTC(0xbc59df81), WTC(0xbc52a381), WTC(0xbc4b6e81), WTC(0xbc444081), WTC(0xbc3d1801), WTC(0xbc35f501), WTC(0xbc2ed681), WTC(0xbc27bd81), WTC(0xbc20ae01), WTC(0xbc19ab01), WTC(0xbc12b801), WTC(0xbc0bcf81), WTC(0xbc04e381), WTC(0xbbfde481), WTC(0xbbf6c601), WTC(0xbbef9b81), WTC(0xbbe89901), WTC(0xbbe1f401), WTC(0xbbdbe201), WTC(0xbbd68c81), WTC(0xbbd21281), WTC(0xbbce9181), WTC(0xbbcc2681), WTC(0xbbcaca01), WTC(0xbbca5081), WTC(0xbbca8d01), WTC(0xbbcb5301), WTC(0xbbcc8201), WTC(0xbbce0601), WTC(0xbbcfca81), WTC(0xbbd1bd81), WTC(0xbbd3e101), WTC(0xbbd64d01), WTC(0xbbd91b81), WTC(0xbbdc6481), WTC(0xbbe03801), WTC(0xbbe49d01), WTC(0xbbe99981), WTC(0xbbef3301), WTC(0xbbf56181), WTC(0xbbfc0f81), WTC(0xbc032601), WTC(0xbc0a8f01), WTC(0xbc123b81), WTC(0xbc1a2401), WTC(0xbc224181), WTC(0xbc2a8c81), WTC(0xbc330781), WTC(0xbc3bbc01), WTC(0xbc44b481), WTC(0xbc4dfb81), WTC(0xbc57a301), WTC(0xbc61c401), WTC(0xbc6c7781), WTC(0xbc77d601), WTC(0xbc83f201), WTC(0xbc90d481), WTC(0xbc9e8801), WTC(0xbcad1501), WTC(0xbcbc7e01), WTC(0xbcccbd01), WTC(0xbcddcc81), WTC(0xbcefa601), WTC(0xbd023f01), WTC(0xbd158801), WTC(0xbd297181), WTC(0xbd3deb81), WTC(0xbd52eb01), WTC(0xbd686681), WTC(0xbd7e5581), WTC(0xbd94b001), WTC(0xbdab7181), WTC(0xbdc29a81), WTC(0xbdda2a01), WTC(0xbdf22181), WTC(0xbe0a8581), WTC(0xbe236001), WTC(0xbe3cbc01), WTC(0xbe56a381), WTC(0xbe712001), WTC(0xbe8c3781), WTC(0xbea7f301), WTC(0xbec45881), WTC(0xbee17201), WTC(0xbeff4801), WTC(0xbf1de601), WTC(0xbf3d5501), WTC(0xbf5d9a81), WTC(0xbf7eb581), WTC(0xbfa0a581), WTC(0xbfc36a01), WTC(0xbfe6ed01), WTC(0xc00b04c0), WTC(0xc02f86c0), WTC(0xc0544940), WTC(0xc0792ec0), WTC(0xc09e2640), WTC(0xc0c31f00), WTC(0xc0e80a00), WTC(0xc10cf480), WTC(0xc1320940), WTC(0xc15773c0), WTC(0xc17d5f00), WTC(0xc1a3e340), WTC(0xc1cb05c0), WTC(0xc1f2cbc0), WTC(0xc21b3940), WTC(0xc2444b00), WTC(0xc26df5c0), WTC(0xc2982d80), WTC(0xc2c2e640), WTC(0xc2ee0a00), WTC(0xc3197940), WTC(0xc34513c0), WTC(0xc370b9c0), WTC(0xc39c4f00), WTC(0xc3c7bc00), WTC(0xc3f2e940), WTC(0xc41dc140), WTC(0xc44856c0), WTC(0xc472e640), WTC(0xc49dad80), WTC(0xc4c8e880), WTC(0xc4f4acc0), WTC(0xc520e840), WTC(0xc54d8780), WTC(0xc57a76c0), WTC(0xc5a79640), WTC(0xc5d4bac0), WTC(0xc601b880), WTC(0xc62e6580), WTC(0xc65ab600), WTC(0xc686bd40), WTC(0xc6b28fc0), WTC(0xc6de41c0), WTC(0xc709de40), WTC(0xc7356640), WTC(0xc760da80), WTC(0xc78c3c40), WTC(0xc7b78640), WTC(0xc7e2afc0), WTC(0xc80dae80), WTC(0xc83878c0), WTC(0xc86304c0), WTC(0xc88d4900), WTC(0xc8b73b80), WTC(0xc8e0d280), WTC(0xc90a0440), /* part 1 */ WTC(0xb5212e81), WTC(0xb4959501), WTC(0xb40ab501), WTC(0xb3808d81), WTC(0xb2f71f01), WTC(0xb26e6881), WTC(0xb1e66a01), WTC(0xb15f2381), WTC(0xb0d89401), WTC(0xb052bc01), WTC(0xafcd9a81), WTC(0xaf492f01), WTC(0xaec57801), WTC(0xae427481), WTC(0xadc02281), WTC(0xad3e8101), WTC(0xacbd9081), WTC(0xac3d5001), WTC(0xabbdc001), WTC(0xab3edf01), WTC(0xaac0ad01), WTC(0xaa432981), WTC(0xa9c65401), WTC(0xa94a2c01), WTC(0xa8ceb201), WTC(0xa853e501), WTC(0xa7d9c681), WTC(0xa7605601), WTC(0xa6e79401), WTC(0xa66f8201), WTC(0xa5f81f81), WTC(0xa5816e81), WTC(0xa50b6e81), WTC(0xa4962181), WTC(0xa4218801), WTC(0xa3ada281), WTC(0xa33a7201), WTC(0xa2c7f801), WTC(0xa2563501), WTC(0xa1e52a81), WTC(0xa174da81), WTC(0xa1054701), WTC(0xa0967201), WTC(0xa0285d81), WTC(0x9fbb0981), WTC(0x9f4e7801), WTC(0x9ee2a901), WTC(0x9e779f81), WTC(0x9e0d5e01), WTC(0x9da3e601), WTC(0x9d3b3b81), WTC(0x9cd35f81), WTC(0x9c6c5481), WTC(0x9c061b81), WTC(0x9ba0b701), WTC(0x9b3c2801), WTC(0x9ad87081), WTC(0x9a759301), WTC(0x9a139101), WTC(0x99b26c81), WTC(0x99522801), WTC(0x98f2c601), WTC(0x98944901), WTC(0x9836b201), WTC(0x97da0481), WTC(0x977e4181), WTC(0x97236b01), WTC(0x96c98381), WTC(0x96708b81), WTC(0x96188501), WTC(0x95c17081), WTC(0x956b4f81), WTC(0x95162381), WTC(0x94c1ee01), WTC(0x946eaf81), WTC(0x941c6901), WTC(0x93cb1c81), WTC(0x937acb01), WTC(0x932b7501), WTC(0x92dd1b01), WTC(0x928fbe01), WTC(0x92435d01), WTC(0x91f7f981), WTC(0x91ad9281), WTC(0x91642781), WTC(0x911bb981), WTC(0x90d44781), WTC(0x908dd101), WTC(0x90485401), WTC(0x9003ce81), WTC(0x8fc03f01), WTC(0x8f7da401), WTC(0x8f3bfb01), WTC(0x8efb4181), WTC(0x8ebb7581), WTC(0x8e7c9301), WTC(0x8e3e9481), WTC(0x8e017581), WTC(0x8dc53001), WTC(0x8d89be81), WTC(0x8d4f1b01), WTC(0x8d154081), WTC(0x8cdc2901), WTC(0x8ca3cb01), WTC(0x8c6c1b01), WTC(0x8c350d01), WTC(0x8bfe9401), WTC(0x8bc8a401), WTC(0x8b933001), WTC(0x8b5e2c81), WTC(0x8b298b81), WTC(0x8af53e81), WTC(0x8ac13381), WTC(0x8a8d5801), WTC(0x8a599a81), WTC(0x8a25f301), WTC(0x89f26101), WTC(0x89bee581), WTC(0x898b8301), WTC(0x89586901), WTC(0x8925f101), WTC(0x88f47901), WTC(0x88c45e81), WTC(0x88962981), WTC(0x886a8a81), WTC(0x88423301), WTC(0x881dd301), WTC(0x87fdd781), WTC(0x87d0ca81), WTC(0x87c76201), WTC(0x87bcab81), WTC(0x87b0ef01), WTC(0x87a48b01), WTC(0x8797dd81), WTC(0x878b4301), WTC(0x877ede01), WTC(0x87729701), WTC(0x87665481), WTC(0x8759fd01), WTC(0x874d8681), WTC(0x8740f681), WTC(0x87345381), WTC(0x8727a381), WTC(0x871ae981), WTC(0x870e2301), WTC(0x87014f81), WTC(0x86f46d81), WTC(0x86e77b81), WTC(0x86da7901), WTC(0x86cd6681), WTC(0x86c04381), WTC(0x86b30f01), WTC(0x86a5ca81), WTC(0x86987581), WTC(0x868b1001), WTC(0x867d9a81), WTC(0x86701381), WTC(0x86627b01), WTC(0x8654d001), WTC(0x86471281), WTC(0x86394301), WTC(0x862b6201), WTC(0x861d7081), WTC(0x860f6e01), WTC(0x86015981), WTC(0x85f33281), WTC(0x85e4f801), WTC(0x85d6a981), WTC(0x85c84801), WTC(0x85b9d481), WTC(0x85ab4f01), WTC(0x859cb781), WTC(0x858e0e01), WTC(0x857f5101), WTC(0x85707f81), WTC(0x85619a01), WTC(0x8552a181), WTC(0x85439601), WTC(0x85347901), WTC(0x85254a81), WTC(0x85160981), WTC(0x8506b581), WTC(0x84f74e01), WTC(0x84e7d381), WTC(0x84d84601), WTC(0x84c8a701), WTC(0x84b8f801), WTC(0x84a93801), WTC(0x84996701), WTC(0x84898481), WTC(0x84798f81), WTC(0x84698881), WTC(0x84597081), WTC(0x84494881), WTC(0x84391081), WTC(0x8428ca01), WTC(0x84187401), WTC(0x84080d81), WTC(0x83f79681), WTC(0x83e70f01), WTC(0x83d67881), WTC(0x83c5d381), WTC(0x83b52101), WTC(0x83a46181), WTC(0x83939501), WTC(0x8382ba01), WTC(0x8371d081), WTC(0x8360d901), WTC(0x834fd481), WTC(0x833ec381), WTC(0x832da781), WTC(0x831c8101), WTC(0x830b4f81), WTC(0x82fa1181), WTC(0x82e8c801), WTC(0x82d77201), WTC(0x82c61101), WTC(0x82b4a601), WTC(0x82a33281), WTC(0x8291b601), WTC(0x82803101), WTC(0x826ea201), WTC(0x825d0901), WTC(0x824b6601), WTC(0x8239b981), WTC(0x82280581), WTC(0x82164a81), WTC(0x82048881), WTC(0x81f2bf81), WTC(0x81e0ee81), WTC(0x81cf1581), WTC(0x81bd3401), WTC(0x81ab4b01), WTC(0x81995c01), WTC(0x81876781), WTC(0x81756d81), WTC(0x81636d81), WTC(0x81516701), WTC(0x813f5981), WTC(0x812d4481), WTC(0x811b2981), WTC(0x81090981), WTC(0x80f6e481), WTC(0x80e4bb81), WTC(0x80d28d81), WTC(0x80c05a01), WTC(0x80ae1f81), WTC(0x809bdf01), WTC(0x80899881), WTC(0x80774c81), WTC(0x8064fc81), WTC(0x8052a881), WTC(0x80405101), WTC(0x802df701), WTC(0x801b9b01), WTC(0x80093e01), WTC(0x0a74b120), WTC(0x0aa08a90), WTC(0x0acd2b80), WTC(0x0afa8860), WTC(0x0b289590), WTC(0x0b574790), WTC(0x0b8692d0), WTC(0x0bb66bb0), WTC(0x0be6c6b0), WTC(0x0c179830), WTC(0x0c48d500), WTC(0x0c7a7ad0), WTC(0x0cac9000), WTC(0x0cdf1b60), WTC(0x0d122390), WTC(0x0d45a8f0), WTC(0x0d79a5e0), WTC(0x0dae1480), WTC(0x0de2ef30), WTC(0x0e183800), WTC(0x0e4df8c0), WTC(0x0e843b90), WTC(0x0ebb0a20), WTC(0x0ef26430), WTC(0x0f2a3fc0), WTC(0x0f629280), WTC(0x0f9b5210), WTC(0x0fd47690), WTC(0x100dfa80), WTC(0x1047d8a0), WTC(0x10820b40), WTC(0x10bc8b80), WTC(0x10f75080), WTC(0x11325100), WTC(0x116d84e0), WTC(0x11a8ece0), WTC(0x11e49420), WTC(0x122085a0), WTC(0x125ccbc0), WTC(0x12995a40), WTC(0x12d60e80), WTC(0x1312c4c0), WTC(0x134f59e0), WTC(0x138bae60), WTC(0x13c7a740), WTC(0x140329e0), WTC(0x143e1b60), WTC(0x147862a0), WTC(0x14b1e840), WTC(0x14ea94c0), WTC(0x152250a0), WTC(0x15590380), WTC(0x158e93e0), WTC(0x15c2e820), WTC(0x15f5e6e0), WTC(0x162779a0), WTC(0x16578ca0), WTC(0x16860ca0), WTC(0x16b2e640), WTC(0x16de0b00), WTC(0x17077140), WTC(0x172f0fa0), WTC(0x1754e200), WTC(0x17796080), WTC(0x179d7f20), WTC(0x17c23760), WTC(0x17e87da0), WTC(0x1810cc80), WTC(0x183b25a0), WTC(0x18678520), WTC(0x1895e700), WTC(0x18c64540), WTC(0x18f89780), WTC(0x192cd560), WTC(0x1962f680), WTC(0x199af2a0), WTC(0x19d4c1e0), WTC(0x1a105ca0), WTC(0x1a4dbae0), WTC(0x1a8cd660), WTC(0x1acdaa60), WTC(0x1b103260), WTC(0x1b546940), WTC(0x1b9a4600), WTC(0x1be1bb80), WTC(0x1c2abc60), WTC(0x1c753b80), WTC(0x1cc13860), WTC(0x1d0ebe20), WTC(0x1d5dd8c0), WTC(0x1dae9480), WTC(0x1e010060), WTC(0x1e552f40), WTC(0x1eab33e0), WTC(0x1f032060), WTC(0x1f5cfce0), WTC(0x1fb8c660), WTC(0x201679c0), WTC(0x207611c0), WTC(0x20d75f00), WTC(0x213a0640), WTC(0x219dab80), WTC(0x2201f480), WTC(0x2266ba80), WTC(0x22cc0ac0), WTC(0x2331f4c0), WTC(0x23988940), WTC(0x23ffff40), WTC(0x2468b340), WTC(0x24d30300), WTC(0x253f4900), WTC(0x25ad8980), WTC(0x261d72c0), WTC(0x268eaec0), WTC(0x2700e880), WTC(0x2773db40), WTC(0x27e751c0), WTC(0x285b1780), WTC(0x28cefbc0), WTC(0x29431f80), WTC(0x29b7f680), WTC(0x2a2df780), WTC(0x2aa59880), WTC(0x2b1f3280), WTC(0x2b9b0140), WTC(0x2c194000), WTC(0x2c9a2540), WTC(0x2d1d8dc0), WTC(0x2da2fc40), WTC(0x2e29ee80), WTC(0x2eb1e340), WTC(0x2f3a4e40), WTC(0x2fc29980), WTC(0x304a2ec0), WTC(0x30d07cc0), WTC(0x315566c0), WTC(0x31d94480), WTC(0x325c72c0), WTC(0x32df51c0), WTC(0x33628c80), WTC(0x33e71a00), WTC(0x346df400), WTC(0x34f80dc0), WTC(0x3585c640), WTC(0x3616e700), WTC(0x36ab3380), WTC(0x37426ac0), WTC(0x37dbe840), WTC(0x3876a340), WTC(0x39118f40), WTC(0x39aba2c0), WTC(0x3a4422c0), WTC(0x3adaa200), WTC(0x3b6eb6c0), WTC(0x3bfffd80), WTC(0x3c8e9380), WTC(0x3d1b1780), WTC(0x3da62e00), WTC(0x3e307b00), WTC(0x3eba97c0), WTC(0x3f451280), WTC(0x3fd07940), WTC(0x405d577f), WTC(0x40ebf57f), WTC(0x417c59ff), WTC(0x420e897f), WTC(0x42a2857f), WTC(0x4338307f), WTC(0x43cf4d7f), WTC(0x44679cff), WTC(0x4500dfff), WTC(0x459ac2ff), WTC(0x4634e2ff), WTC(0x46ced9ff), WTC(0x4768437f), WTC(0x4800d27f), WTC(0x489850ff), WTC(0x492e88ff), WTC(0x49c346ff), WTC(0x4a5678ff), WTC(0x4ae82f7f), WTC(0x4b787c7f), WTC(0x4c07717f), WTC(0x4c95337f), WTC(0x4d21f77f), WTC(0x4dadf3ff), WTC(0x4e395eff), WTC(0x4ec4657f), WTC(0x4f4f297f), WTC(0x4fd9cd7f), WTC(0x5064737f), WTC(0x50ef3cff), WTC(0x517a46ff), WTC(0x5205b0ff), WTC(0x529197ff), WTC(0x531e04ff), WTC(0x53aaeb7f), WTC(0x54383eff), WTC(0x54c5ef7f), WTC(0x5553a8ff), WTC(0x55e0d57f), WTC(0x566cda7f), WTC(0x56f720ff), WTC(0x577f4aff), WTC(0x580534ff), WTC(0x5888bd7f), WTC(0x5909c6ff), WTC(0x598890ff), WTC(0x5a05b7ff), WTC(0x5a81db7f), WTC(0x5afd99ff), WTC(0x5b794a7f), WTC(0x5bf5007f), WTC(0x5c70cbff), WTC(0x5cecbb7f), WTC(0x5d68c47f), WTC(0x5de4c3ff), WTC(0x5e6094ff), WTC(0x5edc127f), WTC(0x5f56fdff), WTC(0x5fd1017f), WTC(0x6049c67f), WTC(0x60c0f67f), WTC(0x613650ff), WTC(0x61a9a9ff), WTC(0x621ad77f), WTC(0x6289b37f), WTC(0x62f67fff), WTC(0x6361e87f), WTC(0x63cc9bff), WTC(0x6437457f), WTC(0x64a2247f), WTC(0x650d0c7f), WTC(0x6577cc7f), WTC(0x65e2327f), WTC(0x664bf57f), WTC(0x66b4b5ff), WTC(0x671c137f), WTC(0x6781afff), WTC(0x67e579ff), WTC(0x6847abff), WTC(0x68a882ff), WTC(0x69083bff), WTC(0x6966fbff), WTC(0x69c4cfff), WTC(0x6a21c57f), WTC(0x6a7de87f), WTC(0x6ad9377f), WTC(0x6b33a5ff), WTC(0x6b8d257f), WTC(0x6be5a8ff), WTC(0x6c3d20ff), WTC(0x6c9380ff), WTC(0x6ce8ba7f), WTC(0x6d3cbfff), WTC(0x6d8f827f), /* part 2 */ WTC(0xad98b481), WTC(0xaead9d01), WTC(0xafbfc381), WTC(0xb0cf4d01), WTC(0xb1dc5f81), WTC(0xb2e72081), WTC(0xb3efb501), WTC(0xb4f64381), WTC(0xb5faf101), WTC(0xb6fde401), WTC(0xb7ff4001), WTC(0xb8ff1601), WTC(0xb9fd6181), WTC(0xbafa1d01), WTC(0xbbf54401), WTC(0xbceed101), WTC(0xbde6c081), WTC(0xbedd0e81), WTC(0xbfd1b701), WTC(0xc0c4b440), WTC(0xc1b5ffc0), WTC(0xc2a59340), WTC(0xc3936780), WTC(0xc47f78c0), WTC(0xc569c600), WTC(0xc6524d40), WTC(0xc7390dc0), WTC(0xc81e04c0), WTC(0xc9012e00), WTC(0xc9e28540), WTC(0xcac20700), WTC(0xcb9fb1c0), WTC(0xcc7b8640), WTC(0xcd558600), WTC(0xce2db200), WTC(0xcf0409c0), WTC(0xcfd88a40), WTC(0xd0ab3080), WTC(0xd17bfa00), WTC(0xd24ae640), WTC(0xd317f7c0), WTC(0xd3e33080), WTC(0xd4ac9340), WTC(0xd5741f40), WTC(0xd639d2c0), WTC(0xd6fdab00), WTC(0xd7bfa5c0), WTC(0xd87fc300), WTC(0xd93e0600), WTC(0xd9fa7180), WTC(0xdab50900), WTC(0xdb6dccc0), WTC(0xdc24ba80), WTC(0xdcd9d000), WTC(0xdd8d0b80), WTC(0xde3e6dc0), WTC(0xdeedf9c0), WTC(0xdf9bb340), WTC(0xe0479e20), WTC(0xe0f1bac0), WTC(0xe19a07e0), WTC(0xe2408380), WTC(0xe2e52c00), WTC(0xe38802e0), WTC(0xe4290c00), WTC(0xe4c84c20), WTC(0xe565c760), WTC(0xe6017f20), WTC(0xe69b7240), WTC(0xe7339f60), WTC(0xe7ca0500), WTC(0xe85ea480), WTC(0xe8f18180), WTC(0xe9829fc0), WTC(0xea1202e0), WTC(0xea9fab80), WTC(0xeb2b9700), WTC(0xebb5c2a0), WTC(0xec3e2bc0), WTC(0xecc4d300), WTC(0xed49bc80), WTC(0xedccec60), WTC(0xee4e66a0), WTC(0xeece2d80), WTC(0xef4c41e0), WTC(0xefc8a480), WTC(0xf0435610), WTC(0xf0bc5c60), WTC(0xf133c230), WTC(0xf1a99270), WTC(0xf21dd7b0), WTC(0xf29097e0), WTC(0xf301d3d0), WTC(0xf3718c20), WTC(0xf3dfc180), WTC(0xf44c7100), WTC(0xf4b79480), WTC(0xf52125b0), WTC(0xf5891df0), WTC(0xf5ef6fe0), WTC(0xf6540730), WTC(0xf6b6cf50), WTC(0xf717b490), WTC(0xf776b9a0), WTC(0xf7d3f720), WTC(0xf82f86e8), WTC(0xf8898260), WTC(0xf8e1fc50), WTC(0xf93900f0), WTC(0xf98e9c28), WTC(0xf9e2d940), WTC(0xfa35b4a0), WTC(0xfa871bd8), WTC(0xfad6fbd0), WTC(0xfb254250), WTC(0xfb71f0c0), WTC(0xfbbd1c28), WTC(0xfc06da60), WTC(0xfc4f40a4), WTC(0xfc965500), WTC(0xfcdc0e5c), WTC(0xfd2062f4), WTC(0xfd6348d0), WTC(0xfda4b1b8), WTC(0xfde48b2c), WTC(0xfe22c280), WTC(0xfe5f462a), WTC(0xfe9a1f2e), WTC(0xfed3711c), WTC(0xff0b60ac), WTC(0xff4212dd), WTC(0xff77b344), WTC(0xffac7407), WTC(0xffe08796), WTC(0x00141e37), WTC(0x00473665), WTC(0x00799cd0), WTC(0x00ab1bff), WTC(0x00db7d8b), WTC(0x010a75ea), WTC(0x0137a46e), WTC(0x0162a77a), WTC(0x018b20ac), WTC(0x01b0fb7a), WTC(0x01d46d3c), WTC(0x01f5ae7c), WTC(0x0214f91c), WTC(0x0232a5cc), WTC(0x024f2c04), WTC(0x026b048c), WTC(0x0286a628), WTC(0x02a25808), WTC(0x02be31c0), WTC(0x02da48e0), WTC(0x02f6b09c), WTC(0x031345dc), WTC(0x032faf50), WTC(0x034b9148), WTC(0x036690e8), WTC(0x0380658c), WTC(0x0398d8e4), WTC(0x03afb568), WTC(0x03c4c6e0), WTC(0x03d7f770), WTC(0x03e94f9c), WTC(0x03f8d938), WTC(0x04069ee8), WTC(0x0412bef8), WTC(0x041d6b30), WTC(0x0426d638), WTC(0x042f3288), WTC(0x0436ad98), WTC(0x043d6fd0), WTC(0x0443a170), WTC(0x04496a40), WTC(0x044ee728), WTC(0x04542a40), WTC(0x04594520), WTC(0x045e4890), WTC(0x04633210), WTC(0x0467ebe8), WTC(0x046c5f80), WTC(0x04707630), WTC(0x047417f0), WTC(0x04772b58), WTC(0x047996e8), WTC(0x047b4140), WTC(0x047c12a0), WTC(0x047bf520), WTC(0x047ad2e0), WTC(0x04789690), WTC(0x047539c8), WTC(0x0470c4b8), WTC(0x046b4058), WTC(0x0464b600), WTC(0x045d3a08), WTC(0x0454ebc8), WTC(0x044beb00), WTC(0x04425798), WTC(0x043853b0), WTC(0x042e0398), WTC(0x04238bd8), WTC(0x04190f98), WTC(0x040e9670), WTC(0x04040c18), WTC(0x03f95b30), WTC(0x03ee6e20), WTC(0x03e32b64), WTC(0x03d77598), WTC(0x03cb2f24), WTC(0x03be3b18), WTC(0x03b08b18), WTC(0x03a21f64), WTC(0x0392f8d4), WTC(0x038318e0), WTC(0x03728e94), WTC(0x03617694), WTC(0x034fee18), WTC(0x033e11f4), WTC(0x032bf530), WTC(0x0319a114), WTC(0x03071e80), WTC(0x02f475f4), WTC(0x02e1a7c0), WTC(0x02ceac04), WTC(0x02bb7a84), WTC(0x02a80af0), WTC(0x029452b0), WTC(0x028044e0), WTC(0x026bd488), WTC(0x0256f558), WTC(0x0241a940), WTC(0x022c0084), WTC(0x02160c08), WTC(0x01ffdc5a), WTC(0x01e97ad2), WTC(0x01d2e982), WTC(0x01bc2a2a), WTC(0x01a53e8c), WTC(0x018e2860), WTC(0x0176e94c), WTC(0x015f82fa), WTC(0x0147f70e), WTC(0x013046c2), WTC(0x011872e8), WTC(0x01007c4a), WTC(0x00e863cf), WTC(0x00d02c81), WTC(0x00b7db94), WTC(0x009f7651), WTC(0x00870204), WTC(0x006e83f8), WTC(0x00560176), WTC(0x003d7fcb), WTC(0x0025043f), WTC(0x000c941f), WTC(0xd65574c0), WTC(0xd5ebc100), WTC(0xd582d080), WTC(0xd51a9cc0), WTC(0xd4b31f80), WTC(0xd44c5280), WTC(0xd3e62f80), WTC(0xd380b040), WTC(0xd31bce40), WTC(0xd2b78380), WTC(0xd253ca40), WTC(0xd1f0acc0), WTC(0xd18e4580), WTC(0xd12caf40), WTC(0xd0cc0400), WTC(0xd06c40c0), WTC(0xd00d4740), WTC(0xcfaef6c0), WTC(0xcf513140), WTC(0xcef3fa80), WTC(0xce977a40), WTC(0xce3bd980), WTC(0xcde13f40), WTC(0xcd87a880), WTC(0xcd2ee800), WTC(0xccd6cf00), WTC(0xcc7f2f40), WTC(0xcc27e880), WTC(0xcbd0ea00), WTC(0xcb7a2380), WTC(0xcb238380), WTC(0xcaccee80), WTC(0xca763ec0), WTC(0xca1f4d00), WTC(0xc9c7f480), WTC(0xc9703b40), WTC(0xc9185200), WTC(0xc8c06b00), WTC(0xc868b4c0), WTC(0xc81100c0), WTC(0xc7b8c280), WTC(0xc75f6a40), WTC(0xc7046900), WTC(0xc6a74340), WTC(0xc6479300), WTC(0xc5e4f200), WTC(0xc57efac0), WTC(0xc5154880), WTC(0xc4a77780), WTC(0xc4352440), WTC(0xc3bdeac0), WTC(0xc3416740), WTC(0xc2bf33c0), WTC(0xc236eb40), WTC(0xc1a82900), WTC(0xc11290c0), WTC(0xc075cf00), WTC(0xbfd19081), WTC(0xbf258401), WTC(0xbe716d81), WTC(0xbdb52b81), WTC(0xbcf09a81), WTC(0xbc23af81), WTC(0xbb505c01), WTC(0xba7a9081), WTC(0xb9a65281), WTC(0xb8d79301), WTC(0xb8104c01), WTC(0xb7508181), WTC(0xb6982201), WTC(0xb5e71b01), WTC(0xb53d5b01), WTC(0xb49ad081), WTC(0xb3ff6901), WTC(0xb36b1301), WTC(0xb2ddbd01), WTC(0xb2575481), WTC(0xb1d7c801), WTC(0xb15f0601), WTC(0xb0ecfc01), WTC(0xb0819881), WTC(0xb01cca01), WTC(0xafbe7e01), WTC(0xaf66a301), WTC(0xaf152701), WTC(0xaec9f881), WTC(0xae850601), WTC(0xae463c81), WTC(0xae0d8b01), WTC(0xaddae001), WTC(0xadae2881), WTC(0xad875381), WTC(0xad664f81), WTC(0xad4b0981), WTC(0xad357081), WTC(0xad257301), WTC(0xad1afe01), WTC(0xad160081), WTC(0xad166901), WTC(0xad1c2481), WTC(0xad272201), WTC(0xad374f81), WTC(0xad4c9b01), WTC(0xad66f381), WTC(0xad864601), WTC(0xadaa8101), WTC(0xadd39301), WTC(0xae016a01), WTC(0xae33f481), WTC(0xae6b2001), WTC(0xaea6db01), WTC(0xaee71381), WTC(0xaf2bb801), WTC(0xaf74b681), WTC(0xafc1fd01), WTC(0xb0137a01), WTC(0xb0691b81), WTC(0xb0c2cf81), WTC(0xb1208481), WTC(0xb1822881), WTC(0xb1e7a981), WTC(0xb250f601), WTC(0xb2bdfc01), WTC(0xb32eaa01), WTC(0xb3a2ed01), WTC(0xb41ab481), WTC(0xb495ee01), WTC(0xb5148801), WTC(0xb5967081), WTC(0xb61b9581), WTC(0xb6a3e581), WTC(0xb72f4e01), WTC(0xb7bdbe01), WTC(0xb84f2381), WTC(0xb8e36c81), WTC(0xb97a8701), WTC(0xba146101), WTC(0xbab0e981), WTC(0xbb500d81), WTC(0xbbf1bc81), WTC(0xbc95e381), WTC(0xbd3c7181), WTC(0xbde55481), WTC(0xbe907a01), WTC(0xbf3dd101), WTC(0xbfed4701), WTC(0xc09ecac0), WTC(0xc1524a00), WTC(0xc207b300), WTC(0xc2bef440), WTC(0xc377fb80), WTC(0xc432b700), WTC(0xc4ef1500), WTC(0xc5ad03c0), WTC(0xc66c7140), WTC(0xc72d4bc0), WTC(0xc7ef8180), WTC(0xc8b30080), WTC(0xc977b700), WTC(0xca3d9340), WTC(0xcb048340), WTC(0xcbcc7540), WTC(0xcc955740), WTC(0xcd5f17c0), WTC(0xce29a480), WTC(0xcef4ec00), WTC(0xcfc0dc80), WTC(0xd08d63c0), WTC(0xd15a7040), WTC(0xd227f000), WTC(0xd2f5d140), WTC(0xd3c40240), WTC(0xd4927100), WTC(0xd5610b80), WTC(0xd62fc080), WTC(0xd6fe7dc0), WTC(0xd7cd3140), WTC(0xd89bc980), WTC(0xd96a34c0), WTC(0xda3860c0), WTC(0xdb063c00), WTC(0xdbd3b480), WTC(0xdca0b880), WTC(0xdd6d3640), WTC(0xde391bc0), WTC(0xdf045740), WTC(0xdfced6c0), WTC(0xe09888c0), WTC(0xe1615b20), WTC(0xe2293c20), WTC(0xe2f01a00), WTC(0xe3b5e2c0), WTC(0xe47a84c0), WTC(0xe53dee00), WTC(0xe6000cc0), WTC(0xe6c0cf20), WTC(0xe7802360), WTC(0xe83df7a0), WTC(0xe8fa39e0), WTC(0xe9b4d880), WTC(0xea6dc1a0), WTC(0xeb24e360), WTC(0xebda2be0), WTC(0xec8d8960), WTC(0xed3eea20), WTC(0xedee3c00), WTC(0xee9b6d80), WTC(0xef466ca0), WTC(0xefef2780), WTC(0xf0958c50), WTC(0xf1398950), WTC(0xf1db0ca0), WTC(0xf27a0470), WTC(0xf3165ed0), WTC(0xf3b00a10), WTC(0xf446f440), WTC(0xf4db0b90), WTC(0xf56c3e30), WTC(0xf5fa7a50), WTC(0xf685ae10), WTC(0xf70dc7a0), WTC(0xf792b520), WTC(0xf81464c8), WTC(0xf892c4c0), WTC(0xf90dc330), WTC(0xf9854e40), WTC(0xf9f95418), WTC(0xfa69c2f0), WTC(0xfad688e8), WTC(0xfb3f9428), WTC(0xfba4d2e8), WTC(0xfc063344), WTC(0xfc63a370), WTC(0xfcbd1194), WTC(0xfd126bdc), WTC(0xfd63a06c), WTC(0xfdb09d78), WTC(0xfdf95124), WTC(0xfe3da99e), WTC(0xfe7d950e), WTC(0xfeb901a2), WTC(0xfeefdd80), WTC(0xff2216d7), WTC(0xff4f9bcf), WTC(0xff785a93), WTC(0xff9c414e), WTC(0xffbb3e2b), WTC(0xffd53f54), WTC(0xffea32f4), WTC(0xfffa0735), WTC(0x0004aa43), WTC(0x000a0a47), WTC(0x000a156c), WTC(0x0004b9de), WTC(0xfff9e5c5), WTC(0xffe9874e) }; const FIXP_WTB LowDelaySynthesis480[1440] = { WTC(0xdad2e6c0), WTC(0xdb1da900), WTC(0xdb68ce40), WTC(0xdbb45840), WTC(0xdc004940), WTC(0xdc4ca280), WTC(0xdc996500), WTC(0xdce69140), WTC(0xdd342780), WTC(0xdd822700), WTC(0xddd08a80), WTC(0xde1f4d00), WTC(0xde6e6ec0), WTC(0xdebdec40), WTC(0xdf0dba80), WTC(0xdf5dd540), WTC(0xdfae3cc0), WTC(0xdfff0500), WTC(0xe0505140), WTC(0xe0a22980), WTC(0xe0f488e0), WTC(0xe1476180), WTC(0xe19aa480), WTC(0xe1ee4d80), WTC(0xe2425400), WTC(0xe29689a0), WTC(0xe2eacd60), WTC(0xe33f2420), WTC(0xe393a300), WTC(0xe3e87f20), WTC(0xe43dcee0), WTC(0xe4938a80), WTC(0xe4e9b0a0), WTC(0xe5404300), WTC(0xe5973e60), WTC(0xe5ee9b80), WTC(0xe64649e0), WTC(0xe69e37e0), WTC(0xe6f65ec0), WTC(0xe74eb6c0), WTC(0xe7a73000), WTC(0xe7ffbe40), WTC(0xe8585ee0), WTC(0xe8b10740), WTC(0xe9099c40), WTC(0xe96214e0), WTC(0xe9ba79a0), WTC(0xea12e7c0), WTC(0xea6b89c0), WTC(0xeac46580), WTC(0xeb1d7260), WTC(0xeb76b620), WTC(0xebd036c0), WTC(0xec29e520), WTC(0xec83aa60), WTC(0xecdd5a00), WTC(0xed36d500), WTC(0xed901540), WTC(0xede91160), WTC(0xee41bc20), WTC(0xee9a0ee0), WTC(0xeef20860), WTC(0xef49a7e0), WTC(0xefa0ec00), WTC(0xeff7d1c0), WTC(0xf04e56b0), WTC(0xf0a476e0), WTC(0xf0fa2f60), WTC(0xf14f80e0), WTC(0xf1a46e10), WTC(0xf1f8fe80), WTC(0xf24d34a0), WTC(0xf2a10bb0), WTC(0xf2f48210), WTC(0xf3479cc0), WTC(0xf39a5be0), WTC(0xf3ecb8f0), WTC(0xf43eafa0), WTC(0xf4903b50), WTC(0xf4e14e80), WTC(0xf531d6a0), WTC(0xf581bc10), WTC(0xf5d0e9c0), WTC(0xf61f5250), WTC(0xf66ce6e0), WTC(0xf6b99330), WTC(0xf7054eb0), WTC(0xf7501f20), WTC(0xf79a0750), WTC(0xf7e30700), WTC(0xf82b2fc0), WTC(0xf872a138), WTC(0xf8b97f18), WTC(0xf8ffe668), WTC(0xf945e538), WTC(0xf98b8860), WTC(0xf9d0f380), WTC(0xfa165148), WTC(0xfa5bb8a8), WTC(0xfaa13df8), WTC(0xfae6fb00), WTC(0xfb2cf8c8), WTC(0xfb732a80), WTC(0xfbb97910), WTC(0xfbffcd10), WTC(0xfc463478), WTC(0xfc8cd3fc), WTC(0xfcd3be5c), WTC(0xfd1afa90), WTC(0xfd62aa84), WTC(0xfdab0288), WTC(0xfdf404b4), WTC(0xfe3d3006), WTC(0xfe85b20e), WTC(0xfecca4cc), WTC(0xff10d559), WTC(0xff50579b), WTC(0xff8a40d2), WTC(0xffb7d86e), WTC(0xffef6bbb), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0x00000000), WTC(0xbff67a01), WTC(0xbfecaa81), WTC(0xbfe2d901), WTC(0xbfd90601), WTC(0xbfcf3181), WTC(0xbfc55c81), WTC(0xbfbb8701), WTC(0xbfb1b101), WTC(0xbfa7dc01), WTC(0xbf9e0701), WTC(0xbf943301), WTC(0xbf8a5f81), WTC(0xbf808b81), WTC(0xbf76b701), WTC(0xbf6ce201), WTC(0xbf630d81), WTC(0xbf593a01), WTC(0xbf4f6801), WTC(0xbf459681), WTC(0xbf3bc601), WTC(0xbf31f501), WTC(0xbf282501), WTC(0xbf1e5501), WTC(0xbf148681), WTC(0xbf0aba01), WTC(0xbf00ef81), WTC(0xbef72681), WTC(0xbeed5f01), WTC(0xbee39801), WTC(0xbed9d281), WTC(0xbed00f81), WTC(0xbec64e81), WTC(0xbebc9181), WTC(0xbeb2d681), WTC(0xbea91f01), WTC(0xbe9f6901), WTC(0xbe95b581), WTC(0xbe8c0501), WTC(0xbe825801), WTC(0xbe78b001), WTC(0xbe6f0c01), WTC(0xbe656c01), WTC(0xbe5bd001), WTC(0xbe523781), WTC(0xbe48a301), WTC(0xbe3f1381), WTC(0xbe358901), WTC(0xbe2c0501), WTC(0xbe228681), WTC(0xbe190d81), WTC(0xbe0f9a01), WTC(0xbe062b81), WTC(0xbdfcc301), WTC(0xbdf36101), WTC(0xbdea0681), WTC(0xbde0b301), WTC(0xbdd76701), WTC(0xbdce2181), WTC(0xbdc4e301), WTC(0xbdbbab01), WTC(0xbdb27b01), WTC(0xbda95301), WTC(0xbda03381), WTC(0xbd971c81), WTC(0xbd8e0e01), WTC(0xbd850701), WTC(0xbd7c0781), WTC(0xbd731081), WTC(0xbd6a2201), WTC(0xbd613d81), WTC(0xbd586281), WTC(0xbd4f9101), WTC(0xbd46c801), WTC(0xbd3e0801), WTC(0xbd355081), WTC(0xbd2ca281), WTC(0xbd23ff01), WTC(0xbd1b6501), WTC(0xbd12d581), WTC(0xbd0a4f81), WTC(0xbd01d281), WTC(0xbcf95e81), WTC(0xbcf0f381), WTC(0xbce89281), WTC(0xbce03b81), WTC(0xbcd7ef01), WTC(0xbccfac01), WTC(0xbcc77181), WTC(0xbcbf4001), WTC(0xbcb71701), WTC(0xbcaef701), WTC(0xbca6e101), WTC(0xbc9ed481), WTC(0xbc96d101), WTC(0xbc8ed701), WTC(0xbc86e581), WTC(0xbc7efc81), WTC(0xbc771c01), WTC(0xbc6f4401), WTC(0xbc677501), WTC(0xbc5fae81), WTC(0xbc57f101), WTC(0xbc503b81), WTC(0xbc488e81), WTC(0xbc40e881), WTC(0xbc394901), WTC(0xbc31af01), WTC(0xbc2a1a81), WTC(0xbc228f01), WTC(0xbc1b1081), WTC(0xbc13a481), WTC(0xbc0c4581), WTC(0xbc04e381), WTC(0xbbfd6c01), WTC(0xbbf5d181), WTC(0xbbee2f81), WTC(0xbbe6c801), WTC(0xbbdfdb81), WTC(0xbbd9a781), WTC(0xbbd45881), WTC(0xbbd01301), WTC(0xbbccfc81), WTC(0xbbcb2281), WTC(0xbbca5d01), WTC(0xbbca7481), WTC(0xbbcb3201), WTC(0xbbcc6b01), WTC(0xbbce0601), WTC(0xbbcfea81), WTC(0xbbd20301), WTC(0xbbd45601), WTC(0xbbd70201), WTC(0xbbda2501), WTC(0xbbdddb01), WTC(0xbbe23281), WTC(0xbbe73201), WTC(0xbbece281), WTC(0xbbf34281), WTC(0xbbfa3c01), WTC(0xbc01b381), WTC(0xbc098d81), WTC(0xbc11b681), WTC(0xbc1a2401), WTC(0xbc22cd81), WTC(0xbc2bab01), WTC(0xbc34c081), WTC(0xbc3e1981), WTC(0xbc47c281), WTC(0xbc51cb01), WTC(0xbc5c4c81), WTC(0xbc676501), WTC(0xbc733401), WTC(0xbc7fd301), WTC(0xbc8d5101), WTC(0xbc9bb901), WTC(0xbcab1781), WTC(0xbcbb7001), WTC(0xbcccbd01), WTC(0xbcdef701), WTC(0xbcf21601), WTC(0xbd060c81), WTC(0xbd1ac801), WTC(0xbd303581), WTC(0xbd464281), WTC(0xbd5ce281), WTC(0xbd740b81), WTC(0xbd8bb281), WTC(0xbda3d081), WTC(0xbdbc6381), WTC(0xbdd56b81), WTC(0xbdeee981), WTC(0xbe08e181), WTC(0xbe236001), WTC(0xbe3e7201), WTC(0xbe5a2301), WTC(0xbe767e81), WTC(0xbe938c81), WTC(0xbeb15701), WTC(0xbecfe601), WTC(0xbeef4601), WTC(0xbf0f8301), WTC(0xbf30a901), WTC(0xbf52c101), WTC(0xbf75cc81), WTC(0xbf99cb01), WTC(0xbfbebb81), WTC(0xbfe48981), WTC(0xc00b04c0), WTC(0xc031f880), WTC(0xc0593340), WTC(0xc0809280), WTC(0xc0a802c0), WTC(0xc0cf6ec0), WTC(0xc0f6cc00), WTC(0xc11e3a80), WTC(0xc145f040), WTC(0xc16e22c0), WTC(0xc196fb00), WTC(0xc1c08680), WTC(0xc1eaca00), WTC(0xc215cbc0), WTC(0xc2418940), WTC(0xc26df5c0), WTC(0xc29b02c0), WTC(0xc2c8a140), WTC(0xc2f6b500), WTC(0xc3251740), WTC(0xc353a0c0), WTC(0xc3822c00), WTC(0xc3b09940), WTC(0xc3deccc0), WTC(0xc40ca800), WTC(0xc43a28c0), WTC(0xc4678a00), WTC(0xc4951780), WTC(0xc4c31d00), WTC(0xc4f1bdc0), WTC(0xc520e840), WTC(0xc5508440), WTC(0xc5807900), WTC(0xc5b09e80), WTC(0xc5e0bfc0), WTC(0xc610a740), WTC(0xc64029c0), WTC(0xc66f49c0), WTC(0xc69e2180), WTC(0xc6ccca40), WTC(0xc6fb5700), WTC(0xc729cc80), WTC(0xc7582b40), WTC(0xc7867480), WTC(0xc7b4a480), WTC(0xc7e2afc0), WTC(0xc8108a80), WTC(0xc83e28c0), WTC(0xc86b7f00), WTC(0xc8988100), WTC(0xc8c52340), WTC(0xc8f15980), WTC(0xc91d1840), WTC(0xb4d6a381), WTC(0xb4422b81), WTC(0xb3ae8601), WTC(0xb31bb301), WTC(0xb289b181), WTC(0xb1f88181), WTC(0xb1682281), WTC(0xb0d89401), WTC(0xb049d601), WTC(0xafbbe801), WTC(0xaf2ec901), WTC(0xaea27681), WTC(0xae16f001), WTC(0xad8c3301), WTC(0xad023f01), WTC(0xac791401), WTC(0xabf0b181), WTC(0xab691681), WTC(0xaae24301), WTC(0xaa5c3601), WTC(0xa9d6ef01), WTC(0xa9526d81), WTC(0xa8ceb201), WTC(0xa84bbb81), WTC(0xa7c98b01), WTC(0xa7482101), WTC(0xa6c77e01), WTC(0xa647a301), WTC(0xa5c89001), WTC(0xa54a4701), WTC(0xa4ccc901), WTC(0xa4501601), WTC(0xa3d43001), WTC(0xa3591801), WTC(0xa2dece81), WTC(0xa2655581), WTC(0xa1ecae01), WTC(0xa174da81), WTC(0xa0fddd81), WTC(0xa087b981), WTC(0xa0127081), WTC(0x9f9e0301), WTC(0x9f2a7281), WTC(0x9eb7c101), WTC(0x9e45f081), WTC(0x9dd50481), WTC(0x9d650081), WTC(0x9cf5e701), WTC(0x9c87ba81), WTC(0x9c1a7c81), WTC(0x9bae2f81), WTC(0x9b42d581), WTC(0x9ad87081), WTC(0x9a6f0381), WTC(0x9a069001), WTC(0x999f1981), WTC(0x9938a281), WTC(0x98d32d81), WTC(0x986ebd81), WTC(0x980b5501), WTC(0x97a8f681), WTC(0x9747a481), WTC(0x96e76101), WTC(0x96882e01), WTC(0x962a0c81), WTC(0x95ccff01), WTC(0x95710601), WTC(0x95162381), WTC(0x94bc5981), WTC(0x9463a881), WTC(0x940c1281), WTC(0x93b59901), WTC(0x93603d01), WTC(0x930bff81), WTC(0x92b8e101), WTC(0x9266e281), WTC(0x92160301), WTC(0x91c64301), WTC(0x9177a301), WTC(0x912a2201), WTC(0x90ddc001), WTC(0x90927b81), WTC(0x90485401), WTC(0x8fff4601), WTC(0x8fb74f81), WTC(0x8f706f01), WTC(0x8f2aa101), WTC(0x8ee5e301), WTC(0x8ea23201), WTC(0x8e5f8881), WTC(0x8e1de001), WTC(0x8ddd3201), WTC(0x8d9d7781), WTC(0x8d5eaa01), WTC(0x8d20c301), WTC(0x8ce3ba81), WTC(0x8ca78781), WTC(0x8c6c1b01), WTC(0x8c316681), WTC(0x8bf75b01), WTC(0x8bbde981), WTC(0x8b850281), WTC(0x8b4c9701), WTC(0x8b149701), WTC(0x8adcee01), WTC(0x8aa58681), WTC(0x8a6e4a01), WTC(0x8a372881), WTC(0x8a001f01), WTC(0x89c92f81), WTC(0x89925a81), WTC(0x895bcd01), WTC(0x8925f101), WTC(0x88f13801), WTC(0x88be1681), WTC(0x888d3181), WTC(0x885f8481), WTC(0x88353501), WTC(0x88124281), WTC(0x87e73d81), WTC(0x87d4ac81), WTC(0x87cb5101), WTC(0x87c05e81), WTC(0x87b42481), WTC(0x87a70e81), WTC(0x87998f01), WTC(0x878c1881), WTC(0x877ede01), WTC(0x8771c601), WTC(0x8764b101), WTC(0x87578181), WTC(0x874a2f01), WTC(0x873cc201), WTC(0x872f4201), WTC(0x8721b481), WTC(0x87141b01), WTC(0x87067281), WTC(0x86f8ba81), WTC(0x86eaf081), WTC(0x86dd1481), WTC(0x86cf2601), WTC(0x86c12401), WTC(0x86b30f01), WTC(0x86a4e781), WTC(0x8696ad01), WTC(0x86886001), WTC(0x867a0081), WTC(0x866b8d81), WTC(0x865d0581), WTC(0x864e6901), WTC(0x863fb701), WTC(0x8630f181), WTC(0x86221801), WTC(0x86132c01), WTC(0x86042c01), WTC(0x85f51681), WTC(0x85e5eb81), WTC(0x85d6a981), WTC(0x85c75201), WTC(0x85b7e601), WTC(0x85a86581), WTC(0x8598d081), WTC(0x85892681), WTC(0x85796601), WTC(0x85698e81), WTC(0x8559a081), WTC(0x85499d01), WTC(0x85398481), WTC(0x85295881), WTC(0x85191801), WTC(0x8508c181), WTC(0x84f85581), WTC(0x84e7d381), WTC(0x84d73c01), WTC(0x84c69101), WTC(0x84b5d301), WTC(0x84a50201), WTC(0x84941d81), WTC(0x84832481), WTC(0x84721701), WTC(0x8460f581), WTC(0x844fc081), WTC(0x843e7a81), WTC(0x842d2281), WTC(0x841bb981), WTC(0x840a3e81), WTC(0x83f8b001), WTC(0x83e70f01), WTC(0x83d55d01), WTC(0x83c39a81), WTC(0x83b1c881), WTC(0x839fe801), WTC(0x838df801), WTC(0x837bf801), WTC(0x8369e781), WTC(0x8357c701), WTC(0x83459881), WTC(0x83335c81), WTC(0x83211501), WTC(0x830ec081), WTC(0x82fc5f01), WTC(0x82e9ef01), WTC(0x82d77201), WTC(0x82c4e801), WTC(0x82b25301), WTC(0x829fb401), WTC(0x828d0b01), WTC(0x827a5801), WTC(0x82679901), WTC(0x8254cf01), WTC(0x8241fa01), WTC(0x822f1b01), WTC(0x821c3401), WTC(0x82094581), WTC(0x81f64f01), WTC(0x81e34f81), WTC(0x81d04681), WTC(0x81bd3401), WTC(0x81aa1981), WTC(0x8196f781), WTC(0x8183cf81), WTC(0x8170a181), WTC(0x815d6c01), WTC(0x814a2f81), WTC(0x8136ea01), WTC(0x81239d81), WTC(0x81104a01), WTC(0x80fcf181), WTC(0x80e99401), WTC(0x80d63101), WTC(0x80c2c781), WTC(0x80af5701), WTC(0x809bdf01), WTC(0x80886081), WTC(0x8074dc01), WTC(0x80615281), WTC(0x804dc481), WTC(0x803a3381), WTC(0x80269f81), WTC(0x80130981), WTC(0x0a608220), WTC(0x0a8ee7d0), WTC(0x0abe35c0), WTC(0x0aee5de0), WTC(0x0b1f5230), WTC(0x0b5104a0), WTC(0x0b836720), WTC(0x0bb66bb0), WTC(0x0bea0440), WTC(0x0c1e22c0), WTC(0x0c52ba70), WTC(0x0c87ca90), WTC(0x0cbd5ba0), WTC(0x0cf375e0), WTC(0x0d2a1f50), WTC(0x0d615480), WTC(0x0d990e40), WTC(0x0dd14500), WTC(0x0e09f730), WTC(0x0e432e90), WTC(0x0e7cf790), WTC(0x0eb75e50), WTC(0x0ef26430), WTC(0x0f2dfd70), WTC(0x0f6a1d70), WTC(0x0fa6b7e0), WTC(0x0fe3c3d0), WTC(0x10213ac0), WTC(0x105f1640), WTC(0x109d4f20), WTC(0x10dbdb80), WTC(0x111ab0c0), WTC(0x1159c360), WTC(0x11990fc0), WTC(0x11d8a060), WTC(0x121882c0), WTC(0x1258c480), WTC(0x12995a40), WTC(0x12da1b00), WTC(0x131adb60), WTC(0x135b70c0), WTC(0x139bb680), WTC(0x13db8c00), WTC(0x141ad080), WTC(0x14596460), WTC(0x149729e0), WTC(0x14d404e0), WTC(0x150fd8e0), WTC(0x154a88c0), WTC(0x1583f5e0), WTC(0x15bc0120), WTC(0x15f28ba0), WTC(0x162779a0), WTC(0x165ab300), WTC(0x168c2040), WTC(0x16bbaa80), WTC(0x16e94120), WTC(0x1714d9e0), WTC(0x173e6440), WTC(0x17660680), WTC(0x178ca020), WTC(0x17b36400), WTC(0x17db84e0), WTC(0x1805d920), WTC(0x18328400), WTC(0x18617cc0), WTC(0x1892bfa0), WTC(0x18c64540), WTC(0x18fc0400), WTC(0x1933f140), WTC(0x196e0320), WTC(0x19aa2fc0), WTC(0x19e86d80), WTC(0x1a28b2e0), WTC(0x1a6af700), WTC(0x1aaf3320), WTC(0x1af56180), WTC(0x1b3d7ce0), WTC(0x1b877c40), WTC(0x1bd350c0), WTC(0x1c20ea40), WTC(0x1c703840), WTC(0x1cc13860), WTC(0x1d13f760), WTC(0x1d688420), WTC(0x1dbeed40), WTC(0x1e174660), WTC(0x1e71a640), WTC(0x1ece2400), WTC(0x1f2cd220), WTC(0x1f8db3c0), WTC(0x1ff0c3e0), WTC(0x20560080), WTC(0x20bd46c0), WTC(0x21263400), WTC(0x21905740), WTC(0x21fb4100), WTC(0x2266ba80), WTC(0x22d2d140), WTC(0x233f9780), WTC(0x23ad25c0), WTC(0x241bc800), WTC(0x248bf040), WTC(0x24fe1380), WTC(0x25728180), WTC(0x25e90a00), WTC(0x26614080), WTC(0x26dabdc0), WTC(0x27552540), WTC(0x27d03200), WTC(0x284ba580), WTC(0x28c740c0), WTC(0x29431f80), WTC(0x29bfc9c0), WTC(0x2a3dd080), WTC(0x2abdc000), WTC(0x2b3ffd00), WTC(0x2bc4cd80), WTC(0x2c4c7d40), WTC(0x2cd72ec0), WTC(0x2d647f80), WTC(0x2df3cd80), WTC(0x2e847d80), WTC(0x2f15ea40), WTC(0x2fa760c0), WTC(0x30382b80), WTC(0x30c79440), WTC(0x315566c0), WTC(0x31e20800), WTC(0x326de7c0), WTC(0x32f98200), WTC(0x3385ba00), WTC(0x3413bec0), WTC(0x34a4c480), WTC(0x3539bf00), WTC(0x35d2c4c0), WTC(0x366f8340), WTC(0x370fb800), WTC(0x37b2cf80), WTC(0x3857a480), WTC(0x38fcee80), WTC(0x39a16840), WTC(0x3a4422c0), WTC(0x3ae495c0), WTC(0x3b824000), WTC(0x3c1cb500), WTC(0x3cb438c0), WTC(0x3d4994c0), WTC(0x3ddd8f40), WTC(0x3e70ec00), WTC(0x3f045e40), WTC(0x3f989080), WTC(0x402e32ff), WTC(0x40c5c07f), WTC(0x415f547f), WTC(0x41faf07f), WTC(0x4298997f), WTC(0x4338307f), WTC(0x43d96bff), WTC(0x447bffff), WTC(0x451f9cff), WTC(0x45c3daff), WTC(0x46683eff), WTC(0x470c4cff), WTC(0x47af93ff), WTC(0x4851c3ff), WTC(0x48f29d7f), WTC(0x4991de7f), WTC(0x4a2f5e7f), WTC(0x4acb287f), WTC(0x4b65537f), WTC(0x4bfdf37f), WTC(0x4c95337f), WTC(0x4d2b51ff), WTC(0x4dc091ff), WTC(0x4e5533ff), WTC(0x4ee96b7f), WTC(0x4f7d61ff), WTC(0x501140ff), WTC(0x50a5317f), WTC(0x51395a7f), WTC(0x51cddf7f), WTC(0x5262e6ff), WTC(0x52f885ff), WTC(0x538eb47f), WTC(0x542560ff), WTC(0x54bc7b7f), WTC(0x5553a8ff), WTC(0x55ea35ff), WTC(0x567f66ff), WTC(0x5712897f), WTC(0x57a33a7f), WTC(0x583152ff), WTC(0x58bca5ff), WTC(0x594530ff), WTC(0x59cb79ff), WTC(0x5a5047ff), WTC(0x5ad45eff), WTC(0x5b584e7f), WTC(0x5bdc417f), WTC(0x5c60487f), WTC(0x5ce476ff), WTC(0x5d68c47f), WTC(0x5ded06ff), WTC(0x5e7111ff), WTC(0x5ef4b5ff), WTC(0x5f77a17f), WTC(0x5ff96aff), WTC(0x6079a7ff), WTC(0x60f7f7ff), WTC(0x617417ff), WTC(0x61edd87f), WTC(0x6264ffff), WTC(0x62d9a6ff), WTC(0x634c817f), WTC(0x63be657f), WTC(0x6430277f), WTC(0x64a2247f), WTC(0x65142bff), WTC(0x6586027f), WTC(0x65f7697f), WTC(0x666801ff), WTC(0x66d756ff), WTC(0x6744f0ff), WTC(0x67b0787f), WTC(0x681a077f), WTC(0x6881ebff), WTC(0x68e8707f), WTC(0x694dceff), WTC(0x69b21e7f), WTC(0x6a156cff), WTC(0x6a77ca7f), WTC(0x6ad9377f), WTC(0x6b39a4ff), WTC(0x6b9901ff), WTC(0x6bf73cff), WTC(0x6c54457f), WTC(0x6cb00aff), WTC(0x6d0a7bff), WTC(0x6d6387ff), WTC(0xae2cbe01), WTC(0xaf526d01), WTC(0xb0751201), WTC(0xb194da81), WTC(0xb2b1f401), WTC(0xb3cc8d01), WTC(0xb4e4d201), WTC(0xb5faf101), WTC(0xb70f1881), WTC(0xb8217301), WTC(0xb9321181), WTC(0xba40ee01), WTC(0xbb4e0201), WTC(0xbc594781), WTC(0xbd62b881), WTC(0xbe6a5181), WTC(0xbf700d01), WTC(0xc073e4c0), WTC(0xc175d240), WTC(0xc275cc80), WTC(0xc373cb80), WTC(0xc46fca00), WTC(0xc569c600), WTC(0xc661bdc0), WTC(0xc757af80), WTC(0xc84b9840), WTC(0xc93d7300), WTC(0xca2d3a40), WTC(0xcb1aea40), WTC(0xcc068280), WTC(0xccf00480), WTC(0xcdd77200), WTC(0xcebccb40), WTC(0xcfa00d80), WTC(0xd0813540), WTC(0xd1603f00), WTC(0xd23d2980), WTC(0xd317f7c0), WTC(0xd3f0ac40), WTC(0xd4c74980), WTC(0xd59bcf80), WTC(0xd66e3b00), WTC(0xd73e8900), WTC(0xd80cb740), WTC(0xd8d8c7c0), WTC(0xd9a2be00), WTC(0xda6a9e40), WTC(0xdb306a40), WTC(0xdbf42080), WTC(0xdcb5be80), WTC(0xdd754140), WTC(0xde32a900), WTC(0xdeedf9c0), WTC(0xdfa737c0), WTC(0xe05e6740), WTC(0xe1138900), WTC(0xe1c69ac0), WTC(0xe2779a40), WTC(0xe3268680), WTC(0xe3d36260), WTC(0xe47e33a0), WTC(0xe526ff80), WTC(0xe5cdc960), WTC(0xe6729100), WTC(0xe7155460), WTC(0xe7b611c0), WTC(0xe854ca20), WTC(0xe8f18180), WTC(0xe98c3ca0), WTC(0xea24ffe0), WTC(0xeabbcb20), WTC(0xeb509b60), WTC(0xebe36d00), WTC(0xec743e00), WTC(0xed0310e0), WTC(0xed8feaa0), WTC(0xee1ad060), WTC(0xeea3c640), WTC(0xef2acd60), WTC(0xefafe6a0), WTC(0xf03312f0), WTC(0xf0b45800), WTC(0xf133c230), WTC(0xf1b15ef0), WTC(0xf22d3af0), WTC(0xf2a75c80), WTC(0xf31fc460), WTC(0xf39673b0), WTC(0xf40b6a00), WTC(0xf47ea230), WTC(0xf4f01450), WTC(0xf55fb930), WTC(0xf5cd84c0), WTC(0xf6396090), WTC(0xf6a333e0), WTC(0xf70ae540), WTC(0xf7707260), WTC(0xf7d3f720), WTC(0xf83592f0), WTC(0xf8956450), WTC(0xf8f38120), WTC(0xf94ff7c8), WTC(0xf9aad740), WTC(0xfa042920), WTC(0xfa5be110), WTC(0xfab1e778), WTC(0xfb062478), WTC(0xfb588d78), WTC(0xfba93530), WTC(0xfbf836c8), WTC(0xfc45ace0), WTC(0xfc91a294), WTC(0xfcdc0e5c), WTC(0xfd24e438), WTC(0xfd6c17dc), WTC(0xfdb19758), WTC(0xfdf54c3c), WTC(0xfe371ef8), WTC(0xfe7701aa), WTC(0xfeb50d62), WTC(0xfef1700a), WTC(0xff2c5574), WTC(0xff65ee7b), WTC(0xff9e75de), WTC(0xffd62863), WTC(0x000d4401), WTC(0x0043d345), WTC(0x00799cd0), WTC(0x00ae5f49), WTC(0x00e1d7a4), WTC(0x0113a6f2), WTC(0x0143575c), WTC(0x01707024), WTC(0x019a9346), WTC(0x01c1cf08), WTC(0x01e66c12), WTC(0x0208ac48), WTC(0x0228e868), WTC(0x0247a6c8), WTC(0x02657aa0), WTC(0x0282f710), WTC(0x02a07e50), WTC(0x02be31c0), WTC(0x02dc2b30), WTC(0x02fa7f34), WTC(0x0318fb10), WTC(0x03372fdc), WTC(0x0354ae54), WTC(0x03710d18), WTC(0x038bfdb4), WTC(0x03a54084), WTC(0x03bc92b8), WTC(0x03d1c710), WTC(0x03e4dd20), WTC(0x03f5e25c), WTC(0x0404e218), WTC(0x0411fc30), WTC(0x041d6b30), WTC(0x04276cd0), WTC(0x04303e00), WTC(0x04381528), WTC(0x043f2310), WTC(0x04459908), WTC(0x044ba430), WTC(0x045161f8), WTC(0x0456e6f8), WTC(0x045c49a8), WTC(0x046192f8), WTC(0x0466af40), WTC(0x046b8240), WTC(0x046ff0d8), WTC(0x0473de18), WTC(0x04772b58), WTC(0x0479b9a0), WTC(0x047b6a30), WTC(0x047c2088), WTC(0x047bc230), WTC(0x047a3418), WTC(0x04776098), WTC(0x04734790), WTC(0x046df4c0), WTC(0x04677220), WTC(0x045fd1b0), WTC(0x04573588), WTC(0x044dc4b8), WTC(0x0443a5b8), WTC(0x04390160), WTC(0x042e0398), WTC(0x0422d8c0), WTC(0x0417aa30), WTC(0x040c7ce0), WTC(0x040136e0), WTC(0x03f5beb0), WTC(0x03e9f8ec), WTC(0x03ddc484), WTC(0x03d0fd9c), WTC(0x03c37fa0), WTC(0x03b53014), WTC(0x03a60a18), WTC(0x03960f88), WTC(0x03854110), WTC(0x0373ad9c), WTC(0x03617694), WTC(0x034ebf9c), WTC(0x033bab30), WTC(0x03284ef0), WTC(0x0314b598), WTC(0x0300ea54), WTC(0x02ecf524), WTC(0x02d8d210), WTC(0x02c476ac), WTC(0x02afd940), WTC(0x029aee4c), WTC(0x0285a6f4), WTC(0x026ff398), WTC(0x0259c448), WTC(0x024317cc), WTC(0x022c0084), WTC(0x02149310), WTC(0x01fce334), WTC(0x01e4fb24), WTC(0x01ccdd0a), WTC(0x01b48b20), WTC(0x019c077e), WTC(0x01835432), WTC(0x016a733c), WTC(0x015166a6), WTC(0x0138302e), WTC(0x011ed0f6), WTC(0x010549f8), WTC(0x00eb9c25), WTC(0x00d1caa6), WTC(0x00b7db94), WTC(0x009dd560), WTC(0x0083be75), WTC(0x00699d41), WTC(0x004f782f), WTC(0x003555ab), WTC(0x001b3c21), WTC(0x000131fe), WTC(0xd61cfc40), WTC(0xd5acb340), WTC(0xd53d4400), WTC(0xd4cea6c0), WTC(0xd460d440), WTC(0xd3f3c440), WTC(0xd3876f80), WTC(0xd31bce40), WTC(0xd2b0d900), WTC(0xd2468980), WTC(0xd1dcef00), WTC(0xd17429c0), WTC(0xd10c5b80), WTC(0xd0a59b80), WTC(0xd03fd780), WTC(0xcfdae780), WTC(0xcf76a380), WTC(0xcf12fac0), WTC(0xceb01100), WTC(0xce4e18c0), WTC(0xcded4440), WTC(0xcd8d9a40), WTC(0xcd2ee800), WTC(0xccd0f440), WTC(0xcc738780), WTC(0xcc167d40), WTC(0xcbb9c180), WTC(0xcb5d4040), WTC(0xcb00e240), WTC(0xcaa48000), WTC(0xca47eac0), WTC(0xc9eaf1c0), WTC(0xc98d8100), WTC(0xc92fc580), WTC(0xc8d1fc80), WTC(0xc8746480), WTC(0xc816dc40), WTC(0xc7b8c280), WTC(0xc7596800), WTC(0xc6f81f80), WTC(0xc6945740), WTC(0xc62d93c0), WTC(0xc5c358c0), WTC(0xc5552b80), WTC(0xc4e29240), WTC(0xc46b1440), WTC(0xc3ee3840), WTC(0xc36b8500), WTC(0xc2e28040), WTC(0xc252ae80), WTC(0xc1bb9540), WTC(0xc11cc200), WTC(0xc075cf00), WTC(0xbfc65781), WTC(0xbf0df881), WTC(0xbe4c6f01), WTC(0xbd819401), WTC(0xbcad2d01), WTC(0xbbcfb981), WTC(0xbaeca681), WTC(0xba08e781), WTC(0xb9297081), WTC(0xb851e081), WTC(0xb782ed01), WTC(0xb6bc6a81), WTC(0xb5fe4981), WTC(0xb5487281), WTC(0xb49ad081), WTC(0xb3f54d81), WTC(0xb357d401), WTC(0xb2c24e01), WTC(0xb234a681), WTC(0xb1aec701), WTC(0xb1309b01), WTC(0xb0ba0c01), WTC(0xb04b0481), WTC(0xafe36f01), WTC(0xaf833601), WTC(0xaf2a4381), WTC(0xaed88201), WTC(0xae8ddb81), WTC(0xae4a3b81), WTC(0xae0d8b01), WTC(0xadd7b581), WTC(0xada8a481), WTC(0xad804281), WTC(0xad5e7a81), WTC(0xad433601), WTC(0xad2e6001), WTC(0xad1fe281), WTC(0xad17a801), WTC(0xad159a81), WTC(0xad19a501), WTC(0xad23b101), WTC(0xad33aa01), WTC(0xad497981), WTC(0xad650a01), WTC(0xad864601), WTC(0xadad1781), WTC(0xadd96981), WTC(0xae0b2601), WTC(0xae423781), WTC(0xae7e8801), WTC(0xaec00201), WTC(0xaf069081), WTC(0xaf521c81), WTC(0xafa29201), WTC(0xaff7da01), WTC(0xb051df01), WTC(0xb0b08c81), WTC(0xb113cb81), WTC(0xb17b8701), WTC(0xb1e7a981), WTC(0xb2581d81), WTC(0xb2cccc81), WTC(0xb345a181), WTC(0xb3c28701), WTC(0xb4436681), WTC(0xb4c82b81), WTC(0xb550bf81), WTC(0xb5dd0d01), WTC(0xb66cff01), WTC(0xb7007f01), WTC(0xb7977781), WTC(0xb831d381), WTC(0xb8cf7d01), WTC(0xb9705e01), WTC(0xba146101), WTC(0xbabb7081), WTC(0xbb657781), WTC(0xbc125f01), WTC(0xbcc21281), WTC(0xbd747b81), WTC(0xbe298581), WTC(0xbee11981), WTC(0xbf9b2301), WTC(0xc0578b80), WTC(0xc1163dc0), WTC(0xc1d72400), WTC(0xc29a28c0), WTC(0xc35f3640), WTC(0xc42636c0), WTC(0xc4ef1500), WTC(0xc5b9bb00), WTC(0xc6861340), WTC(0xc7540840), WTC(0xc8238400), WTC(0xc8f47100), WTC(0xc9c6b9c0), WTC(0xca9a4840), WTC(0xcb6f0780), WTC(0xcc44e140), WTC(0xcd1bc000), WTC(0xcdf38e00), WTC(0xcecc3600), WTC(0xcfa5a240), WTC(0xd07fbcc0), WTC(0xd15a7040), WTC(0xd235a6c0), WTC(0xd3114b00), WTC(0xd3ed4740), WTC(0xd4c98580), WTC(0xd5a5f080), WTC(0xd6827280), WTC(0xd75ef600), WTC(0xd83b6500), WTC(0xd917aa00), WTC(0xd9f3af80), WTC(0xdacf5fc0), WTC(0xdbaaa540), WTC(0xdc856a00), WTC(0xdd5f98c0), WTC(0xde391bc0), WTC(0xdf11dd40), WTC(0xdfe9c780), WTC(0xe0c0c540), WTC(0xe196c080), WTC(0xe26ba3c0), WTC(0xe33f5960), WTC(0xe411cba0), WTC(0xe4e2e500), WTC(0xe5b28fc0), WTC(0xe680b640), WTC(0xe74d42e0), WTC(0xe8181fe0), WTC(0xe8e137e0), WTC(0xe9a87500), WTC(0xea6dc1a0), WTC(0xeb310820), WTC(0xebf23300), WTC(0xecb12c60), WTC(0xed6ddee0), WTC(0xee2834a0), WTC(0xeee01800), WTC(0xef957380), WTC(0xf0483160), WTC(0xf0f83c00), WTC(0xf1a57db0), WTC(0xf24fe0f0), WTC(0xf2f74ff0), WTC(0xf39bb530), WTC(0xf43cfaf0), WTC(0xf4db0b90), WTC(0xf575d180), WTC(0xf60d3700), WTC(0xf6a12680), WTC(0xf7318a50), WTC(0xf7be4cc0), WTC(0xf8475850), WTC(0xf8cc9738), WTC(0xf94df3e0), WTC(0xf9cb58a8), WTC(0xfa44afe0), WTC(0xfab9e3e8), WTC(0xfb2adf20), WTC(0xfb978be8), WTC(0xfbffd488), WTC(0xfc63a370), WTC(0xfcc2e2f0), WTC(0xfd1d7d64), WTC(0xfd735d2c), WTC(0xfdc46c9c), WTC(0xfe109618), WTC(0xfe57c3f4), WTC(0xfe99e090), WTC(0xfed6d644), WTC(0xff0e8f6e), WTC(0xff40f667), WTC(0xff6df58c), WTC(0xff957738), WTC(0xffb765c5), WTC(0xffd3ab90), WTC(0xffea32f4), WTC(0xfffae64c), WTC(0x0005aff3), WTC(0x000a7a44), WTC(0x00092f9c), WTC(0x0001ba54), WTC(0xfff404ca), WTC(0xffdff957) }; /* * TNS_MAX_BANDS * entry for each sampling rate * 1 long window * 2 SHORT window */ const UCHAR tns_max_bands_tbl[13][2] = { { 31, 9 }, /* 96000 */ { 31, 9 }, /* 88200 */ { 34, 10 }, /* 64000 */ { 40, 14 }, /* 48000 */ { 42, 14 }, /* 44100 */ { 51, 14 }, /* 32000 */ { 46, 14 }, /* 24000 */ { 46, 14 }, /* 22050 */ { 42, 14 }, /* 16000 */ { 42, 14 }, /* 12000 */ { 42, 14 }, /* 11025 */ { 39, 14 }, /* 8000 */ { 39, 14 }, /* 7350 */ }; /* TNS_MAX_BANDS for low delay. The array index is the sampleRateIndex */ const UCHAR tns_max_bands_tbl_480[13] = { 31, /* 96000 */ 31, /* 88200 */ 31, /* 64000 */ 31, /* 48000 */ 32, /* 44100 */ 37, /* 32000 */ 30, /* 24000 */ 30, /* 22050 */ 30, /* 16000 */ 30, /* 12000 */ 30, /* 11025 */ 30, /* 8000 */ 30 /* 7350 */ }; const UCHAR tns_max_bands_tbl_512[13] = { 31, /* 96000 */ 31, /* 88200 */ 31, /* 64000 */ 31, /* 48000 */ 32, /* 44100 */ 37, /* 32000 */ 31, /* 24000 */ 31, /* 22050 */ 31, /* 16000 */ 31, /* 12000 */ 31, /* 11025 */ 31, /* 8000 */ 31 /* 7350 */ }; #define TCC(x) (FIXP_DBL(x)) const FIXP_TCC FDKaacDec_tnsCoeff3 [8] = { TCC(0x81f1d1d4), TCC(0x9126146c), TCC(0xadb922c4), TCC(0xd438af1f), TCC(0x00000000), TCC(0x3789809b), TCC(0x64130dd4), TCC(0x7cca7016) }; const FIXP_TCC FDKaacDec_tnsCoeff4 [16] = { TCC(0x808bc842), TCC(0x84e2e58c), TCC(0x8d6b49d1), TCC(0x99da920a), TCC(0xa9c45713), TCC(0xbc9ddeb9), TCC(0xd1c2d51b), TCC(0xe87ae53d), TCC(0x00000000), TCC(0x1a9cd9b6), TCC(0x340ff254), TCC(0x4b3c8c29), TCC(0x5f1f5ebb), TCC(0x6ed9ebba), TCC(0x79bc385f), TCC(0x7f4c7e5b) }; /* MPEG like mapping (no change). */ const UCHAR channelMappingTablePassthrough[8][8] = { { 0, 1,255,255,255,255,255,255}, /* mono / PS */ { 0, 1,255,255,255,255,255,255}, /* stereo */ { 0, 1, 2,255,255,255,255,255}, /* 3ch */ { 0, 1, 2, 3,255,255,255,255}, /* 4ch */ { 0, 1, 2, 3, 4,255,255,255}, /* 5ch */ { 0, 1, 2, 3, 4, 5,255,255}, /* 5.1ch */ { 0, 1, 2, 3, 4, 5, 6, 7}, /* 7ch */ { 0, 1, 2, 3, 4, 5, 6, 7} /* 7.1ch */ }; /* WAV file like mapping (from MPEG mapping). */ const UCHAR channelMappingTableWAV[8][8] = { { 0, 1,255,255,255,255,255,255}, /* mono / PS */ { 0, 1,255,255,255,255,255,255}, /* stereo */ { 2, 0, 1,255,255,255,255,255}, /* 3ch */ { 2, 0, 1, 3,255,255,255,255}, /* 4ch */ { 2, 0, 1, 3, 4,255,255,255}, /* 5ch */ { 2, 0, 1, 4, 5, 3,255,255}, /* 5.1ch */ { 0, 1, 2, 3, 4, 5, 6, 7}, /* 7ch */ { 2, 0, 1, 6, 7, 4, 5, 3} /* 7.1ch */ }; /* Lookup tables for elements in ER bitstream */ const MP4_ELEMENT_ID elementsTab[8][7] = { {ID_SCE, ID_EXT, ID_END, ID_NONE, ID_NONE,ID_NONE,ID_NONE }, /* 1 channel */ {ID_CPE, ID_EXT, ID_END, ID_NONE, ID_NONE,ID_NONE,ID_NONE } /* 2 channels */ , {ID_SCE, ID_CPE, ID_EXT, ID_END, ID_NONE,ID_NONE,ID_NONE }, /* 3 channels */ {ID_SCE, ID_CPE, ID_SCE, ID_EXT, ID_END, ID_NONE,ID_NONE }, /* 4 channels */ {ID_SCE, ID_CPE, ID_CPE, ID_EXT, ID_END, ID_NONE,ID_NONE }, /* 5 channels */ {ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_EXT, ID_END, ID_NONE }, /* 6 channels */ {ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_EXT, ID_END} /* 8 channels */ }; /*! Random sign bit used for concealment */ const USHORT randomSign[AAC_NF_NO_RANDOM_VAL/16] = { /* sign bits of FDK_sbrDecoder_sbr_randomPhase[] entries: LSB ........... MSB -> MSB ... LSB */ /* 1001 0111 0011 1100 -> */ 0x3ce9, /* 0100 0111 0111 1011 -> */ 0xdee2, /* 0001 1100 1110 1011 -> */ 0xd738, /* 0001 0011 0110 1001 -> */ 0x96c8, /* 0101 0011 1101 0000 -> */ 0x0bca, /* 0001 0001 1111 0100 -> */ 0x2f88, /* 1110 1100 1110 1101 -> */ 0xb737, /* 0010 1010 1011 1001 -> */ 0x9d54, /* 0111 1100 0110 1010 -> */ 0x563e, /* 1101 0111 0010 0101 -> */ 0xa4eb, /* 0001 0101 1011 1100 -> */ 0x3da8, /* 0101 0111 1001 1011 -> */ 0xd9ea, /* 1101 0100 0101 0101 -> */ 0xaa2b, /* 1000 1001 0100 0011 -> */ 0xc291, /* 1100 1111 1010 1100 -> */ 0x35f3, /* 1100 1010 1110 0010 -> */ 0x4753, /* 0110 0001 1010 1000 -> */ 0x1586, /* 0011 0101 1111 1100 -> */ 0x3fac, /* 0001 0110 1010 0001 -> */ 0x8568, /* 0010 1101 0111 0010 -> */ 0x4eb4, /* 1101 1010 0100 1001 -> */ 0x925b, /* 1100 1001 0000 1110 -> */ 0x7093, /* 1000 1100 0110 1010 -> */ 0x5631, /* 0000 1000 0110 1101 -> */ 0xb610, /* 1000 0001 1111 1011 -> */ 0xdf81, /* 1111 0011 0100 0111 -> */ 0xe2cf, /* 1000 0001 0010 1010 -> */ 0x5481, /* 1101 0101 1100 1111 -> */ 0xf3ab, /* 0110 0001 0110 1000 -> */ 0x1686, /* 0011 0011 1100 0110 -> */ 0x63cc, /* 0011 0111 0101 0110 -> */ 0x6aec, /* 1011 0001 1010 0010 -> */ 0x458d }; fdk-aac-0.1.3/libAACdec/src/pulsedata.h0000644000175000017500000001422312372261464020065 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: pulse data tool ******************************************************************************/ #ifndef PULSEDATA_H #define PULSEDATA_H #include "common_fix.h" #include "FDK_bitstream.h" #define N_MAX_LINES 4 typedef struct { UCHAR PulseDataPresent; UCHAR NumberPulse; UCHAR PulseStartBand; UCHAR PulseOffset[N_MAX_LINES]; UCHAR PulseAmp[N_MAX_LINES]; } CPulseData; /** * \brief Read pulse data from bitstream * * The function reads the elements for pulse data from * the bitstream. * * \param bs bit stream handle data source. * \param PulseData pointer to a CPulseData were the decoded data is stored into. * \param MaxSfBands max number of scale factor bands. * \return 0 on success, != 0 on parse error. */ INT CPulseData_Read( const HANDLE_FDK_BITSTREAM bs, CPulseData *const PulseData, const SHORT *sfb_startlines, const void *pIcsInfo, const SHORT frame_length ); /** * \brief Apply pulse data to spectral lines * * The function applies the pulse data to the * specified spectral lines. * * \param PulseData pointer to the previously decoded pulse data. * \param pScaleFactorBandOffsets scale factor band line offset table. * \param coef pointer to the spectral data were pulse data should be applied to. * \return none */ void CPulseData_Apply(CPulseData *PulseData, const short *pScaleFactorBandOffsets, FIXP_DBL *coef); #endif /* #ifndef PULSEDATA_H */ fdk-aac-0.1.3/libAACdec/src/arm/0000755000175000017500000000000012372262444016506 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACdec/src/arm/block_arm.cpp0000644000175000017500000001413512372261464021150 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** Fraunhofer IIS *************************** Author(s): Arthur Tritthart Description: (ARM optimised) Scaling of spectral data ******************************************************************************/ #define FUNCTION_CBlock_ScaleSpectralData_func1 /* Note: This loop is only separated for ARM in order to save cycles by loop unrolling. The ARM core provides by default a 5-cycle loop overhead per sample, that goes down to 1-cycle per sample with an optimal 4x-loop construct (do - 4x - while). */ FDK_INLINE static void CBlock_ScaleSpectralData_func1( FIXP_DBL *pSpectrum, int max_band, const SHORT * RESTRICT BandOffsets, int SpecScale_window, const SHORT * RESTRICT pSfbScale, int window) { int band_offset = 0; for (int band=0; band < max_band; band++) { int runs = band_offset; band_offset = BandOffsets[band+1]; runs = band_offset - runs; /* is always a multiple of 4 */ int scale = SpecScale_window-pSfbScale[window*16+band]; if (scale) { do { FIXP_DBL tmp0, tmp1, tmp2, tmp3; tmp0 = pSpectrum[0]; tmp1 = pSpectrum[1]; tmp2 = pSpectrum[2]; tmp3 = pSpectrum[3]; tmp0 >>= scale; tmp1 >>= scale; tmp2 >>= scale; tmp3 >>= scale; *pSpectrum++ = tmp0; *pSpectrum++ = tmp1; *pSpectrum++ = tmp2; *pSpectrum++ = tmp3; } while ((runs = runs-4) != 0); } else { pSpectrum+= runs; } } } fdk-aac-0.1.3/libAACdec/src/aacdec_pns.h0000644000175000017500000001267212372261464020171 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: perceptual noise substitution tool ******************************************************************************/ #ifndef PNS_H #define PNS_H #include "common_fix.h" #define NO_OFBANDS ((8*16)) typedef struct { UCHAR correlated[NO_OFBANDS]; } CPnsInterChannelData; typedef struct { CPnsInterChannelData *pPnsInterChannelData; UCHAR pnsUsed[NO_OFBANDS]; int CurrentEnergy; UCHAR PnsActive; INT *currentSeed; INT *randomSeed; } CPnsData; void CPns_InitPns ( CPnsData *pPnsData, CPnsInterChannelData *pPnsInterChannelData, INT* currentSeed, INT* randomSeed ); void CPns_ResetData ( CPnsData *pPnsData, CPnsInterChannelData *pPnsInterChannelData ); #endif /* #ifndef PNS_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_tns.h0000644000175000017500000001267312372261464020176 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Josef Hoepfl Description: temporal noise shaping tool ******************************************************************************/ #ifndef TNS_H #define TNS_H #include "common_fix.h" enum { TNS_MAX_WINDOWS = 8, /* 8 */ TNS_MAXIMUM_ORDER = 20, /* 12 for AAC-LC and AAC-SSR. Set to 20 for AAC-Main (AOT 1). Some broken encoders also do order 20 for AAC-LC :( */ TNS_MAXIMUM_FILTERS = 3 }; typedef struct { SCHAR Coeff[TNS_MAXIMUM_ORDER]; UCHAR StartBand; UCHAR StopBand; SCHAR Direction; SCHAR Resolution; UCHAR Order; } CFilter; typedef struct { CFilter Filter[TNS_MAX_WINDOWS][TNS_MAXIMUM_FILTERS]; UCHAR NumberOfFilters[TNS_MAX_WINDOWS]; UCHAR DataPresent; UCHAR Active; } CTnsData; void CTns_Reset(CTnsData *pTnsData); #endif /* #ifndef TNS_H */ fdk-aac-0.1.3/libAACdec/src/aacdec_hcr_types.h0000644000175000017500000004630312372261464021367 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder *************************** Author(s): Robert Weidner (DSP Solutions) Description: HCR Decoder: Common defines and structures; defines for switching error-generator, -detector, and -concealment; *******************************************************************************/ #ifndef _AACDEC_HCR_TYPES_H_ #define _AACDEC_HCR_TYPES_H_ #include "FDK_bitstream.h" #include "overlapadd.h" /* ------------------------------------------------ */ /* ------------------------------------------------ */ #define LINES_PER_UNIT 4 /* ------------------------------------------------ */ /* ------------------------------------------------ */ /* ----------- basic HCR configuration ------------ */ #define MAX_SFB_HCR (((1024/8) / LINES_PER_UNIT) * 8) /* (8 * 16) is not enough because sfbs are split in units for blocktype short */ #define NUMBER_OF_UNIT_GROUPS (LINES_PER_UNIT * 8) #define LINES_PER_UNIT_GROUP (1024 / NUMBER_OF_UNIT_GROUPS) /* 15 16 30 32 */ /* ------------------------------------------------ */ /* ------------------------------------------------ */ /* ------------------------------------------------ */ #define FROM_LEFT_TO_RIGHT 0 #define FROM_RIGHT_TO_LEFT 1 #define MAX_CB_PAIRS 23 #define MAX_HCR_SETS 14 #define ESCAPE_VALUE 16 #define POSITION_OF_FLAG_A 21 #define POSITION_OF_FLAG_B 20 #define MAX_CB 32 /* last used CB is cb #31 when VCB11 is used */ #define MAX_CB_CHECK 32 /* support for VCB11 available -- is more general, could therefore used in both cases */ #define NUMBER_OF_BIT_IN_WORD 32 /* log */ #define THIRTYTWO_LOG_DIV_TWO_LOG 5 #define EIGHT_LOG_DIV_TWO_LOG 3 #define FOUR_LOG_DIV_TWO_LOG 2 /* borders */ #define CPE_TOP_LENGTH 12288 #define SCE_TOP_LENGTH 6144 #define LEN_OF_LONGEST_CW_TOP_LENGTH 49 /* qsc's of high level */ #define Q_VALUE_INVALID 8192 /* mark a invalid line with this value (to be concealed later on) */ #define HCR_DIRAC 500 /* a line of high level */ /* masks */ #define MASK_LEFT 0xFFF000 #define MASK_RIGHT 0xFFF #define CLR_BIT_10 0x3FF #define TEST_BIT_10 0x400 #define LEFT_OFFSET 12 /* when set HCR is replaced by a dummy-module which just fills the outputbuffer with a dirac sequence */ /* use this if HCR is suspected to write in other modules -- if error is stell there, HCR is innocent */ #define USE_HCR_DUMMY 0 /* ------------------------------ */ /* - insert HCR errors - */ /* ------------------------------ */ /* modify input lengths -- high protected */ #define ERROR_LORSD 0 /* offset: error if different from zero */ #define ERROR_LOLC 0 /* offset: error if different from zero */ /* segments are earlier empty as expected when decoding PCWs */ #define ERROR_PCW_BODY 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */ #define ERROR_PCW_BODY_SIGN 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */ #define ERROR_PCW_BODY_SIGN_ESC 0 /* set a positive values to trigger the error (make segments earlyer appear to be empty) */ /* pretend there are too many bits decoded (enlarge length of codeword) at PCWs -- use a positive value */ #define ERROR_PCW_BODY_ONLY_TOO_LONG 0 /* set a positive values to trigger the error */ #define ERROR_PCW_BODY_SIGN_TOO_LONG 0 /* set a positive values to trigger the error */ #define ERROR_PCW_BODY_SIGN_ESC_TOO_LONG 0 /* set a positive values to trigger the error */ /* modify HCR bitstream block */ #define ERROR_GENERATOR_BIT_STREAM_HCR 0 /* modify every -bit when reading from bitstream */ /* !!! BEWARE!!! if RVLC is active, also RVLC data at ESC2 will be modified !!! */ #define MODULO_DIVISOR_HCR 30 /* ------------------------------ */ /* - detect HCR errors - */ /* ------------------------------ */ /* check input data */ #define CHECK_VALID_HCR_INPUT 1 /* it is highly recommended to check input data */ /* during decoding */ #define CHECK_SEGMENTATION_IMMEDIATELY 1 /* the 2 or 4 lines of a detected PCW-decoding-error is marked */ #define CHECK_SEGMENTATION_FINAL 1 /* all the segments are checked -- therefore -- if this check passes, its a kind of evidence that the decoded PCWs and non-PCWs are fine */ #define DETECT_TOO_LONG_CW_READS 1 /* if a codeword is decoded there exists a border for the number of bits, which are allowed to read for this codeword. This border is the minimum of the length of the longest codeword (for the currently used codebook) and the separately transmitted 'lengthOfLongestCodeword' in this frame and channel. The number of decoded bits is counted (for PCWs only -- there it makes really sense in my opinion). If this number exceeds the border (derived as minimum -- see above), a error is detected. */ #define STATE_MACHINE_ERROR_CHECK 1 /* test if the number of remaining bits in a segment is _below_ zero. If there are no errors the lowest allowed value for remainingBitsInSegment is zero. This check also could be set to zero (save runtime) */ /* other */ #define VALID_LAV_ERROR_TRIGGER 1 /* when set to '1', avoid setting the LAV-Flag in errorLog due to a previous-line-marking (at PCW decoder). A little more runtime is needed then when writing values out into output-buffer. */ #define HCR_LISTEN_TO_MUTED_LINES 0 /* listen to the "error-concealment" for testing */ /* ------------------------------ */ /* - conceal HCR errors - */ /* ------------------------------ */ #define HCR_ERROR_CONCEALMENT 1 /* if set to '1', HCR _mutes_ the erred quantized spectral coefficients */ // ------------------------------------------------------------------------------------------------------------------ // errorLog: A word of 32 bits used for logging possible errors within HCR // in case of distorted bitstreams. Table of all known errors: // ------------------------------------------------------------------------------------------------------------------------ // bit fatal location meaning // ----+-----+-----------+-------------------------------------- #define SEGMENT_OVERRIDE_ERR_PCW_BODY 0x80000000 // 31 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check). #define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN 0x40000000 // 30 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check). #define SEGMENT_OVERRIDE_ERR_PCW_BODY_SIGN_ESC 0x20000000 // 29 no PCW-Dec During PCW decoding it is checked after every PCW if there are too many bits decoded (immediate check). #define EXTENDED_SORTED_COUNTER_OVERFLOW 0x10000000 // 28 yes Init-Dec Error during extending sideinfo (neither a PCW nor a nonPCW was decoded so far) // 0x08000000 // 27 reserved // 0x04000000 // 26 reserved // 0x02000000 // 25 reserved // 0x01000000 // 24 reserved // 0x00800000 // 23 reserved // 0x00400000 // 22 reserved // 0x00200000 // 21 reserved // 0x00100000 // 20 reserved /* special errors */ #define TOO_MANY_PCW_BODY_BITS_DECODED 0x00080000 // 19 yes PCW-Dec During PCW-body-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding #define TOO_MANY_PCW_BODY_SIGN_BITS_DECODED 0x00040000 // 18 yes PCW-Dec During PCW-body-sign-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding #define TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED 0x00020000 // 17 yes PCW-Dec During PCW-body-sign-esc-decoding too many bits have been read from bitstream -- advice: skip non-PCW decoding // 0x00010000 // 16 reserved #define STATE_ERROR_BODY_ONLY 0x00008000 // 15 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN__BODY 0x00004000 // 14 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN__SIGN 0x00002000 // 13 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN_ESC__BODY 0x00001000 // 12 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN_ESC__SIGN 0x00000800 // 11 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX 0x00000400 // 10 no NonPCW-Dec State machine returned with error #define STATE_ERROR_BODY_SIGN_ESC__ESC_WORD 0x00000200 // 9 no NonPCW-Dec State machine returned with error #define HCR_SI_LENGTHS_FAILURE 0x00000100 // 8 yes Init-Dec LengthOfLongestCodeword must not be less than lenghtOfReorderedSpectralData #define NUM_SECT_OUT_OF_RANGE_SHORT_BLOCK 0x00000080 // 7 yes Init-Dec The number of sections is not within the allowed range (short block) #define NUM_SECT_OUT_OF_RANGE_LONG_BLOCK 0x00000040 // 6 yes Init-Dec The number of sections is not within the allowed range (long block) #define LINE_IN_SECT_OUT_OF_RANGE_SHORT_BLOCK 0x00000020 // 5 yes Init-Dec The number of lines per section is not within the allowed range (short block) #define CB_OUT_OF_RANGE_SHORT_BLOCK 0x00000010 // 4 yes Init-Dec The codebook is not within the allowed range (short block) #define LINE_IN_SECT_OUT_OF_RANGE_LONG_BLOCK 0x00000008 // 3 yes Init-Dec The number of lines per section is not within the allowed range (long block) #define CB_OUT_OF_RANGE_LONG_BLOCK 0x00000004 // 2 yes Init-Dec The codebook is not within the allowed range (long block) #define LAV_VIOLATION 0x00000002 // 1 no Final The absolute value of at least one decoded line was too high for the according codebook. #define BIT_IN_SEGMENTATION_ERROR 0x00000001 // 0 no Final After PCW and non-PWC-decoding at least one segment is not zero (global check). /*----------*/ #define HCR_FATAL_PCW_ERROR_MASK 0x100E01FC typedef enum { PCW_BODY, PCW_BODY_SIGN, PCW_BODY_SIGN_ESC } PCW_TYPE; /* interface Decoder <---> HCR */ typedef struct { UINT errorLog; SPECTRAL_PTR pQuantizedSpectralCoefficientsBase; int quantizedSpectralCoefficientsIdx; SHORT lengthOfReorderedSpectralData; SHORT numSection; SHORT *pNumLineInSect; USHORT bitstreamIndex; SCHAR lengthOfLongestCodeword; UCHAR *pCodebook; } HCR_INPUT_OUTPUT; typedef struct { const UCHAR *pMinOfCbPair; const UCHAR *pMaxOfCbPair; } HCR_CB_PAIRS; typedef struct{ const USHORT *pLargestAbsVal; const UCHAR *pMaxCwLength; const UCHAR *pCbDimension; const UCHAR *pCbDimShift; const UCHAR *pCbSign; const UCHAR *pCbPriority; } HCR_TABLE_INFO; typedef struct{ UINT numSegment; UINT pSegmentBitfield[((1024>>1)/NUMBER_OF_BIT_IN_WORD+1)]; UINT pCodewordBitfield[((1024>>1)/NUMBER_OF_BIT_IN_WORD+1)]; UINT segmentOffset; FIXP_DBL pTempValues[1024]; USHORT pLeftStartOfSegment[1024>>1]; USHORT pRightStartOfSegment[1024>>1]; SCHAR pRemainingBitsInSegment[1024>>1]; UCHAR readDirection; UCHAR numWordForBitfield; USHORT pNumBitValidInLastWord; } HCR_SEGMENT_INFO; typedef struct{ UINT numCodeword; UINT numSortedSection; USHORT pNumCodewordInSection[MAX_SFB_HCR]; USHORT pNumSortedCodewordInSection[MAX_SFB_HCR]; USHORT pNumExtendedSortedCodewordInSection[MAX_SFB_HCR+MAX_HCR_SETS]; int numExtendedSortedCodewordInSectionIdx; USHORT pNumExtendedSortedSectionsInSets[MAX_HCR_SETS]; int numExtendedSortedSectionsInSetsIdx; USHORT pReorderOffset[MAX_SFB_HCR]; UCHAR pSortedCodebook[MAX_SFB_HCR]; UCHAR pExtendedSortedCodebook[MAX_SFB_HCR+MAX_HCR_SETS]; int extendedSortedCodebookIdx; #if DETECT_TOO_LONG_CW_READS UCHAR pMaxLenOfCbInExtSrtSec[MAX_SFB_HCR+MAX_HCR_SETS]; int maxLenOfCbInExtSrtSecIdx; #endif UCHAR pCodebookSwitch[MAX_SFB_HCR]; } HCR_SECTION_INFO; typedef UINT (*STATEFUNC)(HANDLE_FDK_BITSTREAM, void*); typedef struct{ /* worst-case and 1024/4 non-PCWs exist in worst-case */ FIXP_DBL *pResultBase; /* Base address for spectral data output target buffer */ UINT iNode[1024>>2]; /* Helper indices for code books */ USHORT iResultPointer[1024>>2]; /* Helper indices for accessing pResultBase */ UINT pEscapeSequenceInfo[1024>>2]; UINT codewordOffset; STATEFUNC pState; UCHAR pCodebook[1024>>2]; UCHAR pCntSign[1024>>2]; /* this array holds the states coded as integer values within the range [0,1,..,7] */ SCHAR pSta[1024>>2]; } HCR_NON_PCW_SIDEINFO; typedef struct{ HCR_INPUT_OUTPUT decInOut; HCR_CB_PAIRS cbPairs; HCR_TABLE_INFO tableInfo; HCR_SEGMENT_INFO segmentInfo; HCR_SECTION_INFO sectionInfo; HCR_NON_PCW_SIDEINFO nonPcwSideinfo; INT globalHcrType; } CErHcrInfo; typedef CErHcrInfo *H_HCR_INFO; #endif /* _AACDEC_HCR_TYPES_H_ */ fdk-aac-0.1.3/Makefile.am0000644000175000017500000001517012372261464015452 0ustar00tootstoots00000000000000ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = subdir-objects AM_CPPFLAGS = \ -I$(top_srcdir)/libAACdec/include \ -I$(top_srcdir)/libAACenc/include \ -I$(top_srcdir)/libSBRdec/include \ -I$(top_srcdir)/libSBRenc/include \ -I$(top_srcdir)/libMpegTPDec/include \ -I$(top_srcdir)/libMpegTPEnc/include \ -I$(top_srcdir)/libSYS/include \ -I$(top_srcdir)/libFDK/include \ -I$(top_srcdir)/libPCMutils/include AM_CXXFLAGS = -fno-exceptions -fno-rtti libfdk_aac_la_LINK = $(LINK) $(libfdk_aac_la_LDFLAGS) # Mention a dummy pure C file to trigger generation of the $(LINK) variable nodist_EXTRA_libfdk_aac_la_SOURCES = dummy.c fdk_aacincludedir = $(includedir)/fdk-aac fdk_aacinclude_HEADERS = \ $(top_srcdir)/libSYS/include/machine_type.h \ $(top_srcdir)/libSYS/include/genericStds.h \ $(top_srcdir)/libSYS/include/FDK_audio.h \ $(top_srcdir)/libAACenc/include/aacenc_lib.h \ $(top_srcdir)/libAACdec/include/aacdecoder_lib.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = fdk-aac.pc lib_LTLIBRARIES = libfdk-aac.la libfdk_aac_la_LDFLAGS = -version-info @FDK_AAC_VERSION@ -no-undefined \ -export-symbols $(top_srcdir)/fdk-aac.sym if EXAMPLE bin_PROGRAMS = aac-enc$(EXEEXT) aac_enc_LDADD = libfdk-aac.la aac_enc_SOURCES = aac-enc.c wavreader.c noinst_HEADERS = wavreader.h endif AACDEC_SRC = \ libAACdec/src/aacdec_drc.cpp \ libAACdec/src/aacdec_hcr.cpp \ libAACdec/src/aacdecoder.cpp \ libAACdec/src/aacdec_pns.cpp \ libAACdec/src/aac_ram.cpp \ libAACdec/src/block.cpp \ libAACdec/src/channelinfo.cpp \ libAACdec/src/ldfiltbank.cpp \ libAACdec/src/rvlcbit.cpp \ libAACdec/src/rvlc.cpp \ libAACdec/src/aacdec_hcr_bit.cpp \ libAACdec/src/aacdec_hcrs.cpp \ libAACdec/src/aacdecoder_lib.cpp \ libAACdec/src/aacdec_tns.cpp \ libAACdec/src/aac_rom.cpp \ libAACdec/src/channel.cpp \ libAACdec/src/conceal.cpp \ libAACdec/src/pulsedata.cpp \ libAACdec/src/rvlcconceal.cpp \ libAACdec/src/stereo.cpp AACENC_SRC = \ libAACenc/src/aacenc.cpp \ libAACenc/src/aacEnc_ram.cpp \ libAACenc/src/band_nrg.cpp \ libAACenc/src/block_switch.cpp \ libAACenc/src/grp_data.cpp \ libAACenc/src/metadata_main.cpp \ libAACenc/src/pre_echo_control.cpp \ libAACenc/src/quantize.cpp \ libAACenc/src/tonality.cpp \ libAACenc/src/aacenc_hcr.cpp \ libAACenc/src/aacEnc_rom.cpp \ libAACenc/src/bandwidth.cpp \ libAACenc/src/channel_map.cpp \ libAACenc/src/intensity.cpp \ libAACenc/src/ms_stereo.cpp \ libAACenc/src/psy_configuration.cpp \ libAACenc/src/sf_estim.cpp \ libAACenc/src/transform.cpp \ libAACenc/src/aacenc_lib.cpp \ libAACenc/src/aacenc_tns.cpp \ libAACenc/src/bit_cnt.cpp \ libAACenc/src/chaosmeasure.cpp \ libAACenc/src/line_pe.cpp \ libAACenc/src/noisedet.cpp \ libAACenc/src/psy_main.cpp \ libAACenc/src/spreading.cpp \ libAACenc/src/aacenc_pns.cpp \ libAACenc/src/adj_thr.cpp \ libAACenc/src/bitenc.cpp \ libAACenc/src/dyn_bits.cpp \ libAACenc/src/metadata_compressor.cpp \ libAACenc/src/pnsparam.cpp \ libAACenc/src/qc_main.cpp FDK_SRC = \ libFDK/src/autocorr2nd.cpp \ libFDK/src/dct.cpp \ libFDK/src/FDK_bitbuffer.cpp \ libFDK/src/FDK_core.cpp \ libFDK/src/FDK_crc.cpp \ libFDK/src/FDK_hybrid.cpp \ libFDK/src/FDK_tools_rom.cpp \ libFDK/src/FDK_trigFcts.cpp \ libFDK/src/fft.cpp \ libFDK/src/fft_rad2.cpp \ libFDK/src/fixpoint_math.cpp \ libFDK/src/mdct.cpp \ libFDK/src/qmf.cpp \ libFDK/src/scale.cpp MPEGTPDEC_SRC = \ libMpegTPDec/src/tpdec_adif.cpp \ libMpegTPDec/src/tpdec_adts.cpp \ libMpegTPDec/src/tpdec_asc.cpp \ libMpegTPDec/src/tpdec_latm.cpp \ libMpegTPDec/src/tpdec_lib.cpp MPEGTPENC_SRC = \ libMpegTPEnc/src/tpenc_adif.cpp \ libMpegTPEnc/src/tpenc_adts.cpp \ libMpegTPEnc/src/tpenc_asc.cpp \ libMpegTPEnc/src/tpenc_latm.cpp \ libMpegTPEnc/src/tpenc_lib.cpp PCMUTILS_SRC = \ libPCMutils/src/pcmutils_lib.cpp SBRDEC_SRC = \ libSBRdec/src/env_calc.cpp \ libSBRdec/src/env_dec.cpp \ libSBRdec/src/env_extr.cpp \ libSBRdec/src/huff_dec.cpp \ libSBRdec/src/lpp_tran.cpp \ libSBRdec/src/psbitdec.cpp \ libSBRdec/src/psdec.cpp \ libSBRdec/src/psdec_hybrid.cpp \ libSBRdec/src/sbr_crc.cpp \ libSBRdec/src/sbr_deb.cpp \ libSBRdec/src/sbr_dec.cpp \ libSBRdec/src/sbrdec_drc.cpp \ libSBRdec/src/sbrdec_freq_sca.cpp \ libSBRdec/src/sbrdecoder.cpp \ libSBRdec/src/sbr_ram.cpp \ libSBRdec/src/sbr_rom.cpp SBRENC_SRC = \ libSBRenc/src/bit_sbr.cpp \ libSBRenc/src/env_bit.cpp \ libSBRenc/src/fram_gen.cpp \ libSBRenc/src/mh_det.cpp \ libSBRenc/src/ps_bitenc.cpp \ libSBRenc/src/ps_encode.cpp \ libSBRenc/src/resampler.cpp \ libSBRenc/src/sbr_encoder.cpp \ libSBRenc/src/sbr_ram.cpp \ libSBRenc/src/ton_corr.cpp \ libSBRenc/src/code_env.cpp \ libSBRenc/src/env_est.cpp \ libSBRenc/src/invf_est.cpp \ libSBRenc/src/nf_est.cpp \ libSBRenc/src/ps_main.cpp \ libSBRenc/src/sbrenc_freq_sca.cpp \ libSBRenc/src/sbr_misc.cpp \ libSBRenc/src/sbr_rom.cpp \ libSBRenc/src/tran_det.cpp SYS_SRC = \ libSYS/src/cmdl_parser.cpp \ libSYS/src/conv_string.cpp \ libSYS/src/genericStds.cpp \ libSYS/src/wav_file.cpp libfdk_aac_la_SOURCES = \ $(AACDEC_SRC) $(AACENC_SRC) \ $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ $(SBRDEC_SRC) $(SBRENC_SRC) \ $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) EXTRA_DIST = \ $(top_srcdir)/autogen.sh \ $(top_srcdir)/NOTICE \ $(top_srcdir)/Android.mk \ $(top_srcdir)/fdk-aac.sym \ $(top_srcdir)/documentation/*.pdf \ $(top_srcdir)/libAACdec/src/*.h \ $(top_srcdir)/libAACdec/src/arm/*.cpp \ $(top_srcdir)/libAACenc/src/*.h \ $(top_srcdir)/libSBRenc/src/*.h \ $(top_srcdir)/libSBRenc/include/*.h \ $(top_srcdir)/libSBRdec/src/*.h \ $(top_srcdir)/libSBRdec/src/arm/*.cpp \ $(top_srcdir)/libSBRdec/include/*.h \ $(top_srcdir)/libSYS/include/*.h \ $(top_srcdir)/libSYS/src/linux/*.cpp \ $(top_srcdir)/libSYS/src/mips/*.cpp \ $(top_srcdir)/libPCMutils/include/*.h \ $(top_srcdir)/libMpegTPEnc/include/*.h \ $(top_srcdir)/libMpegTPEnc/src/*.h \ $(top_srcdir)/libMpegTPEnc/src/version \ $(top_srcdir)/libMpegTPDec/include/*.h \ $(top_srcdir)/libMpegTPDec/src/*.h \ $(top_srcdir)/libMpegTPDec/src/version \ $(top_srcdir)/libFDK/include/*.h \ $(top_srcdir)/libFDK/include/arm/*.h \ $(top_srcdir)/libFDK/include/mips/*.h \ $(top_srcdir)/libFDK/include/x86/*.h \ $(top_srcdir)/libFDK/src/arm/*.cpp \ $(top_srcdir)/libFDK/src/mips/*.cpp fdk-aac-0.1.3/ChangeLog0000644000175000017500000000122312372261464015162 0ustar00tootstoots000000000000000.1.3 - Updated upstream sources, with a number of crash fixes and new features (including support for encoding 7.1) 0.1.2 - Fix a few more crashes - Include dependency libs (such as -lm) in the pkg-config file 0.1.1 - Updated to a new upstream version from Android 4.2, fixing a lot of crashes - Cleanup of autotools usage - Make sure the shared library links to libm if necessary - Performance improvements on x86 - Added support for WG4/DVD audio channel mappings - Minimized the differences to upstream - Added an example encoder tool 0.1.0 - Initial release of fdk-aac - autotools based build system - Enable setting VBR bitrate modes fdk-aac-0.1.3/libAACenc/0000755000175000017500000000000012372262442015150 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACenc/include/0000755000175000017500000000000012372262442016573 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACenc/include/aacenc_lib.h0000644000175000017500000021632712372261464021022 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /**************************** MPEG-4 HE-AAC Encoder ************************** Initial author: M. Lohwasser ******************************************************************************/ /** * \file aacenc_lib.h * \brief FDK AAC Encoder library interface header file. * \mainpage Introduction \section Scope This document describes the high-level interface and usage of the ISO/MPEG-2/4 AAC Encoder library developed by the Fraunhofer Institute for Integrated Circuits (IIS). The library implements encoding on the basis of the MPEG-2 and MPEG-4 AAC Low-Complexity standard, and depending on the library's configuration, MPEG-4 High-Efficiency AAC v2 and/or AAC-ELD standard. All references to SBR (Spectral Band Replication) are only applicable to HE-AAC or AAC-ELD versions of the library. All references to PS (Parametric Stereo) are only applicable to HE-AAC v2 versions of the library. \section encBasics Encoder Basics This document can only give a rough overview about the ISO/MPEG-2 and ISO/MPEG-4 AAC audio coding standard. To understand all the terms in this document, you are encouraged to read the following documents. - ISO/IEC 13818-7 (MPEG-2 AAC), which defines the syntax of MPEG-2 AAC audio bitstreams. - ISO/IEC 14496-3 (MPEG-4 AAC, subparts 1 and 4), which defines the syntax of MPEG-4 AAC audio bitstreams. - Lutzky, Schuller, Gayer, Krämer, Wabnik, "A guideline to audio codec delay", 116th AES Convention, May 8, 2004 MPEG Advanced Audio Coding is based on a time-to-frequency mapping of the signal. The signal is partitioned into overlapping portions and transformed into frequency domain. The spectral components are then quantized and coded. \n An MPEG-2 or MPEG-4 AAC audio bitstream is composed of frames. Contrary to MPEG-1/2 Layer-3 (mp3), the length of individual frames is not restricted to a fixed number of bytes, but can take on any length between 1 and 768 bytes. \page LIBUSE Library Usage \section InterfaceDescription API Files All API header files are located in the folder /include of the release package. All header files are provided for usage in C/C++ programs. The AAC encoder library API functions are located at aacenc_lib.h. In binary releases the encoder core resides in statically linkable libraries called for example libAACenc.a/libFDK.a (LINUX) or FDK_fastaaclib.lib (MS Visual C++) for the plain AAC-LC core encoder and libSBRenc.a (LINUX) or FDK_sbrEncLib.lib (MS Visual C++) for the SBR (Spectral Band Replication) and PS (Parametric Stereo) modules. \section CallingSequence Calling Sequence For encoding of ISO/MPEG-2/4 AAC bitstreams the following sequence is mandatory. Input read and output write functions as well as the corresponding open and close functions are left out, since they may be implemented differently according to the user's specific requirements. The example implementation in main.cpp uses file-based input/output. -# Call aacEncOpen() to allocate encoder instance with required \ref encOpen "configuration".\n \dontinclude main.cpp \skipline hAacEncoder = \skipline aacEncOpen -# Call aacEncoder_SetParam() for each parameter to be set. AOT, samplingrate, channelMode, bitrate and transport type are \ref encParams "mandatory". \code ErrorStatus = aacEncoder_SetParam(hAacEncoder, parameter, value); \endcode -# Call aacEncEncode() with NULL parameters to \ref encReconf "initialize" encoder instance with present parameter set. \skipline aacEncEncode -# Call aacEncInfo() to retrieve a configuration data block to be transmitted out of band. This is required when using RFC3640 or RFC3016 like transport. \dontinclude main.cpp \skipline encInfo \skipline aacEncInfo -# Encode input audio data in loop. \skip Encode as long as \skipline do \until { Feed \ref feedInBuf "input buffer" with new audio data and provide input/output \ref bufDes "arguments" to aacEncEncode(). \skipline aacEncEncode \until ; Write \ref writeOutData "output data" to file or audio device. \skipline while -# Call aacEncClose() and destroy encoder instance. \skipline aacEncClose \section encOpen Encoder Instance Allocation The assignment of the aacEncOpen() function is very flexible and can be used in the following way. - If the amount of memory consumption is not an issue, the encoder instance can be allocated for the maximum number of possible audio channels (for example 6 or 8) with the full functional range supported by the library. This is the default open procedure for the AAC encoder if memory consumption does not need to be minimized. \code aacEncOpen(&hAacEncoder,0,0) \endcode - If the required MPEG-4 AOTs do not call for the full functional range of the library, encoder modules can be allocated selectively. \verbatim ------------------------------------------------------ AAC | SBR | PS | MD | FLAGS | value -----+-----+-----+----+-----------------------+------- X | - | - | - | (0x01) | 0x01 X | X | - | - | (0x01|0x02) | 0x03 X | X | X | - | (0x01|0x02|0x04) | 0x07 X | - | - | X | (0x01 |0x10) | 0x11 X | X | - | X | (0x01|0x02 |0x10) | 0x13 X | X | X | X | (0x01|0x02|0x04|0x10) | 0x17 ------------------------------------------------------ - AAC: Allocate AAC Core Encoder module. - SBR: Allocate Spectral Band Replication module. - PS: Allocate Parametric Stereo module. - MD: Allocate Meta Data module within AAC encoder. \endverbatim \code aacEncOpen(&hAacEncoder,value,0) \endcode - Specifying the maximum number of channels to be supported in the encoder instance can be done as follows. - For example allocate an encoder instance which supports 2 channels for all supported AOTs. The library itself may be capable of encoding up to 6 or 8 channels but in this example only 2 channel encoding is required and thus only buffers for 2 channels are allocated to save data memory. \code aacEncOpen(&hAacEncoder,0,2) \endcode - Additionally the maximum number of supported channels in the SBR module can be denoted separately.\n In this example the encoder instance provides a maximum of 6 channels out of which up to 2 channels support SBR. This encoder instance can produce for example 5.1 channel AAC-LC streams or stereo HE-AAC (v2) streams. HE-AAC 5.1 multi channel is not possible since only 2 out of 6 channels support SBR, which saves data memory. \code aacEncOpen(&hAacEncoder,0,6|(2<<8)) \endcode \n \section bufDes Input/Output Arguments \subsection allocIOBufs Provide Buffer Descriptors In the present encoder API, the input and output buffers are described with \ref AACENC_BufDesc "buffer descriptors". This mechanism allows a flexible handling of input and output buffers without impact to the actual encoding call. Optional buffers are necessary e.g. for ancillary data, meta data input or additional output buffers describing superframing data in DAB+ or DRM+.\n At least one input buffer for audio input data and one output buffer for bitstream data must be allocated. The input buffer size can be a user defined multiple of the number of input channels. PCM input data will be copied from the user defined PCM buffer to an internal input buffer and so input data can be less than one AAC audio frame. The output buffer size should be 6144 bits per channel excluding the LFE channel. If the output data does not fit into the provided buffer, an AACENC_ERROR will be returned by aacEncEncode(). \dontinclude main.cpp \skipline inputBuffer \until outputBuffer All input and output buffer must be clustered in input and output buffer arrays. \skipline inBuffer \until outBufferElSize Allocate buffer descriptors \skipline AACENC_BufDesc \skipline AACENC_BufDesc Initialize input buffer descriptor \skipline inBufDesc \until bufElSizes Initialize output buffer descriptor \skipline outBufDesc \until bufElSizes \subsection argLists Provide Input/Output Argument Lists The input and output arguments of an aacEncEncode() call are described in argument structures. \dontinclude main.cpp \skipline AACENC_InArgs \skipline AACENC_OutArgs \section feedInBuf Feed Input Buffer The input buffer should be handled as a modulo buffer. New audio data in the form of pulse-code- modulated samples (PCM) must be read from external and be fed to the input buffer depending on its fill level. The required sample bitrate (represented by the data type INT_PCM which is 16, 24 or 32 bits wide) is fixed and depends on library configuration (usually 16 bit). \dontinclude main.cpp \skipline WAV_InputRead \until ; After the encoder's internal buffer is fed with incoming audio samples, and aacEncEncode() processed the new input data, update/move remaining samples in input buffer, simulating a modulo buffer: \skipline outargs.numInSamples>0 \until } \section writeOutData Output Bitstream Data If any AAC bitstream data is available, write it to output file or device. This can be done once the following condition is true: \dontinclude main.cpp \skip Valid bitstream available \skipline outargs \skipline outBytes>0 If you use file I/O then for example call mpegFileWrite_Write() from the library libMpegFileWrite \dontinclude main.cpp \skipline mpegFileWrite_Write \section cfgMetaData Meta Data Configuration If the present library is configured with Metadata support, it is possible to insert meta data side info into the generated audio bitstream while encoding. To work with meta data the encoder instance has to be \ref encOpen "allocated" with meta data support. The meta data mode must be be configured with the ::AACENC_METADATA_MODE parameter and aacEncoder_SetParam() function. \code aacEncoder_SetParam(hAacEncoder, AACENC_METADATA_MODE, 0-2); \endcode This configuration indicates how to embed meta data into bitstrem. Either no insertion, MPEG or ETSI style. The meta data itself must be specified within the meta data setup structure AACENC_MetaData. Changing one of the AACENC_MetaData setup parameters can be achieved from outside the library within ::IN_METADATA_SETUP input buffer. There is no need to supply meta data setup structure every frame. If there is no new meta setup data available, the encoder uses the previous setup or the default configuration in initial state. In general the audio compressor and limiter within the encoder library can be configured with the ::AACENC_METADATA_DRC_PROFILE parameter AACENC_MetaData::drc_profile and and AACENC_MetaData::comp_profile. \n \section encReconf Encoder Reconfiguration The encoder library allows reconfiguration of the encoder instance with new settings continuously between encoding frames. Each parameter to be changed must be set with a single aacEncoder_SetParam() call. The internal status of each parameter can be retrieved with an aacEncoder_GetParam() call.\n There is no stand-alone reconfiguration function available. When parameters were modified from outside the library, an internal control mechanism triggers the necessary reconfiguration process which will be applied at the beginning of the following aacEncEncode() call. This state can be observed from external via the AACENC_INIT_STATUS and aacEncoder_GetParam() function. The reconfiguration process can also be applied immediately when all parameters of an aacEncEncode() call are NULL with a valid encoder handle.\n\n The internal reconfiguration process can be controlled from extern with the following access. \code aacEncoder_SetParam(hAacEncoder, AACENC_CONTROL_STATE, AACENC_CTRLFLAGS); \endcode \section encParams Encoder Parametrization All parameteres listed in ::AACENC_PARAM can be modified within an encoder instance. \subsection encMandatory Mandatory Encoder Parameters The following parameters must be specified when the encoder instance is initialized. \code aacEncoder_SetParam(hAacEncoder, AACENC_AOT, value); aacEncoder_SetParam(hAacEncoder, AACENC_BITRATE, value); aacEncoder_SetParam(hAacEncoder, AACENC_SAMPLERATE, value); aacEncoder_SetParam(hAacEncoder, AACENC_CHANNELMODE, value); \endcode Beyond that is an internal auto mode which preinitizializes the ::AACENC_BITRATE parameter if the parameter was not set from extern. The bitrate depends on the number of effective channels and sampling rate and is determined as follows. \code AAC-LC (AOT_AAC_LC): 1.5 bits per sample HE-AAC (AOT_SBR): 0.625 bits per sample (dualrate sbr) HE-AAC (AOT_SBR): 1.125 bits per sample (downsampled sbr) HE-AAC v2 (AOT_PS): 0.5 bits per sample \endcode \subsection channelMode Channel Mode Configuration The input audio data is described with the ::AACENC_CHANNELMODE parameter in the aacEncoder_SetParam() call. It is not possible to use the encoder instance with a 'number of input channels' argument. Instead, the channelMode must be set as follows. \code aacEncoder_SetParam(hAacEncoder, AACENC_CHANNELMODE, value); \endcode The parameter is specified in ::CHANNEL_MODE and can be mapped from the number of input channels in the following way. \dontinclude main.cpp \skip CHANNEL_MODE chMode = MODE_INVALID; \until return \subsection encQual Audio Quality Considerations The default encoder configuration is suggested to be used. Encoder tools such as TNS and PNS are activated by default and are internally controlled (see \ref BEHAVIOUR_TOOLS). There is an additional quality parameter called ::AACENC_AFTERBURNER. In the default configuration this quality switch is deactivated because it would cause a workload increase which might be significant. If workload is not an issue in the application we recommended to activate this feature. \code aacEncoder_SetParam(hAacEncoder, AACENC_AFTERBURNER, 1); \endcode \subsection encELD ELD Auto Configuration Mode For ELD configuration a so called auto configurator is available which configures SBR and the SBR ratio by itself. The configurator is used when the encoder parameter ::AACENC_SBR_MODE and ::AACENC_SBR_RATIO are not set explicitely. Based on sampling rate and chosen bitrate per channel a reasonable SBR configuration will be used. \verbatim ------------------------------------------------------------ Sampling Rate | Channel Bitrate | SBR | SBR Ratio -----------------+-----------------+------+----------------- ]min, 16] kHz | min - 27999 | on | downsampled SBR | 28000 - max | off | --- -----------------+-----------------+------+----------------- ]16 - 24] kHz | min - 39999 | on | downsampled SBR | 40000 - max | off | --- -----------------+-----------------+------+----------------- ]24 - 32] kHz | min - 27999 | on | dualrate SBR | 28000 - 55999 | on | downsampled SBR | 56000 - max | off | --- -----------------+-----------------+------+----------------- ]32 - 44.1] kHz | min - 63999 | on | dualrate SBR | 64000 - max | off | --- -----------------+-----------------+------+----------------- ]44.1 - 48] kHz | min - 63999 | on | dualrate SBR | 64000 - max | off | --- ------------------------------------------------------------ \endverbatim \section audiochCfg Audio Channel Configuration The MPEG standard refers often to the so-called Channel Configuration. This Channel Configuration is used for a fixed Channel Mapping. The configurations 1-7 are predefined in MPEG standard and used for implicit signalling within the encoded bitstream. For user defined Configurations the Channel Configuration is set to 0 and the Channel Mapping must be explecitly described with an appropriate Program Config Element. The present Encoder implementation does not allow the user to configure this Channel Configuration from extern. The Encoder implementation supports fixed Channel Modes which are mapped to Channel Configuration as follow. \verbatim ------------------------------------------------------------------------------- ChannelMode | ChCfg | front_El | side_El | back_El | lfe_El -----------------------+--------+---------------+----------+----------+-------- MODE_1 | 1 | SCE | | | MODE_2 | 2 | CPE | | | MODE_1_2 | 3 | SCE, CPE | | | MODE_1_2_1 | 4 | SCE, CPE | | SCE | MODE_1_2_2 | 5 | SCE, CPE | | CPE | MODE_1_2_2_1 | 6 | SCE, CPE | | CPE | LFE MODE_1_2_2_2_1 | 7 | SCE, CPE, CPE | | CPE | LFE -----------------------+--------+---------------+----------+----------+-------- MODE_7_1_REAR_SURROUND | 0 | SCE, CPE | | CPE, CPE | LFE MODE_7_1_FRONT_CENTER | 0 | SCE, CPE, CPE | | CPE | LFE ------------------------------------------------------------------------------- - SCE: Single Channel Element. - CPE: Channel Pair. - SCE: Low Frequency Element. \endverbatim Moreover, the Table describes all fixed Channel Elements for each Channel Mode which are assigned to a speaker arrangement. The arrangement includes front, side, back and lfe Audio Channel Elements.\n This mapping of Audio Channel Elements is defined in MPEG standard for Channel Config 1-7. The Channel assignment for MODE_1_1, MODE_2_2 and MODE_2_1 is used from the ARIB standard. All other configurations are defined as suggested in MPEG.\n In case of Channel Config 0 or writing matrix mixdown coefficients, the encoder enables the writing of Program Config Element itself as described in \ref encPCE. The configuration used in Program Config Element refers to the denoted Table.\n Beside the Channel Element assignment the Channel Modes are resposible for audio input data channel mapping. The Channel Mapping of the audio data depends on the selected ::AACENC_CHANNELORDER which can be MPEG or WAV like order.\n Following Table describes the complete channel mapping for both Channel Order configurations. \verbatim --------------------------------------------------------------------------------------- ChannelMode | MPEG-Channelorder | WAV-Channelorder -----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- MODE_1 | 0 | | | | | | | | 0 | | | | | | | MODE_2 | 0 | 1 | | | | | | | 0 | 1 | | | | | | MODE_1_2 | 0 | 1 | 2 | | | | | | 2 | 0 | 1 | | | | | MODE_1_2_1 | 0 | 1 | 2 | 3 | | | | | 2 | 0 | 1 | 3 | | | | MODE_1_2_2 | 0 | 1 | 2 | 3 | 4 | | | | 2 | 0 | 1 | 3 | 4 | | | MODE_1_2_2_1 | 0 | 1 | 2 | 3 | 4 | 5 | | | 2 | 0 | 1 | 4 | 5 | 3 | | MODE_1_2_2_2_1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 6 | 7 | 0 | 1 | 4 | 5 | 3 -----------------------+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+--- MODE_7_1_REAR_SURROUND | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 0 | 1 | 6 | 7 | 4 | 5 | 3 MODE_7_1_FRONT_CENTER | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 2 | 6 | 7 | 0 | 1 | 4 | 5 | 3 --------------------------------------------------------------------------------------- \endverbatim The denoted mapping is important for correct audio channel assignment when using MPEG or WAV ordering. The incoming audio channels are distributed MPEG like starting at the front channels and ending at the back channels. The distribution is used as described in Table concering Channel Config and fix channel elements. Please see the following example for clarification. \verbatim Example: MODE_1_2_2_1 - WAV-Channelorder 5.1 ------------------------------------------ Input Channel | Coder Channel --------------------+--------------------- 2 (front center) | 0 (SCE channel) 0 (left center) | 1 (1st of 1st CPE) 1 (right center) | 2 (2nd of 1st CPE) 4 (left surround) | 3 (1st of 2nd CPE) 5 (right surround) | 4 (2nd of 2nd CPE) 3 (LFE) | 5 (LFE) ------------------------------------------ \endverbatim \section suppBitrates Supported Bitrates The FDK AAC Encoder provides a wide range of supported bitrates. The minimum and maximum allowed bitrate depends on the Audio Object Type. For AAC-LC the minimum bitrate is the bitrate that is required to write the most basic and minimal valid bitstream. It consists of the bitstream format header information and other static/mandatory information within the AAC payload. The maximum AAC framesize allowed by the MPEG-4 standard determines the maximum allowed bitrate for AAC-LC. For HE-AAC and HE-AAC v2 a library internal look-up table is used. A good working point in terms of audio quality, sampling rate and bitrate, is at 1 to 1.5 bits/audio sample for AAC-LC, 0.625 bits/audio sample for dualrate HE-AAC, 1.125 bits/audio sample for downsampled HE-AAC and 0.5 bits/audio sample for HE-AAC v2. For example for one channel with a sampling frequency of 48 kHz, the range from 48 kbit/s to 72 kbit/s achieves reasonable audio quality for AAC-LC. For HE-AAC and HE-AAC v2 the lowest possible audio input sampling frequency is 16 kHz because then the AAC-LC core encoder operates in dual rate mode at its lowest possible sampling frequency, which is 8 kHz. HE-AAC v2 requires stereo input audio data. Please note that in HE-AAC or HE-AAC v2 mode the encoder supports much higher bitrates than are appropriate for HE-AAC or HE-AAC v2. For example, at a bitrate of more than 64 kbit/s for a stereo audio signal at 44.1 kHz it usually makes sense to use AAC-LC, which will produce better audio quality at that bitrate than HE-AAC or HE-AAC v2. \section reommendedConfig Recommended Sampling Rate and Bitrate Combinations The following table provides an overview of recommended encoder configuration parameters which we determined by virtue of numerous listening tests. \subsection reommendedConfigLC AAC-LC, HE-AAC, HE-AACv2 in Dualrate SBR mode. \verbatim ----------------------------------------------------------------------------------- Audio Object Type | Bit Rate Range | Supported | Preferred | No. of | [bit/s] | Sampling Rates | Sampl. | Chan. | | [kHz] | Rate | | | | [kHz] | -------------------+------------------+-----------------------+------------+------- AAC LC + SBR + PS | 8000 - 11999 | 22.05, 24.00 | 24.00 | 2 AAC LC + SBR + PS | 12000 - 17999 | 32.00 | 32.00 | 2 AAC LC + SBR + PS | 18000 - 39999 | 32.00, 44.10, 48.00 | 44.10 | 2 AAC LC + SBR + PS | 40000 - 56000 | 32.00, 44.10, 48.00 | 48.00 | 2 -------------------+------------------+-----------------------+------------+------- AAC LC + SBR | 8000 - 11999 | 22.05, 24.00 | 24.00 | 1 AAC LC + SBR | 12000 - 17999 | 32.00 | 32.00 | 1 AAC LC + SBR | 18000 - 39999 | 32.00, 44.10, 48.00 | 44.10 | 1 AAC LC + SBR | 40000 - 56000 | 32.00, 44.10, 48.00 | 48.00 | 1 AAC LC + SBR | 16000 - 27999 | 32.00, 44.10, 48.00 | 32.00 | 2 AAC LC + SBR | 28000 - 63999 | 32.00, 44.10, 48.00 | 44.10 | 2 AAC LC + SBR | 64000 - 128000 | 32.00, 44.10, 48.00 | 48.00 | 2 -------------------+------------------+-----------------------+------------+------- AAC LC + SBR | 64000 - 69999 | 32.00, 44.10, 48.00 | 32.00 | 5, 5.1 AAC LC + SBR | 70000 - 159999 | 32.00, 44.10, 48.00 | 44.10 | 5, 5.1 AAC LC + SBR | 160000 - 245999 | 32.00, 44.10, 48.00 | 48.00 | 5 AAC LC + SBR | 160000 - 265999 | 32.00, 44.10, 48.00 | 48.00 | 5.1 -------------------+------------------+-----------------------+------------+------- AAC LC | 8000 - 15999 | 11.025, 12.00, 16.00 | 12.00 | 1 AAC LC | 16000 - 23999 | 16.00 | 16.00 | 1 AAC LC | 24000 - 31999 | 16.00, 22.05, 24.00 | 24.00 | 1 AAC LC | 32000 - 55999 | 32.00 | 32.00 | 1 AAC LC | 56000 - 160000 | 32.00, 44.10, 48.00 | 44.10 | 1 AAC LC | 160001 - 288000 | 48.00 | 48.00 | 1 -------------------+------------------+-----------------------+------------+------- AAC LC | 16000 - 23999 | 11.025, 12.00, 16.00 | 12.00 | 2 AAC LC | 24000 - 31999 | 16.00 | 16.00 | 2 AAC LC | 32000 - 39999 | 16.00, 22.05, 24.00 | 22.05 | 2 AAC LC | 40000 - 95999 | 32.00 | 32.00 | 2 AAC LC | 96000 - 111999 | 32.00, 44.10, 48.00 | 32.00 | 2 AAC LC | 112000 - 320001 | 32.00, 44.10, 48.00 | 44.10 | 2 AAC LC | 320002 - 576000 | 48.00 | 48.00 | 2 -------------------+------------------+-----------------------+------------+------- AAC LC | 160000 - 239999 | 32.00 | 32.00 | 5, 5.1 AAC LC | 240000 - 279999 | 32.00, 44.10, 48.00 | 32.00 | 5, 5.1 AAC LC | 280000 - 800000 | 32.00, 44.10, 48.00 | 44.10 | 5, 5.1 ----------------------------------------------------------------------------------- \endverbatim \n \subsection reommendedConfigLD AAC-LD, AAC-ELD, AAC-ELD with SBR in Dualrate SBR mode. \verbatim ----------------------------------------------------------------------------------- Audio Object Type | Bit Rate Range | Supported | Preferred | No. of | [bit/s] | Sampling Rates | Sampl. | Chan. | | [kHz] | Rate | | | | [kHz] | -------------------+------------------+-----------------------+------------+------- ELD + SBR | 18000 - 24999 | 32.00 - 44.10 | 32.00 | 1 ELD + SBR | 25000 - 31999 | 32.00 - 48.00 | 32.00 | 1 ELD + SBR | 32000 - 64000 | 32.00 - 48.00 | 48.00 | 1 -------------------+------------------+-----------------------+------------+------- ELD + SBR | 32000 - 51999 | 32.00 - 48.00 | 44.10 | 2 ELD + SBR | 52000 - 128000 | 32.00 - 48.00 | 48.00 | 2 -------------------+------------------+-----------------------+------------+------- ELD + SBR | 72000 - 160000 | 44.10 - 48.00 | 48.00 | 3 -------------------+------------------+-----------------------+------------+------- ELD + SBR | 96000 - 212000 | 44.10 - 48.00 | 48.00 | 4 -------------------+------------------+-----------------------+------------+------- ELD + SBR | 120000 - 246000 | 44.10 - 48.00 | 48.00 | 5 -------------------+------------------+-----------------------+------------+------- ELD + SBR | 120000 - 266000 | 44.10 - 48.00 | 48.00 | 5.1 -------------------+------------------+-----------------------+------------+------- LD, ELD | 16000 - 19999 | 16.00 - 24.00 | 16.00 | 1 LD, ELD | 20000 - 39999 | 16.00 - 32.00 | 24.00 | 1 LD, ELD | 40000 - 49999 | 22.05 - 32.00 | 32.00 | 1 LD, ELD | 50000 - 61999 | 24.00 - 44.10 | 32.00 | 1 LD, ELD | 62000 - 84999 | 32.00 - 48.00 | 44.10 | 1 LD, ELD | 85000 - 192000 | 44.10 - 48.00 | 48.00 | 1 -------------------+------------------+-----------------------+------------+------- LD, ELD | 64000 - 75999 | 24.00 - 32.00 | 32.00 | 2 LD, ELD | 76000 - 97999 | 24.00 - 44.10 | 32.00 | 2 LD, ELD | 98000 - 135999 | 32.00 - 48.00 | 44.10 | 2 LD, ELD | 136000 - 384000 | 44.10 - 48.00 | 48.00 | 2 -------------------+------------------+-----------------------+------------+------- LD, ELD | 96000 - 113999 | 24.00 - 32.00 | 32.00 | 3 LD, ELD | 114000 - 146999 | 24.00 - 44.10 | 32.00 | 3 LD, ELD | 147000 - 203999 | 32.00 - 48.00 | 44.10 | 3 LD, ELD | 204000 - 576000 | 44.10 - 48.00 | 48.00 | 3 -------------------+------------------+-----------------------+------------+------- LD, ELD | 128000 - 151999 | 24.00 - 32.00 | 32.00 | 4 LD, ELD | 152000 - 195999 | 24.00 - 44.10 | 32.00 | 4 LD, ELD | 196000 - 271999 | 32.00 - 48.00 | 44.10 | 4 LD, ELD | 272000 - 768000 | 44.10 - 48.00 | 48.00 | 4 -------------------+------------------+-----------------------+------------+------- LD, ELD | 160000 - 189999 | 24.00 - 32.00 | 32.00 | 5 LD, ELD | 190000 - 244999 | 24.00 - 44.10 | 32.00 | 5 LD, ELD | 245000 - 339999 | 32.00 - 48.00 | 44.10 | 5 LD, ELD | 340000 - 960000 | 44.10 - 48.00 | 48.00 | 5 ----------------------------------------------------------------------------------- \endverbatim \n \subsection reommendedConfigELD AAC-ELD with SBR in Downsampled SBR mode. \verbatim ----------------------------------------------------------------------------------- Audio Object Type | Bit Rate Range | Supported | Preferred | No. of | [bit/s] | Sampling Rates | Sampl. | Chan. | | [kHz] | Rate | | | | [kHz] | -------------------+------------------+-----------------------+------------+------- ELD + SBR | 18000 - 24999 | 16.00 - 22.05 | 22.05 | 1 (downsampled SBR) | 25000 - 35999 | 22.05 - 32.00 | 24.00 | 1 | 36000 - 64000 | 32.00 - 48.00 | 32.00 | 1 ----------------------------------------------------------------------------------- \endverbatim \n \page ENCODERBEHAVIOUR Encoder Behaviour \section BEHAVIOUR_BANDWIDTH Bandwidth The FDK AAC encoder usually does not use the full frequency range of the input signal, but restricts the bandwidth according to certain library-internal settings. They can be changed in the table "bandWidthTable" in the file bandwidth.cpp (if available). The encoder API provides the ::AACENC_BANDWIDTH parameter to adjust the bandwidth explicitly. \code aacEncoder_SetParam(hAacEncoder, AACENC_BANDWIDTH, value); \endcode However it is not recommended to change these settings, because they are based on numerious listening tests and careful tweaks to ensure the best overall encoding quality. Theoretically a signal of for example 48 kHz can contain frequencies up to 24 kHz, but to use this full range in an audio encoder usually does not make sense. Usually the encoder has a very limited amount of bits to spend (typically 128 kbit/s for stereo 48 kHz content) and to allow full range bandwidth would waste a lot of these bits for frequencies the human ear is hardly able to perceive anyway, if at all. Hence it is wise to use the available bits for the really important frequency range and just skip the rest. At lower bitrates (e. g. <= 80 kbit/s for stereo 48 kHz content) the encoder will choose an even smaller bandwidth, because an encoded signal with smaller bandwidth and hence less artifacts sounds better than a signal with higher bandwidth but then more coding artefacts across all frequencies. These artefacts would occur if small bitrates and high bandwidths are chosen because the available bits are just not enough to encode all frequencies well. Unfortunately some people evaluate encoding quality based on possible bandwidth as well, but it is a two-sided sword considering the trade-off described above. Another aspect is workload consumption. The higher the allowed bandwidth, the more frequency lines have to be processed, which in turn increases the workload. \section FRAMESIZES_AND_BIT_RESERVOIR Frame Sizes & Bit Reservoir For AAC there is a difference between constant bit rate and constant frame length due to the so-called bit reservoir technique, which allows the encoder to use less bits in an AAC frame for those audio signal sections which are easy to encode, and then spend them at a later point in time for more complex audio sections. The extent to which this "bit exchange" is done is limited to allow for reliable and relatively low delay real time streaming. Over a longer period in time the bitrate will be constant in the AAC constant bitrate mode, e.g. for ISDN transmission. This means that in AAC each bitstream frame will in general have a different length in bytes but over time it will reach the target bitrate. One could also make an MPEG compliant AAC encoder which always produces constant length packages for each AAC frame, but the audio quality would be considerably worse since the bit reservoir technique would have to be switched off completely. A higher bit rate would have to be used to get the same audio quality as with an enabled bit reservoir. The maximum AAC frame length, regardless of the available bit reservoir, is defined as 6144 bits per channel. For mp3 by the way, the same bit reservoir technique exists, but there each bit stream frame has a constant length for a given bit rate (ignoring the padding byte). In mp3 there is a so-called "back pointer" which tells the decoder which bits belong to the current mp3 frame - and in general some or many bits have been transmitted in an earlier mp3 frame. Basically this leads to the same "bit exchange between mp3 frames" as in AAC but with virtually constant length frames. This variable frame length at "constant bit rate" is not something special in this Fraunhofer IIS AAC encoder. AAC has been designed in that way. \subsection BEHAVIOUR_ESTIM_AVG_FRAMESIZES Estimating Average Frame Sizes A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel (there is also one mode with 1920 samples per channel but this is only for special purposes such as DAB+ digital radio). The number of HE-AAC frames \f$N\_FRAMES\f$ per second at 44.1 kHz is: \f[ N\_FRAMES = 44100 / 2048 = 21.5332 \f] At a bit rate of 8 kbps the average number of bits per frame \f$N\_BITS\_PER\_FRAME\f$ is: \f[ N\_BITS\_PER\_FRAME = 8000 / 21.5332 = 371.52 \f] which is about 46.44 bytes per encoded frame. At a bit rate of 32 kbps, which is quite high for single channel HE-AAC v1, it is: \f[ N\_BITS\_PER\_FRAME = 32000 / 21.5332 = 1486 \f] which is about 185.76 bytes per encoded frame. These bits/frame figures are average figures where each AAC frame generally has a different size in bytes. To calculate the same for AAC-LC just use 1024 instead of 2048 PCM samples per frame and channel. For AAC-LD/ELD it is either 480 or 512 PCM samples per frame and channel. \section BEHAVIOUR_TOOLS Encoder Tools The AAC encoder supports TNS, PNS, MS, Intensity and activates these tools depending on the audio signal and the encoder configuration (i.e. bitrate or AOT). It is not required to configure these tools manually. PNS improves encoding quality only for certain bitrates. Therefore it makes sense to activate PNS only for these bitrates and save the processing power required for PNS (about 10 % of the encoder) when using other bitrates. This is done automatically inside the encoder library. PNS is disabled inside the encoder library if an MPEG-2 AOT is choosen since PNS is an MPEG-4 AAC feature. If SBR is activated, the encoder automatically deactivates PNS internally. If TNS is disabled but PNS is allowed, the encoder deactivates PNS calculation internally. */ #ifndef _AAC_ENC_LIB_H_ #define _AAC_ENC_LIB_H_ #include "machine_type.h" #include "FDK_audio.h" #define AACENCODER_LIB_VL0 3 #define AACENCODER_LIB_VL1 4 #define AACENCODER_LIB_VL2 12 /** * AAC encoder error codes. */ typedef enum { AACENC_OK = 0x0000, /*!< No error happened. All fine. */ AACENC_INVALID_HANDLE = 0x0020, /*!< Handle passed to function call was invalid. */ AACENC_MEMORY_ERROR = 0x0021, /*!< Memory allocation failed. */ AACENC_UNSUPPORTED_PARAMETER = 0x0022, /*!< Parameter not available. */ AACENC_INVALID_CONFIG = 0x0023, /*!< Configuration not provided. */ AACENC_INIT_ERROR = 0x0040, /*!< General initialization error. */ AACENC_INIT_AAC_ERROR = 0x0041, /*!< AAC library initialization error. */ AACENC_INIT_SBR_ERROR = 0x0042, /*!< SBR library initialization error. */ AACENC_INIT_TP_ERROR = 0x0043, /*!< Transport library initialization error. */ AACENC_INIT_META_ERROR = 0x0044, /*!< Meta data library initialization error. */ AACENC_ENCODE_ERROR = 0x0060, /*!< The encoding process was interrupted by an unexpected error. */ AACENC_ENCODE_EOF = 0x0080 /*!< End of file reached. */ } AACENC_ERROR; /** * AAC encoder buffer descriptors identifier. * This identifier are used within buffer descriptors AACENC_BufDesc::bufferIdentifiers. */ typedef enum { /* Input buffer identifier. */ IN_AUDIO_DATA = 0, /*!< Audio input buffer, interleaved INT_PCM samples. */ IN_ANCILLRY_DATA = 1, /*!< Ancillary data to be embedded into bitstream. */ IN_METADATA_SETUP = 2, /*!< Setup structure for embedding meta data. */ /* Output buffer identifier. */ OUT_BITSTREAM_DATA = 3, /*!< Buffer holds bitstream output data. */ OUT_AU_SIZES = 4 /*!< Buffer contains sizes of each access unit. This information is necessary for superframing. */ } AACENC_BufferIdentifier; /** * AAC encoder handle. */ typedef struct AACENCODER *HANDLE_AACENCODER; /** * Provides some info about the encoder configuration. */ typedef struct { UINT maxOutBufBytes; /*!< Maximum number of encoder bitstream bytes within one frame. Size depends on maximum number of supported channels in encoder instance. For superframing (as used for example in DAB+), size has to be a multiple accordingly. */ UINT maxAncBytes; /*!< Maximum number of ancillary data bytes which can be inserted into bitstream within one frame. */ UINT inBufFillLevel; /*!< Internal input buffer fill level in samples per channel. This parameter will automatically be cleared if samplingrate or channel(Mode/Order) changes. */ UINT inputChannels; /*!< Number of input channels expected in encoding process. */ UINT frameLength; /*!< Amount of input audio samples consumed each frame per channel, depending on audio object type configuration. */ UINT encoderDelay; /*!< Codec delay in PCM samples/channel. Depends on framelength and AOT. Does not include framing delay for filling up encoder PCM input buffer. */ UCHAR confBuf[64]; /*!< Configuration buffer in binary format as an AudioSpecificConfig or StreamMuxConfig according to the selected transport type. */ UINT confSize; /*!< Number of valid bytes in confBuf. */ } AACENC_InfoStruct; /** * Describes the input and output buffers for an aacEncEncode() call. */ typedef struct { INT numBufs; /*!< Number of buffers. */ void **bufs; /*!< Pointer to vector containing buffer addresses. */ INT *bufferIdentifiers; /*!< Identifier of each buffer element. See ::AACENC_BufferIdentifier. */ INT *bufSizes; /*!< Size of each buffer in 8-bit bytes. */ INT *bufElSizes; /*!< Size of each buffer element in bytes. */ } AACENC_BufDesc; /** * Defines the input arguments for an aacEncEncode() call. */ typedef struct { INT numInSamples; /*!< Number of valid input audio samples (multiple of input channels). */ INT numAncBytes; /*!< Number of ancillary data bytes to be encoded. */ } AACENC_InArgs; /** * Defines the output arguments for an aacEncEncode() call. */ typedef struct { INT numOutBytes; /*!< Number of valid bitstream bytes generated during aacEncEncode(). */ INT numInSamples; /*!< Number of input audio samples consumed by the encoder. */ INT numAncBytes; /*!< Number of ancillary data bytes consumed by the encoder. */ } AACENC_OutArgs; /** * Meta Data Compression Profiles. */ typedef enum { AACENC_METADATA_DRC_NONE = 0, /*!< None. */ AACENC_METADATA_DRC_FILMSTANDARD = 1, /*!< Film standard. */ AACENC_METADATA_DRC_FILMLIGHT = 2, /*!< Film light. */ AACENC_METADATA_DRC_MUSICSTANDARD = 3, /*!< Music standard. */ AACENC_METADATA_DRC_MUSICLIGHT = 4, /*!< Music light. */ AACENC_METADATA_DRC_SPEECH = 5 /*!< Speech. */ } AACENC_METADATA_DRC_PROFILE; /** * Meta Data setup structure. */ typedef struct { AACENC_METADATA_DRC_PROFILE drc_profile; /*!< MPEG DRC compression profile. See ::AACENC_METADATA_DRC_PROFILE. */ AACENC_METADATA_DRC_PROFILE comp_profile; /*!< ETSI heavy compression profile. See ::AACENC_METADATA_DRC_PROFILE. */ INT drc_TargetRefLevel; /*!< Used to define expected level to: Scaled with 16 bit. x*2^16. */ INT comp_TargetRefLevel; /*!< Adjust limiter to avoid overload. Scaled with 16 bit. x*2^16. */ INT prog_ref_level_present; /*!< Flag, if prog_ref_level is present */ INT prog_ref_level; /*!< Programme Reference Level = Dialogue Level: -31.75dB .. 0 dB ; stepsize: 0.25dB Scaled with 16 bit. x*2^16.*/ UCHAR PCE_mixdown_idx_present; /*!< Flag, if dmx-idx should be written in programme config element */ UCHAR ETSI_DmxLvl_present; /*!< Flag, if dmx-lvl should be written in ETSI-ancData */ SCHAR centerMixLevel; /*!< Center downmix level (0...7, according to table) */ SCHAR surroundMixLevel; /*!< Surround downmix level (0...7, according to table) */ UCHAR dolbySurroundMode; /*!< Indication for Dolby Surround Encoding Mode. - 0: Dolby Surround mode not indicated - 1: 2-ch audio part is not Dolby surround encoded - 2: 2-ch audio part is Dolby surround encoded */ } AACENC_MetaData; /** * AAC encoder control flags. * * In interaction with the ::AACENC_CONTROL_STATE parameter it is possible to get information about the internal * initialization process. It is also possible to overwrite the internal state from extern when necessary. */ typedef enum { AACENC_INIT_NONE = 0x0000, /*!< Do not trigger initialization. */ AACENC_INIT_CONFIG = 0x0001, /*!< Initialize all encoder modules configuration. */ AACENC_INIT_STATES = 0x0002, /*!< Reset all encoder modules history buffer. */ AACENC_INIT_TRANSPORT = 0x1000, /*!< Initialize transport lib with new parameters. */ AACENC_RESET_INBUFFER = 0x2000, /*!< Reset fill level of internal input buffer. */ AACENC_INIT_ALL = 0xFFFF /*!< Initialize all. */ } AACENC_CTRLFLAGS; /** * \brief AAC encoder setting parameters. * * Use aacEncoder_SetParam() function to configure, or use aacEncoder_GetParam() function to read * the internal status of the following parameters. */ typedef enum { AACENC_AOT = 0x0100, /*!< Audio object type. See ::AUDIO_OBJECT_TYPE in FDK_audio.h. - 2: MPEG-4 AAC Low Complexity. - 5: MPEG-4 AAC Low Complexity with Spectral Band Replication (HE-AAC). - 29: MPEG-4 AAC Low Complexity with Spectral Band Replication and Parametric Stereo (HE-AAC v2). This configuration can be used only with stereo input audio data. - 23: MPEG-4 AAC Low-Delay. - 39: MPEG-4 AAC Enhanced Low-Delay. Since there is no ::AUDIO_OBJECT_TYPE for ELD in combination with SBR defined, enable SBR explicitely by ::AACENC_SBR_MODE parameter. - 129: MPEG-2 AAC Low Complexity. - 132: MPEG-2 AAC Low Complexity with Spectral Band Replication (HE-AAC). - 156: MPEG-2 AAC Low Complexity with Spectral Band Replication and Parametric Stereo (HE-AAC v2). This configuration can be used only with stereo input audio data. */ AACENC_BITRATE = 0x0101, /*!< Total encoder bitrate. This parameter is mandatory and interacts with ::AACENC_BITRATEMODE. - CBR: Bitrate in bits/second. See \ref suppBitrates for details. */ AACENC_BITRATEMODE = 0x0102, /*!< Bitrate mode. Configuration can be different kind of bitrate configurations: - 0: Constant bitrate, use bitrate according to ::AACENC_BITRATE. (default) Within none LD/ELD ::AUDIO_OBJECT_TYPE, the CBR mode makes use of full allowed bitreservoir. In contrast, at Low-Delay ::AUDIO_OBJECT_TYPE the bitreservoir is kept very small. - 8: LD/ELD full bitreservoir for packet based transmission. */ AACENC_SAMPLERATE = 0x0103, /*!< Audio input data sampling rate. Encoder supports following sampling rates: 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 */ AACENC_SBR_MODE = 0x0104, /*!< Configure SBR independently of the chosen Audio Object Type ::AUDIO_OBJECT_TYPE. This parameter is for ELD audio object type only. - -1: Use ELD SBR auto configurator (default). - 0: Disable Spectral Band Replication. - 1: Enable Spectral Band Replication. */ AACENC_GRANULE_LENGTH = 0x0105, /*!< Core encoder (AAC) audio frame length in samples: - 1024: Default configuration. - 512: Default LD/ELD configuration. - 480: Optional length in LD/ELD configuration. */ AACENC_CHANNELMODE = 0x0106, /*!< Set explicit channel mode. Channel mode must match with number of input channels. - 1-7 and 33,34: MPEG channel modes supported, see ::CHANNEL_MODE in FDK_audio.h. */ AACENC_CHANNELORDER = 0x0107, /*!< Input audio data channel ordering scheme: - 0: MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE). (default) - 1: WAVE file format channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR). */ AACENC_SBR_RATIO = 0x0108, /*!< Controls activation of downsampled SBR. With downsampled SBR, the delay will be shorter. On the other hand, for achieving the same quality level, downsampled SBR needs more bits than dual-rate SBR. With downsampled SBR, the AAC encoder will work at the same sampling rate as the SBR encoder (single rate). Downsampled SBR is supported for AAC-ELD and HE-AACv1. - 1: Downsampled SBR (default for ELD). - 2: Dual-rate SBR (default for HE-AAC). */ AACENC_AFTERBURNER = 0x0200, /*!< This parameter controls the use of the afterburner feature. The afterburner is a type of analysis by synthesis algorithm which increases the audio quality but also the required processing power. It is recommended to always activate this if additional memory consumption and processing power consumption is not a problem. If increased MHz and memory consumption are an issue then the MHz and memory cost of this optional module need to be evaluated against the improvement in audio quality on a case by case basis. - 0: Disable afterburner (default). - 1: Enable afterburner. */ AACENC_BANDWIDTH = 0x0203, /*!< Core encoder audio bandwidth: - 0: Determine bandwidth internally (default, see chapter \ref BEHAVIOUR_BANDWIDTH). - 1 to fs/2: Frequency bandwidth in Hertz. (Experts only, better do not touch this value to avoid degraded audio quality) */ AACENC_TRANSMUX = 0x0300, /*!< Transport type to be used. See ::TRANSPORT_TYPE in FDK_audio.h. Following types can be configured in encoder library: - 0: raw access units - 1: ADIF bitstream format - 2: ADTS bitstream format - 6: Audio Mux Elements (LATM) with muxConfigPresent = 1 - 7: Audio Mux Elements (LATM) with muxConfigPresent = 0, out of band StreamMuxConfig - 10: Audio Sync Stream (LOAS) */ AACENC_HEADER_PERIOD = 0x0301, /*!< Frame count period for sending in-band configuration buffers within LATM/LOAS transport layer. Additionally this parameter configures the PCE repetition period in raw_data_block(). See \ref encPCE. - 0xFF: auto-mode default 10 for TT_MP4_ADTS, TT_MP4_LOAS and TT_MP4_LATM_MCP1, otherwise 0. - n: Frame count period. */ AACENC_SIGNALING_MODE = 0x0302, /*!< Signaling mode of the extension AOT: - 0: Implicit backward compatible signaling (default for non-MPEG-4 based AOT's and for the transport formats ADIF and ADTS) - A stream that uses implicit signaling can be decoded by every AAC decoder, even AAC-LC-only decoders - An AAC-LC-only decoder will only decode the low-frequency part of the stream, resulting in a band-limited output - This method works with all transport formats - This method does not work with downsampled SBR - 1: Explicit backward compatible signaling - A stream that uses explicit backward compatible signaling can be decoded by every AAC decoder, even AAC-LC-only decoders - An AAC-LC-only decoder will only decode the low-frequency part of the stream, resulting in a band-limited output - A decoder not capable of decoding PS will only decode the AAC-LC+SBR part. If the stream contained PS, the result will be a a decoded mono downmix - This method does not work with ADIF or ADTS. For LOAS/LATM, it only works with AudioMuxVersion==1 - This method does work with downsampled SBR - 2: Explicit hierarchical signaling (default for MPEG-4 based AOT's and for all transport formats excluding ADIF and ADTS) - A stream that uses explicit hierarchical signaling can be decoded only by HE-AAC decoders - An AAC-LC-only decoder will not decode a stream that uses explicit hierarchical signaling - A decoder not capable of decoding PS will not decode the stream at all if it contained PS - This method does not work with ADIF or ADTS. It works with LOAS/LATM and the MPEG-4 File format - This method does work with downsampled SBR For making sure that the listener always experiences the best audio quality, explicit hierarchical signaling should be used. This makes sure that only a full HE-AAC-capable decoder will decode those streams. The audio is played at full bandwidth. For best backwards compatibility, it is recommended to encode with implicit SBR signaling. A decoder capable of AAC-LC only will then only decode the AAC part, which means the decoded audio will sound band-limited. For MPEG-2 transport types (ADTS,ADIF), only implicit signaling is possible. For LOAS and LATM, explicit backwards compatible signaling only works together with AudioMuxVersion==1. The reason is that, for explicit backwards compatible signaling, additional information will be appended to the ASC. A decoder that is only capable of decoding AAC-LC will skip this part. Nevertheless, for jumping to the end of the ASC, it needs to know the ASC length. Transmitting the length of the ASC is a feature of AudioMuxVersion==1, it is not possible to transmit the length of the ASC with AudioMuxVersion==0, therefore an AAC-LC-only decoder will not be able to parse a LOAS/LATM stream that was being encoded with AudioMuxVersion==0. For downsampled SBR, explicit signaling is mandatory. The reason for this is that the extension sampling frequency (which is in case of SBR the sampling frequqncy of the SBR part) can only be signaled in explicit mode. For AAC-ELD, the SBR information is transmitted in the ELDSpecific Config, which is part of the AudioSpecificConfig. Therefore, the settings here will have no effect on AAC-ELD.*/ AACENC_TPSUBFRAMES = 0x0303, /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). - ADTS: Maximum number of sub frames restricted to 4. - LOAS/LATM: Maximum number of sub frames restricted to 2.*/ AACENC_PROTECTION = 0x0306, /*!< Configure protection in tranpsort layer: - 0: No protection. (default) - 1: CRC active for ADTS bitstream format. */ AACENC_ANCILLARY_BITRATE = 0x0500, /*!< Constant ancillary data bitrate in bits/second. - 0: Either no ancillary data or insert exact number of bytes, denoted via input parameter, numAncBytes in AACENC_InArgs. - else: Insert ancillary data with specified bitrate. */ AACENC_METADATA_MODE = 0x0600, /*!< Configure Meta Data. See ::AACENC_MetaData for further details: - 0: Do not embed any metadata. - 1: Embed MPEG defined metadata only. - 2: Embed all metadata. */ AACENC_CONTROL_STATE = 0xFF00, /*!< There is an automatic process which internally reconfigures the encoder instance when a configuration parameter changed or an error occured. This paramerter allows overwriting or getting the control status of this process. See ::AACENC_CTRLFLAGS. */ AACENC_NONE = 0xFFFF /*!< ------ */ } AACENC_PARAM; #ifdef __cplusplus extern "C" { #endif /** * \brief Open an instance of the encoder. * * Allocate memory for an encoder instance with a functional range denoted by the function parameters. * Preinitialize encoder instance with default configuration. * * \param phAacEncoder A pointer to an encoder handle. Initialized on return. * \param encModules Specify encoder modules to be supported in this encoder instance: * - 0x0: Allocate memory for all available encoder modules. * - else: Select memory allocation regarding encoder modules. Following flags are possible and can be combined. * - 0x01: AAC module. * - 0x02: SBR module. * - 0x04: PS module. * - 0x10: Metadata module. * - example: (0x01|0x02|0x04|0x10) allocates all modules and is equivalent to default configuration denotet by 0x0. * \param maxChannels Number of channels to be allocated. This parameter can be used in different ways: * - 0: Allocate maximum number of AAC and SBR channels as supported by the library. * - nChannels: Use same maximum number of channels for allocating memory in AAC and SBR module. * - nChannels | (nSbrCh<<8): Number of SBR channels can be different to AAC channels to save data memory. * * \return * - AACENC_OK, on succes. * - AACENC_INVALID_HANDLE, AACENC_MEMORY_ERROR, AACENC_INVALID_CONFIG, on failure. */ AACENC_ERROR aacEncOpen( HANDLE_AACENCODER *phAacEncoder, const UINT encModules, const UINT maxChannels ); /** * \brief Close the encoder instance. * * Deallocate encoder instance and free whole memory. * * \param phAacEncoder Pointer to the encoder handle to be deallocated. * * \return * - AACENC_OK, on success. * - AACENC_INVALID_HANDLE, on failure. */ AACENC_ERROR aacEncClose( HANDLE_AACENCODER *phAacEncoder ); /** * \brief Encode audio data. * * This function is mainly for encoding audio data. In addition the function can be used for an encoder (re)configuration * process. * - PCM input data will be retrieved from external input buffer until the fill level allows encoding a single frame. * This functionality allows an external buffer with reduced size in comparison to the AAC or HE-AAC audio frame length. * - If the value of the input samples argument is zero, just internal reinitialization will be applied if it is * requested. * - At the end of a file the flushing process can be triggerd via setting the value of the input samples argument to -1. * The encoder delay lines are fully flushed when the encoder returns no valid bitstream data AACENC_OutArgs::numOutBytes. * Furthermore the end of file is signaled by the return value AACENC_ENCODE_EOF. * - If an error occured in the previous frame or any of the encoder parameters changed, an internal reinitialization * process will be applied before encoding the incoming audio samples. * - The function can also be used for an independent reconfiguration process without encoding. The first parameter has to be a * valid encoder handle and all other parameters can be set to NULL. * - If the size of the external bitbuffer in outBufDesc is not sufficient for writing the whole bitstream, an internal * error will be the return value and a reconfiguration will be triggered. * * \param hAacEncoder A valid AAC encoder handle. * \param inBufDesc Input buffer descriptor, see AACENC_BufDesc: * - At least one input buffer with audio data is expected. * - Optionally a second input buffer with ancillary data can be fed. * \param outBufDesc Output buffer descriptor, see AACENC_BufDesc: * - Provide one output buffer for the encoded bitstream. * \param inargs Input arguments, see AACENC_InArgs. * \param outargs Output arguments, AACENC_OutArgs. * * \return * - AACENC_OK, on success. * - AACENC_INVALID_HANDLE, AACENC_ENCODE_ERROR, on failure in encoding process. * - AACENC_INVALID_CONFIG, AACENC_INIT_ERROR, AACENC_INIT_AAC_ERROR, AACENC_INIT_SBR_ERROR, AACENC_INIT_TP_ERROR, * AACENC_INIT_META_ERROR, on failure in encoder initialization. * - AACENC_ENCODE_EOF, when flushing fully concluded. */ AACENC_ERROR aacEncEncode( const HANDLE_AACENCODER hAacEncoder, const AACENC_BufDesc *inBufDesc, const AACENC_BufDesc *outBufDesc, const AACENC_InArgs *inargs, AACENC_OutArgs *outargs ); /** * \brief Acquire info about present encoder instance. * * This function retrieves information of the encoder configuration. In addition to informative internal states, * a configuration data block of the current encoder settings will be returned. The format is either Audio Specific Config * in case of Raw Packets transport format or StreamMuxConfig in case of LOAS/LATM transport format. The configuration * data block is binary coded as specified in ISO/IEC 14496-3 (MPEG-4 audio), to be used directly for MPEG-4 File Format * or RFC3016 or RFC3640 applications. * * \param hAacEncoder A valid AAC encoder handle. * \param pInfo Pointer to AACENC_InfoStruct. Filled on return. * * \return * - AACENC_OK, on succes. * - AACENC_INIT_ERROR, on failure. */ AACENC_ERROR aacEncInfo( const HANDLE_AACENCODER hAacEncoder, AACENC_InfoStruct *pInfo ); /** * \brief Set one single AAC encoder parameter. * * This function allows configuration of all encoder parameters specified in ::AACENC_PARAM. Each parameter must be * set with a separate function call. An internal validation of the configuration value range will be done and an * internal reconfiguration will be signaled. The actual configuration adoption is part of the subsequent aacEncEncode() call. * * \param hAacEncoder A valid AAC encoder handle. * \param param Parameter to be set. See ::AACENC_PARAM. * \param value Parameter value. See parameter description in ::AACENC_PARAM. * * \return * - AACENC_OK, on success. * - AACENC_INVALID_HANDLE, AACENC_UNSUPPORTED_PARAMETER, AACENC_INVALID_CONFIG, on failure. */ AACENC_ERROR aacEncoder_SetParam( const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param, const UINT value ); /** * \brief Get one single AAC encoder parameter. * * This function is the complement to aacEncoder_SetParam(). After encoder reinitialization with user defined settings, * the internal status can be obtained of each parameter, specified with ::AACENC_PARAM. * * \param hAacEncoder A valid AAC encoder handle. * \param param Parameter to be returned. See ::AACENC_PARAM. * * \return Internal configuration value of specifed parameter ::AACENC_PARAM. */ UINT aacEncoder_GetParam( const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param ); /** * \brief Get information about encoder library build. * * Fill a given LIB_INFO structure with library version information. * * \param info Pointer to an allocated LIB_INFO struct. * * \return * - AACENC_OK, on success. * - AACENC_INVALID_HANDLE, AACENC_INIT_ERROR, on failure. */ AACENC_ERROR aacEncGetLibInfo( LIB_INFO *info ); #ifdef __cplusplus } #endif #endif /* _AAC_ENC_LIB_H_ */ fdk-aac-0.1.3/libAACenc/src/0000755000175000017500000000000012372262445015742 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libAACenc/src/pnsparam.cpp0000644000175000017500000003225112372261464020272 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Lohwasser contents/description: PNS parameters depending on bitrate and bandwidth ******************************************************************************/ #include "pnsparam.h" #include "psy_configuration.h" typedef struct { SHORT startFreq; /* Parameters for detection */ FIXP_SGL refPower; FIXP_SGL refTonality; SHORT tnsGainThreshold; /* scaled by TNS_PREDGAIN_SCALE (=1000) */ SHORT tnsPNSGainThreshold; /* scaled by TNS_PREDGAIN_SCALE (=1000) */ FIXP_SGL gapFillThr; SHORT minSfbWidth; USHORT detectionAlgorithmFlags; } PNS_INFO_TAB; typedef struct { ULONG brFrom; ULONG brTo; UCHAR S22050; UCHAR S24000; UCHAR S32000; UCHAR S44100; UCHAR S48000; } AUTO_PNS_TAB; static const AUTO_PNS_TAB levelTable_mono[]= { {0, 11999, 1, 1, 1, 1, 1,}, {12000, 19999, 1, 1, 1, 1, 1,}, {20000, 28999, 2, 1, 1, 1, 1,}, {29000, 40999, 4, 4, 4, 2, 2,}, {41000, 55999, 9, 9, 7, 7, 7,}, {56000, 79999, 0, 0, 0, 9, 9,}, {80000, 99999, 0, 0, 0, 0, 0,}, {100000,999999, 0, 0, 0, 0, 0,}, }; static const AUTO_PNS_TAB levelTable_stereo[]= { {0, 11999, 1, 1, 1, 1, 1,}, {12000, 19999, 3, 1, 1, 1, 1,}, {20000, 28999, 3, 3, 3, 2, 2,}, {29000, 40999, 7, 6, 6, 5, 5,}, {41000, 55999, 9, 9, 7, 7, 7,}, {56000, 79999, 0, 0, 0, 0, 0,}, {80000, 99999, 0, 0, 0, 0, 0,}, {100000,999999, 0, 0, 0, 0, 0,}, }; static const PNS_INFO_TAB pnsInfoTab[] = { /*0 pns off */ /*1*/ { 4000, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.06), 1150, 1200, FL2FXCONST_SGL(0.02), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS /*| JUST_LONG_WINDOW*/ }, /*2*/ { 4000, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.07), 1130, 1300, FL2FXCONST_SGL(0.05), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS /*| JUST_LONG_WINDOW*/ }, /*3*/ { 4100, FL2FXCONST_SGL(0.04), FL2FXCONST_SGL(0.07), 1100, 1400, FL2FXCONST_SGL(0.10), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS /*| JUST_LONG_WINDOW*/ }, /*4*/ { 4100, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400, FL2FXCONST_SGL(0.15), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS /*| JUST_LONG_WINDOW*/ }, /*5*/ { 4300, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400, FL2FXCONST_SGL(0.15), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*6*/ { 5000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.10), 1100, 1400, FL2FXCONST_SGL(0.25), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*7*/ { 5500, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.12), 1100, 1400, FL2FXCONST_SGL(0.35), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*8*/ { 6000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.12), 1080, 1400, FL2FXCONST_SGL(0.40), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*9*/ { 6000, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.14), 1070, 1400, FL2FXCONST_SGL(0.45), 8, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, }; static const AUTO_PNS_TAB levelTable_lowComplexity[]= { {0, 27999, 0, 0, 0, 0, 0,}, {28000, 31999, 2, 2, 2, 2, 2,}, {32000, 47999, 3, 3, 3, 3, 3,}, {48000, 48000, 4, 4, 4, 4, 4,}, {48001, 999999, 0, 0, 0, 0, 0,}, }; /* conversion of old LC tuning tables to new (LD enc) structure (only entries which are actually used were converted) */ static const PNS_INFO_TAB pnsInfoTab_lowComplexity[] = { /*0 pns off */ /* DEFAULT parameter set */ /*1*/ { 4100, FL2FXCONST_SGL(0.03), FL2FXCONST_SGL(0.16), 1100, 1400, FL2FXCONST_SGL(0.5), 16, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*2*/ { 4100, FL2FXCONST_SGL(0.05), FL2FXCONST_SGL(0.10), 1410, 1400, FL2FXCONST_SGL(0.5), 16, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /*3*/ { 4100, FL2FXCONST_SGL(0.05), FL2FXCONST_SGL(0.10), 1100, 1400, FL2FXCONST_SGL(0.5), 16, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, /* LOWSUBST -> PNS is used less often than with DEFAULT parameter set (for br: 48000 - 79999) */ /*4*/ { 4100, FL2FXCONST_SGL(0.20), FL2FXCONST_SGL(0.10), 1410, 1400, FL2FXCONST_SGL(0.5), 16, USE_POWER_DISTRIBUTION | USE_PSYCH_TONALITY | USE_TNS_GAIN_THR | USE_TNS_PNS | JUST_LONG_WINDOW }, }; /**************************************************************************** function to look up used pns level ****************************************************************************/ int FDKaacEnc_lookUpPnsUse (int bitRate, int sampleRate, int numChan, const int isLC) { int hUsePns=0, size, i; const AUTO_PNS_TAB *levelTable; if (isLC) { levelTable = &levelTable_lowComplexity[0]; size = sizeof(levelTable_lowComplexity); } else { /* (E)LD */ levelTable = (numChan > 1) ? &levelTable_stereo[0] : &levelTable_mono[0]; size = (numChan > 1) ? sizeof(levelTable_stereo) : sizeof(levelTable_mono); } for(i = 0; i < (int) (size/sizeof(AUTO_PNS_TAB)); i++) { if(((ULONG)bitRate >= levelTable[i].brFrom) && ((ULONG)bitRate <= levelTable[i].brTo) ) break; } /* sanity check */ if ((int)(sizeof(pnsInfoTab)/sizeof(PNS_INFO_TAB)) < i ) { return (PNS_TABLE_ERROR); } switch (sampleRate) { case 22050: hUsePns = levelTable[i].S22050; break; case 24000: hUsePns = levelTable[i].S24000; break; case 32000: hUsePns = levelTable[i].S32000; break; case 44100: hUsePns = levelTable[i].S44100; break; case 48000: hUsePns = levelTable[i].S48000; break; default: if (isLC) { hUsePns = levelTable[i].S48000; } break; } return (hUsePns); } /***************************************************************************** functionname: FDKaacEnc_GetPnsParam description: Gets PNS parameters depending on bitrate and bandwidth returns: error status input: Noiseparams struct, bitrate, sampling rate, number of sfb's, pointer to sfb offset output: PNS parameters *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_GetPnsParam(NOISEPARAMS *np, INT bitRate, INT sampleRate, INT sfbCnt, const INT *sfbOffset, INT *usePns, INT numChan, const int isLC) { int i, hUsePns; const PNS_INFO_TAB *pnsInfo; if (isLC) { np->detectionAlgorithmFlags = IS_LOW_COMLEXITY; pnsInfo = pnsInfoTab_lowComplexity; } else { np->detectionAlgorithmFlags = 0; pnsInfo = pnsInfoTab; } if (*usePns<=0) return AAC_ENC_OK; /* new pns params */ hUsePns = FDKaacEnc_lookUpPnsUse (bitRate, sampleRate, numChan, isLC); if (hUsePns == 0) { *usePns = 0; return AAC_ENC_OK; } if (hUsePns == PNS_TABLE_ERROR) return AAC_ENC_PNS_TABLE_ERROR; /* select correct row of tuning table */ pnsInfo += hUsePns-1; np->startSfb = FDKaacEnc_FreqToBandWithRounding( pnsInfo->startFreq, sampleRate, sfbCnt, sfbOffset ); np->detectionAlgorithmFlags |= pnsInfo->detectionAlgorithmFlags; np->refPower = FX_SGL2FX_DBL(pnsInfo->refPower); np->refTonality = FX_SGL2FX_DBL(pnsInfo->refTonality); np->tnsGainThreshold = pnsInfo->tnsGainThreshold; np->tnsPNSGainThreshold = pnsInfo->tnsPNSGainThreshold; np->minSfbWidth = pnsInfo->minSfbWidth; np->gapFillThr = (FIXP_SGL)pnsInfo->gapFillThr; /* assuming a constant dB/Hz slope in the signal's PSD curve, the detection threshold needs to be corrected for the width of the band */ for ( i = 0; i < (sfbCnt-1); i++) { INT qtmp, sfbWidth; FIXP_DBL tmp; sfbWidth = sfbOffset[i+1]-sfbOffset[i]; tmp = fPow(np->refPower, 0, sfbWidth, DFRACT_BITS-1-5, &qtmp); np->powDistPSDcurve[i] = (FIXP_SGL)((LONG)(scaleValue(tmp, qtmp) >> 16)); } np->powDistPSDcurve[sfbCnt] = np->powDistPSDcurve[sfbCnt-1]; return AAC_ENC_OK; } fdk-aac-0.1.3/libAACenc/src/qc_data.h0000644000175000017500000002425412372261464017516 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Quantizing & coding data ******************************************************************************/ #ifndef _QC_DATA_H #define _QC_DATA_H #include "psy_const.h" #include "dyn_bits.h" #include "adj_thr_data.h" #include "line_pe.h" #include "FDK_audio.h" #include "interface.h" typedef enum { QCDATA_BR_MODE_INVALID = -1, QCDATA_BR_MODE_CBR = 0, QCDATA_BR_MODE_VBR_1 = 1, /* 32 kbps/channel */ QCDATA_BR_MODE_VBR_2 = 2, /* 40 kbps/channel */ QCDATA_BR_MODE_VBR_3 = 3, /* 48 kbps/channel */ QCDATA_BR_MODE_VBR_4 = 4, /* 64 kbps/channel */ QCDATA_BR_MODE_VBR_5 = 5, /* 96 kbps/channel */ QCDATA_BR_MODE_FF = 6, /* Fixed frame mode. */ QCDATA_BR_MODE_SFR = 7 /* Superframe mode. */ } QCDATA_BR_MODE; typedef struct { MP4_ELEMENT_ID elType; INT instanceTag; INT nChannelsInEl; INT ChannelIndex[2]; FIXP_DBL relativeBits; } ELEMENT_INFO; typedef struct { CHANNEL_MODE encMode; INT nChannels; INT nChannelsEff; INT nElements; ELEMENT_INFO elInfo[(8)]; } CHANNEL_MAPPING; typedef struct { INT paddingRest; } PADDING; /* Quantizing & coding stage */ struct QC_INIT{ CHANNEL_MAPPING* channelMapping; INT sceCpe; /* not used yet */ INT maxBits; /* maximum number of bits in reservoir */ INT averageBits; /* average number of bits we should use */ INT bitRes; INT sampleRate; /* output sample rate */ INT advancedBitsToPe; /* if set, calc bits2PE factor depending on samplerate */ INT staticBits; /* Bits per frame consumed by transport layers. */ QCDATA_BR_MODE bitrateMode; INT meanPe; INT chBitrate; INT invQuant; INT maxIterations; /* Maximum number of allowed iterations before FDKaacEnc_crashRecovery() is applied. */ FIXP_DBL maxBitFac; INT bitrate; INT nSubFrames; /* helper variable */ INT minBits; /* minimal number of bits in one frame*/ PADDING padding; }; typedef struct { FIXP_DBL mdctSpectrum[(1024)]; SHORT quantSpec[(1024)]; UINT maxValueInSfb[MAX_GROUPED_SFB]; INT scf[MAX_GROUPED_SFB]; INT globalGain; SECTION_DATA sectionData; FIXP_DBL sfbFormFactorLdData[MAX_GROUPED_SFB]; FIXP_DBL sfbThresholdLdData[MAX_GROUPED_SFB]; FIXP_DBL sfbMinSnrLdData[MAX_GROUPED_SFB]; FIXP_DBL sfbEnergyLdData[MAX_GROUPED_SFB]; FIXP_DBL sfbEnergy[MAX_GROUPED_SFB]; FIXP_DBL sfbWeightedEnergyLdData[MAX_GROUPED_SFB]; FIXP_DBL sfbEnFacLd[MAX_GROUPED_SFB]; FIXP_DBL sfbSpreadEnergy[MAX_GROUPED_SFB]; } QC_OUT_CHANNEL; typedef struct { EXT_PAYLOAD_TYPE type; /* type of the extension payload */ INT nPayloadBits; /* size of the payload */ UCHAR *pPayload; /* pointer to payload */ } QC_OUT_EXTENSION; typedef struct { INT staticBitsUsed; /* for verification purposes */ INT dynBitsUsed; /* for verification purposes */ INT extBitsUsed; /* bit consumption of extended fill elements */ INT nExtensions; /* number of extension payloads for this element */ QC_OUT_EXTENSION extension[(1)]; /* reffering extension payload */ INT grantedDynBits; INT grantedPe; INT grantedPeCorr; PE_DATA peData; QC_OUT_CHANNEL *qcOutChannel[(2)]; } QC_OUT_ELEMENT; typedef struct { QC_OUT_ELEMENT *qcElement[(8)]; QC_OUT_CHANNEL *pQcOutChannels[(8)]; QC_OUT_EXTENSION extension[(2+2)]; /* global extension payload */ INT nExtensions; /* number of extension payloads for this AU */ INT maxDynBits; /* maximal allowed dynamic bits in frame */ INT grantedDynBits; /* granted dynamic bits in frame */ INT totFillBits; /* fill bits */ INT elementExtBits; /* element associated extension payload bits, e.g. sbr, drc ... */ INT globalExtBits; /* frame/au associated extension payload bits (anc data ...) */ INT staticBits; /* aac side info bits */ INT totalNoRedPe; INT totalGrantedPeCorr; INT usedDynBits; /* number of dynamic bits in use */ INT alignBits; /* AU alignment bits */ INT totalBits; /* sum of static, dyn, sbr, fill, align and dse bits */ } QC_OUT; typedef struct { INT chBitrateEl; /* channel bitrate in element (totalbitrate*el_relativeBits/el_channels) */ INT maxBitsEl; /* used in crash recovery */ INT bitResLevelEl; /* update bitreservoir level in each call of FDKaacEnc_QCMain */ INT maxBitResBitsEl; /* nEffChannels*6144 - averageBitsInFrame */ FIXP_DBL relativeBitsEl; /* Bits relative to total Bits*/ } ELEMENT_BITS; typedef struct { /* this is basically struct QC_INIT */ INT globHdrBits; INT maxBitsPerFrame; /* maximal allowed bits per frame, 6144*nChannelsEff */ INT minBitsPerFrame; /* minimal allowd bits per fram, superframing - DRM */ INT nElements; QCDATA_BR_MODE bitrateMode; INT bitDistributionMode; /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */ INT bitResTot; INT bitResTotMax; INT maxIterations; /* Maximum number of allowed iterations before FDKaacEnc_crashRecovery() is applied. */ INT invQuant; FIXP_DBL vbrQualFactor; FIXP_DBL maxBitFac; PADDING padding; ELEMENT_BITS *elementBits[(8)]; BITCNTR_STATE *hBitCounter; ADJ_THR_STATE *hAdjThr; } QC_STATE; #endif /* _QC_DATA_H */ fdk-aac-0.1.3/libAACenc/src/spreading.cpp0000644000175000017500000001302512372261464020423 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Spreading of energy ******************************************************************************/ #include "spreading.h" void FDKaacEnc_SpreadingMax(const INT pbCnt, const FIXP_DBL *RESTRICT maskLowFactor, const FIXP_DBL *RESTRICT maskHighFactor, FIXP_DBL *RESTRICT pbSpreadEnergy) { int i; FIXP_DBL delay; /* slope to higher frequencies */ delay = pbSpreadEnergy[0]; for (i=1; i=0; i--) { delay = fixMax(pbSpreadEnergy[i], fMult(maskLowFactor[i],delay)); pbSpreadEnergy[i] = delay; } } fdk-aac-0.1.3/libAACenc/src/sf_estim.cpp0000644000175000017500000014071412372261464020266 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Scale factor estimation ******************************************************************************/ #include "sf_estim.h" #include "aacEnc_rom.h" #include "quantize.h" #include "bit_cnt.h" #define AS_PE_FAC_SHIFT 7 #define DIST_FAC_SHIFT 3 #define AS_PE_FAC_FLOAT (float)(1 << AS_PE_FAC_SHIFT) static const INT MAX_SCF_DELTA = 60; static const FIXP_DBL PE_C1 = FL2FXCONST_DBL(3.0f/AS_PE_FAC_FLOAT); /* (log(8.0)/log(2)) >> AS_PE_FAC_SHIFT */ static const FIXP_DBL PE_C2 = FL2FXCONST_DBL(1.3219281f/AS_PE_FAC_FLOAT); /* (log(2.5)/log(2)) >> AS_PE_FAC_SHIFT */ static const FIXP_DBL PE_C3 = FL2FXCONST_DBL(0.5593573f); /* 1-C2/C1 */ /* Function; FDKaacEnc_FDKaacEnc_CalcFormFactorChannel Description: Calculates the formfactor sf: scale factor of the mdct spectrum sfbFormFactorLdData is scaled with the factor 1/(((2^sf)^0.5) * (2^FORM_FAC_SHIFT)) */ static void FDKaacEnc_FDKaacEnc_CalcFormFactorChannel(FIXP_DBL *RESTRICT sfbFormFactorLdData, PSY_OUT_CHANNEL *RESTRICT psyOutChan) { INT j, sfb, sfbGrp; FIXP_DBL formFactor; int tmp0 = psyOutChan->sfbCnt; int tmp1 = psyOutChan->maxSfbPerGroup; int step = psyOutChan->sfbPerGroup; for(sfbGrp = 0; sfbGrp < tmp0; sfbGrp += step) { for (sfb = 0; sfb < tmp1; sfb++) { formFactor = FL2FXCONST_DBL(0.0f); /* calc sum of sqrt(spec) */ for(j=psyOutChan->sfbOffsets[sfbGrp+sfb]; jsfbOffsets[sfbGrp+sfb+1]; j++ ) { formFactor += sqrtFixp(fixp_abs(psyOutChan->mdctSpectrum[j]))>>FORM_FAC_SHIFT; } sfbFormFactorLdData[sfbGrp+sfb] = CalcLdData(formFactor); } /* set sfbFormFactor for sfbs with zero spec to zero. Just for debugging. */ for ( ; sfb < psyOutChan->sfbPerGroup; sfb++) { sfbFormFactorLdData[sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f); } } } /* Function: FDKaacEnc_CalcFormFactor Description: Calls FDKaacEnc_FDKaacEnc_CalcFormFactorChannel() for each channel */ void FDKaacEnc_CalcFormFactor(QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_CHANNEL *psyOutChannel[(2)], const INT nChannels) { INT j; for (j=0; jsfbFormFactorLdData, psyOutChannel[j]); } } /* Function: FDKaacEnc_calcSfbRelevantLines Description: Calculates sfbNRelevantLines sfbNRelevantLines is scaled with the factor 1/((2^FORM_FAC_SHIFT) * 2.0) */ static void FDKaacEnc_calcSfbRelevantLines( const FIXP_DBL *const sfbFormFactorLdData, const FIXP_DBL *const sfbEnergyLdData, const FIXP_DBL *const sfbThresholdLdData, const INT *const sfbOffsets, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, FIXP_DBL *sfbNRelevantLines) { INT sfbOffs, sfb; FIXP_DBL sfbWidthLdData; FIXP_DBL asPeFacLdData = FL2FXCONST_DBL(0.109375); /* AS_PE_FAC_SHIFT*ld64(2) */ FIXP_DBL accu; /* sfbNRelevantLines[i] = 2^( (sfbFormFactorLdData[i] - 0.25 * (sfbEnergyLdData[i] - ld64(sfbWidth[i]/(2^7)) - AS_PE_FAC_SHIFT*ld64(2)) * 64); */ FDKmemclear(sfbNRelevantLines, sfbCnt * sizeof(FIXP_DBL)); for (sfbOffs=0; sfbOffs (FIXP_DBL)sfbThresholdLdData[sfbOffs+sfb]) { INT sfbWidth = sfbOffsets[sfbOffs+sfb+1] - sfbOffsets[sfbOffs+sfb]; /* avgFormFactorLdData = sqrtFixp(sqrtFixp(sfbEnergyLdData[sfbOffs+sfb]/sfbWidth)); */ /* sfbNRelevantLines[sfbOffs+sfb] = sfbFormFactor[sfbOffs+sfb] / avgFormFactorLdData; */ sfbWidthLdData = (FIXP_DBL)(sfbWidth << (DFRACT_BITS-1-AS_PE_FAC_SHIFT)); sfbWidthLdData = CalcLdData(sfbWidthLdData); accu = sfbEnergyLdData[sfbOffs+sfb] - sfbWidthLdData - asPeFacLdData; accu = sfbFormFactorLdData[sfbOffs+sfb] - (accu >> 2); sfbNRelevantLines[sfbOffs+sfb] = CalcInvLdData(accu) >> 1; } } } } /* Function: FDKaacEnc_countSingleScfBits Description: scfBitsFract is scaled by 1/(2^(2*AS_PE_FAC_SHIFT)) */ static FIXP_DBL FDKaacEnc_countSingleScfBits(INT scf, INT scfLeft, INT scfRight) { FIXP_DBL scfBitsFract; scfBitsFract = (FIXP_DBL) ( FDKaacEnc_bitCountScalefactorDelta(scfLeft-scf) + FDKaacEnc_bitCountScalefactorDelta(scf-scfRight) ); scfBitsFract = scfBitsFract << (DFRACT_BITS-1-(2*AS_PE_FAC_SHIFT)); return scfBitsFract; /* output scaled by 1/(2^(2*AS_PE_FAC)) */ } /* Function: FDKaacEnc_calcSingleSpecPe specPe is scaled by 1/(2^(2*AS_PE_FAC_SHIFT)) */ static FIXP_DBL FDKaacEnc_calcSingleSpecPe(INT scf, FIXP_DBL sfbConstPePart, FIXP_DBL nLines) { FIXP_DBL specPe = FL2FXCONST_DBL(0.0f); FIXP_DBL ldRatio; FIXP_DBL scfFract; scfFract = (FIXP_DBL)(scf << (DFRACT_BITS-1-AS_PE_FAC_SHIFT)); ldRatio = sfbConstPePart - fMult(FL2FXCONST_DBL(0.375f),scfFract); if (ldRatio >= PE_C1) { specPe = fMult(FL2FXCONST_DBL(0.7f),fMult(nLines,ldRatio)); } else { specPe = fMult(FL2FXCONST_DBL(0.7f),fMult(nLines,(PE_C2 + fMult(PE_C3,ldRatio)))); } return specPe; /* output scaled by 1/(2^(2*AS_PE_FAC)) */ } /* Function: FDKaacEnc_countScfBitsDiff scfBitsDiff is scaled by 1/(2^(2*AS_PE_FAC_SHIFT)) */ static FIXP_DBL FDKaacEnc_countScfBitsDiff(INT *scfOld, INT *scfNew, INT sfbCnt, INT startSfb, INT stopSfb) { FIXP_DBL scfBitsFract; INT scfBitsDiff = 0; INT sfb = 0, sfbLast; INT sfbPrev, sfbNext; /* search for first relevant sfb */ sfbLast = startSfb; while ((sfbLast=0) && (scfOld[sfbPrev]==FDK_INT_MIN)) sfbPrev--; if (sfbPrev>=0) scfBitsDiff += FDKaacEnc_bitCountScalefactorDelta(scfNew[sfbPrev]-scfNew[sfbLast]) - FDKaacEnc_bitCountScalefactorDelta(scfOld[sfbPrev]-scfOld[sfbLast]); /* now loop through all sfbs and count diffs of relevant sfbs */ for (sfb=sfbLast+1; sfbsfbEnergy[sfb] * 6.75f / sfbFormFactor[sfb]) * LOG2_1; */ /* 0.02152255861f = log(6.75)/log(2)/AS_PE_FAC_FLOAT; LOG2_1 is 1.0 for log2 */ /* 0.09375f = log(64.0)/log(2.0)/64.0 = scale of sfbFormFactorLdData */ if (sfbConstPePart[sfb] == (FIXP_DBL)FDK_INT_MIN) sfbConstPePart[sfb] = ((psyOutChan->sfbEnergyLdData[sfb] - sfbFormFactorLdData[sfb] - FL2FXCONST_DBL(0.09375f)) >> 1) + FL2FXCONST_DBL(0.02152255861f); scfFract = (FIXP_DBL) (scfOld[sfb] << (DFRACT_BITS-1-AS_PE_FAC_SHIFT)); ldRatioOld = sfbConstPePart[sfb] - fMult(FL2FXCONST_DBL(0.375f),scfFract); scfFract = (FIXP_DBL) (scfNew[sfb] << (DFRACT_BITS-1-AS_PE_FAC_SHIFT)); ldRatioNew = sfbConstPePart[sfb] - fMult(FL2FXCONST_DBL(0.375f),scfFract); if (ldRatioOld >= PE_C1) pOld = ldRatioOld; else pOld = PE_C2 + fMult(PE_C3,ldRatioOld); if (ldRatioNew >= PE_C1) pNew = ldRatioNew; else pNew = PE_C2 + fMult(PE_C3,ldRatioNew); specPeDiff += fMult(FL2FXCONST_DBL(0.7f),fMult(sfbNRelevantLines[sfb],(pNew - pOld))); } } return specPeDiff; } /* Function: FDKaacEnc_improveScf Description: Calculate the distortion by quantization and inverse quantization of the spectrum with various scalefactors. The scalefactor which provides the best results will be used. */ static INT FDKaacEnc_improveScf(FIXP_DBL *spec, SHORT *quantSpec, SHORT *quantSpecTmp, INT sfbWidth, FIXP_DBL threshLdData, INT scf, INT minScf, FIXP_DBL *distLdData, INT *minScfCalculated ) { FIXP_DBL sfbDistLdData; INT scfBest = scf; INT k; FIXP_DBL distFactorLdData = FL2FXCONST_DBL(-0.0050301265); /* ld64(1/1.25) */ /* calc real distortion */ sfbDistLdData = FDKaacEnc_calcSfbDist(spec, quantSpec, sfbWidth, scf); *minScfCalculated = scf; /* nmr > 1.25 -> try to improve nmr */ if (sfbDistLdData > (threshLdData-distFactorLdData)) { INT scfEstimated = scf; FIXP_DBL sfbDistBestLdData = sfbDistLdData; INT cnt; /* improve by bigger scf ? */ cnt = 0; while ((sfbDistLdData > (threshLdData-distFactorLdData)) && (cnt++ < 3)) { scf++; sfbDistLdData = FDKaacEnc_calcSfbDist(spec, quantSpecTmp, sfbWidth, scf); if (sfbDistLdData < sfbDistBestLdData) { scfBest = scf; sfbDistBestLdData = sfbDistLdData; for (k=0; k (threshLdData-distFactorLdData)) && (cnt++ < 1) && (scf > minScf)) { scf--; sfbDistLdData = FDKaacEnc_calcSfbDist(spec, quantSpecTmp, sfbWidth, scf); if (sfbDistLdData < sfbDistBestLdData) { scfBest = scf; sfbDistBestLdData = sfbDistLdData; for (k=0; k try to find bigger scf to use less bits */ FIXP_DBL sfbDistBestLdData = sfbDistLdData; FIXP_DBL sfbDistAllowedLdData = fixMin(sfbDistLdData-distFactorLdData,threshLdData); int cnt; for (cnt=0; cnt<3; cnt++) { scf++; sfbDistLdData = FDKaacEnc_calcSfbDist(spec, quantSpecTmp, sfbWidth, scf); if (sfbDistLdData < sfbDistAllowedLdData) { *minScfCalculated = scfBest+1; scfBest = scf; sfbDistBestLdData = sfbDistLdData; for (k=0; ksfbCnt; i++) { prevScfLast[i] = FDK_INT_MAX; prevScfNext[i] = FDK_INT_MAX; deltaPeLast[i] = (FIXP_DBL)FDK_INT_MAX; } sfbLast = -1; sfbAct = -1; sfbNext = -1; scfLast = 0; scfNext = 0; scfMin = FDK_INT_MAX; scfMax = FDK_INT_MAX; do { /* search for new relevant sfb */ sfbNext++; while ((sfbNext < psyOutChan->sfbCnt) && (scf[sfbNext] == FDK_INT_MIN)) sfbNext++; if ((sfbLast>=0) && (sfbAct>=0) && (sfbNextsfbCnt)) { /* relevant scfs to the left and to the right */ scfAct = scf[sfbAct]; scfLast = scf + sfbLast; scfNext = scf + sfbNext; scfMin = fixMin(*scfLast, *scfNext); scfMax = fixMax(*scfLast, *scfNext); } else if ((sfbLast==-1) && (sfbAct>=0) && (sfbNextsfbCnt)) { /* first relevant scf */ scfAct = scf[sfbAct]; scfLast = &scfAct; scfNext = scf + sfbNext; scfMin = *scfNext; scfMax = *scfNext; } else if ((sfbLast>=0) && (sfbAct>=0) && (sfbNext==psyOutChan->sfbCnt)) { /* last relevant scf */ scfAct = scf[sfbAct]; scfLast = scf + sfbLast; scfNext = &scfAct; scfMin = *scfLast; scfMax = *scfLast; } if (sfbAct>=0) scfMin = fixMax(scfMin, minScf[sfbAct]); if ((sfbAct >= 0) && (sfbLast>=0 || sfbNextsfbCnt) && (scfAct > scfMin) && (scfAct <= scfMin+MAX_SCF_DELTA) && (scfAct >= scfMax-MAX_SCF_DELTA) && (*scfLast != prevScfLast[sfbAct] || *scfNext != prevScfNext[sfbAct] || deltaPe < deltaPeLast[sfbAct])) { /* bigger than neighbouring scf found, try to use smaller scf */ success = 0; sfbWidth = psyOutChan->sfbOffsets[sfbAct+1] - psyOutChan->sfbOffsets[sfbAct]; sfbOffs = psyOutChan->sfbOffsets[sfbAct]; /* estimate required bits for actual scf */ enLdData = qcOutChannel->sfbEnergyLdData[sfbAct]; /* sfbConstPePart[sfbAct] = (float)log(6.75f*en/sfbFormFactor[sfbAct]) * LOG2_1; */ /* 0.02152255861f = log(6.75)/log(2)/AS_PE_FAC_FLOAT; LOG2_1 is 1.0 for log2 */ /* 0.09375f = log(64.0)/log(2.0)/64.0 = scale of sfbFormFactorLdData */ if (sfbConstPePart[sfbAct] == (FIXP_DBL)FDK_INT_MIN) { sfbConstPePart[sfbAct] = ((enLdData - sfbFormFactorLdData[sfbAct] - FL2FXCONST_DBL(0.09375f)) >> 1) + FL2FXCONST_DBL(0.02152255861f); } sfbPeOld = FDKaacEnc_calcSingleSpecPe(scfAct,sfbConstPePart[sfbAct],sfbNRelevantLines[sfbAct]) +FDKaacEnc_countSingleScfBits(scfAct, *scfLast, *scfNext); deltaPeNew = deltaPe; updateMinScfCalculated = 1; do { /* estimate required bits for smaller scf */ scfAct--; /* check only if the same check was not done before */ if (scfAct < minScfCalculated[sfbAct] && scfAct>=scfMax-MAX_SCF_DELTA){ /* estimate required bits for new scf */ sfbPeNew = FDKaacEnc_calcSingleSpecPe(scfAct,sfbConstPePart[sfbAct],sfbNRelevantLines[sfbAct]) +FDKaacEnc_countSingleScfBits(scfAct,*scfLast, *scfNext); /* use new scf if no increase in pe and quantization error is smaller */ deltaPeTmp = deltaPe + sfbPeNew - sfbPeOld; /* 0.0006103515625f = 10.0f/(2^(2*AS_PE_FAC_SHIFT)) */ if (deltaPeTmp < FL2FXCONST_DBL(0.0006103515625f)) { /* distortion of new scf */ sfbDistNew = FDKaacEnc_calcSfbDist(qcOutChannel->mdctSpectrum+sfbOffs, quantSpecTmp+sfbOffs, sfbWidth, scfAct); if (sfbDistNew < sfbDist[sfbAct]) { /* success, replace scf by new one */ scf[sfbAct] = scfAct; sfbDist[sfbAct] = sfbDistNew; for (k=0; k scfMin); deltaPe = deltaPeNew; /* save parameters to avoid multiple computations of the same sfb */ prevScfLast[sfbAct] = *scfLast; prevScfNext[sfbAct] = *scfNext; deltaPeLast[sfbAct] = deltaPe; } if (success && restartOnSuccess) { /* start again at first sfb */ sfbLast = -1; sfbAct = -1; sfbNext = -1; scfLast = 0; scfNext = 0; scfMin = FDK_INT_MAX; scfMax = FDK_INT_MAX; success = 0; } else { /* shift sfbs for next band */ sfbLast = sfbAct; sfbAct = sfbNext; } } while (sfbNext < psyOutChan->sfbCnt); } /* Function: FDKaacEnc_assimilateMultipleScf */ static void FDKaacEnc_assimilateMultipleScf(PSY_OUT_CHANNEL *psyOutChan, QC_OUT_CHANNEL *qcOutChannel, SHORT *quantSpec, SHORT *quantSpecTmp, INT *scf, INT *minScf, FIXP_DBL *sfbDist, FIXP_DBL *sfbConstPePart, FIXP_DBL *sfbFormFactorLdData, FIXP_DBL *sfbNRelevantLines) { INT sfb, startSfb, stopSfb; INT scfTmp[MAX_GROUPED_SFB], scfMin, scfMax, scfAct; INT possibleRegionFound; INT sfbWidth, sfbOffs, i, k; FIXP_DBL sfbDistNew[MAX_GROUPED_SFB], distOldSum, distNewSum; INT deltaScfBits; FIXP_DBL deltaSpecPe; FIXP_DBL deltaPe = FL2FXCONST_DBL(0.0f); FIXP_DBL deltaPeNew; INT sfbCnt = psyOutChan->sfbCnt; /* calc min and max scalfactors */ scfMin = FDK_INT_MAX; scfMax = FDK_INT_MIN; for (sfb=0; sfb scfAct)) sfb++; stopSfb = sfb; /* check if in all sfb of a valid region scfAct >= minScf[sfb] */ possibleRegionFound = 0; if (startSfb < sfbCnt) { possibleRegionFound = 1; for (sfb=startSfb; sfb> DIST_FAC_SHIFT; sfbWidth = psyOutChan->sfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]; sfbOffs = psyOutChan->sfbOffsets[sfb]; sfbDistNew[sfb] = FDKaacEnc_calcSfbDist(qcOutChannel->mdctSpectrum+sfbOffs, quantSpecTmp+sfbOffs, sfbWidth, scfAct); if (sfbDistNew[sfb] >qcOutChannel->sfbThresholdLdData[sfb]) { /* no improvement, skip further dist. calculations */ distNewSum = distOldSum << 1; break; } distNewSum += CalcInvLdData(sfbDistNew[sfb]) >> DIST_FAC_SHIFT; } } /* distortion smaller ? -> use new scalefactors */ if (distNewSum < distOldSum) { deltaPe = deltaPeNew; for (sfb=startSfb; sfbsfbOffsets[sfb+1] - psyOutChan->sfbOffsets[sfb]; sfbOffs = psyOutChan->sfbOffsets[sfb]; scf[sfb] = scfAct; sfbDist[sfb] = sfbDistNew[sfb]; for (k=0; k scfMin); } } /* Function: FDKaacEnc_FDKaacEnc_assimilateMultipleScf2 */ static void FDKaacEnc_FDKaacEnc_assimilateMultipleScf2(PSY_OUT_CHANNEL *psyOutChan, QC_OUT_CHANNEL *qcOutChannel, SHORT *quantSpec, SHORT *quantSpecTmp, INT *scf, INT *minScf, FIXP_DBL *sfbDist, FIXP_DBL *sfbConstPePart, FIXP_DBL *sfbFormFactorLdData, FIXP_DBL *sfbNRelevantLines) { INT sfb, startSfb, stopSfb; INT scfTmp[MAX_GROUPED_SFB], scfAct, scfNew; INT scfPrev, scfNext, scfPrevNextMin, scfPrevNextMax, scfLo, scfHi; INT scfMin, scfMax; INT *sfbOffs = psyOutChan->sfbOffsets; FIXP_DBL sfbDistNew[MAX_GROUPED_SFB], sfbDistMax[MAX_GROUPED_SFB]; FIXP_DBL distOldSum, distNewSum; INT deltaScfBits; FIXP_DBL deltaSpecPe; FIXP_DBL deltaPe = FL2FXCONST_DBL(0.0f); FIXP_DBL deltaPeNew = FL2FXCONST_DBL(0.0f); INT sfbCnt = psyOutChan->sfbCnt; INT bSuccess, bCheckScf; INT i,k; /* calc min and max scalfactors */ scfMin = FDK_INT_MAX; scfMax = FDK_INT_MIN; for (sfb=0; sfb= scfAct) scfLo = fixMin(scfAct, scfPrevNextMin); else scfLo = scfPrevNextMax; if (startSfb < sfbCnt && scfHi-scfLo <= MAX_SCF_DELTA) { /* region found */ /* 1. try to save bits by coarser quantization */ if (scfHi > scf[startSfb]) { /* calculate the allowed distortion */ for (sfb=startSfb; sfbsfbThreshold[sfb]*sfbDist[sfb]*sfbDist[sfb],1.0f/3.0f); */ /* sfbDistMax[sfb] = fixMax(sfbDistMax[sfb],qcOutChannel->sfbEnergy[sfb]*FL2FXCONST_DBL(1.e-3f)); */ /* -0.15571537944 = ld64(1.e-3f)*/ sfbDistMax[sfb] = fMult(FL2FXCONST_DBL(1.0f/3.0f),qcOutChannel->sfbThresholdLdData[sfb])+fMult(FL2FXCONST_DBL(1.0f/3.0f),sfbDist[sfb])+fMult(FL2FXCONST_DBL(1.0f/3.0f),sfbDist[sfb]); sfbDistMax[sfb] = fixMax(sfbDistMax[sfb],qcOutChannel->sfbEnergyLdData[sfb]-FL2FXCONST_DBL(0.15571537944)); sfbDistMax[sfb] = fixMin(sfbDistMax[sfb],qcOutChannel->sfbThresholdLdData[sfb]); } } /* loop over all possible scf values for this region */ bCheckScf = 1; for (scfNew=scf[startSfb]+1; scfNew<=scfHi; scfNew++) { for (k=0; kmdctSpectrum+sfbOffs[sfb], quantSpecTmp+sfbOffs[sfb], sfbOffs[sfb+1]-sfbOffs[sfb], scfNew); if (sfbDistNew[sfb] > sfbDistMax[sfb]) { /* no improvement, skip further dist. calculations */ bSuccess = 0; if (sfbDistNew[sfb] == qcOutChannel->sfbEnergyLdData[sfb]) { /* if whole sfb is already quantized to 0, further checks with even coarser quant. are useless*/ bCheckScf = 0; } break; } } } if (bCheckScf==0) /* further calculations useless ? */ break; /* distortion small enough ? -> use new scalefactors */ if (bSuccess) { deltaPe = deltaPeNew; for (sfb=startSfb; sfb= minScf[sfb] */ for (sfb=startSfb; sfb> DIST_FAC_SHIFT; sfbDistNew[sfb] = FDKaacEnc_calcSfbDist(qcOutChannel->mdctSpectrum+sfbOffs[sfb], quantSpecTmp+sfbOffs[sfb], sfbOffs[sfb+1]-sfbOffs[sfb], scfNew); if (sfbDistNew[sfb] > qcOutChannel->sfbThresholdLdData[sfb]) { /* no improvement, skip further dist. calculations */ distNewSum = distOldSum << 1; break; } distNewSum += CalcInvLdData(sfbDistNew[sfb]) >> DIST_FAC_SHIFT; } } /* distortion smaller ? -> use new scalefactors */ if (distNewSum < fMult(FL2FXCONST_DBL(0.8f),distOldSum)) { deltaPe = deltaPeNew; for (sfb=startSfb; sfbmdctSpectrum+sfbOffs[sfb], quantSpec+sfbOffs[sfb], sfbOffs[sfb+1]-sfbOffs[sfb], scfNew, &sfbEnQ, &sfbDistNew[sfb]); distOldSum += CalcInvLdData(sfbDist[sfb]) >> DIST_FAC_SHIFT; distNewSum += CalcInvLdData(sfbDistNew[sfb]) >> DIST_FAC_SHIFT; /* 0.00259488556167 = ld64(1.122f) */ /* -0.00778722686652 = ld64(0.7079f) */ if ((sfbDistNew[sfb] > (sfbDist[sfb]+FL2FXCONST_DBL(0.00259488556167f))) || (sfbEnQ < (qcOutChannel->sfbEnergyLdData[sfb] - FL2FXCONST_DBL(0.00778722686652f)))){ bSuccess = 0; break; } } } /* distortion smaller ? -> use new scalefactors */ if (distNewSum < distOldSum && bSuccess) { deltaPe = deltaPeNew; for (sfb=startSfb; sfb C1/2^8 */ if (invQuant>0) { FDKmemclear(quantSpec, (1024)*sizeof(SHORT)); } /* scfs without energy or with thresh>energy are marked with FDK_INT_MIN */ for(i=0; isfbCnt; i++) { scf[i] = FDK_INT_MIN; } for (i=0; isfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for(sfb=0; sfbmaxSfbPerGroup; sfb++) { threshLdData = qcOutChannel->sfbThresholdLdData[sfbOffs+sfb]; energyLdData = qcOutChannel->sfbEnergyLdData[sfbOffs+sfb]; sfbDistLdData[sfbOffs+sfb] = energyLdData; if (energyLdData > threshLdData) { FIXP_DBL tmp; /* energyPart = (float)log10(sfbFormFactor[sfbOffs+sfb]); */ /* 0.09375f = log(64.0)/log(2.0)/64.0 = scale of sfbFormFactorLdData */ energyPartLdData = sfbFormFactorLdData[sfbOffs+sfb] + FL2FXCONST_DBL(0.09375f); /* influence of allowed distortion */ /* thresholdPart = (float)log10(6.75*thresh+FLT_MIN); */ thresholdPartLdData = threshConstLdData + threshLdData; /* scf calc */ /* scfFloat = 8.8585f * (thresholdPart - energyPart); */ scfFract = thresholdPartLdData - energyPartLdData; /* conversion from log2 to log10 */ scfFract = fMult(convConst,scfFract); /* (8.8585f * scfFract)/8 = 8/8 * scfFract + 0.8585 * scfFract/8 */ scfFract = scfFract + fMult(FL2FXCONST_DBL(0.8585f),scfFract >> 3); /* integer scalefactor */ /* scfInt = (int)floor(scfFloat); */ scfInt = (INT)(scfFract>>((DFRACT_BITS-1)-3-LD_DATA_SHIFT)); /* 3 bits => scfFract/8.0; 6 bits => ld64 */ /* maximum of spectrum */ maxSpec = FL2FXCONST_DBL(0.0f); for(j=psyOutChannel->sfbOffsets[sfbOffs+sfb]; jsfbOffsets[sfbOffs+sfb+1]; j++ ){ absSpec = fixp_abs(qcOutChannel->mdctSpectrum[j]); maxSpec = (absSpec > maxSpec) ? absSpec : maxSpec; } /* lower scf limit to avoid quantized values bigger than MAX_QUANT */ /* C1 = -69.33295f, C2 = 5.77078f = 4/log(2) */ /* minSfMaxQuant[sfbOffs+sfb] = (int)ceil(C1 + C2*log(maxSpec)); */ /* C1/2^8 + 4/log(2.0)*log(maxSpec)/2^8 => C1/2^8 + log(maxSpec)/log(2.0)*4/2^8 => C1/2^8 + log(maxSpec)/log(2.0)/64.0 */ //minSfMaxQuant[sfbOffs+sfb] = ((INT) ((c1Const + CalcLdData(maxSpec)) >> ((DFRACT_BITS-1)-8))) + 1; tmp = CalcLdData(maxSpec); if (c1Const>FL2FXCONST_DBL(-1.f)-tmp) { minSfMaxQuant[sfbOffs+sfb] = ((INT) ((c1Const + tmp) >> ((DFRACT_BITS-1)-8))) + 1; } else { minSfMaxQuant[sfbOffs+sfb] = ((INT) (FL2FXCONST_DBL(-1.f) >> ((DFRACT_BITS-1)-8))) + 1; } scfInt = fixMax(scfInt, minSfMaxQuant[sfbOffs+sfb]); /* find better scalefactor with analysis by synthesis */ if (invQuant>0) { scfInt = FDKaacEnc_improveScf(qcOutChannel->mdctSpectrum+psyOutChannel->sfbOffsets[sfbOffs+sfb], quantSpec+psyOutChannel->sfbOffsets[sfbOffs+sfb], quantSpecTmp+psyOutChannel->sfbOffsets[sfbOffs+sfb], psyOutChannel->sfbOffsets[sfbOffs+sfb+1]-psyOutChannel->sfbOffsets[sfbOffs+sfb], threshLdData, scfInt, minSfMaxQuant[sfbOffs+sfb], &sfbDistLdData[sfbOffs+sfb], &minScfCalculated[sfbOffs+sfb] ); } scf[sfbOffs+sfb] = scfInt; } } } if (invQuant>1) { /* try to decrease scf differences */ FIXP_DBL sfbConstPePart[MAX_GROUPED_SFB]; FIXP_DBL sfbNRelevantLines[MAX_GROUPED_SFB]; for (i=0; isfbCnt; i++) sfbConstPePart[i] = (FIXP_DBL)FDK_INT_MIN; FDKaacEnc_calcSfbRelevantLines( sfbFormFactorLdData, qcOutChannel->sfbEnergyLdData, qcOutChannel->sfbThresholdLdData, psyOutChannel->sfbOffsets, psyOutChannel->sfbCnt, psyOutChannel->sfbPerGroup, psyOutChannel->maxSfbPerGroup, sfbNRelevantLines); FDKaacEnc_assimilateSingleScf(psyOutChannel, qcOutChannel, quantSpec, quantSpecTmp, scf, minSfMaxQuant, sfbDistLdData, sfbConstPePart, sfbFormFactorLdData, sfbNRelevantLines, minScfCalculated, 1); FDKaacEnc_assimilateMultipleScf(psyOutChannel, qcOutChannel, quantSpec, quantSpecTmp, scf, minSfMaxQuant, sfbDistLdData, sfbConstPePart, sfbFormFactorLdData, sfbNRelevantLines); FDKaacEnc_FDKaacEnc_assimilateMultipleScf2(psyOutChannel, qcOutChannel, quantSpec, quantSpecTmp, scf, minSfMaxQuant, sfbDistLdData, sfbConstPePart, sfbFormFactorLdData, sfbNRelevantLines); } /* get min scalefac */ minSf = FDK_INT_MAX; for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for (sfb = 0; sfb < psyOutChannel->maxSfbPerGroup; sfb++) { if (scf[sfbOffs+sfb]!=FDK_INT_MIN) minSf = fixMin(minSf,scf[sfbOffs+sfb]); } } /* limit scf delta */ for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for (sfb = 0; sfb < psyOutChannel->maxSfbPerGroup; sfb++) { if ((scf[sfbOffs+sfb] != FDK_INT_MIN) && (minSf+MAX_SCF_DELTA) < scf[sfbOffs+sfb]) { scf[sfbOffs+sfb] = minSf + MAX_SCF_DELTA; if (invQuant > 0) { /* changed bands need to be quantized again */ sfbDistLdData[sfbOffs+sfb] = FDKaacEnc_calcSfbDist(qcOutChannel->mdctSpectrum+psyOutChannel->sfbOffsets[sfbOffs+sfb], quantSpec+psyOutChannel->sfbOffsets[sfbOffs+sfb], psyOutChannel->sfbOffsets[sfbOffs+sfb+1]-psyOutChannel->sfbOffsets[sfbOffs+sfb], scf[sfbOffs+sfb] ); } } } } /* get max scalefac for global gain */ maxSf = FDK_INT_MIN; for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for (sfb = 0; sfb < psyOutChannel->maxSfbPerGroup; sfb++) { maxSf = fixMax(maxSf,scf[sfbOffs+sfb]); } } /* calc loop scalefactors, if spec is not all zero (i.e. maxSf == -99) */ if( maxSf > FDK_INT_MIN ) { *globalGain = maxSf; for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for (sfb = 0; sfb < psyOutChannel->maxSfbPerGroup; sfb++) { if( scf[sfbOffs+sfb] == FDK_INT_MIN ) { scf[sfbOffs+sfb] = 0; /* set band explicitely to zero */ for(j=psyOutChannel->sfbOffsets[sfbOffs+sfb]; jsfbOffsets[sfbOffs+sfb+1]; j++ ) { qcOutChannel->mdctSpectrum[j] = FL2FXCONST_DBL(0.0f); } } else { scf[sfbOffs+sfb] = maxSf - scf[sfbOffs+sfb]; } } } } else{ *globalGain = 0; /* set spectrum explicitely to zero */ for (sfbOffs=0; sfbOffssfbCnt; sfbOffs+=psyOutChannel->sfbPerGroup) { for (sfb = 0; sfb < psyOutChannel->maxSfbPerGroup; sfb++) { scf[sfbOffs+sfb] = 0; /* set band explicitely to zero */ for(j=psyOutChannel->sfbOffsets[sfbOffs+sfb]; jsfbOffsets[sfbOffs+sfb+1]; j++ ) { qcOutChannel->mdctSpectrum[j] = FL2FXCONST_DBL(0.0f); } } } } /* free quantSpecTmp from scratch */ C_ALLOC_SCRATCH_END(quantSpecTmp, SHORT, (1024)); } void FDKaacEnc_EstimateScaleFactors(PSY_OUT_CHANNEL *psyOutChannel[], QC_OUT_CHANNEL* qcOutChannel[], const int invQuant, const int nChannels) { int ch; for (ch = 0; ch < nChannels; ch++) { FDKaacEnc_FDKaacEnc_EstimateScaleFactorsChannel(qcOutChannel[ch], psyOutChannel[ch], qcOutChannel[ch]->scf, &qcOutChannel[ch]->globalGain, qcOutChannel[ch]->sfbFormFactorLdData ,invQuant, qcOutChannel[ch]->quantSpec ); } } fdk-aac-0.1.3/libAACenc/src/metadata_compressor.h0000644000175000017500000002236512372261464022157 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /********************** Fraunhofer IIS FDK AAC Encoder lib ****************** Author(s): M. Neusinger Description: Compressor for AAC Metadata Generator ******************************************************************************/ #ifndef _METADATA_COMPRESSOR_H #define _METADATA_COMPRESSOR_H #include "FDK_audio.h" #include "common_fix.h" #include "aacenc.h" /** * DRC compression profiles. */ typedef enum DRC_PROFILE { DRC_NONE = 0, DRC_FILMSTANDARD = 1, DRC_FILMLIGHT = 2, DRC_MUSICSTANDARD = 3, DRC_MUSICLIGHT = 4, DRC_SPEECH = 5, DRC_DELAY_TEST = 6 } DRC_PROFILE; /** * DRC Compressor handle. */ typedef struct DRC_COMP DRC_COMP, *HDRC_COMP; /** * \brief Open a DRC Compressor instance. * * Allocate memory for a compressor instance. * * \param phDrcComp A pointer to a compressor handle. Initialized on return. * * \return * - 0, on succes. * - unequal 0, on failure. */ INT FDK_DRC_Generator_Open( HDRC_COMP *phDrcComp ); /** * \brief Close the DRC Compressor instance. * * Deallocate instance and free whole memory. * * \param phDrcComp Pointer to the compressor handle to be deallocated. * * \return * - 0, on succes. * - unequal 0, on failure. */ INT FDK_DRC_Generator_Close( HDRC_COMP *phDrcComp ); /** * \brief Configure DRC Compressor. * * \param drcComp Compressor handle. * \param profileLine DRC profile for line mode. * \param profileRF DRC profile for RF mode. * \param blockLength Length of processing block in samples per channel. * \param sampleRate Sampling rate in Hz. * \param channelMode Channel configuration. * \param channelOrder Channel order, MPEG or WAV. * \param useWeighting Use weighting filter for loudness calculation * * \return * - 0, on success, * - unequal 0, on failure */ INT FDK_DRC_Generator_Initialize( HDRC_COMP drcComp, const DRC_PROFILE profileLine, const DRC_PROFILE profileRF, const INT blockLength, const UINT sampleRate, const CHANNEL_MODE channelMode, const CHANNEL_ORDER channelOrder, const UCHAR useWeighting ); /** * \brief Calculate DRC Compressor Gain. * * \param drcComp Compressor handle. * \param inSamples Pointer to interleaved input audio samples. * \param dialnorm Dialog Level in dB (typically -31...-1). * \param drc_TargetRefLevel * \param comp_TargetRefLevel * \param clev Downmix center mix factor (typically 0.707, 0.595 or 0.5) * \param slev Downmix surround mix factor (typically 0.707, 0.5, or 0) * \param dynrng Pointer to variable receiving line mode DRC gain in dB * \param compr Pointer to variable receiving RF mode DRC gain in dB * * \return * - 0, on success, * - unequal 0, on failure */ INT FDK_DRC_Generator_Calc( HDRC_COMP drcComp, const INT_PCM * const inSamples, const INT dialnorm, const INT drc_TargetRefLevel, const INT comp_TargetRefLevel, FIXP_DBL clev, FIXP_DBL slev, INT * const dynrng, INT * const compr ); /** * \brief Configure DRC Compressor Profile. * * \param drcComp Compressor handle. * \param profileLine DRC profile for line mode. * \param profileRF DRC profile for RF mode. * * \return * - 0, on success, * - unequal 0, on failure */ INT FDK_DRC_Generator_setDrcProfile( HDRC_COMP drcComp, const DRC_PROFILE profileLine, const DRC_PROFILE profileRF ); /** * \brief Get DRC profile for line mode. * * \param drcComp Compressor handle. * * \return Current Profile. */ DRC_PROFILE FDK_DRC_Generator_getDrcProfile( const HDRC_COMP drcComp ); /** * \brief Get DRC profile for RF mode. * * \param drcComp Compressor handle. * * \return Current Profile. */ DRC_PROFILE FDK_DRC_Generator_getCompProfile( const HDRC_COMP drcComp ); #endif /* _METADATA_COMPRESSOR_H */ fdk-aac-0.1.3/libAACenc/src/psy_configuration.cpp0000644000175000017500000005617212372261464022223 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Psychoaccoustic configuration ******************************************************************************/ #include "psy_configuration.h" #include "adj_thr.h" #include "aacEnc_rom.h" #include "genericStds.h" #include "FDK_trigFcts.h" typedef struct{ LONG sampleRate; const SFB_PARAM_LONG *paramLong; const SFB_PARAM_SHORT *paramShort; }SFB_INFO_TAB; static const SFB_INFO_TAB sfbInfoTab[] = { {8000, &p_FDKaacEnc_8000_long_1024, &p_FDKaacEnc_8000_short_128}, {11025, &p_FDKaacEnc_11025_long_1024, &p_FDKaacEnc_11025_short_128}, {12000, &p_FDKaacEnc_12000_long_1024, &p_FDKaacEnc_12000_short_128}, {16000, &p_FDKaacEnc_16000_long_1024, &p_FDKaacEnc_16000_short_128}, {22050, &p_FDKaacEnc_22050_long_1024, &p_FDKaacEnc_22050_short_128}, {24000, &p_FDKaacEnc_24000_long_1024, &p_FDKaacEnc_24000_short_128}, {32000, &p_FDKaacEnc_32000_long_1024, &p_FDKaacEnc_32000_short_128}, {44100, &p_FDKaacEnc_44100_long_1024, &p_FDKaacEnc_44100_short_128}, {48000, &p_FDKaacEnc_48000_long_1024, &p_FDKaacEnc_48000_short_128}, {64000, &p_FDKaacEnc_64000_long_1024, &p_FDKaacEnc_64000_short_128}, {88200, &p_FDKaacEnc_88200_long_1024, &p_FDKaacEnc_88200_short_128}, {96000, &p_FDKaacEnc_96000_long_1024, &p_FDKaacEnc_96000_short_128} }; /* 22050 and 24000 Hz */ static const SFB_PARAM_LONG p_22050_long_512 = { 31, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 20, 24, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32} }; /* 32000 Hz */ static const SFB_PARAM_LONG p_32000_long_512 = { 37, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 32, 32, 32, 32, 32, 32, 32} }; /* 44100 Hz */ static const SFB_PARAM_LONG p_44100_long_512 = { 36, {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 20, 24, 28, 32, 32, 32, 32, 32, 32, 32, 52} }; static const SFB_INFO_TAB sfbInfoTabLD512[] = { { 8000, &p_22050_long_512, NULL}, {11025, &p_22050_long_512, NULL}, {12000, &p_22050_long_512, NULL}, {16000, &p_22050_long_512, NULL}, {22050, &p_22050_long_512, NULL}, {24000, &p_22050_long_512, NULL}, {32000, &p_32000_long_512, NULL}, {44100, &p_44100_long_512, NULL}, {48000, &p_44100_long_512, NULL}, {64000, &p_44100_long_512, NULL}, {88200, &p_44100_long_512, NULL}, {96000, &p_44100_long_512, NULL}, }; /* 22050 and 24000 Hz */ static const SFB_PARAM_LONG p_22050_long_480 = { 30, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 20, 24, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32} }; /* 32000 Hz */ static const SFB_PARAM_LONG p_32000_long_480 = { 37, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16, 16, 20, 24, 32, 32, 32, 32, 32, 32, 32, 32} }; /* 44100 Hz */ static const SFB_PARAM_LONG p_44100_long_480 = { 35, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 16, 16, 24, 28, 32, 32, 32, 32, 32, 32, 48} }; static const SFB_INFO_TAB sfbInfoTabLD480[] = { { 8000, &p_22050_long_480, NULL}, {11025, &p_22050_long_480, NULL}, {12000, &p_22050_long_480, NULL}, {16000, &p_22050_long_480, NULL}, {22050, &p_22050_long_480, NULL}, {24000, &p_22050_long_480, NULL}, {32000, &p_32000_long_480, NULL}, {44100, &p_44100_long_480, NULL}, {48000, &p_44100_long_480, NULL}, {64000, &p_44100_long_480, NULL}, {88200, &p_44100_long_480, NULL}, {96000, &p_44100_long_480, NULL}, }; /* Fixed point precision definitions */ #define Q_BARCVAL (25) static AAC_ENCODER_ERROR FDKaacEnc_initSfbTable(LONG sampleRate, INT blockType, INT granuleLength, INT *sfbOffset, INT *sfbCnt) { INT i, specStartOffset = 0; const UCHAR* sfbWidth = NULL; const SFB_INFO_TAB *sfbInfo = NULL; int size; /* select table */ switch(granuleLength) { case 1024: case 960: sfbInfo = sfbInfoTab; size = (INT)(sizeof(sfbInfoTab)/sizeof(SFB_INFO_TAB)); break; case 512: sfbInfo = sfbInfoTabLD512; size = sizeof(sfbInfoTabLD512); break; case 480: sfbInfo = sfbInfoTabLD480; size = sizeof(sfbInfoTabLD480); break; default: return AAC_ENC_INVALID_FRAME_LENGTH; } for(i = 0; i < size; i++){ if(sfbInfo[i].sampleRate == sampleRate){ switch(blockType){ case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: sfbWidth = sfbInfo[i].paramLong->sfbWidth; *sfbCnt = sfbInfo[i].paramLong->sfbCnt; break; case SHORT_WINDOW: sfbWidth = sfbInfo[i].paramShort->sfbWidth; *sfbCnt = sfbInfo[i].paramShort->sfbCnt; granuleLength /= TRANS_FAC; break; } break; } } if (i == size) { return AAC_ENC_UNSUPPORTED_SAMPLINGRATE; } /* calc sfb offsets */ for(i = 0; i < *sfbCnt; i++){ sfbOffset[i] = specStartOffset; specStartOffset += sfbWidth[i]; if (specStartOffset >= granuleLength) { i++; break; } } *sfbCnt = fixMin(i,*sfbCnt); sfbOffset[*sfbCnt] = fixMin(specStartOffset,granuleLength); return AAC_ENC_OK; } /***************************************************************************** functionname: FDKaacEnc_BarcLineValue description: Calculates barc value for one frequency line returns: barc value of line input: number of lines in transform, index of line to check, Fs output: *****************************************************************************/ static FIXP_DBL FDKaacEnc_BarcLineValue(INT noOfLines, INT fftLine, LONG samplingFreq) { FIXP_DBL FOURBY3EM4 = (FIXP_DBL)0x45e7b273; /* 4.0/3 * 0.0001 in q43 */ FIXP_DBL PZZZ76 = (FIXP_DBL)0x639d5e4a; /* 0.00076 in q41 */ FIXP_DBL ONE3P3 = (FIXP_DBL)0x35333333; /* 13.3 in q26 */ FIXP_DBL THREEP5 = (FIXP_DBL)0x1c000000; /* 3.5 in q27 */ FIXP_DBL INV480 = (FIXP_DBL)0x44444444; // 1/480 in q39 FIXP_DBL center_freq, x1, x2; FIXP_DBL bvalFFTLine, atan1, atan2; /* Theoritical maximum of center_freq (samp_freq*0.5) is 96khz * 0.5 = 48000 */ /* Theoritical maximum of x1 is 1.3333333e-4f * center_freq = 6.4, can keep in q28 */ /* Theoritical maximum of x2 is 0.00076f * center_freq = 36.48, can keep in q25 */ center_freq = fftLine * samplingFreq; /* q11 or q8 */ switch (noOfLines) { case 1024: center_freq = center_freq << 2; /* q13 */ break; case 128: center_freq = center_freq << 5; /* q13 */ break; case 512: center_freq = (fftLine * samplingFreq) << 3; // q13 break; case 480: center_freq = fMult(center_freq, INV480) << 4; // q13 break; default: center_freq = (FIXP_DBL)0; } x1 = fMult(center_freq, FOURBY3EM4); /* q13 * q43 - (DFRACT_BITS-1) = q25 */ x2 = fMult(center_freq, PZZZ76) << 2; /* q13 * q41 - (DFRACT_BITS-1) + 2 = q25 */ atan1 = fixp_atan(x1); atan2 = fixp_atan(x2); /* q25 (q26 * q30 - (DFRACT_BITS-1)) + q25 (q27 * q30 * q30) */ bvalFFTLine = fMult(ONE3P3, atan2) + fMult(THREEP5, fMult(atan1, atan1)); return(bvalFFTLine); } /* do not consider energies below a certain input signal level, i.e. of -96dB or 1 bit at 16 bit PCM resolution, might need to be configurable to e.g. 24 bit PCM Input or a lower resolution for low bit rates */ static void FDKaacEnc_InitMinPCMResolution(int numPb, int *pbOffset, FIXP_DBL *sfbPCMquantThreshold) { /* PCM_QUANT_NOISE = FDKpow(10.0f, - 20.f / 10.0f) * ABS_LOW * NORM_PCM_ENERGY * FDKpow(2,PCM_QUANT_THR_SCALE) */ #define PCM_QUANT_NOISE ((FIXP_DBL)0x00547062) for( int i = 0; i < numPb; i++ ) { sfbPCMquantThreshold[i] = (pbOffset[i+1] - pbOffset[i]) * PCM_QUANT_NOISE; } } static FIXP_DBL getMaskFactor( const FIXP_DBL dbVal_fix, const INT dbVal_e, const FIXP_DBL ten_fix, const INT ten_e ) { INT q_msk; FIXP_DBL mask_factor; mask_factor = fPow(ten_fix, DFRACT_BITS-1-ten_e, -dbVal_fix, DFRACT_BITS-1-dbVal_e, &q_msk); q_msk = fixMin(DFRACT_BITS-1,fixMax(-(DFRACT_BITS-1),q_msk)); if ( (q_msk>0) && (mask_factor>(FIXP_DBL)MAXVAL_DBL>>q_msk) ) { mask_factor = (FIXP_DBL)MAXVAL_DBL; } else { mask_factor = scaleValue(mask_factor, q_msk); } return (mask_factor); } static void FDKaacEnc_initSpreading(INT numPb, FIXP_DBL *pbBarcValue, FIXP_DBL *pbMaskLoFactor, FIXP_DBL *pbMaskHiFactor, FIXP_DBL *pbMaskLoFactorSprEn, FIXP_DBL *pbMaskHiFactorSprEn, const LONG bitrate, const INT blockType) { INT i; FIXP_DBL MASKLOWSPREN, MASKHIGHSPREN; FIXP_DBL MASKHIGH = (FIXP_DBL)0x30000000; /* 1.5 in q29 */ FIXP_DBL MASKLOW = (FIXP_DBL)0x60000000; /* 3.0 in q29 */ FIXP_DBL MASKLOWSPRENLONG = (FIXP_DBL)0x60000000; /* 3.0 in q29 */ FIXP_DBL MASKHIGHSPRENLONG = (FIXP_DBL)0x40000000; /* 2.0 in q29 */ FIXP_DBL MASKHIGHSPRENLONGLOWBR = (FIXP_DBL)0x30000000; /* 1.5 in q29 */ FIXP_DBL MASKLOWSPRENSHORT = (FIXP_DBL)0x40000000; /* 2.0 in q29 */ FIXP_DBL MASKHIGHSPRENSHORT = (FIXP_DBL)0x30000000; /* 1.5 in q29 */ FIXP_DBL TEN = (FIXP_DBL)0x50000000; /* 10.0 in q27 */ if (blockType != SHORT_WINDOW) { MASKLOWSPREN = MASKLOWSPRENLONG; MASKHIGHSPREN = (bitrate>20000)?MASKHIGHSPRENLONG:MASKHIGHSPRENLONGLOWBR; } else { MASKLOWSPREN = MASKLOWSPRENSHORT; MASKHIGHSPREN = MASKHIGHSPRENSHORT; } for(i=0; i 0) { pbMaskHiFactor[i] = getMaskFactor( fMult(MASKHIGH, (pbBarcValue[i] - pbBarcValue[i-1])), 23, TEN, 27); pbMaskLoFactor[i-1] = getMaskFactor( fMult(MASKLOW, (pbBarcValue[i] - pbBarcValue[i-1])), 23, TEN, 27); pbMaskHiFactorSprEn[i] = getMaskFactor( fMult(MASKHIGHSPREN, (pbBarcValue[i] - pbBarcValue[i-1])), 23, TEN, 27); pbMaskLoFactorSprEn[i-1] = getMaskFactor( fMult(MASKLOWSPREN, (pbBarcValue[i] - pbBarcValue[i-1])), 23, TEN, 27); } else { pbMaskHiFactor[i] = (FIXP_DBL)0; pbMaskLoFactor[numPb-1] = (FIXP_DBL)0; pbMaskHiFactorSprEn[i] = (FIXP_DBL)0; pbMaskLoFactorSprEn[numPb-1] = (FIXP_DBL)0; } } } static void FDKaacEnc_initBarcValues(INT numPb, INT *pbOffset, INT numLines, INT samplingFrequency, FIXP_DBL *pbBval) { INT i; FIXP_DBL MAX_BARC = (FIXP_DBL)0x30000000; /* 24.0 in q25 */ for(i=0; i> 1) + (v2 >> 1); pbBval[i] = fixMin(cur_bark, MAX_BARC); } } static void FDKaacEnc_initMinSnr(const LONG bitrate, const LONG samplerate, const INT numLines, const INT *sfbOffset, const INT sfbActive, const INT blockType, FIXP_DBL *sfbMinSnrLdData) { INT sfb; /* Fix conversion variables */ INT qbfac, qperwin, qdiv, qpeprt_const, qpeprt; INT qtmp, qsnr, sfbWidth; FIXP_DBL MAX_BARC = (FIXP_DBL)0x30000000; /* 24.0 in q25 */ FIXP_DBL MAX_BARCP1 = (FIXP_DBL)0x32000000; /* 25.0 in q25 */ FIXP_DBL BITS2PEFAC = (FIXP_DBL)0x4b851eb8; /* 1.18 in q30 */ FIXP_DBL PERS2P4 = (FIXP_DBL)0x624dd2f2; /* 0.024 in q36 */ FIXP_DBL ONEP5 = (FIXP_DBL)0x60000000; /* 1.5 in q30 */ FIXP_DBL MAX_SNR = (FIXP_DBL)0x33333333; /* 0.8 in q30 */ FIXP_DBL MIN_SNR = (FIXP_DBL)0x003126e9; /* 0.003 in q30 */ FIXP_DBL barcFactor, pePerWindow, pePart, barcWidth; FIXP_DBL pePart_const, tmp, snr, one_qsnr, one_point5; /* relative number of active barks */ barcFactor = fDivNorm(fixMin(FDKaacEnc_BarcLineValue(numLines, sfbOffset[sfbActive], samplerate), MAX_BARC), MAX_BARCP1, &qbfac); qbfac = DFRACT_BITS-1-qbfac; pePerWindow = fDivNorm(bitrate, samplerate, &qperwin); qperwin = DFRACT_BITS-1-qperwin; pePerWindow = fMult(pePerWindow, BITS2PEFAC); qperwin = qperwin + 30 - (DFRACT_BITS-1); pePerWindow = fMult(pePerWindow, PERS2P4); qperwin = qperwin + 36 - (DFRACT_BITS-1); switch (numLines) { case 1024: qperwin = qperwin - 10; break; case 128: qperwin = qperwin - 7; break; case 512: qperwin = qperwin - 9; break; case 480: qperwin = qperwin - 9; pePerWindow = fMult(pePerWindow, FL2FXCONST_DBL(480.f/512.f)); break; } /* for short blocks it is assumed that more bits are available */ if (blockType == SHORT_WINDOW) { pePerWindow = fMult(pePerWindow, ONEP5); qperwin = qperwin + 30 - (DFRACT_BITS-1); } pePart_const = fDivNorm(pePerWindow, barcFactor, &qdiv); qpeprt_const = qperwin - qbfac + DFRACT_BITS-1-qdiv; for (sfb = 0; sfb < sfbActive; sfb++) { barcWidth = FDKaacEnc_BarcLineValue(numLines, sfbOffset[sfb+1], samplerate) - FDKaacEnc_BarcLineValue(numLines, sfbOffset[sfb], samplerate); /* adapt to sfb bands */ pePart = fMult(pePart_const, barcWidth); qpeprt = qpeprt_const + 25 - (DFRACT_BITS-1); /* pe -> snr calculation */ sfbWidth = (sfbOffset[sfb+1] - sfbOffset[sfb]); pePart = fDivNorm(pePart, sfbWidth, &qdiv); qpeprt += DFRACT_BITS-1-qdiv; tmp = f2Pow(pePart, DFRACT_BITS-1-qpeprt, &qtmp); qtmp = DFRACT_BITS-1-qtmp; /* Subtract 1.5 */ qsnr = fixMin(qtmp, 30); tmp = tmp >> (qtmp - qsnr); if((30+1-qsnr) > (DFRACT_BITS-1)) one_point5 = (FIXP_DBL)0; else one_point5 = (FIXP_DBL)(ONEP5 >> (30+1-qsnr)); snr = (tmp>>1) - (one_point5); qsnr -= 1; /* max(snr, 1.0) */ if(qsnr > 0) one_qsnr = (FIXP_DBL)(1 << qsnr); else one_qsnr = (FIXP_DBL)0; snr = fixMax(one_qsnr, snr); /* 1/snr */ snr = fDivNorm(one_qsnr, snr, &qsnr); qsnr = DFRACT_BITS-1-qsnr; snr = (qsnr > 30)? (snr>>(qsnr-30)):snr; /* upper limit is -1 dB */ snr = (snr > MAX_SNR) ? MAX_SNR : snr; /* lower limit is -25 dB */ snr = (snr < MIN_SNR) ? MIN_SNR : snr; snr = snr << 1; sfbMinSnrLdData[sfb] = CalcLdData(snr); } } AAC_ENCODER_ERROR FDKaacEnc_InitPsyConfiguration(INT bitrate, INT samplerate, INT bandwidth, INT blocktype, INT granuleLength, INT useIS, PSY_CONFIGURATION *psyConf, FB_TYPE filterbank) { AAC_ENCODER_ERROR ErrorStatus; INT sfb; FIXP_DBL sfbBarcVal[MAX_SFB]; const INT frameLengthLong = granuleLength; const INT frameLengthShort = granuleLength/TRANS_FAC; FDKmemclear(psyConf, sizeof(PSY_CONFIGURATION)); psyConf->granuleLength = granuleLength; psyConf->filterbank = filterbank; psyConf->allowIS = (useIS) && ( (bitrate/bandwidth) < 5 ); /* init sfb table */ ErrorStatus = FDKaacEnc_initSfbTable(samplerate,blocktype,granuleLength,psyConf->sfbOffset,&psyConf->sfbCnt); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /* calculate barc values for each pb */ FDKaacEnc_initBarcValues(psyConf->sfbCnt, psyConf->sfbOffset, psyConf->sfbOffset[psyConf->sfbCnt], samplerate, sfbBarcVal); FDKaacEnc_InitMinPCMResolution(psyConf->sfbCnt, psyConf->sfbOffset, psyConf->sfbPcmQuantThreshold); /* calculate spreading function */ FDKaacEnc_initSpreading(psyConf->sfbCnt, sfbBarcVal, psyConf->sfbMaskLowFactor, psyConf->sfbMaskHighFactor, psyConf->sfbMaskLowFactorSprEn, psyConf->sfbMaskHighFactorSprEn, bitrate, blocktype); /* init ratio */ psyConf->maxAllowedIncreaseFactor = 2; /* integer */ psyConf->minRemainingThresholdFactor = (FIXP_SGL)0x0148; /* FL2FXCONST_SGL(0.01f); */ /* fract */ psyConf->clipEnergy = (FIXP_DBL)0x773593ff; /* FL2FXCONST_DBL(1.0e9*NORM_PCM_ENERGY); */ if (blocktype!=SHORT_WINDOW) { psyConf->lowpassLine = (INT)((2*bandwidth*frameLengthLong)/samplerate); psyConf->lowpassLineLFE = LFE_LOWPASS_LINE; } else { psyConf->lowpassLine = (INT)((2*bandwidth*frameLengthShort)/samplerate); psyConf->lowpassLineLFE = 0; /* LFE only in lonf blocks */ /* psyConf->clipEnergy /= (TRANS_FAC * TRANS_FAC); */ psyConf->clipEnergy >>= 6; } for (sfb = 0; sfb < psyConf->sfbCnt; sfb++){ if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLine) break; } psyConf->sfbActive = sfb; for (sfb = 0; sfb < psyConf->sfbCnt; sfb++){ if (psyConf->sfbOffset[sfb] >= psyConf->lowpassLineLFE) break; } psyConf->sfbActiveLFE = sfb; /* calculate minSnr */ FDKaacEnc_initMinSnr(bitrate, samplerate, psyConf->sfbOffset[psyConf->sfbCnt], psyConf->sfbOffset, psyConf->sfbActive, blocktype, psyConf->sfbMinSnrLdData); return AAC_ENC_OK; } fdk-aac-0.1.3/libAACenc/src/ms_stereo.h0000644000175000017500000001256212372261464020121 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: MS stereo processing ******************************************************************************/ #ifndef __MS_STEREO_H__ #define __MS_STEREO_H__ #include "interface.h" void FDKaacEnc_MsStereoProcessing(PSY_DATA *RESTRICT psyData[(2)], PSY_OUT_CHANNEL* psyOutChannel[2], const INT *isBook, INT *msDigest, /* output */ INT *msMask, /* output */ const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *sfbOffset); #endif fdk-aac-0.1.3/libAACenc/src/adj_thr.cpp0000644000175000017500000033335012372261464020070 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Threshold compensation ******************************************************************************/ #include "common_fix.h" #include "adj_thr_data.h" #include "adj_thr.h" #include "qc_data.h" #include "sf_estim.h" #include "aacEnc_ram.h" #define INV_INT_TAB_SIZE (8) static const FIXP_DBL invInt[INV_INT_TAB_SIZE] = { 0x7fffffff, 0x7fffffff, 0x40000000, 0x2aaaaaaa, 0x20000000, 0x19999999, 0x15555555, 0x12492492 }; #define INV_SQRT4_TAB_SIZE (8) static const FIXP_DBL invSqrt4[INV_SQRT4_TAB_SIZE] = { 0x7fffffff, 0x7fffffff, 0x6ba27e65, 0x61424bb5, 0x5a827999, 0x55994845, 0x51c8e33c, 0x4eb160d1 }; /*static const INT invRedExp = 4;*/ static const FIXP_DBL SnrLdMin1 = (FIXP_DBL)0xfcad0ddf; /*FL2FXCONST_DBL(FDKlog(0.316)/FDKlog(2.0)/LD_DATA_SCALING);*/ static const FIXP_DBL SnrLdMin2 = (FIXP_DBL)0x0351e1a2; /*FL2FXCONST_DBL(FDKlog(3.16) /FDKlog(2.0)/LD_DATA_SCALING);*/ static const FIXP_DBL SnrLdFac = (FIXP_DBL)0xff5b2c3e; /*FL2FXCONST_DBL(FDKlog(0.8) /FDKlog(2.0)/LD_DATA_SCALING);*/ static const FIXP_DBL SnrLdMin3 = (FIXP_DBL)0xfe000000; /*FL2FXCONST_DBL(FDKlog(0.5) /FDKlog(2.0)/LD_DATA_SCALING);*/ static const FIXP_DBL SnrLdMin4 = (FIXP_DBL)0x02000000; /*FL2FXCONST_DBL(FDKlog(2.0) /FDKlog(2.0)/LD_DATA_SCALING);*/ static const FIXP_DBL SnrLdMin5 = (FIXP_DBL)0xfc000000; /*FL2FXCONST_DBL(FDKlog(0.25) /FDKlog(2.0)/LD_DATA_SCALING);*/ /* The bits2Pe factors are choosen for the case that some times the crash recovery strategy will be activated once. */ typedef struct { INT bitrate; LONG bits2PeFactor_mono; LONG bits2PeFactor_mono_slope; LONG bits2PeFactor_stereo; LONG bits2PeFactor_stereo_slope; LONG bits2PeFactor_mono_scfOpt; LONG bits2PeFactor_mono_scfOpt_slope; LONG bits2PeFactor_stereo_scfOpt; LONG bits2PeFactor_stereo_scfOpt_slope; } BIT_PE_SFAC; typedef struct { const INT sampleRate; const BIT_PE_SFAC * pPeTab; const INT nEntries; } BITS2PE_CFG_TAB; static const BIT_PE_SFAC S_Bits2PeTab16000[] = { { 10000, 0x228F5C29, 0x02FEF55D, 0x1D70A3D7, 0x09BC9D6D, 0x228F5C29, 0x02FEF55D, 0x1C28F5C3, 0x0CBB92CA}, { 24000, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413, 0x23D70A3D, 0x029F16B1, 0x2199999A, 0x07DD4413}, { 32000, 0x247AE148, 0x11B1D92B, 0x23851EB8, 0x01F75105, 0x247AE148, 0x110A137F, 0x23851EB8, 0x01F75105}, { 48000, 0x2D1EB852, 0x6833C600, 0x247AE148, 0x014F8B59, 0x2CCCCCCD, 0x68DB8BAC, 0x247AE148, 0x01F75105}, { 64000, 0x60000000, 0x00000000, 0x251EB852, 0x154C985F, 0x60000000, 0x00000000, 0x2570A3D7, 0x154C985F}, { 96000, 0x60000000, 0x00000000, 0x39EB851F, 0x088509C0, 0x60000000, 0x00000000, 0x3A3D70A4, 0x088509C0}, {128000, 0x60000000, 0x00000000, 0x423D70A4, 0x18A43BB4, 0x60000000, 0x00000000, 0x428F5C29, 0x181E03F7}, {148000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000, 0x60000000, 0x00000000, 0x5147AE14, 0x00000000} }; static const BIT_PE_SFAC S_Bits2PeTab22050[] = { { 16000, 0x1a8f5c29, 0x1797cc3a, 0x128f5c29, 0x18e75793, 0x175c28f6, 0x221426fe, 0x00000000, 0x5a708ede}, { 24000, 0x2051eb85, 0x092ccf6c, 0x18a3d70a, 0x13a92a30, 0x1fae147b, 0xbcbe61d, 0x16147ae1, 0x18e75793}, { 32000, 0x228f5c29, 0x029f16b1, 0x1d70a3d7, 0x088509c0, 0x228f5c29, 0x29f16b1, 0x1c28f5c3, 0x0b242071}, { 48000, 0x23d70a3d, 0x014f8b59, 0x2199999a, 0x03eea20a, 0x23d70a3d, 0x14f8b59, 0x2199999a, 0x03eea20a}, { 64000, 0x247ae148, 0x08d8ec96, 0x23851eb8, 0x00fba882, 0x247ae148, 0x88509c0, 0x23851eb8, 0x00fba882}, { 96000, 0x2d1eb852, 0x3419e300, 0x247ae148, 0x00a7c5ac, 0x2ccccccd, 0x346dc5d6, 0x247ae148, 0x00fba882}, {128000, 0x60000000, 0x00000000, 0x251eb852, 0x029f16b1, 0x60000000, 0x00000000, 0x2570a3d7, 0x009f16b1}, {148000, 0x60000000, 0x00000000, 0x26b851ec, 0x00000000, 0x60000000, 0x00000000, 0x270a3d71, 0x00000000} }; static const BIT_PE_SFAC S_Bits2PeTab24000[] = { { 16000, 0x19eb851f, 0x13a92a30, 0x1147ae14, 0x164840e1, 0x1999999a, 0x12599ed8, 0x00000000, 0x46c764ae}, { 24000, 0x1eb851ec, 0x0d1b7176, 0x16b851ec, 0x18e75793, 0x1e147ae1, 0x0fba8827, 0x1147ae14, 0x2c9081c3}, { 32000, 0x21eb851f, 0x049667b6, 0x1ccccccd, 0x07357e67, 0x21eb851f, 0x03eea20a, 0x1c28f5c3, 0x07357e67}, { 48000, 0x2428f5c3, 0x014f8b59, 0x2051eb85, 0x053e2d62, 0x23d70a3d, 0x01f75105, 0x1fae147b, 0x07357e67}, { 64000, 0x24cccccd, 0x05e5f30e, 0x22e147ae, 0x01a36e2f, 0x24cccccd, 0x05e5f30e, 0x23333333, 0x014f8b59}, { 96000, 0x2a8f5c29, 0x24b33db0, 0x247ae148, 0x00fba882, 0x2a8f5c29, 0x26fe718b, 0x247ae148, 0x00fba882}, {128000, 0x4e666666, 0x1cd5f99c, 0x2570a3d7, 0x010c6f7a, 0x50a3d70a, 0x192a7371, 0x2570a3d7, 0x010c6f7a}, {148000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000, 0x60000000, 0x00000000, 0x26147ae1, 0x00000000} }; static const BIT_PE_SFAC S_Bits2PeTab32000[] = { { 16000, 0x1199999a, 0x20c49ba6, 0x00000000, 0x4577d955, 0x00000000, 0x60fe4799, 0x00000000, 0x00000000}, { 24000, 0x1999999a, 0x0fba8827, 0x10f5c28f, 0x1b866e44, 0x17ae147b, 0x0fba8827, 0x00000000, 0x4d551d69}, { 32000, 0x1d70a3d7, 0x07357e67, 0x17ae147b, 0x09d49518, 0x1b851eb8, 0x0a7c5ac4, 0x12e147ae, 0x110a137f}, { 48000, 0x20f5c28f, 0x049667b6, 0x1c7ae148, 0x053e2d62, 0x20a3d70a, 0x053e2d62, 0x1b333333, 0x05e5f30e}, { 64000, 0x23333333, 0x029f16b1, 0x1f0a3d71, 0x02f2f987, 0x23333333, 0x029f16b1, 0x1e147ae1, 0x03eea20a}, { 96000, 0x25c28f5c, 0x2c3c9eed, 0x21eb851f, 0x01f75105, 0x25c28f5c, 0x0a7c5ac4, 0x21eb851f, 0x01a36e2f}, {128000, 0x50f5c28f, 0x18a43bb4, 0x23d70a3d, 0x010c6f7a, 0x30000000, 0x168b5cc0, 0x23851eb8, 0x0192a737}, {148000, 0x60000000, 0x00000000, 0x247ae148, 0x00dfb23b, 0x3dc28f5c, 0x300f4aaf, 0x247ae148, 0x01bf6476}, {160000, 0x60000000, 0xb15b5740, 0x24cccccd, 0x053e2d62, 0x4f5c28f6, 0xbefd0072, 0x251eb852, 0x04fb1184}, {200000, 0x00000000, 0x00000000, 0x2b333333, 0x0836be91, 0x00000000, 0x00000000, 0x2b333333, 0x0890390f}, {320000, 0x00000000, 0x00000000, 0x4947ae14, 0x00000000, 0x00000000, 0x00000000, 0x4a8f5c29, 0x00000000} }; static const BIT_PE_SFAC S_Bits2PeTab44100[] = { { 16000, 0x10a3d70a, 0x1797cc3a, 0x00000000, 0x00000000, 0x00000000, 0x59210386, 0x00000000, 0x00000000}, { 24000, 0x16666666, 0x1797cc3a, 0x00000000, 0x639d5e4a, 0x15c28f5c, 0x12599ed8, 0x00000000, 0x5bc01a37}, { 32000, 0x1c28f5c3, 0x049667b6, 0x1851eb85, 0x049667b6, 0x1a3d70a4, 0x088509c0, 0x16666666, 0x053e2d62}, { 48000, 0x1e666666, 0x05e5f30e, 0x1a8f5c29, 0x049667b6, 0x1e666666, 0x05e5f30e, 0x18f5c28f, 0x05e5f30e}, { 64000, 0x2147ae14, 0x0346dc5d, 0x1ccccccd, 0x02f2f987, 0x2147ae14, 0x02f2f987, 0x1bd70a3d, 0x039abf34}, { 96000, 0x247ae148, 0x068db8bb, 0x1fae147b, 0x029f16b1, 0x2428f5c3, 0x0639d5e5, 0x1f5c28f6, 0x029f16b1}, {128000, 0x2ae147ae, 0x1b435265, 0x223d70a4, 0x0192a737, 0x2a3d70a4, 0x1040bfe4, 0x21eb851f, 0x0192a737}, {148000, 0x3b851eb8, 0x2832069c, 0x23333333, 0x00dfb23b, 0x3428f5c3, 0x2054c288, 0x22e147ae, 0x00dfb23b}, {160000, 0x4a3d70a4, 0xc32ebe5a, 0x23851eb8, 0x01d5c316, 0x40000000, 0xcb923a2b, 0x23333333, 0x01d5c316}, {200000, 0x00000000, 0x00000000, 0x25c28f5c, 0x0713f078, 0x00000000, 0x00000000, 0x2570a3d7, 0x072a4f17}, {320000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000, 0x00000000, 0x00000000, 0x3fae147b, 0x00000000} }; static const BIT_PE_SFAC S_Bits2PeTab48000[] = { { 16000, 0x0f5c28f6, 0x31ceaf25, 0x00000000, 0x00000000, 0x00000000, 0x74a771c9, 0x00000000, 0x00000000}, { 24000, 0x1b851eb8, 0x029f16b1, 0x00000000, 0x663c74fb, 0x1c7ae148, 0xe47991bd, 0x00000000, 0x49667b5f}, { 32000, 0x1c28f5c3, 0x029f16b1, 0x18f5c28f, 0x07357e67, 0x15c28f5c, 0x0f12c27a, 0x11eb851f, 0x13016484}, { 48000, 0x1d70a3d7, 0x053e2d62, 0x1c7ae148, 0xfe08aefc, 0x1d1eb852, 0x068db8bb, 0x1b333333, 0xfeb074a8}, { 64000, 0x20000000, 0x03eea20a, 0x1b851eb8, 0x0346dc5d, 0x2051eb85, 0x0346dc5d, 0x1a8f5c29, 0x039abf34}, { 96000, 0x23d70a3d, 0x053e2d62, 0x1eb851ec, 0x029f16b1, 0x23851eb8, 0x04ea4a8c, 0x1e147ae1, 0x02f2f987}, {128000, 0x28f5c28f, 0x14727dcc, 0x2147ae14, 0x0218def4, 0x2851eb85, 0x0e27e0f0, 0x20f5c28f, 0x0218def4}, {148000, 0x3570a3d7, 0x1cd5f99c, 0x228f5c29, 0x01bf6476, 0x30f5c28f, 0x18777e75, 0x223d70a4, 0x01bf6476}, {160000, 0x40000000, 0xcb923a2b, 0x23333333, 0x0192a737, 0x39eb851f, 0xd08d4bae, 0x22e147ae, 0x0192a737}, {200000, 0x00000000, 0x00000000, 0x251eb852, 0x06775a1b, 0x00000000, 0x00000000, 0x24cccccd, 0x06a4175a}, {320000, 0x00000000, 0x00000000, 0x3ccccccd, 0x00000000, 0x00000000, 0x00000000, 0x3d1eb852, 0x00000000} }; static const BITS2PE_CFG_TAB bits2PeConfigTab[] = { { 16000, S_Bits2PeTab16000, sizeof(S_Bits2PeTab16000)/sizeof(BIT_PE_SFAC) }, { 22050, S_Bits2PeTab22050, sizeof(S_Bits2PeTab22050)/sizeof(BIT_PE_SFAC) }, { 24000, S_Bits2PeTab24000, sizeof(S_Bits2PeTab24000)/sizeof(BIT_PE_SFAC) }, { 32000, S_Bits2PeTab32000, sizeof(S_Bits2PeTab32000)/sizeof(BIT_PE_SFAC) }, { 44100, S_Bits2PeTab44100, sizeof(S_Bits2PeTab44100)/sizeof(BIT_PE_SFAC) }, { 48000, S_Bits2PeTab48000, sizeof(S_Bits2PeTab48000)/sizeof(BIT_PE_SFAC) } }; /* values for avoid hole flag */ enum _avoid_hole_state { NO_AH =0, AH_INACTIVE =1, AH_ACTIVE =2 }; /* Q format definitions */ #define Q_BITFAC (24) /* Q scaling used in FDKaacEnc_bitresCalcBitFac() calculation */ #define Q_AVGBITS (17) /* scale bit values */ /***************************************************************************** functionname: FDKaacEnc_InitBits2PeFactor description: retrieve bits2PeFactor from table *****************************************************************************/ static void FDKaacEnc_InitBits2PeFactor( FIXP_DBL *bits2PeFactor_m, INT *bits2PeFactor_e, const INT bitRate, const INT nChannels, const INT sampleRate, const INT advancedBitsToPe, const INT invQuant ) { /* default bits2pe factor */ FIXP_DBL bit2PE_m = FL2FXCONST_DBL(1.18f/(1<<(1))); INT bit2PE_e = 1; /* make use of advanced bits to pe factor table */ if (advancedBitsToPe) { int i; const BIT_PE_SFAC *peTab = NULL; INT size = 0; /* Get correct table entry */ for (i=0; i<(INT)(sizeof(bits2PeConfigTab)/sizeof(BITS2PE_CFG_TAB)); i++) { if (sampleRate >= bits2PeConfigTab[i].sampleRate) { peTab = bits2PeConfigTab[i].pPeTab; size = bits2PeConfigTab[i].nEntries; } } if ( (peTab!=NULL) && (size!=0) ) { INT startB = -1; LONG startPF = 0; LONG peSlope = 0; /* stereo or mono mode and invQuant used or not */ for (i=0; ibitRate) || ((i==size-2)) )) { if (nChannels==1) { startPF = (!invQuant) ? peTab[i].bits2PeFactor_mono : peTab[i].bits2PeFactor_mono_scfOpt; peSlope = (!invQuant) ? peTab[i].bits2PeFactor_mono_slope : peTab[i].bits2PeFactor_mono_scfOpt_slope; /*endPF = (!invQuant) ? peTab[i+1].bits2PeFactor_mono : peTab[i+1].bits2PeFactor_mono_scfOpt; endB=peTab[i+1].bitrate;*/ startB=peTab[i].bitrate; break; } else { startPF = (!invQuant) ? peTab[i].bits2PeFactor_stereo : peTab[i].bits2PeFactor_stereo_scfOpt; peSlope = (!invQuant) ? peTab[i].bits2PeFactor_stereo_slope : peTab[i].bits2PeFactor_stereo_scfOpt_slope; /*endPF = (!invQuant) ? peTab[i+1].bits2PeFactor_stereo : peTab[i+1].bits2PeFactor_stereo_scfOpt; endB=peTab[i+1].bitrate;*/ startB=peTab[i].bitrate; break; } } } /* for i */ /* if a configuration is available */ if (startB!=-1) { /* linear interpolate to actual PEfactor */ FIXP_DBL peFac = fMult((FIXP_DBL)(bitRate-startB)<<14, (FIXP_DBL)peSlope) << 2; FIXP_DBL bit2PE = peFac + (FIXP_DBL)startPF; /* startPF_float = startPF << 2 */ /* sanity check if bits2pe value is high enough */ if ( bit2PE >= (FL2FXCONST_DBL(0.35f) >> 2) ) { bit2PE_m = bit2PE; bit2PE_e = 2; /* table is fixed scaled */ } } /* br */ } /* sr */ } /* advancedBitsToPe */ /* return bits2pe factor */ *bits2PeFactor_m = bit2PE_m; *bits2PeFactor_e = bit2PE_e; } /***************************************************************************** functionname: FDKaacEnc_bits2pe2 description: convert from bits to pe *****************************************************************************/ static INT FDKaacEnc_bits2pe2( const INT bits, const FIXP_DBL factor_m, const INT factor_e ) { return (INT)(fMult(factor_m, (FIXP_DBL)(bits<> (Q_AVGBITS-factor_e)); } /***************************************************************************** functionname: FDKaacEnc_calcThreshExp description: loudness calculation (threshold to the power of redExp) *****************************************************************************/ static void FDKaacEnc_calcThreshExp(FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB], QC_OUT_CHANNEL* qcOutChannel[(2)], PSY_OUT_CHANNEL* psyOutChannel[(2)], const INT nChannels) { INT ch, sfb, sfbGrp; FIXP_DBL thrExpLdData; for (ch=0; chsfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { thrExpLdData = psyOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb]>>2 ; thrExp[ch][sfbGrp+sfb] = CalcInvLdData(thrExpLdData); } } } } /***************************************************************************** functionname: FDKaacEnc_adaptMinSnr description: reduce minSnr requirements for bands with relative low energies *****************************************************************************/ static void FDKaacEnc_adaptMinSnr(QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_CHANNEL *psyOutChannel[(2)], MINSNR_ADAPT_PARAM *msaParam, const INT nChannels) { INT ch, sfb, sfbGrp, nSfb; FIXP_DBL avgEnLD64, dbRatio, minSnrRed; FIXP_DBL minSnrLimitLD64 = FL2FXCONST_DBL(-0.00503012648262f); /* ld64(0.8f) */ FIXP_DBL nSfbLD64; FIXP_DBL accu; for (ch=0; chsfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { accu += psyOutChannel[ch]->sfbEnergy[sfbGrp+sfb]>>6; nSfb++; } } if ((accu == FL2FXCONST_DBL(0.0f)) || (nSfb == 0)) { avgEnLD64 = FL2FXCONST_DBL(-1.0f); } else { nSfbLD64 = CalcLdInt(nSfb); avgEnLD64 = CalcLdData(accu); avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - nSfbLD64; /* 0.09375f: compensate shift with 6 */ } /* reduce minSnr requirement by minSnr^minSnrRed dependent on avgEn/sfbEn */ for (sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if ( (msaParam->startRatio + qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]) < avgEnLD64 ) { dbRatio = fMult((avgEnLD64 - qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]),FL2FXCONST_DBL(0.3010299956f)); /* scaled by (1.0f/(10.0f*64.0f)) */ minSnrRed = msaParam->redOffs + fMult(msaParam->redRatioFac,dbRatio); /* scaled by 1.0f/64.0f*/ minSnrRed = fixMax(minSnrRed, msaParam->maxRed); /* scaled by 1.0f/64.0f*/ qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = (fMult(qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb],minSnrRed)) << 6; qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(minSnrLimitLD64, qcOutChannel[ch]->sfbMinSnrLdData[sfbGrp+sfb]); } } } } } /***************************************************************************** functionname: FDKaacEnc_initAvoidHoleFlag description: determine bands where avoid hole is not necessary resp. possible *****************************************************************************/ static void FDKaacEnc_initAvoidHoleFlag(QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_CHANNEL *psyOutChannel[(2)], UCHAR ahFlag[(2)][MAX_GROUPED_SFB], struct TOOLSINFO *toolsInfo, const INT nChannels, const PE_DATA *peData, AH_PARAM *ahParam) { INT ch, sfb, sfbGrp; FIXP_DBL sfbEn, sfbEnm1; FIXP_DBL sfbEnLdData; FIXP_DBL avgEnLdData; /* decrease spread energy by 3dB for long blocks, resp. 2dB for shorts (avoid more holes in long blocks) */ for (ch=0; chlastWindowSequence != SHORT_WINDOW) { for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup) for (sfb=0; sfbmaxSfbPerGroup; sfb++) qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] >>= 1 ; } else { for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup) for (sfb=0; sfbmaxSfbPerGroup; sfb++) qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] = fMult(FL2FXCONST_DBL(0.63f), qcOutChan->sfbSpreadEnergy[sfbGrp+sfb]) ; } } /* increase minSnr for local peaks, decrease it for valleys */ if (ahParam->modifyMinSnr) { for(ch=0; chsfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { FIXP_DBL sfbEnp1, avgEn; if (sfb > 0) sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb-1]; else sfbEnm1 = qcOutChan->sfbEnergy[sfbGrp+sfb]; if (sfb < psyOutChannel[ch]->maxSfbPerGroup-1) sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb+1]; else sfbEnp1 = qcOutChan->sfbEnergy[sfbGrp+sfb]; avgEn = (sfbEnm1>>1) + (sfbEnp1>>1); avgEnLdData = CalcLdData(avgEn); sfbEn = qcOutChan->sfbEnergy[sfbGrp+sfb]; sfbEnLdData = qcOutChan->sfbEnergyLdData[sfbGrp+sfb]; /* peak ? */ if (sfbEn > avgEn) { FIXP_DBL tmpMinSnrLdData; if (psyOutChannel[ch]->lastWindowSequence==LONG_WINDOW) tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin1 ) ; else tmpMinSnrLdData = fixMax( SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), (FIXP_DBL)SnrLdMin3 ) ; qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb], tmpMinSnrLdData); } /* valley ? */ if ( ((sfbEnLdData+(FIXP_DBL)SnrLdMin4) < (FIXP_DBL)avgEnLdData) && (sfbEn > FL2FXCONST_DBL(0.0)) ) { FIXP_DBL tmpMinSnrLdData = avgEnLdData - sfbEnLdData -(FIXP_DBL)SnrLdMin4 + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]; tmpMinSnrLdData = fixMin((FIXP_DBL)SnrLdFac, tmpMinSnrLdData); qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(tmpMinSnrLdData, (FIXP_DBL)(qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + SnrLdMin2 )); } } } } } /* stereo: adapt the minimum requirements sfbMinSnr of mid and side channels to avoid spending unnoticable bits */ if (nChannels == 2) { QC_OUT_CHANNEL* qcOutChanM = qcOutChannel[0]; QC_OUT_CHANNEL* qcOutChanS = qcOutChannel[1]; PSY_OUT_CHANNEL* psyOutChanM = psyOutChannel[0]; for(sfbGrp = 0;sfbGrp < psyOutChanM->sfbCnt;sfbGrp+= psyOutChanM->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if (toolsInfo->msMask[sfbGrp+sfb]) { FIXP_DBL maxSfbEnLd = fixMax(qcOutChanM->sfbEnergyLdData[sfbGrp+sfb],qcOutChanS->sfbEnergyLdData[sfbGrp+sfb]); FIXP_DBL maxThrLd, sfbMinSnrTmpLd; if ( ((SnrLdMin5>>1) + (maxSfbEnLd>>1) + (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb]>>1)) <= FL2FXCONST_DBL(-0.5f)) maxThrLd = FL2FXCONST_DBL(-1.0f) ; else maxThrLd = SnrLdMin5 + maxSfbEnLd + qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb]; if (qcOutChanM->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f)) sfbMinSnrTmpLd = maxThrLd - qcOutChanM->sfbEnergyLdData[sfbGrp+sfb]; else sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f); qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd); if (qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f)) qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanM->sfbMinSnrLdData[sfbGrp+sfb], (FIXP_DBL)SnrLdFac); if (qcOutChanS->sfbEnergy[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f)) sfbMinSnrTmpLd = maxThrLd - qcOutChanS->sfbEnergyLdData[sfbGrp+sfb]; else sfbMinSnrTmpLd = FL2FXCONST_DBL(0.0f); qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMax(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],sfbMinSnrTmpLd); if (qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] <= FL2FXCONST_DBL(0.0f)) qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb] = fixMin(qcOutChanS->sfbMinSnrLdData[sfbGrp+sfb],(FIXP_DBL)SnrLdFac); if (qcOutChanM->sfbEnergy[sfbGrp+sfb]>qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb]) qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb] = fMult(qcOutChanS->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f)); if (qcOutChanS->sfbEnergy[sfbGrp+sfb]>qcOutChanS->sfbSpreadEnergy[sfbGrp+sfb]) qcOutChanM->sfbSpreadEnergy[sfbGrp+sfb] = fMult(qcOutChanM->sfbEnergy[sfbGrp+sfb], FL2FXCONST_DBL(0.9f)); } } } } /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */ for(ch=0; chsfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if ((qcOutChan->sfbSpreadEnergy[sfbGrp+sfb] > qcOutChan->sfbEnergy[sfbGrp+sfb]) || (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] > FL2FXCONST_DBL(0.0f))) { ahFlag[ch][sfbGrp+sfb] = NO_AH; } else { ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE; } } } } } /** * \brief Calculate constants that do not change during successive pe calculations. * * \param peData Pointer to structure containing PE data of current element. * \param psyOutChannel Pointer to PSY_OUT_CHANNEL struct holding nChannels elements. * \param qcOutChannel Pointer to QC_OUT_CHANNEL struct holding nChannels elements. * \param nChannels Number of channels in element. * \param peOffset Fixed PE offset defined while FDKaacEnc_AdjThrInit() depending on bitrate. * * \return void */ static void FDKaacEnc_preparePe(PE_DATA *peData, PSY_OUT_CHANNEL* psyOutChannel[(2)], QC_OUT_CHANNEL* qcOutChannel[(2)], const INT nChannels, const INT peOffset) { INT ch; for(ch=0; chpeChannelData[ch], psyOutChan->sfbEnergyLdData, psyOutChan->sfbThresholdLdData, qcOutChannel[ch]->sfbFormFactorLdData, psyOutChan->sfbOffsets, psyOutChan->sfbCnt, psyOutChan->sfbPerGroup, psyOutChan->maxSfbPerGroup); } peData->offset = peOffset; } /** * \brief Calculate weighting factor for threshold adjustment. * * Calculate weighting factor to be applied at energies and thresholds in ld64 format. * * \param peData, Pointer to PE data in current element. * \param psyOutChannel Pointer to PSY_OUT_CHANNEL struct holding nChannels elements. * \param qcOutChannel Pointer to QC_OUT_CHANNEL struct holding nChannels elements. * \param toolsInfo Pointer to tools info struct of current element. * \param adjThrStateElement Pointer to ATS_ELEMENT holding enFacPatch states. * \param nChannels Number of channels in element. * \param usePatchTool Apply the weighting tool 0 (no) else (yes). * * \return void */ static void FDKaacEnc_calcWeighting(PE_DATA *peData, PSY_OUT_CHANNEL* psyOutChannel[(2)], QC_OUT_CHANNEL* qcOutChannel[(2)], struct TOOLSINFO *toolsInfo, ATS_ELEMENT* adjThrStateElement, const INT nChannels, const INT usePatchTool) { int ch, noShortWindowInFrame = TRUE; INT exePatchM = 0; for (ch=0; chlastWindowSequence == SHORT_WINDOW) { noShortWindowInFrame = FALSE; } FDKmemclear(qcOutChannel[ch]->sfbEnFacLd, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); } if (usePatchTool==0) { return; /* tool is disabled */ } for (ch=0; chsfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { FIXP_DBL nrgFac12 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1); /* nrg^(1/2) */ FIXP_DBL nrgFac14 = CalcInvLdData(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>2); /* nrg^(1/4) */ /* maximal number of bands is 64, results scaling factor 6 */ nLinesSum += peData->peChannelData[ch].sfbNLines[sfbGrp+sfb]; /* relevant lines */ nrgTotal += ( psyOutChan->sfbEnergy[sfbGrp+sfb] >> 6 ); /* sum up nrg */ nrgSum12 += ( nrgFac12 >> 6 ); /* sum up nrg^(2/4) */ nrgSum14 += ( nrgFac14 >> 6 ); /* sum up nrg^(1/4) */ nrgSum34 += ( fMult(nrgFac14, nrgFac12) >> 6 ); /* sum up nrg^(3/4) */ } } nrgTotal = CalcLdData(nrgTotal); /* get ld64 of total nrg */ nrgFacLd_14 = CalcLdData(nrgSum14) - nrgTotal; /* ld64(nrgSum14/nrgTotal) */ nrgFacLd_12 = CalcLdData(nrgSum12) - nrgTotal; /* ld64(nrgSum12/nrgTotal) */ nrgFacLd_34 = CalcLdData(nrgSum34) - nrgTotal; /* ld64(nrgSum34/nrgTotal) */ adjThrStateElement->chaosMeasureEnFac[ch] = FDKmax( FL2FXCONST_DBL(0.1875f), fDivNorm(nLinesSum,psyOutChan->sfbOffsets[psyOutChan->sfbCnt]) ); usePatch = (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.78125f)); exePatch = ((usePatch) && (adjThrStateElement->lastEnFacPatch[ch])); for (sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { INT sfbExePatch; /* for MS coupled SFBs, also execute patch in side channel if done in mid channel */ if ((ch == 1) && (toolsInfo->msMask[sfbGrp+sfb])) { sfbExePatch = exePatchM; } else { sfbExePatch = exePatch; } if ( (sfbExePatch) && (psyOutChan->sfbEnergy[sfbGrp+sfb]>FL2FXCONST_DBL(0.f)) ) { /* execute patch based on spectral flatness calculated above */ if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.8125f)) { qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_14 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]+(psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1)))>>1 ); /* sfbEnergy^(3/4) */ } else if (adjThrStateElement->chaosMeasureEnFac[ch] > FL2FXCONST_DBL(0.796875f)) { qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_12 + psyOutChan->sfbEnergyLdData[sfbGrp+sfb])>>1 ); /* sfbEnergy^(2/4) */ } else { qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = ( (nrgFacLd_34 + (psyOutChan->sfbEnergyLdData[sfbGrp+sfb]>>1))>>1 ); /* sfbEnergy^(1/4) */ } qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb] = fixMin(qcOutChannel[ch]->sfbEnFacLd[sfbGrp+sfb],(FIXP_DBL)0); } } } /* sfb loop */ adjThrStateElement->lastEnFacPatch[ch] = usePatch; exePatchM = exePatch; } else { /* !noShortWindowInFrame */ adjThrStateElement->chaosMeasureEnFac[ch] = FL2FXCONST_DBL(0.75f); adjThrStateElement->lastEnFacPatch[ch] = TRUE; /* allow use of sfbEnFac patch in upcoming frame */ } } /* ch loop */ } /***************************************************************************** functionname: FDKaacEnc_calcPe description: calculate pe for both channels *****************************************************************************/ static void FDKaacEnc_calcPe(PSY_OUT_CHANNEL* psyOutChannel[(2)], QC_OUT_CHANNEL* qcOutChannel[(2)], PE_DATA *peData, const INT nChannels) { INT ch; peData->pe = peData->offset; peData->constPart = 0; peData->nActiveLines = 0; for(ch=0; chpeChannelData[ch]; FDKaacEnc_calcSfbPe(&peData->peChannelData[ch], qcOutChannel[ch]->sfbWeightedEnergyLdData, qcOutChannel[ch]->sfbThresholdLdData, psyOutChannel[ch]->sfbCnt, psyOutChannel[ch]->sfbPerGroup, psyOutChannel[ch]->maxSfbPerGroup, psyOutChannel[ch]->isBook, psyOutChannel[ch]->isScale); peData->pe += peChanData->pe; peData->constPart += peChanData->constPart; peData->nActiveLines += peChanData->nActiveLines; } } void FDKaacEnc_peCalculation(PE_DATA *peData, PSY_OUT_CHANNEL* psyOutChannel[(2)], QC_OUT_CHANNEL* qcOutChannel[(2)], struct TOOLSINFO *toolsInfo, ATS_ELEMENT* adjThrStateElement, const INT nChannels) { /* constants that will not change during successive pe calculations */ FDKaacEnc_preparePe(peData, psyOutChannel, qcOutChannel, nChannels, adjThrStateElement->peOffset); /* calculate weighting factor for threshold adjustment */ FDKaacEnc_calcWeighting(peData, psyOutChannel, qcOutChannel, toolsInfo, adjThrStateElement, nChannels, 1); { /* no weighting of threholds and energies for mlout */ /* weight energies and thresholds */ int ch; for (ch=0; chsfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { pQcOutCh->sfbWeightedEnergyLdData[sfb+sfbGrp] = pQcOutCh->sfbEnergyLdData[sfb+sfbGrp] - pQcOutCh->sfbEnFacLd[sfb+sfbGrp]; pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] -= pQcOutCh->sfbEnFacLd[sfb+sfbGrp]; } } } } /* pe without reduction */ FDKaacEnc_calcPe(psyOutChannel, qcOutChannel, peData, nChannels); } /***************************************************************************** functionname: FDKaacEnc_FDKaacEnc_calcPeNoAH description: sum the pe data only for bands where avoid hole is inactive *****************************************************************************/ static void FDKaacEnc_FDKaacEnc_calcPeNoAH(INT *pe, INT *constPart, INT *nActiveLines, PE_DATA *peData, UCHAR ahFlag[(2)][MAX_GROUPED_SFB], PSY_OUT_CHANNEL* psyOutChannel[(2)], const INT nChannels) { INT ch, sfb,sfbGrp; INT pe_tmp = peData->offset; INT constPart_tmp = 0; INT nActiveLines_tmp = 0; for(ch=0; chpeChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChannel[ch]->sfbCnt;sfbGrp+= psyOutChannel[ch]->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if(ahFlag[ch][sfbGrp+sfb] < AH_ACTIVE) { pe_tmp += peChanData->sfbPe[sfbGrp+sfb]; constPart_tmp += peChanData->sfbConstPart[sfbGrp+sfb]; nActiveLines_tmp += peChanData->sfbNActiveLines[sfbGrp+sfb]; } } } } /* correct scaled pe and constPart values */ *pe = pe_tmp >> PE_CONSTPART_SHIFT; *constPart = constPart_tmp >> PE_CONSTPART_SHIFT; *nActiveLines = nActiveLines_tmp; } /***************************************************************************** functionname: FDKaacEnc_reduceThresholdsCBR description: apply reduction formula *****************************************************************************/ static const FIXP_DBL limitThrReducedLdData = (FIXP_DBL)0x00008000; /*FL2FXCONST_DBL(FDKpow(2.0,-LD_DATA_SCALING/4.0));*/ static void FDKaacEnc_reduceThresholdsCBR(QC_OUT_CHANNEL* qcOutChannel[(2)], PSY_OUT_CHANNEL* psyOutChannel[(2)], UCHAR ahFlag[(2)][MAX_GROUPED_SFB], FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB], const INT nChannels, const FIXP_DBL redVal, const SCHAR redValScaling) { INT ch, sfb, sfbGrp; FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData; FIXP_DBL sfbThrExp; for(ch=0; chsfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { sfbEnLdData = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb]; sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb]; sfbThrExp = thrExp[ch][sfbGrp+sfb]; if ((sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) { /* threshold reduction formula: float tmp = thrExp[ch][sfb]+redVal; tmp *= tmp; sfbThrReduced = tmp*tmp; */ int minScale = fixMin(CountLeadingBits(sfbThrExp), CountLeadingBits(redVal) - (DFRACT_BITS-1-redValScaling) )-1; /* 4*log( sfbThrExp + redVal ) */ sfbThrReducedLdData = CalcLdData(fAbs(scaleValue(sfbThrExp, minScale) + scaleValue(redVal,(DFRACT_BITS-1-redValScaling)+minScale))) - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT)); sfbThrReducedLdData <<= 2; /* avoid holes */ if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] ) && (ahFlag[ch][sfbGrp+sfb] != NO_AH) ) { if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){ sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData); } else sfbThrReducedLdData = sfbThrLdData; ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; } /* minimum of 29 dB Ratio for Thresholds */ if ((sfbEnLdData+(FIXP_DBL)MAXVAL_DBL) > FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){ sfbThrReducedLdData = fixMax(sfbThrReducedLdData, (sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING))); } qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData; } } } } } /* similar to prepareSfbPe1() */ static FIXP_DBL FDKaacEnc_calcChaosMeasure(PSY_OUT_CHANNEL *psyOutChannel, const FIXP_DBL *sfbFormFactorLdData) { #define SCALE_FORM_FAC (4) /* (SCALE_FORM_FAC+FORM_FAC_SHIFT) >= ld(FRAME_LENGTH)*/ #define SCALE_NRGS (8) #define SCALE_NLINES (16) #define SCALE_NRGS_SQRT4 (2) /* 0.25 * SCALE_NRGS */ #define SCALE_NLINES_P34 (12) /* 0.75 * SCALE_NLINES */ INT sfbGrp, sfb; FIXP_DBL chaosMeasure; INT frameNLines = 0; FIXP_DBL frameFormFactor = FL2FXCONST_DBL(0.f); FIXP_DBL frameEnergy = FL2FXCONST_DBL(0.f); for (sfbGrp=0; sfbGrpsfbCnt; sfbGrp+=psyOutChannel->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++){ if (psyOutChannel->sfbEnergyLdData[sfbGrp+sfb] > psyOutChannel->sfbThresholdLdData[sfbGrp+sfb]) { frameFormFactor += (CalcInvLdData(sfbFormFactorLdData[sfbGrp+sfb])>>SCALE_FORM_FAC); frameNLines += (psyOutChannel->sfbOffsets[sfbGrp+sfb+1] - psyOutChannel->sfbOffsets[sfbGrp+sfb]); frameEnergy += (psyOutChannel->sfbEnergy[sfbGrp+sfb]>>SCALE_NRGS); } } } if(frameNLines > 0){ /* frameNActiveLines = frameFormFactor*2^FORM_FAC_SHIFT * ((frameEnergy *2^SCALE_NRGS)/frameNLines)^-0.25 chaosMeasure = frameNActiveLines / frameNLines */ chaosMeasure = CalcInvLdData( (((CalcLdData(frameFormFactor)>>1) - (CalcLdData(frameEnergy)>>(2+1))) - (fMultDiv2(FL2FXCONST_DBL(0.75f),CalcLdData((FIXP_DBL)frameNLines<<(DFRACT_BITS-1-SCALE_NLINES))) - (((FIXP_DBL)(SCALE_FORM_FAC-SCALE_NRGS_SQRT4+FORM_FAC_SHIFT-(SCALE_NLINES_P34))<<(DFRACT_BITS-1-LD_DATA_SHIFT))>>1)) )<<1 ); } else { /* assuming total chaos, if no sfb is above thresholds */ chaosMeasure = FL2FXCONST_DBL(1.f); } return chaosMeasure; } /* apply reduction formula for VBR-mode */ static void FDKaacEnc_reduceThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)], PSY_OUT_CHANNEL* psyOutChannel[(2)], UCHAR ahFlag[(2)][MAX_GROUPED_SFB], FIXP_DBL thrExp[(2)][MAX_GROUPED_SFB], const INT nChannels, const FIXP_DBL vbrQualFactor, FIXP_DBL* chaosMeasureOld) { INT ch, sfbGrp, sfb; FIXP_DBL chGroupEnergy[TRANS_FAC][2];/*energy for each group and channel*/ FIXP_DBL chChaosMeasure[2]; FIXP_DBL frameEnergy = FL2FXCONST_DBL(1e-10f); FIXP_DBL chaosMeasure = FL2FXCONST_DBL(0.f); FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrExp; FIXP_DBL sfbThrReducedLdData; FIXP_DBL chaosMeasureAvg; INT groupCnt; /* loop counter */ FIXP_DBL redVal[TRANS_FAC]; /* reduction values; in short-block case one redVal for each group */ QC_OUT_CHANNEL *qcOutChan = NULL; PSY_OUT_CHANNEL *psyOutChan = NULL; #define SCALE_GROUP_ENERGY (8) #define CONST_CHAOS_MEAS_AVG_FAC_0 (FL2FXCONST_DBL(0.25f)) #define CONST_CHAOS_MEAS_AVG_FAC_1 (FL2FXCONST_DBL(1.f-0.25f)) #define MIN_LDTHRESH (FL2FXCONST_DBL(-0.515625f)) for(ch=0; chsfbCnt; sfbGrp+=psyOutChan->sfbPerGroup, groupCnt++) { chGroupEnergy[groupCnt][ch] = FL2FXCONST_DBL(0.f); for (sfb=0; sfbmaxSfbPerGroup; sfb++){ chGroupEnergy[groupCnt][ch] += (psyOutChan->sfbEnergy[sfbGrp+sfb]>>SCALE_GROUP_ENERGY); } chEnergy += chGroupEnergy[groupCnt][ch]; } frameEnergy += chEnergy; /* chaosMeasure */ if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) { chChaosMeasure[ch] = FL2FXCONST_DBL(0.5f); /* assume a constant chaos measure of 0.5f for short blocks */ } else { chChaosMeasure[ch] = FDKaacEnc_calcChaosMeasure(psyOutChannel[ch], qcOutChannel[ch]->sfbFormFactorLdData); } chaosMeasure += fMult(chChaosMeasure[ch], chEnergy); } if(frameEnergy > chaosMeasure) { INT scale = CntLeadingZeros(frameEnergy) - 1; FIXP_DBL num = chaosMeasure<>2) + fMult(FL2FXCONST_DBL(0.7f/(4.f*0.3f)), (chaosMeasure - FL2FXCONST_DBL(0.2f)))); chaosMeasure = (fixMin((FIXP_DBL)(FL2FXCONST_DBL(1.0f)>>2), fixMax((FIXP_DBL)(FL2FXCONST_DBL(0.1f)>>2), chaosMeasure)))<<2; /* calculation of reduction value */ if (psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW){ /* short-blocks */ FDK_ASSERT(TRANS_FAC==8); #define WIN_TYPE_SCALE (3) INT sfbGrp, groupCnt=0; for (sfbGrp=0; sfbGrpsfbCnt; sfbGrp+=psyOutChan->sfbPerGroup,groupCnt++) { FIXP_DBL groupEnergy = FL2FXCONST_DBL(0.f); for(ch=0;chgroupLen[groupCnt]<=INV_INT_TAB_SIZE); groupEnergy = fMult(groupEnergy,invInt[psyOutChannel[0]->groupLen[groupCnt]]); /* correction of group energy */ groupEnergy = fixMin(groupEnergy, frameEnergy>>WIN_TYPE_SCALE); /* do not allow an higher redVal as calculated framewise */ groupEnergy>>=2; /* 2*WIN_TYPE_SCALE = 6 => 6+2 = 8 ==> 8/4 = int number */ redVal[groupCnt] = fMult(fMult(vbrQualFactor,chaosMeasure), CalcInvLdData(CalcLdData(groupEnergy)>>2) ) << (int)( ( 2 + (2*WIN_TYPE_SCALE) + SCALE_GROUP_ENERGY )>>2 ) ; } } else { /* long-block */ redVal[0] = fMult( fMult(vbrQualFactor,chaosMeasure), CalcInvLdData(CalcLdData(frameEnergy)>>2) ) << (int)( SCALE_GROUP_ENERGY>>2 ) ; } for(ch=0; chsfbCnt; sfbGrp+=psyOutChan->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++){ sfbEnLdData = (qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb]); sfbThrLdData = (qcOutChan->sfbThresholdLdData[sfbGrp+sfb]); sfbThrExp = thrExp[ch][sfbGrp+sfb]; if ( (sfbThrLdData>=MIN_LDTHRESH) && (sfbEnLdData > sfbThrLdData) && (ahFlag[ch][sfbGrp+sfb] != AH_ACTIVE)) { /* Short-Window */ if (psyOutChannel[ch]->lastWindowSequence == SHORT_WINDOW) { const int groupNumber = (int) sfb/psyOutChan->sfbPerGroup; FDK_ASSERT(INV_SQRT4_TAB_SIZE>psyOutChan->groupLen[groupNumber]); sfbThrExp = fMult(sfbThrExp, fMult( FL2FXCONST_DBL(2.82f/4.f), invSqrt4[psyOutChan->groupLen[groupNumber]]))<<2 ; if ( sfbThrExp <= (limitThrReducedLdData-redVal[groupNumber]) ) { sfbThrReducedLdData = FL2FXCONST_DBL(-1.0f); } else { if ((FIXP_DBL)redVal[groupNumber] >= FL2FXCONST_DBL(1.0f)-sfbThrExp) sfbThrReducedLdData = FL2FXCONST_DBL(0.0f); else { /* threshold reduction formula */ sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[groupNumber]); sfbThrReducedLdData <<= 2; } } sfbThrReducedLdData += ( CalcLdInt(psyOutChan->groupLen[groupNumber]) - ((FIXP_DBL)6<<(DFRACT_BITS-1-LD_DATA_SHIFT)) ); } /* Long-Window */ else { if ((FIXP_DBL)redVal[0] >= FL2FXCONST_DBL(1.0f)-sfbThrExp) { sfbThrReducedLdData = FL2FXCONST_DBL(0.0f); } else { /* threshold reduction formula */ sfbThrReducedLdData = CalcLdData(sfbThrExp + redVal[0]); sfbThrReducedLdData <<= 2; } } /* avoid holes */ if ( ((sfbThrReducedLdData - sfbEnLdData) > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] ) && (ahFlag[ch][sfbGrp+sfb] != NO_AH) ) { if (qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] > (FL2FXCONST_DBL(-1.0f) - sfbEnLdData) ){ sfbThrReducedLdData = fixMax((qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData), sfbThrLdData); } else sfbThrReducedLdData = sfbThrLdData; ahFlag[ch][sfbGrp+sfb] = AH_ACTIVE; } if (sfbThrReducedLdData FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)){ sfbThrReducedLdData = fixMax(sfbThrReducedLdData, sfbEnLdData - FL2FXCONST_DBL(9.6336206/LD_DATA_SCALING)); } sfbThrReducedLdData = fixMax(MIN_LDTHRESH,sfbThrReducedLdData); qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData; } } } } } /***************************************************************************** functionname: FDKaacEnc_correctThresh description: if pe difference deltaPe between desired pe and real pe is small enough, the difference can be distributed among the scale factor bands. New thresholds can be derived from this pe-difference *****************************************************************************/ static void FDKaacEnc_correctThresh(CHANNEL_MAPPING* cm, QC_OUT_ELEMENT* qcElement[(8)], PSY_OUT_ELEMENT* psyOutElement[(8)], UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB], FIXP_DBL thrExp[(8)][(2)][MAX_GROUPED_SFB], const FIXP_DBL redVal[(8)], const SCHAR redValScaling[(8)], const INT deltaPe, const INT processElements, const INT elementOffset) { INT ch, sfb, sfbGrp; QC_OUT_CHANNEL *qcOutChan; PSY_OUT_CHANNEL *psyOutChan; PE_CHANNEL_DATA *peChanData; FIXP_DBL thrFactorLdData; FIXP_DBL sfbEnLdData, sfbThrLdData, sfbThrReducedLdData; FIXP_DBL *sfbPeFactorsLdData[(8)][(2)]; FIXP_DBL sfbNActiveLinesLdData[(8)][(2)][MAX_GROUPED_SFB]; INT normFactorInt; FIXP_DBL normFactorLdData; INT nElements = elementOffset+processElements; INT elementId; /* scratch is empty; use temporal memory from quantSpec in QC_OUT_CHANNEL */ for(elementId=elementOffset;elementIdelInfo[elementId].nChannelsInEl; ch++) { SHORT* ptr = qcElement[elementId]->qcOutChannel[ch]->quantSpec; sfbPeFactorsLdData[elementId][ch] = (FIXP_DBL*)ptr; } } /* for each sfb calc relative factors for pe changes */ normFactorInt = 0; for(elementId=elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { qcOutChan = qcElement[elementId]->qcOutChannel[ch]; psyOutChan = psyOutElement[elementId]->psyOutChannel[ch]; peChanData = &qcElement[elementId]->peData.peChannelData[ch]; for(sfbGrp = 0; sfbGrp < psyOutChan->sfbCnt; sfbGrp+= psyOutChan->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if ( peChanData->sfbNActiveLines[sfbGrp+sfb] == 0 ) { sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f); } else { /* Both CalcLdInt and CalcLdData can be used! * No offset has to be subtracted, because sfbNActiveLinesLdData * is shorted while thrFactor calculation */ sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] = CalcLdInt(peChanData->sfbNActiveLines[sfbGrp+sfb]); } if ( ((ahFlag[elementId][ch][sfbGrp+sfb] < AH_ACTIVE) || (deltaPe > 0)) && peChanData->sfbNActiveLines[sfbGrp+sfb] != 0 ) { if (thrExp[elementId][ch][sfbGrp+sfb] > -redVal[elementId]) { /* sfbPeFactors[ch][sfbGrp+sfb] = peChanData->sfbNActiveLines[sfbGrp+sfb] / (thrExp[elementId][ch][sfbGrp+sfb] + redVal[elementId]); */ int minScale = fixMin(CountLeadingBits(thrExp[elementId][ch][sfbGrp+sfb]), CountLeadingBits(redVal[elementId]) - (DFRACT_BITS-1-redValScaling[elementId]) ) - 1; /* sumld = ld64( sfbThrExp + redVal ) */ FIXP_DBL sumLd = CalcLdData(scaleValue(thrExp[elementId][ch][sfbGrp+sfb], minScale) + scaleValue(redVal[elementId], (DFRACT_BITS-1-redValScaling[elementId])+minScale)) - (FIXP_DBL)(minScale<<(DFRACT_BITS-1-LD_DATA_SHIFT)); if (sumLd < FL2FXCONST_DBL(0.f)) { sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd; } else { if ( sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] > (FL2FXCONST_DBL(-1.f) + sumLd) ) { sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - sumLd; } else { sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb]; } } normFactorInt += (INT)CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]); } else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(1.0f); } else sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] = FL2FXCONST_DBL(-1.0f); } } } } } /* normFactorLdData = ld64(deltaPe/normFactorInt) */ normFactorLdData = CalcLdData((FIXP_DBL)((deltaPe<0) ? (-deltaPe) : (deltaPe))) - CalcLdData((FIXP_DBL)normFactorInt); /* distribute the pe difference to the scalefactors and calculate the according thresholds */ for(elementId=elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { qcOutChan = qcElement[elementId]->qcOutChannel[ch]; psyOutChan = psyOutElement[elementId]->psyOutChannel[ch]; peChanData = &qcElement[elementId]->peData.peChannelData[ch]; for(sfbGrp = 0;sfbGrp < psyOutChan->sfbCnt;sfbGrp+= psyOutChan->sfbPerGroup){ for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if (peChanData->sfbNActiveLines[sfbGrp+sfb] > 0) { /* pe difference for this sfb */ if ( (sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb]==FL2FXCONST_DBL(-1.0f)) || (deltaPe==0) ) { thrFactorLdData = FL2FXCONST_DBL(0.f); } else { /* new threshold */ FIXP_DBL tmp = CalcInvLdData(sfbPeFactorsLdData[elementId][ch][sfbGrp+sfb] + normFactorLdData - sfbNActiveLinesLdData[elementId][ch][sfbGrp+sfb] - FL2FXCONST_DBL((float)LD_DATA_SHIFT/LD_DATA_SCALING)); /* limit thrFactor to 60dB */ tmp = (deltaPe<0) ? tmp : (-tmp); thrFactorLdData = FDKmin(tmp, FL2FXCONST_DBL(20.f/LD_DATA_SCALING)); } /* new threshold */ sfbThrLdData = qcOutChan->sfbThresholdLdData[sfbGrp+sfb]; sfbEnLdData = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb]; if (thrFactorLdData < FL2FXCONST_DBL(0.f)) { if( sfbThrLdData > (FL2FXCONST_DBL(-1.f)-thrFactorLdData) ) { sfbThrReducedLdData = sfbThrLdData + thrFactorLdData; } else { sfbThrReducedLdData = FL2FXCONST_DBL(-1.f); } } else{ sfbThrReducedLdData = sfbThrLdData + thrFactorLdData; } /* avoid hole */ if ( (sfbThrReducedLdData - sfbEnLdData > qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) && (ahFlag[elementId][ch][sfbGrp+sfb] == AH_INACTIVE) ) { /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */ if ( sfbEnLdData > (sfbThrLdData-qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]) ) { sfbThrReducedLdData = qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] + sfbEnLdData; } else { sfbThrReducedLdData = sfbThrLdData; } ahFlag[elementId][ch][sfbGrp+sfb] = AH_ACTIVE; } qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = sfbThrReducedLdData; } } } } } } } /***************************************************************************** functionname: FDKaacEnc_reduceMinSnr description: if the desired pe can not be reached, reduce pe by reducing minSnr *****************************************************************************/ void FDKaacEnc_reduceMinSnr(CHANNEL_MAPPING* cm, QC_OUT_ELEMENT* qcElement[(8)], PSY_OUT_ELEMENT* psyOutElement[(8)], UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB], const INT desiredPe, INT* redPeGlobal, const INT processElements, const INT elementOffset) { INT elementId; INT nElements = elementOffset+processElements; INT newGlobalPe = *redPeGlobal; for(elementId=elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT ch; INT maxSfbPerGroup[2]; INT sfbCnt[2]; INT sfbPerGroup[2]; for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1; sfbCnt[ch] = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt; sfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup; } PE_DATA *peData = &qcElement[elementId]->peData; do { for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { INT sfb, sfbGrp; QC_OUT_CHANNEL *qcOutChan = qcElement[elementId]->qcOutChannel[ch]; INT noReduction = 1; if (maxSfbPerGroup[ch]>=0) { /* sfb in next channel */ INT deltaPe = 0; sfb = maxSfbPerGroup[ch]--; noReduction = 0; for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) { if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH && qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] < SnrLdFac) { /* increase threshold to new minSnr of 1dB */ qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] = SnrLdFac; /* sfbThrReduced = max(psyOutChan[ch]->sfbMinSnr[i] * sfbEn, sfbThr); */ if ( qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] >= qcOutChan->sfbThresholdLdData[sfbGrp+sfb] - qcOutChan->sfbMinSnrLdData[sfbGrp+sfb] ) { qcOutChan->sfbThresholdLdData[sfbGrp+sfb] = qcOutChan->sfbWeightedEnergyLdData[sfbGrp+sfb] + qcOutChan->sfbMinSnrLdData[sfbGrp+sfb]; /* calc new pe */ /* C2 + C3*ld(1/0.8) = 1.5 */ deltaPe -= (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT); /* sfbPe = 1.5 * sfbNLines */ peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = (3*peData->peChannelData[ch].sfbNLines[sfbGrp+sfb]) << (PE_CONSTPART_SHIFT-1); deltaPe += (peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT); } } } /* sfbGrp loop */ peData->pe += deltaPe; peData->peChannelData[ch].pe += deltaPe; newGlobalPe += deltaPe; /* stop if enough has been saved */ if (peData->pe <= desiredPe) { goto bail; } } /* sfb > 0 */ if ( (ch==(cm->elInfo[elementId].nChannelsInEl-1)) && noReduction ) { goto bail; } } /* ch loop */ } while ( peData->pe > desiredPe); } /* != ID_DSE */ } /* element loop */ bail: /* update global PE */ *redPeGlobal = newGlobalPe; } /***************************************************************************** functionname: FDKaacEnc_allowMoreHoles description: if the desired pe can not be reached, some more scalefactor bands have to be quantized to zero *****************************************************************************/ static void FDKaacEnc_allowMoreHoles(CHANNEL_MAPPING* cm, QC_OUT_ELEMENT* qcElement[(8)], PSY_OUT_ELEMENT* psyOutElement[(8)], ATS_ELEMENT* AdjThrStateElement[(8)], UCHAR ahFlag[(8)][(2)][MAX_GROUPED_SFB], const INT desiredPe, const INT currentPe, const int processElements, const int elementOffset) { INT elementId; INT nElements = elementOffset+processElements; INT actPe = currentPe; if (actPe <= desiredPe) { return; /* nothing to do */ } for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT ch, sfb, sfbGrp; PE_DATA *peData = &qcElement[elementId]->peData; const INT nChannels = cm->elInfo[elementId].nChannelsInEl; QC_OUT_CHANNEL* qcOutChannel[(2)] = {NULL}; PSY_OUT_CHANNEL* psyOutChannel[(2)] = {NULL}; for (ch=0; chqcOutChannel[ch]; psyOutChannel[ch] = psyOutElement[elementId]->psyOutChannel[ch]; for(sfbGrp=0; sfbGrp < psyOutChannel[ch]->sfbCnt; sfbGrp+= psyOutChannel[ch]->sfbPerGroup) { for (sfb=psyOutChannel[ch]->maxSfbPerGroup; sfbsfbPerGroup; sfb++) { peData->peChannelData[ch].sfbPe[sfbGrp+sfb] = 0; } } } /* for MS allow hole in the channel with less energy */ if ( nChannels==2 && psyOutChannel[0]->lastWindowSequence==psyOutChannel[1]->lastWindowSequence ) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { for(sfbGrp=0; sfbGrp < psyOutChannel[0]->sfbCnt; sfbGrp+=psyOutChannel[0]->sfbPerGroup) { if (psyOutElement[elementId]->toolsInfo.msMask[sfbGrp+sfb]) { FIXP_DBL EnergyLd_L = qcOutChannel[0]->sfbWeightedEnergyLdData[sfbGrp+sfb]; FIXP_DBL EnergyLd_R = qcOutChannel[1]->sfbWeightedEnergyLdData[sfbGrp+sfb]; /* allow hole in side channel ? */ if ( (ahFlag[elementId][1][sfbGrp+sfb] != NO_AH) && (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[0]->sfbMinSnrLdData[sfbGrp+sfb]>>1)) > ((EnergyLd_R>>1) - (EnergyLd_L>>1))) ) { ahFlag[elementId][1][sfbGrp+sfb] = NO_AH; qcOutChannel[1]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_R; actPe -= peData->peChannelData[1].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT; } /* allow hole in mid channel ? */ else if ( (ahFlag[elementId][0][sfbGrp+sfb] != NO_AH) && (((FL2FXCONST_DBL(-0.02065512648f)>>1) + (qcOutChannel[1]->sfbMinSnrLdData[sfbGrp+sfb]>>1)) > ((EnergyLd_L>>1) - (EnergyLd_R>>1))) ) { ahFlag[elementId][0][sfbGrp+sfb] = NO_AH; qcOutChannel[0]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + EnergyLd_L; actPe -= peData->peChannelData[0].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT; } /* if (ahFlag) */ } /* if MS */ } /* sfbGrp */ if (actPe <= desiredPe) { return; /* stop if enough has been saved */ } } /* sfb */ } /* MS possible ? */ /* more holes necessary? subsequently erase bands starting with low energies */ INT startSfb[2]; FIXP_DBL avgEnLD64,minEnLD64; INT ahCnt; FIXP_DBL ahCntLD64; INT enIdx; FIXP_DBL enLD64[4]; FIXP_DBL avgEn; /* do not go below startSfb */ for (ch=0; chlastWindowSequence != SHORT_WINDOW) startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbL; else startSfb[ch] = AdjThrStateElement[elementId]->ahParam.startSfbS; } /* calc avg and min energies of bands that avoid holes */ avgEn = FL2FXCONST_DBL(0.0f); minEnLD64 = FL2FXCONST_DBL(0.0f); ahCnt = 0; for (ch=0; chmaxSfbPerGroup; sfb++) { if ((ahFlag[elementId][ch][sfbGrp+sfb]!=NO_AH) && (qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb] > qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb])){ minEnLD64 = fixMin(minEnLD64,qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb]); avgEn += qcOutChannel[ch]->sfbEnergy[sfbGrp+sfb] >> 6; ahCnt++; } } sfbGrp += psyOutChannel[ch]->sfbPerGroup; sfb=0; } while (sfbGrp < psyOutChannel[ch]->sfbCnt); } if ( (avgEn == FL2FXCONST_DBL(0.0f)) || (ahCnt == 0) ) { avgEnLD64 = FL2FXCONST_DBL(0.0f); } else { avgEnLD64 = CalcLdData(avgEn); ahCntLD64 = CalcLdInt(ahCnt); avgEnLD64 = avgEnLD64 + FL2FXCONST_DBL(0.09375f) - ahCntLD64; /* compensate shift with 6 */ } /* calc some energy borders between minEn and avgEn */ /* for (enIdx=0; enIdx<4; enIdx++) */ /* en[enIdx] = minEn * (float)FDKpow(avgEn/(minEn+FLT_MIN), (2*enIdx+1)/7.0f); */ enLD64[0] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.14285714285f)); enLD64[1] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.42857142857f)); enLD64[2] = minEnLD64 + fMult((avgEnLD64-minEnLD64),FL2FXCONST_DBL(0.71428571428f)); enLD64[3] = minEnLD64 + (avgEnLD64-minEnLD64); for (enIdx=0; enIdx<4; enIdx++) { INT noReduction = 1; INT maxSfbPerGroup[2]; INT sfbCnt[2]; INT sfbPerGroup[2]; for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { maxSfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->maxSfbPerGroup-1; sfbCnt[ch] = psyOutElement[elementId]->psyOutChannel[ch]->sfbCnt; sfbPerGroup[ch] = psyOutElement[elementId]->psyOutChannel[ch]->sfbPerGroup; } do { noReduction = 1; for(ch=0; chelInfo[elementId].nChannelsInEl; ch++) { INT sfb, sfbGrp; /* start with lowest energy border at highest sfb */ if (maxSfbPerGroup[ch]>=startSfb[ch]) { /* sfb in next channel */ sfb = maxSfbPerGroup[ch]--; noReduction = 0; for (sfbGrp = 0; sfbGrp < sfbCnt[ch]; sfbGrp += sfbPerGroup[ch]) { /* sfb energy below border ? */ if (ahFlag[elementId][ch][sfbGrp+sfb] != NO_AH && qcOutChannel[ch]->sfbEnergyLdData[sfbGrp+sfb] < enLD64[enIdx]) { /* allow hole */ ahFlag[elementId][ch][sfbGrp+sfb] = NO_AH; qcOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb] = FL2FXCONST_DBL(0.015625f) + qcOutChannel[ch]->sfbWeightedEnergyLdData[sfbGrp+sfb]; actPe -= peData->peChannelData[ch].sfbPe[sfbGrp+sfb]>>PE_CONSTPART_SHIFT; } } /* sfbGrp */ if (actPe <= desiredPe) { return; /* stop if enough has been saved */ } } /* sfb > 0 */ } /* ch loop */ } while( (noReduction == 0) && (actPe > desiredPe) ); if (actPe <= desiredPe) { return; /* stop if enough has been saved */ } } /* enIdx loop */ } /* EOF DSE-suppression */ } /* EOF for all elements... */ } /* reset avoid hole flags from AH_ACTIVE to AH_INACTIVE */ static void FDKaacEnc_resetAHFlags( UCHAR ahFlag[(2)][MAX_GROUPED_SFB], const int nChannels, PSY_OUT_CHANNEL *psyOutChannel[(2)]) { int ch, sfb, sfbGrp; for(ch=0; chsfbCnt; sfbGrp+=psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbmaxSfbPerGroup; sfb++) { if ( ahFlag[ch][sfbGrp+sfb] == AH_ACTIVE) { ahFlag[ch][sfbGrp+sfb] = AH_INACTIVE; } } } } } static FIXP_DBL CalcRedValPower(FIXP_DBL num, FIXP_DBL denum, INT* scaling ) { FIXP_DBL value = FL2FXCONST_DBL(0.f); if (num>=FL2FXCONST_DBL(0.f)) { value = fDivNorm( num, denum, scaling); } else { value = -fDivNorm( -num, denum, scaling); } value = f2Pow(value, *scaling, scaling); *scaling = DFRACT_BITS-1-*scaling; return value; } /***************************************************************************** functionname: FDKaacEnc_adaptThresholdsToPe description: two guesses for the reduction value and one final correction of the thresholds *****************************************************************************/ static void FDKaacEnc_adaptThresholdsToPe(CHANNEL_MAPPING* cm, ATS_ELEMENT* AdjThrStateElement[(8)], QC_OUT_ELEMENT* qcElement[(8)], PSY_OUT_ELEMENT* psyOutElement[(8)], const INT desiredPe, const INT processElements, const INT elementOffset) { FIXP_DBL redValue[(8)]; SCHAR redValScaling[(8)]; UCHAR pAhFlag[(8)][(2)][MAX_GROUPED_SFB]; FIXP_DBL pThrExp[(8)][(2)][MAX_GROUPED_SFB]; int iter; INT constPartGlobal, noRedPeGlobal, nActiveLinesGlobal, redPeGlobal; constPartGlobal = noRedPeGlobal = nActiveLinesGlobal = redPeGlobal = 0; int elementId; int nElements = elementOffset+processElements; if(nElements > cm->nElements) { nElements = cm->nElements; } /* ------------------------------------------------------- */ /* Part I: Initialize data structures and variables... */ /* ------------------------------------------------------- */ for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT nChannels = cm->elInfo[elementId].nChannelsInEl; PE_DATA *peData = &qcElement[elementId]->peData; /* thresholds to the power of redExp */ FDKaacEnc_calcThreshExp(pThrExp[elementId], qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, nChannels); /* lower the minSnr requirements for low energies compared to the average energy in this frame */ FDKaacEnc_adaptMinSnr(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, &AdjThrStateElement[elementId]->minSnrAdaptParam, nChannels); /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */ FDKaacEnc_initAvoidHoleFlag(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], &psyOutElement[elementId]->toolsInfo, nChannels, peData, &AdjThrStateElement[elementId]->ahParam); /* sum up */ constPartGlobal += peData->constPart; noRedPeGlobal += peData->pe; nActiveLinesGlobal += fixMax((INT)peData->nActiveLines, 1); } /* EOF DSE-suppression */ } /* EOF for all elements... */ /* ----------------------------------------------------------------------- */ /* Part II: Calculate bit consumption of initial bit constraints setup */ /* ----------------------------------------------------------------------- */ for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { /* redVal = ( 2 ^ ( (constPartGlobal-desiredPe) / (invRedExp*nActiveLinesGlobal) ) - 2 ^ ( (constPartGlobal-noRedPeGlobal) / (invRedExp*nActiveLinesGlobal) ) ) */ INT nChannels = cm->elInfo[elementId].nChannelsInEl; PE_DATA *peData = &qcElement[elementId]->peData; /* first guess of reduction value */ int scale0=0, scale1=0; FIXP_DBL tmp0 = CalcRedValPower( constPartGlobal-desiredPe, 4*nActiveLinesGlobal, &scale0 ); FIXP_DBL tmp1 = CalcRedValPower( constPartGlobal-noRedPeGlobal, 4*nActiveLinesGlobal, &scale1 ); int scalMin = FDKmin(scale0, scale1)-1; redValue[elementId] = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1)); redValScaling[elementId] = scalMin; /* reduce thresholds */ FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]); /* pe after first guess */ FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels); redPeGlobal += peData->pe; } /* EOF DSE-suppression */ } /* EOF for all elements... */ /* -------------------------------------------------- */ /* Part III: Iterate until bit constraints are met */ /* -------------------------------------------------- */ iter = 0; while ((fixp_abs(redPeGlobal - desiredPe) > fMultI(FL2FXCONST_DBL(0.05f),desiredPe)) && (iter < 1)) { INT desiredPeNoAHGlobal; INT redPeNoAHGlobal = 0; INT constPartNoAHGlobal = 0; INT nActiveLinesNoAHGlobal = 0; for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT redPeNoAH, constPartNoAH, nActiveLinesNoAH; INT nChannels = cm->elInfo[elementId].nChannelsInEl; PE_DATA *peData = &qcElement[elementId]->peData; /* pe for bands where avoid hole is inactive */ FDKaacEnc_FDKaacEnc_calcPeNoAH(&redPeNoAH, &constPartNoAH, &nActiveLinesNoAH, peData, pAhFlag[elementId], psyOutElement[elementId]->psyOutChannel, nChannels); redPeNoAHGlobal += redPeNoAH; constPartNoAHGlobal += constPartNoAH; nActiveLinesNoAHGlobal += nActiveLinesNoAH; } /* EOF DSE-suppression */ } /* EOF for all elements... */ /* Calculate new redVal ... */ if(desiredPe < redPeGlobal) { /* new desired pe without bands where avoid hole is active */ desiredPeNoAHGlobal = desiredPe - (redPeGlobal - redPeNoAHGlobal); /* limit desiredPeNoAH to positive values, as the PE can not become negative */ desiredPeNoAHGlobal = FDKmax(0,desiredPeNoAHGlobal); /* second guess (only if there are bands left where avoid hole is inactive)*/ if (nActiveLinesNoAHGlobal > 0) { for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { /* redVal += ( 2 ^ ( (constPartNoAHGlobal-desiredPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) ) - 2 ^ ( (constPartNoAHGlobal-redPeNoAHGlobal) / (invRedExp*nActiveLinesNoAHGlobal) ) ) */ int scale0 = 0; int scale1 = 0; FIXP_DBL tmp0 = CalcRedValPower( constPartNoAHGlobal-desiredPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale0 ); FIXP_DBL tmp1 = CalcRedValPower( constPartNoAHGlobal-redPeNoAHGlobal, 4*nActiveLinesNoAHGlobal, &scale1 ); int scalMin = FDKmin(scale0, scale1)-1; tmp0 = scaleValue(tmp0,(scalMin-scale0)) - scaleValue(tmp1,(scalMin-scale1)); scale0 = scalMin; /* old reduction value */ tmp1 = redValue[elementId]; scale1 = redValScaling[elementId]; scalMin = fixMin(scale0,scale1)-1; /* sum up old and new reduction value */ redValue[elementId] = scaleValue(tmp0,(scalMin-scale0)) + scaleValue(tmp1,(scalMin-scale1)); redValScaling[elementId] = scalMin; } /* EOF DSE-suppression */ } /* EOF for all elements... */ } /* nActiveLinesNoAHGlobal > 0 */ } else { /* desiredPe >= redPeGlobal */ for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT redVal_scale = 0; FIXP_DBL tmp = fDivNorm((FIXP_DBL)redPeGlobal, (FIXP_DBL)desiredPe, &redVal_scale); /* redVal *= redPeGlobal/desiredPe; */ redValue[elementId] = fMult(redValue[elementId], tmp); redValScaling[elementId] -= redVal_scale; FDKaacEnc_resetAHFlags(pAhFlag[elementId], cm->elInfo[elementId].nChannelsInEl, psyOutElement[elementId]->psyOutChannel); } /* EOF DSE-suppression */ } /* EOF for all elements... */ } redPeGlobal = 0; /* Calculate new redVal's PE... */ for (elementId = elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT nChannels = cm->elInfo[elementId].nChannelsInEl; PE_DATA *peData = &qcElement[elementId]->peData; /* reduce thresholds */ FDKaacEnc_reduceThresholdsCBR(qcElement[elementId]->qcOutChannel, psyOutElement[elementId]->psyOutChannel, pAhFlag[elementId], pThrExp[elementId], nChannels, redValue[elementId], redValScaling[elementId]); /* pe after second guess */ FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels); redPeGlobal += peData->pe; } /* EOF DSE-suppression */ } /* EOF for all elements... */ iter++; } /* EOF while */ /* ------------------------------------------------------- */ /* Part IV: if still required, further reduce constraints */ /* ------------------------------------------------------- */ /* 1.0* 1.15* 1.20* * desiredPe desiredPe desiredPe * | | | * ...XXXXXXXXXXXXXXXXXXXXXXXXXXX| | * | | |XXXXXXXXXXX... * | |XXXXXXXXXXX| * --- A --- | --- B --- | --- C --- * * (X): redPeGlobal * (A): FDKaacEnc_correctThresh() * (B): FDKaacEnc_allowMoreHoles() * (C): FDKaacEnc_reduceMinSnr() */ /* correct thresholds to get closer to the desired pe */ if ( redPeGlobal > desiredPe ) { FDKaacEnc_correctThresh(cm, qcElement, psyOutElement, pAhFlag, pThrExp, redValue, redValScaling, desiredPe - redPeGlobal, processElements, elementOffset); /* update PE */ redPeGlobal = 0; for(elementId=elementOffset;elementIdelInfo[elementId].elType != ID_DSE) { INT nChannels = cm->elInfo[elementId].nChannelsInEl; PE_DATA *peData = &qcElement[elementId]->peData; /* pe after correctThresh */ FDKaacEnc_calcPe(psyOutElement[elementId]->psyOutChannel, qcElement[elementId]->qcOutChannel, peData, nChannels); redPeGlobal += peData->pe; } /* EOF DSE-suppression */ } /* EOF for all elements... */ } if ( redPeGlobal > desiredPe ) { /* reduce pe by reducing minSnr requirements */ FDKaacEnc_reduceMinSnr(cm, qcElement, psyOutElement, pAhFlag, (fMultI(FL2FXCONST_DBL(0.15f),desiredPe) + desiredPe), &redPeGlobal, processElements, elementOffset); /* reduce pe by allowing additional spectral holes */ FDKaacEnc_allowMoreHoles(cm, qcElement, psyOutElement, AdjThrStateElement, pAhFlag, desiredPe, redPeGlobal, processElements, elementOffset); } } /* similar to FDKaacEnc_adaptThresholdsToPe(), for VBR-mode */ void FDKaacEnc_AdaptThresholdsVBR(QC_OUT_CHANNEL* qcOutChannel[(2)], PSY_OUT_CHANNEL* psyOutChannel[(2)], ATS_ELEMENT* AdjThrStateElement, struct TOOLSINFO *toolsInfo, PE_DATA *peData, const INT nChannels) { UCHAR (*pAhFlag)[MAX_GROUPED_SFB]; FIXP_DBL (*pThrExp)[MAX_GROUPED_SFB]; /* allocate scratch memory */ C_ALLOC_SCRATCH_START(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB) C_ALLOC_SCRATCH_START(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB) pAhFlag = (UCHAR(*)[MAX_GROUPED_SFB])_pAhFlag; pThrExp = (FIXP_DBL(*)[MAX_GROUPED_SFB])_pThrExp; /* thresholds to the power of redExp */ FDKaacEnc_calcThreshExp(pThrExp, qcOutChannel, psyOutChannel, nChannels); /* lower the minSnr requirements for low energies compared to the average energy in this frame */ FDKaacEnc_adaptMinSnr(qcOutChannel, psyOutChannel, &AdjThrStateElement->minSnrAdaptParam, nChannels); /* init ahFlag (0: no ah necessary, 1: ah possible, 2: ah active */ FDKaacEnc_initAvoidHoleFlag(qcOutChannel, psyOutChannel, pAhFlag, toolsInfo, nChannels, peData, &AdjThrStateElement->ahParam); /* reduce thresholds */ FDKaacEnc_reduceThresholdsVBR(qcOutChannel, psyOutChannel, pAhFlag, pThrExp, nChannels, AdjThrStateElement->vbrQualFactor, &AdjThrStateElement->chaosMeasureOld); /* free scratch memory */ C_ALLOC_SCRATCH_END(_pThrExp, FIXP_DBL, (2)*MAX_GROUPED_SFB) C_ALLOC_SCRATCH_END(_pAhFlag, UCHAR, (2)*MAX_GROUPED_SFB) } /***************************************************************************** functionname: FDKaacEnc_calcBitSave description: Calculates percentage of bit save, see figure below returns: input: parameters and bitres-fullness output: percentage of bit save *****************************************************************************/ /* bitsave maxBitSave(%)| clipLow |---\ | \ | \ | \ | \ |--------\--------------> bitres | \ minBitSave(%)| \------------ clipHigh maxBitres */ static FIXP_DBL FDKaacEnc_calcBitSave(FIXP_DBL fillLevel, const FIXP_DBL clipLow, const FIXP_DBL clipHigh, const FIXP_DBL minBitSave, const FIXP_DBL maxBitSave, const FIXP_DBL bitsave_slope) { FIXP_DBL bitsave; fillLevel = fixMax(fillLevel, clipLow); fillLevel = fixMin(fillLevel, clipHigh); bitsave = maxBitSave - fMult((fillLevel-clipLow), bitsave_slope); return (bitsave); } /***************************************************************************** functionname: FDKaacEnc_calcBitSpend description: Calculates percentage of bit spend, see figure below returns: input: parameters and bitres-fullness output: percentage of bit spend *****************************************************************************/ /* bitspend clipHigh maxBitSpend(%)| /-----------maxBitres | / | / | / | / | / |----/-----------------> bitres | / minBitSpend(%)|--/ clipLow */ static FIXP_DBL FDKaacEnc_calcBitSpend(FIXP_DBL fillLevel, const FIXP_DBL clipLow, const FIXP_DBL clipHigh, const FIXP_DBL minBitSpend, const FIXP_DBL maxBitSpend, const FIXP_DBL bitspend_slope) { FIXP_DBL bitspend; fillLevel = fixMax(fillLevel, clipLow); fillLevel = fixMin(fillLevel, clipHigh); bitspend = minBitSpend + fMult(fillLevel-clipLow, bitspend_slope); return (bitspend); } /***************************************************************************** functionname: FDKaacEnc_adjustPeMinMax() description: adjusts peMin and peMax parameters over time returns: input: current pe, peMin, peMax, bitres size output: adjusted peMin/peMax *****************************************************************************/ static void FDKaacEnc_adjustPeMinMax(const INT currPe, INT *peMin, INT *peMax) { FIXP_DBL minFacHi = FL2FXCONST_DBL(0.3f), maxFacHi = (FIXP_DBL)MAXVAL_DBL, minFacLo = FL2FXCONST_DBL(0.14f), maxFacLo = FL2FXCONST_DBL(0.07f); INT diff; INT minDiff_fix = fMultI(FL2FXCONST_DBL(0.1666666667f), currPe); if (currPe > *peMax) { diff = (currPe-*peMax) ; *peMin += fMultI(minFacHi,diff); *peMax += fMultI(maxFacHi,diff); } else if (currPe < *peMin) { diff = (*peMin-currPe) ; *peMin -= fMultI(minFacLo,diff); *peMax -= fMultI(maxFacLo,diff); } else { *peMin += fMultI(minFacHi, (currPe - *peMin)); *peMax -= fMultI(maxFacLo, (*peMax - currPe)); } if ((*peMax - *peMin) < minDiff_fix) { INT peMax_fix = *peMax, peMin_fix = *peMin; FIXP_DBL partLo_fix, partHi_fix; partLo_fix = (FIXP_DBL)fixMax(0, currPe - peMin_fix); partHi_fix = (FIXP_DBL)fixMax(0, peMax_fix - currPe); peMax_fix = (INT)(currPe + fMultI(fDivNorm(partHi_fix, (partLo_fix+partHi_fix)), minDiff_fix)); peMin_fix = (INT)(currPe - fMultI(fDivNorm(partLo_fix, (partLo_fix+partHi_fix)), minDiff_fix)); peMin_fix = fixMax(0, peMin_fix); *peMax = peMax_fix; *peMin = peMin_fix; } } /***************************************************************************** functionname: BitresCalcBitFac description: calculates factor of spending bits for one frame 1.0 : take all frame dynpart bits >1.0 : take all frame dynpart bits + bitres <1.0 : put bits in bitreservoir returns: BitFac input: bitres-fullness, pe, blockType, parameter-settings output: *****************************************************************************/ /* bitfac(%) pemax bitspend(%) | /-----------maxBitres | / | / | / | / | / |----/-----------------> pe | / bitsave(%) |--/ pemin */ static FIXP_DBL FDKaacEnc_bitresCalcBitFac(const INT bitresBits, const INT maxBitresBits, const INT pe, const INT lastWindowSequence, const INT avgBits, const FIXP_DBL maxBitFac, ADJ_THR_STATE *AdjThr, ATS_ELEMENT *adjThrChan) { BRES_PARAM *bresParam; INT pex; INT qmin, qbr, qbres, qmbr; FIXP_DBL bitSave, bitSpend; FIXP_DBL bitresFac_fix, tmp_cst, tmp_fix; FIXP_DBL pe_pers, bits_ratio, maxBrVal; FIXP_DBL bitsave_slope, bitspend_slope, maxBitFac_tmp; FIXP_DBL fillLevel_fix = (FIXP_DBL)0x7fffffff; FIXP_DBL UNITY = (FIXP_DBL)0x7fffffff; FIXP_DBL POINT7 = (FIXP_DBL)0x5999999A; if (maxBitresBits > bitresBits) { fillLevel_fix = fDivNorm(bitresBits, maxBitresBits); } if (lastWindowSequence != SHORT_WINDOW) { bresParam = &(AdjThr->bresParamLong); bitsave_slope = (FIXP_DBL)0x3BBBBBBC; bitspend_slope = (FIXP_DBL)0x55555555; } else { bresParam = &(AdjThr->bresParamShort); bitsave_slope = (FIXP_DBL)0x2E8BA2E9; bitspend_slope = (FIXP_DBL)0x7fffffff; } pex = fixMax(pe, adjThrChan->peMin); pex = fixMin(pex, adjThrChan->peMax); bitSave = FDKaacEnc_calcBitSave(fillLevel_fix, bresParam->clipSaveLow, bresParam->clipSaveHigh, bresParam->minBitSave, bresParam->maxBitSave, bitsave_slope); bitSpend = FDKaacEnc_calcBitSpend(fillLevel_fix, bresParam->clipSpendLow, bresParam->clipSpendHigh, bresParam->minBitSpend, bresParam->maxBitSpend, bitspend_slope); pe_pers = fDivNorm(pex - adjThrChan->peMin, adjThrChan->peMax - adjThrChan->peMin); tmp_fix = fMult(((FIXP_DBL)bitSpend + (FIXP_DBL)bitSave), pe_pers); bitresFac_fix = (UNITY>>1) - ((FIXP_DBL)bitSave>>1) + (tmp_fix>>1); qbres = (DFRACT_BITS-2); /* (float)bitresBits/(float)avgBits */ bits_ratio = fDivNorm(bitresBits, avgBits, &qbr); qbr = DFRACT_BITS-1-qbr; /* Add 0.7 in q31 to bits_ratio in qbr */ /* 0.7f + (float)bitresBits/(float)avgBits */ qmin = fixMin(qbr, (DFRACT_BITS-1)); bits_ratio = bits_ratio >> (qbr - qmin); tmp_cst = POINT7 >> ((DFRACT_BITS-1) - qmin); maxBrVal = (bits_ratio>>1) + (tmp_cst>>1); qmbr = qmin - 1; /* bitresFac_fix = fixMin(bitresFac_fix, 0.7 + bitresBits/avgBits); */ bitresFac_fix = bitresFac_fix >> (qbres - qmbr); qbres = qmbr; bitresFac_fix = fixMin(bitresFac_fix, maxBrVal); /* Compare with maxBitFac */ qmin = fixMin(Q_BITFAC, qbres); bitresFac_fix = bitresFac_fix >> (qbres - qmin); maxBitFac_tmp = maxBitFac >> (Q_BITFAC - qmin); if(maxBitFac_tmp < bitresFac_fix) { bitresFac_fix = maxBitFac; } else { if(qmin < Q_BITFAC) { bitresFac_fix = bitresFac_fix << (Q_BITFAC-qmin); } else { bitresFac_fix = bitresFac_fix >> (qmin-Q_BITFAC); } } FDKaacEnc_adjustPeMinMax(pe, &adjThrChan->peMin, &adjThrChan->peMax); return bitresFac_fix; } /***************************************************************************** functionname: FDKaacEnc_AdjThrNew description: allocate ADJ_THR_STATE *****************************************************************************/ INT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr, INT nElements) { INT err = 0; INT i; ADJ_THR_STATE* hAdjThr = GetRam_aacEnc_AdjustThreshold(); if (hAdjThr==NULL) { err = 1; goto bail; } for (i=0; iadjThrStateElem[i] = GetRam_aacEnc_AdjThrStateElement(i); if (hAdjThr->adjThrStateElem[i]==NULL) { err = 1; goto bail; } } bail: *phAdjThr = hAdjThr; return err; } /***************************************************************************** functionname: FDKaacEnc_AdjThrInit description: initialize ADJ_THR_STATE *****************************************************************************/ void FDKaacEnc_AdjThrInit( ADJ_THR_STATE *hAdjThr, const INT meanPe, ELEMENT_BITS *elBits[(8)], INT invQuant, INT nElements, INT nChannelsEff, INT sampleRate, INT advancedBitsToPe, FIXP_DBL vbrQualFactor ) { INT i; FIXP_DBL POINT8 = FL2FXCONST_DBL(0.8f); FIXP_DBL POINT6 = FL2FXCONST_DBL(0.6f); /* common for all elements: */ /* parameters for bitres control */ hAdjThr->bresParamLong.clipSaveLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */ hAdjThr->bresParamLong.clipSaveHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */ hAdjThr->bresParamLong.minBitSave = (FIXP_DBL)0xf999999a; /* FL2FXCONST_DBL(-0.05f); */ hAdjThr->bresParamLong.maxBitSave = (FIXP_DBL)0x26666666; /* FL2FXCONST_DBL(0.3f); */ hAdjThr->bresParamLong.clipSpendLow = (FIXP_DBL)0x1999999a; /* FL2FXCONST_DBL(0.2f); */ hAdjThr->bresParamLong.clipSpendHigh = (FIXP_DBL)0x7999999a; /* FL2FXCONST_DBL(0.95f); */ hAdjThr->bresParamLong.minBitSpend = (FIXP_DBL)0xf3333333; /* FL2FXCONST_DBL(-0.10f); */ hAdjThr->bresParamLong.maxBitSpend = (FIXP_DBL)0x33333333; /* FL2FXCONST_DBL(0.4f); */ hAdjThr->bresParamShort.clipSaveLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */ hAdjThr->bresParamShort.clipSaveHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */ hAdjThr->bresParamShort.minBitSave = (FIXP_DBL)0x00000000; /* FL2FXCONST_DBL(0.0f); */ hAdjThr->bresParamShort.maxBitSave = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */ hAdjThr->bresParamShort.clipSpendLow = (FIXP_DBL)0x199999a0; /* FL2FXCONST_DBL(0.2f); */ hAdjThr->bresParamShort.clipSpendHigh = (FIXP_DBL)0x5fffffff; /* FL2FXCONST_DBL(0.75f); */ hAdjThr->bresParamShort.minBitSpend = (FIXP_DBL)0xf9999998; /* FL2FXCONST_DBL(-0.05f); */ hAdjThr->bresParamShort.maxBitSpend = (FIXP_DBL)0x40000000; /* FL2FXCONST_DBL(0.5f); */ /* specific for each element: */ for (i=0; iadjThrStateElem[i]; MINSNR_ADAPT_PARAM *msaParam = &atsElem->minSnrAdaptParam; INT chBitrate = elBits[i]->chBitrateEl; /* parameters for bitres control */ atsElem->peMin = fMultI(POINT8, meanPe) >> 1; atsElem->peMax = fMultI(POINT6, meanPe); /* for use in FDKaacEnc_reduceThresholdsVBR */ atsElem->chaosMeasureOld = FL2FXCONST_DBL(0.3f); /* additional pe offset to correct pe2bits for low bitrates */ atsElem->peOffset = 0; /* vbr initialisation */ atsElem->vbrQualFactor = vbrQualFactor; if (chBitrate < 32000) { atsElem->peOffset = fixMax(50, 100-fMultI((FIXP_DBL)0x666667, chBitrate)); } /* avoid hole parameters */ if (chBitrate > 20000) { atsElem->ahParam.modifyMinSnr = TRUE; atsElem->ahParam.startSfbL = 15; atsElem->ahParam.startSfbS = 3; } else { atsElem->ahParam.modifyMinSnr = FALSE; atsElem->ahParam.startSfbL = 0; atsElem->ahParam.startSfbS = 0; } /* minSnr adaptation */ msaParam->maxRed = FL2FXCONST_DBL(0.00390625f); /* 0.25f/64.0f */ /* start adaptation of minSnr for avgEn/sfbEn > startRatio */ msaParam->startRatio = FL2FXCONST_DBL(0.05190512648f); /* ld64(10.0f) */ /* maximum minSnr reduction to minSnr^maxRed is reached for avgEn/sfbEn >= maxRatio */ /* msaParam->maxRatio = 1000.0f; */ /*msaParam->redRatioFac = ((float)1.0f - msaParam->maxRed) / ((float)10.0f*log10(msaParam->startRatio/msaParam->maxRatio)/log10(2.0f)*(float)0.3010299956f);*/ msaParam->redRatioFac = FL2FXCONST_DBL(-0.375f); /* -0.0375f * 10.0f */ /*msaParam->redOffs = (float)1.0f - msaParam->redRatioFac * (float)10.0f * log10(msaParam->startRatio)/log10(2.0f) * (float)0.3010299956f;*/ msaParam->redOffs = FL2FXCONST_DBL(0.021484375); /* 1.375f/64.0f */ /* init pe correction */ atsElem->peCorrectionFactor_m = FL2FXCONST_DBL(0.5f); /* 1.0 */ atsElem->peCorrectionFactor_e = 1; atsElem->dynBitsLast = -1; atsElem->peLast = 0; /* init bits to pe factor */ /* init bits2PeFactor */ FDKaacEnc_InitBits2PeFactor( &atsElem->bits2PeFactor_m, &atsElem->bits2PeFactor_e, chBitrate, /* bitrate/channel*/ nChannelsEff, /* number of channels */ sampleRate, advancedBitsToPe, invQuant ); } /* for nElements */ } /***************************************************************************** functionname: FDKaacEnc_FDKaacEnc_calcPeCorrection description: calc desired pe *****************************************************************************/ static void FDKaacEnc_FDKaacEnc_calcPeCorrection( FIXP_DBL *const correctionFac_m, INT *const correctionFac_e, const INT peAct, const INT peLast, const INT bitsLast, const FIXP_DBL bits2PeFactor_m, const INT bits2PeFactor_e ) { if ( (bitsLast > 0) && (peAct < 1.5f*peLast) && (peAct > 0.7f*peLast) && (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(1.2f/2.f), bits2PeFactor_m), bits2PeFactor_e+1) > peLast) && (FDKaacEnc_bits2pe2(bitsLast, fMult(FL2FXCONST_DBL(0.65f), bits2PeFactor_m), bits2PeFactor_e ) < peLast) ) { FIXP_DBL corrFac = *correctionFac_m; int scaling = 0; FIXP_DBL denum = (FIXP_DBL)FDKaacEnc_bits2pe2(bitsLast, bits2PeFactor_m, bits2PeFactor_e); FIXP_DBL newFac = fDivNorm((FIXP_DBL)peLast, denum, &scaling); /* dead zone, newFac and corrFac are scaled by 0.5 */ if ((FIXP_DBL)peLast <= denum) { /* ratio <= 1.f */ newFac = fixMax(scaleValue(fixMin( fMult(FL2FXCONST_DBL(1.1f/2.f), newFac), scaleValue(FL2FXCONST_DBL( 1.f/2.f), -scaling)), scaling), FL2FXCONST_DBL(0.85f/2.f) ); } else { /* ratio < 1.f */ newFac = fixMax( fixMin( scaleValue(fMult(FL2FXCONST_DBL(0.9f/2.f), newFac), scaling), FL2FXCONST_DBL(1.15f/2.f) ), FL2FXCONST_DBL( 1.f/2.f) ); } if ( ((newFac > FL2FXCONST_DBL(1.f/2.f)) && (corrFac < FL2FXCONST_DBL(1.f/2.f))) || ((newFac < FL2FXCONST_DBL(1.f/2.f)) && (corrFac > FL2FXCONST_DBL(1.f/2.f)))) { corrFac = FL2FXCONST_DBL(1.f/2.f); } /* faster adaptation towards 1.0, slower in the other direction */ if ( (corrFac < FL2FXCONST_DBL(1.f/2.f) && newFac < corrFac) || (corrFac > FL2FXCONST_DBL(1.f/2.f) && newFac > corrFac) ) { corrFac = fMult(FL2FXCONST_DBL(0.85f), corrFac) + fMult(FL2FXCONST_DBL(0.15f), newFac); } else { corrFac = fMult(FL2FXCONST_DBL(0.7f), corrFac) + fMult(FL2FXCONST_DBL(0.3f), newFac); } corrFac = fixMax( fixMin( corrFac, FL2FXCONST_DBL(1.15f/2.f) ), FL2FXCONST_DBL(0.85/2.f) ); *correctionFac_m = corrFac; *correctionFac_e = 1; } else { *correctionFac_m = FL2FXCONST_DBL(1.f/2.f); *correctionFac_e = 1; } } static void FDKaacEnc_calcPeCorrectionLowBitRes( FIXP_DBL *const correctionFac_m, INT *const correctionFac_e, const INT peLast, const INT bitsLast, const INT bitresLevel, const INT nChannels, const FIXP_DBL bits2PeFactor_m, const INT bits2PeFactor_e ) { /* tuning params */ const FIXP_DBL amp = FL2FXCONST_DBL(0.005); const FIXP_DBL maxDiff = FL2FXCONST_DBL(0.25f); if (bitsLast > 0) { /* Estimate deviation of granted and used dynamic bits in previous frame, in PE units */ const int bitsBalLast = peLast - FDKaacEnc_bits2pe2( bitsLast, bits2PeFactor_m, bits2PeFactor_e); /* reserve n bits per channel */ int headroom = (bitresLevel>=50*nChannels) ? 0 : (100*nChannels); /* in PE units */ headroom = FDKaacEnc_bits2pe2( headroom, bits2PeFactor_m, bits2PeFactor_e); /* * diff = amp * ((bitsBalLast - headroom) / (bitresLevel + headroom) * diff = max ( min ( diff, maxDiff, -maxDiff)) / 2 */ FIXP_DBL denominator = (FIXP_DBL)FDKaacEnc_bits2pe2(bitresLevel, bits2PeFactor_m, bits2PeFactor_e) + (FIXP_DBL)headroom; int scaling = 0; FIXP_DBL diff = (bitsBalLast>=headroom) ? fMult(amp, fDivNorm( (FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling)) : -fMult(amp, fDivNorm(-(FIXP_DBL)(bitsBalLast - headroom), denominator, &scaling)) ; scaling -= 1; /* divide by 2 */ diff = (scaling<=0) ? FDKmax( FDKmin (diff>>(-scaling), maxDiff>>1), -maxDiff>>1) : FDKmax( FDKmin (diff, maxDiff>>(1+scaling)), -maxDiff>>(1+scaling)) << scaling; /* * corrFac += diff * corrFac = max ( min ( corrFac/2.f, 1.f/2.f, 0.75f/2.f ) ) */ *correctionFac_m = FDKmax(FDKmin((*correctionFac_m)+diff, FL2FXCONST_DBL(1.0f/2.f)), FL2FXCONST_DBL(0.75f/2.f)) ; *correctionFac_e = 1; } else { *correctionFac_m = FL2FXCONST_DBL(0.75/2.f); *correctionFac_e = 1; } } void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState, ATS_ELEMENT *AdjThrStateElement, PSY_OUT_CHANNEL *psyOutChannel[(2)], PE_DATA *peData, INT *grantedPe, INT *grantedPeCorr, const INT nChannels, const INT commonWindow, const INT grantedDynBits, const INT bitresBits, const INT maxBitresBits, const FIXP_DBL maxBitFac, const INT bitDistributionMode) { FIXP_DBL bitFactor; INT noRedPe = peData->pe; /* prefer short windows for calculation of bitFactor */ INT curWindowSequence = LONG_WINDOW; if (nChannels==2) { if ((psyOutChannel[0]->lastWindowSequence == SHORT_WINDOW) || (psyOutChannel[1]->lastWindowSequence == SHORT_WINDOW)) { curWindowSequence = SHORT_WINDOW; } } else { curWindowSequence = psyOutChannel[0]->lastWindowSequence; } if (grantedDynBits >= 1) { if (bitDistributionMode!=0) { *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e); } else { /* factor dependend on current fill level and pe */ bitFactor = FDKaacEnc_bitresCalcBitFac(bitresBits, maxBitresBits, noRedPe, curWindowSequence, grantedDynBits, maxBitFac, adjThrState, AdjThrStateElement ); /* desired pe for actual frame */ /* Worst case max of grantedDynBits is = 1024 * 5.27 * 2 */ *grantedPe = FDKaacEnc_bits2pe2(grantedDynBits, fMult(bitFactor, AdjThrStateElement->bits2PeFactor_m), AdjThrStateElement->bits2PeFactor_e+(DFRACT_BITS-1-Q_BITFAC) ); } } else { *grantedPe = 0; /* prevent divsion by 0 */ } /* correction of pe value */ switch (bitDistributionMode) { case 2: case 1: FDKaacEnc_calcPeCorrectionLowBitRes( &AdjThrStateElement->peCorrectionFactor_m, &AdjThrStateElement->peCorrectionFactor_e, AdjThrStateElement->peLast, AdjThrStateElement->dynBitsLast, bitresBits, nChannels, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e ); break; case 0: default: FDKaacEnc_FDKaacEnc_calcPeCorrection( &AdjThrStateElement->peCorrectionFactor_m, &AdjThrStateElement->peCorrectionFactor_e, fixMin(*grantedPe, noRedPe), AdjThrStateElement->peLast, AdjThrStateElement->dynBitsLast, AdjThrStateElement->bits2PeFactor_m, AdjThrStateElement->bits2PeFactor_e ); break; } *grantedPeCorr = (INT)(fMult((FIXP_DBL)(*grantedPe<peCorrectionFactor_m) >> (Q_AVGBITS-AdjThrStateElement->peCorrectionFactor_e)); /* update last pe */ AdjThrStateElement->peLast = *grantedPe; AdjThrStateElement->dynBitsLast = -1; } /***************************************************************************** functionname: FDKaacEnc_AdjustThresholds description: adjust thresholds *****************************************************************************/ void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(8)], QC_OUT_ELEMENT* qcElement[(8)], QC_OUT* qcOut, PSY_OUT_ELEMENT* psyOutElement[(8)], INT CBRbitrateMode, CHANNEL_MAPPING* cm) { int i; if (CBRbitrateMode) { /* In case, no bits must be shifted between different elements, */ /* an element-wise execution of the pe-dependent threshold- */ /* adaption becomes necessary... */ for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* qcElement[i]->grantedPe = 2000; */ /* Use this only for debugging */ //if (totalGrantedPeCorr < totalNoRedPe) { if (qcElement[i]->grantedPe < qcElement[i]->peData.pe) { /* calc threshold necessary for desired pe */ FDKaacEnc_adaptThresholdsToPe(cm, AdjThrStateElement, qcElement, psyOutElement, qcElement[i]->grantedPeCorr, 1, /* Process only 1 element */ i); /* Process exactly THIS element */ } } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ } else { for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* for VBR-mode */ FDKaacEnc_AdaptThresholdsVBR(qcElement[i]->qcOutChannel, psyOutElement[i]->psyOutChannel, AdjThrStateElement[i], &psyOutElement[i]->toolsInfo, &qcElement[i]->peData, cm->elInfo[i].nChannelsInEl); } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ } for (i=0; inElements; i++) { int ch,sfb,sfbGrp; /* no weighting of threholds and energies for mlout */ /* weight energies and thresholds */ for (ch=0; chelInfo[i].nChannelsInEl; ch++) { QC_OUT_CHANNEL* pQcOutCh = qcElement[i]->qcOutChannel[ch]; for (sfbGrp = 0;sfbGrp < psyOutElement[i]->psyOutChannel[ch]->sfbCnt; sfbGrp+=psyOutElement[i]->psyOutChannel[ch]->sfbPerGroup) { for (sfb=0; sfbpsyOutChannel[ch]->maxSfbPerGroup; sfb++) { pQcOutCh->sfbThresholdLdData[sfb+sfbGrp] += pQcOutCh->sfbEnFacLd[sfb+sfbGrp]; } } } } } void FDKaacEnc_AdjThrClose(ADJ_THR_STATE** phAdjThr) { INT i; ADJ_THR_STATE* hAdjThr = *phAdjThr; if (hAdjThr!=NULL) { for (i=0; i<(8); i++) { if (hAdjThr->adjThrStateElem[i]!=NULL) { FreeRam_aacEnc_AdjThrStateElement(&hAdjThr->adjThrStateElem[i]); } } FreeRam_aacEnc_AdjustThreshold(phAdjThr); } } fdk-aac-0.1.3/libAACenc/src/bandwidth.h0000644000175000017500000001266612372261464020072 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: M. Schug / A. Groeschel contents/description: bandwidth expert ******************************************************************************/ #ifndef _BANDWIDTH_H #define _BANDWIDTH_H #include "qc_data.h" AAC_ENCODER_ERROR FDKaacEnc_DetermineBandWidth(INT* bandWidth, INT proposedBandwidth, INT bitrate, AACENC_BITRATE_MODE bitrateMode, INT sampleRate, INT frameLength, CHANNEL_MAPPING* cm, CHANNEL_MODE encoderMode); #endif /* BANDWIDTH_H */ fdk-aac-0.1.3/libAACenc/src/aacenc.h0000644000175000017500000004051612372261464017333 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: M. Schug / A. Groeschel contents/description: fast aac coder interface library functions ******************************************************************************/ #ifndef _aacenc_h_ #define _aacenc_h_ #include "common_fix.h" #include "FDK_audio.h" #include "tpenc_lib.h" #include "sbr_encoder.h" #ifdef __cplusplus extern "C" { #endif /* * AAC-LC error codes. */ typedef enum { AAC_ENC_OK = 0x0000, /*!< All fine. */ AAC_ENC_UNKNOWN = 0x0002, /*!< Error condition is of unknown reason, or from another module. */ /* initialization errors */ aac_enc_init_error_start = 0x2000, AAC_ENC_INVALID_HANDLE = 0x2020, /*!< The handle passed to the function call was invalid (probably NULL). */ AAC_ENC_INVALID_FRAME_LENGTH = 0x2080, /*!< Invalid frame length. */ AAC_ENC_INVALID_N_CHANNELS = 0x20e0, /*!< Invalid amount of audio input channels. */ AAC_ENC_INVALID_SFB_TABLE = 0x2140, /*!< Internal encoder error. */ AAC_ENC_UNSUPPORTED_AOT = 0x3000, /*!< The Audio Object Type (AOT) is not supported. */ AAC_ENC_UNSUPPORTED_BITRATE = 0x3020, /*!< The chosen bitrate is not supported. */ AAC_ENC_UNSUPPORTED_BITRATE_MODE = 0x3028, /*!< Unsupported bit rate mode (CBR or VBR). */ AAC_ENC_UNSUPPORTED_ANC_BITRATE = 0x3040, /*!< Unsupported ancillay bitrate. */ AAC_ENC_UNSUPPORTED_ANC_MODE = 0x3060, AAC_ENC_UNSUPPORTED_TRANSPORT_TYPE = 0x3080, /*!< The bitstream format is not supported. */ AAC_ENC_UNSUPPORTED_ER_FORMAT = 0x30a0, /*!< The error resilience tool format is not supported. */ AAC_ENC_UNSUPPORTED_EPCONFIG = 0x30c0, /*!< The error protection format is not supported. */ AAC_ENC_UNSUPPORTED_CHANNELCONFIG = 0x30e0, /*!< The channel configuration (either number or arrangement) is not supported. */ AAC_ENC_UNSUPPORTED_SAMPLINGRATE = 0x3100, /*!< Sample rate of audio input is not supported. */ AAC_ENC_NO_MEMORY = 0x3120, /*!< Could not allocate memory. */ AAC_ENC_PE_INIT_TABLE_NOT_FOUND = 0x3140, /*!< Internal encoder error. */ aac_enc_init_error_end, /* encode errors */ aac_enc_error_start = 0x4000, AAC_ENC_QUANT_ERROR = 0x4020, /*!< Too many bits used in quantization. */ AAC_ENC_WRITTEN_BITS_ERROR = 0x4040, /*!< Unexpected number of written bits, differs to calculated number of bits. */ AAC_ENC_PNS_TABLE_ERROR = 0x4060, /*!< PNS level out of range. */ AAC_ENC_GLOBAL_GAIN_TOO_HIGH = 0x4080, /*!< Internal quantizer error. */ AAC_ENC_BITRES_TOO_LOW = 0x40a0, /*!< Too few bits in bit reservoir. */ AAC_ENC_BITRES_TOO_HIGH = 0x40a1, /*!< Too many bits in bit reservoir. */ AAC_ENC_INVALID_CHANNEL_BITRATE = 0x4100, AAC_ENC_INVALID_ELEMENTINFO_TYPE = 0x4120, /*!< Internal encoder error. */ AAC_ENC_WRITE_SCAL_ERROR = 0x41e0, /*!< Error writing scalefacData. */ AAC_ENC_WRITE_SEC_ERROR = 0x4200, /*!< Error writing sectionData. */ AAC_ENC_WRITE_SPEC_ERROR = 0x4220, /*!< Error writing spectralData. */ aac_enc_error_end } AAC_ENCODER_ERROR; /*-------------------------- defines --------------------------------------*/ #define ANC_DATA_BUFFERSIZE 1024 /* ancBuffer size */ #define MAX_TOTAL_EXT_PAYLOADS (((8) * (1)) + (2+2)) typedef enum { AACENC_BR_MODE_INVALID = -1, /*!< Invalid bitrate mode. */ AACENC_BR_MODE_CBR = 0, /*!< Constant bitrate mode. */ AACENC_BR_MODE_VBR_1 = 1, /*!< Variable bitrate mode, about 32 kbps/channel. */ AACENC_BR_MODE_VBR_2 = 2, /*!< Variable bitrate mode, about 40 kbps/channel. */ AACENC_BR_MODE_VBR_3 = 3, /*!< Variable bitrate mode, about 48-56 kbps/channel. */ AACENC_BR_MODE_VBR_4 = 4, /*!< Variable bitrate mode, about 64 kbps/channel. */ AACENC_BR_MODE_VBR_5 = 5, /*!< Variable bitrate mode, about 80-96 kbps/channel. */ AACENC_BR_MODE_FF = 6, /*!< Fixed frame mode. */ AACENC_BR_MODE_SFR = 7 /*!< Superframe mode. */ } AACENC_BITRATE_MODE; typedef enum { CH_ORDER_MPEG = 0, /*!< MPEG channel ordering (e. g. 5.1: C, L, R, SL, SR, LFE) */ CH_ORDER_WAV, /*!< WAV fileformat channel ordering (e. g. 5.1: L, R, C, LFE, SL, SR) */ CH_ORDER_WG4 /*!< WG4 fileformat channel ordering (e. g. 5.1: L, R, SL, SR, C, LFE) */ } CHANNEL_ORDER; /*-------------------- structure definitions ------------------------------*/ struct AACENC_CONFIG { INT sampleRate; /* encoder sample rate */ INT bitRate; /* encoder bit rate in bits/sec */ INT ancDataBitRate; /* additional bits consumed by anc data or sbr have to be consiedered while configuration */ INT nSubFrames; /* number of frames in super frame (not ADTS/LATM subframes !) */ AUDIO_OBJECT_TYPE audioObjectType; /* Audio Object Type */ INT averageBits; /* encoder bit rate in bits/superframe */ INT bitrateMode; /* encoder bitrate mode (CBR/VBR) */ INT nChannels; /* number of channels to process */ CHANNEL_ORDER channelOrder; /* Input Channel ordering scheme. */ INT bandWidth; /* targeted audio bandwidth in Hz */ CHANNEL_MODE channelMode; /* encoder channel mode configuration */ INT framelength; /* used frame size */ UINT syntaxFlags; /* bitstreams syntax configuration */ SCHAR epConfig; /* error protection configuration */ INT anc_Rate; /* ancillary rate, 0 (disabled), -1 (default) else desired rate */ UINT maxAncBytesPerAU; INT minBitsPerFrame; /* minimum number of bits in AU */ INT maxBitsPerFrame; /* maximum number of bits in AU */ INT bitreservoir; /* size of bitreservoir */ UINT sbrRatio; /* sbr sampling rate ratio: dual- or single-rate */ UCHAR useTns; /* flag: use temporal noise shaping */ UCHAR usePns; /* flag: use perceptual noise substitution */ UCHAR useIS; /* flag: use intensity coding */ UCHAR useRequant; /* flag: use afterburner */ }; typedef struct { UCHAR *pData; /* pointer to extension payload data */ UINT dataSize; /* extension payload data size in bits */ EXT_PAYLOAD_TYPE dataType; /* extension payload data type */ INT associatedChElement; /* number of the channel element the data is assigned to */ } AACENC_EXT_PAYLOAD; typedef struct AAC_ENC *HANDLE_AAC_ENC; /** * \brief Limit given bit rate to a valid value * \param hTpEnc transport encoder handle * \param coreSamplingRate the sample rate to be used for the AAC encoder * \param frameLength the frameLength to be used for the AAC encoder * \param nChannels number of total channels * \param nChannelsEff number of effective channels * \param bitRate the initial bit rate value for which the closest valid bit rate value is searched for * \param averageBits average bits per frame for fixed framing. Set to -1 if not available. * \param optional pointer where the current bits per frame are stored into. * \param bitrateMode the current bit rate mode * \param nSubFrames number of sub frames for super framing (not transport frames). * \return a valid bit rate value as close as possible or identical to bitRate */ INT FDKaacEnc_LimitBitrate( HANDLE_TRANSPORTENC hTpEnc, INT coreSamplingRate, INT frameLength, INT nChannels, INT nChannelsEff, INT bitRate, INT averageBits, INT *pAverageBitsPerFrame, INT bitrateMode, INT nSubFrames ); /*----------------------------------------------------------------------------- functionname: FDKaacEnc_GetVBRBitrate description: Get VBR bitrate from vbr quality input params: int vbrQuality (VBR0, VBR1, VBR2) channelMode returns: vbr bitrate ------------------------------------------------------------------------------*/ INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode); /*----------------------------------------------------------------------------- functionname: FDKaacEnc_AacInitDefaultConfig description: gives reasonable default configuration returns: --- ------------------------------------------------------------------------------*/ void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config); /*--------------------------------------------------------------------------- functionname:FDKaacEnc_Open description: allocate and initialize a new encoder instance returns: 0 if success ---------------------------------------------------------------------------*/ AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC *phAacEnc, /* pointer to an encoder handle, initialized on return */ const INT nElements, /* number of maximal elements in instance to support */ const INT nChannels, /* number of maximal channels in instance to support */ const INT nSubFrames); /* support superframing in instance */ AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC hAacEncoder, /* pointer to an encoder handle, initialized on return */ AACENC_CONFIG *config, /* pre-initialized config struct */ HANDLE_TRANSPORTENC hTpEnc, ULONG initFlags); /*--------------------------------------------------------------------------- functionname: FDKaacEnc_EncodeFrame description: encode one frame returns: 0 if success ---------------------------------------------------------------------------*/ AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC hAacEnc, /* encoder handle */ HANDLE_TRANSPORTENC hTpEnc, INT_PCM* inputBuffer, INT* numOutBytes, AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS] ); /*--------------------------------------------------------------------------- functionname:FDKaacEnc_Close description: delete encoder instance returns: ---------------------------------------------------------------------------*/ void FDKaacEnc_Close( HANDLE_AAC_ENC* phAacEnc); /* encoder handle */ #ifdef __cplusplus } #endif #endif /* _aacenc_h_ */ fdk-aac-0.1.3/libAACenc/src/block_switch.cpp0000644000175000017500000005704612372261464021135 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): M. Werner, Tobias Chalupka Description: Block switching ******************************************************************************/ /****************** Includes *****************************/ #include "block_switch.h" #include "genericStds.h" #define LOWOV_WINDOW _LOWOV_WINDOW /**************** internal function prototypes ***********/ static FIXP_DBL FDKaacEnc_GetWindowEnergy(const FIXP_DBL in[], const INT blSwWndIdx); static void FDKaacEnc_CalcWindowEnergy( BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl, INT windowLen, const INT_PCM *pTimeSignal ); /****************** Constants *****************************/ /* LONG START SHORT STOP LOWOV */ static const INT blockType2windowShape[2][5] = { {SINE_WINDOW, KBD_WINDOW, WRONG_WINDOW, SINE_WINDOW, KBD_WINDOW}, /* LD */ {KBD_WINDOW, SINE_WINDOW, SINE_WINDOW, KBD_WINDOW, WRONG_WINDOW} }; /* LC */ /* IIR high pass coeffs */ #ifndef SINETABLE_16BIT static const FIXP_DBL hiPassCoeff[BLOCK_SWITCHING_IIR_LEN]= { FL2FXCONST_DBL(-0.5095),FL2FXCONST_DBL(0.7548) }; static const FIXP_DBL accWindowNrgFac = FL2FXCONST_DBL(0.3f); /* factor for accumulating filtered window energies */ static const FIXP_DBL oneMinusAccWindowNrgFac = FL2FXCONST_DBL(0.7f); /* static const float attackRatio = 10.0; */ /* lower ratio limit for attacks */ static const FIXP_DBL invAttackRatio = FL2FXCONST_DBL(0.1f); /* inverted lower ratio limit for attacks */ /* The next constants are scaled, because they are used for comparison with scaled values*/ /* minimum energy for attacks */ static const FIXP_DBL minAttackNrg = (FL2FXCONST_DBL(1e+6f*NORM_PCM_ENERGY)>>BLOCK_SWITCH_ENERGY_SHIFT); /* minimum energy for attacks */ #else static const FIXP_SGL hiPassCoeff[BLOCK_SWITCHING_IIR_LEN]= { FL2FXCONST_SGL(-0.5095),FL2FXCONST_SGL(0.7548) }; static const FIXP_DBL accWindowNrgFac = FL2FXCONST_DBL(0.3f); /* factor for accumulating filtered window energies */ static const FIXP_SGL oneMinusAccWindowNrgFac = FL2FXCONST_SGL(0.7f); /* static const float attackRatio = 10.0; */ /* lower ratio limit for attacks */ static const FIXP_SGL invAttackRatio = FL2FXCONST_SGL(0.1f); /* inverted lower ratio limit for attacks */ /* minimum energy for attacks */ static const FIXP_DBL minAttackNrg = (FL2FXCONST_DBL(1e+6f*NORM_PCM_ENERGY)>>BLOCK_SWITCH_ENERGY_SHIFT); /* minimum energy for attacks */ #endif /**************** internal function prototypes ***********/ /****************** Routines ****************************/ void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay) { FDKmemclear (blockSwitchingControl, sizeof(BLOCK_SWITCHING_CONTROL)); if (isLowDelay) { blockSwitchingControl->nBlockSwitchWindows = 4; blockSwitchingControl->allowShortFrames = 0; blockSwitchingControl->allowLookAhead = 0; } else { blockSwitchingControl->nBlockSwitchWindows = 8; blockSwitchingControl->allowShortFrames = 1; blockSwitchingControl->allowLookAhead = 1; } blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS; /* Initialize startvalue for blocktype */ blockSwitchingControl->lastWindowSequence = LONG_WINDOW; blockSwitchingControl->windowShape = blockType2windowShape[blockSwitchingControl->allowShortFrames][blockSwitchingControl->lastWindowSequence]; } static const INT suggestedGroupingTable[TRANS_FAC][MAX_NO_OF_GROUPS] = { /* Attack in Window 0 */ {1, 3, 3, 1}, /* Attack in Window 1 */ {1, 1, 3, 3}, /* Attack in Window 2 */ {2, 1, 3, 2}, /* Attack in Window 3 */ {3, 1, 3, 1}, /* Attack in Window 4 */ {3, 1, 1, 3}, /* Attack in Window 5 */ {3, 2, 1, 2}, /* Attack in Window 6 */ {3, 3, 1, 1}, /* Attack in Window 7 */ {3, 3, 1, 1} }; /* change block type depending on current blocktype and whether there's an attack */ /* assume no look-ahead */ static const INT chgWndSq[2][N_BLOCKTYPES] = { /* LONG WINDOW START_WINDOW SHORT_WINDOW STOP_WINDOW, LOWOV_WINDOW, WRONG_WINDOW */ /*no attack*/ {LONG_WINDOW, STOP_WINDOW, WRONG_WINDOW, LONG_WINDOW, STOP_WINDOW , WRONG_WINDOW }, /*attack */ {START_WINDOW, LOWOV_WINDOW, WRONG_WINDOW, START_WINDOW, LOWOV_WINDOW, WRONG_WINDOW } }; /* change block type depending on current blocktype and whether there's an attack */ /* assume look-ahead */ static const INT chgWndSqLkAhd[2][2][N_BLOCKTYPES] = { /*attack LONG WINDOW START_WINDOW SHORT_WINDOW STOP_WINDOW LOWOV_WINDOW, WRONG_WINDOW */ /* last attack */ /*no attack*/ { {LONG_WINDOW, SHORT_WINDOW, STOP_WINDOW, LONG_WINDOW, WRONG_WINDOW, WRONG_WINDOW}, /* no attack */ /*attack */ {START_WINDOW, SHORT_WINDOW, SHORT_WINDOW, START_WINDOW, WRONG_WINDOW, WRONG_WINDOW} }, /* no attack */ /*no attack*/ { {LONG_WINDOW, SHORT_WINDOW, SHORT_WINDOW, LONG_WINDOW, WRONG_WINDOW, WRONG_WINDOW}, /* attack */ /*attack */ {START_WINDOW, SHORT_WINDOW, SHORT_WINDOW, START_WINDOW, WRONG_WINDOW, WRONG_WINDOW} } /* attack */ }; int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE, const INT_PCM *pTimeSignal) { UINT i; FIXP_DBL enM1, enMax; UINT nBlockSwitchWindows = blockSwitchingControl->nBlockSwitchWindows; /* for LFE : only LONG window allowed */ if (isLFE) { /* case LFE: */ /* only long blocks, always use sine windows (MPEG2 AAC, MPEG4 AAC) */ blockSwitchingControl->lastWindowSequence = LONG_WINDOW; blockSwitchingControl->windowShape = SINE_WINDOW; blockSwitchingControl->noOfGroups = 1; blockSwitchingControl->groupLen[0] = 1; return(0); }; /* Save current attack index as last attack index */ blockSwitchingControl->lastattack = blockSwitchingControl->attack; blockSwitchingControl->lastAttackIndex = blockSwitchingControl->attackIndex; /* Save current window energy as last window energy */ FDKmemcpy(blockSwitchingControl->windowNrg[0], blockSwitchingControl->windowNrg[1], sizeof(blockSwitchingControl->windowNrg[0])); FDKmemcpy(blockSwitchingControl->windowNrgF[0], blockSwitchingControl->windowNrgF[1], sizeof(blockSwitchingControl->windowNrgF[0])); if (blockSwitchingControl->allowShortFrames) { /* Calculate suggested grouping info for the last frame */ /* Reset grouping info */ FDKmemclear (blockSwitchingControl->groupLen, sizeof(blockSwitchingControl->groupLen)); /* Set grouping info */ blockSwitchingControl->noOfGroups = MAX_NO_OF_GROUPS; FDKmemcpy(blockSwitchingControl->groupLen, suggestedGroupingTable[blockSwitchingControl->lastAttackIndex], sizeof(blockSwitchingControl->groupLen)); if (blockSwitchingControl->attack == TRUE) blockSwitchingControl->maxWindowNrg = FDKaacEnc_GetWindowEnergy(blockSwitchingControl->windowNrg[0], blockSwitchingControl->lastAttackIndex); else blockSwitchingControl->maxWindowNrg = FL2FXCONST_DBL(0.0); } /* Calculate unfiltered and filtered energies in subwindows and combine to segments */ FDKaacEnc_CalcWindowEnergy(blockSwitchingControl, granuleLength>>(nBlockSwitchWindows==4? 2:3 ), pTimeSignal); /* now calculate if there is an attack */ /* reset attack */ blockSwitchingControl->attack = FALSE; /* look for attack */ enMax = FL2FXCONST_DBL(0.0f); enM1 = blockSwitchingControl->windowNrgF[0][nBlockSwitchWindows-1]; for (i=0; iaccWindowNrg); blockSwitchingControl->accWindowNrg = fMultAdd(tmp, accWindowNrgFac, enM1) ; if (fMult(blockSwitchingControl->windowNrgF[1][i],invAttackRatio) > blockSwitchingControl->accWindowNrg ) { blockSwitchingControl->attack = TRUE; blockSwitchingControl->attackIndex = i; } enM1 = blockSwitchingControl->windowNrgF[1][i]; enMax = fixMax(enMax, enM1); } if (enMax < minAttackNrg) blockSwitchingControl->attack = FALSE; /* Check if attack spreads over frame border */ if((blockSwitchingControl->attack == FALSE) && (blockSwitchingControl->lastattack == TRUE)) { /* if attack is in last window repeat SHORT_WINDOW */ if ( ((blockSwitchingControl->windowNrgF[0][nBlockSwitchWindows-1]>>4) > fMult((FIXP_DBL)(10<<(DFRACT_BITS-1-4)), blockSwitchingControl->windowNrgF[1][1])) && (blockSwitchingControl->lastAttackIndex == (INT)nBlockSwitchWindows-1) ) { blockSwitchingControl->attack = TRUE; blockSwitchingControl->attackIndex = 0; } } if(blockSwitchingControl->allowLookAhead) { blockSwitchingControl->lastWindowSequence = chgWndSqLkAhd[blockSwitchingControl->lastattack][blockSwitchingControl->attack][blockSwitchingControl->lastWindowSequence]; } else { /* Low Delay */ blockSwitchingControl->lastWindowSequence = chgWndSq[blockSwitchingControl->attack][blockSwitchingControl->lastWindowSequence]; } /* update window shape */ blockSwitchingControl->windowShape = blockType2windowShape[blockSwitchingControl->allowShortFrames][blockSwitchingControl->lastWindowSequence]; return(0); } static FIXP_DBL FDKaacEnc_GetWindowEnergy(const FIXP_DBL in[], const INT blSwWndIdx) { /* For coherency, change FDKaacEnc_GetWindowEnergy() to calcluate the energy for a block switching analysis windows, not for a short block. The same is done FDKaacEnc_CalcWindowEnergy(). The result of FDKaacEnc_GetWindowEnergy() is used for a comparision of the max energy of left/right channel. */ return in[blSwWndIdx]; } static void FDKaacEnc_CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *RESTRICT blockSwitchingControl, INT windowLen, const INT_PCM *pTimeSignal) { INT i; UINT w; FIXP_SGL hiPassCoeff0 = hiPassCoeff[0]; FIXP_SGL hiPassCoeff1 = hiPassCoeff[1]; /* sum up scalarproduct of timesignal as windowed Energies */ for (w=0; w < blockSwitchingControl->nBlockSwitchWindows; w++) { FIXP_DBL temp_windowNrg = FL2FXCONST_DBL(0.0f); FIXP_DBL temp_windowNrgF = FL2FXCONST_DBL(0.0f); FIXP_DBL temp_iirState0 = blockSwitchingControl->iirStates[0]; FIXP_DBL temp_iirState1 = blockSwitchingControl->iirStates[1]; /* windowNrg = sum(timesample^2) */ for(i=0;i> 1; #else tempUnfiltered = (FIXP_DBL) *pTimeSignal++ << (DFRACT_BITS-SAMPLE_BITS-1); #endif t1 = fMultDiv2(hiPassCoeff1, tempUnfiltered-temp_iirState0); t2 = fMultDiv2(hiPassCoeff0, temp_iirState1); tempFiltred = (t1 - t2) << 1; temp_iirState0 = tempUnfiltered; temp_iirState1 = tempFiltred; /* subtract 2 from overallscaling (BLOCK_SWITCH_ENERGY_SHIFT) * because tempUnfiltered was already scaled with 1 (is 2 after squaring) * subtract 1 from overallscaling (BLOCK_SWITCH_ENERGY_SHIFT) * because of fMultDiv2 is doing a scaling by one */ temp_windowNrg += fPow2Div2(tempUnfiltered) >> (BLOCK_SWITCH_ENERGY_SHIFT - 1 - 2); temp_windowNrgF += fPow2Div2(tempFiltred) >> (BLOCK_SWITCH_ENERGY_SHIFT - 1 - 2); } blockSwitchingControl->windowNrg[1][w] = temp_windowNrg; blockSwitchingControl->windowNrgF[1][w] = temp_windowNrgF; blockSwitchingControl->iirStates[0] = temp_iirState0; blockSwitchingControl->iirStates[1] = temp_iirState1; } } static const UCHAR synchronizedBlockTypeTable[5][5] = { /* LONG_WINDOW START_WINDOW SHORT_WINDOW STOP_WINDOW LOWOV_WINDOW*/ /* LONG_WINDOW */ {LONG_WINDOW, START_WINDOW, SHORT_WINDOW, STOP_WINDOW, LOWOV_WINDOW}, /* START_WINDOW */ {START_WINDOW, START_WINDOW, SHORT_WINDOW, SHORT_WINDOW, LOWOV_WINDOW}, /* SHORT_WINDOW */ {SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW, SHORT_WINDOW, WRONG_WINDOW}, /* STOP_WINDOW */ {STOP_WINDOW, SHORT_WINDOW, SHORT_WINDOW, STOP_WINDOW, LOWOV_WINDOW}, /* LOWOV_WINDOW */ {LOWOV_WINDOW, LOWOV_WINDOW, WRONG_WINDOW, LOWOV_WINDOW, LOWOV_WINDOW}, }; int FDKaacEnc_SyncBlockSwitching ( BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft, BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight, const INT nChannels, const INT commonWindow ) { UCHAR patchType = LONG_WINDOW; if( nChannels == 2 && commonWindow == TRUE) { /* could be better with a channel loop (need a handle to psy_data) */ /* get suggested Block Types and synchronize */ patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlLeft->lastWindowSequence]; patchType = synchronizedBlockTypeTable[patchType][blockSwitchingControlRight->lastWindowSequence]; /* sanity check (no change from low overlap window to short winow and vice versa) */ if (patchType == WRONG_WINDOW) return -1; /* mixed up AAC-LC and AAC-LD */ /* Set synchronized Blocktype */ blockSwitchingControlLeft->lastWindowSequence = patchType; blockSwitchingControlRight->lastWindowSequence = patchType; /* update window shape */ blockSwitchingControlLeft->windowShape = blockType2windowShape[blockSwitchingControlLeft->allowShortFrames][blockSwitchingControlLeft->lastWindowSequence]; blockSwitchingControlRight->windowShape = blockType2windowShape[blockSwitchingControlLeft->allowShortFrames][blockSwitchingControlRight->lastWindowSequence]; } if (blockSwitchingControlLeft->allowShortFrames) { int i; if( nChannels == 2 ) { if (commonWindow == TRUE) { /* Synchronize grouping info */ int windowSequenceLeftOld = blockSwitchingControlLeft->lastWindowSequence; int windowSequenceRightOld = blockSwitchingControlRight->lastWindowSequence; /* Long Blocks */ if(patchType != SHORT_WINDOW) { /* Set grouping info */ blockSwitchingControlLeft->noOfGroups = 1; blockSwitchingControlRight->noOfGroups = 1; blockSwitchingControlLeft->groupLen[0] = 1; blockSwitchingControlRight->groupLen[0] = 1; for (i = 1; i < MAX_NO_OF_GROUPS; i++) { blockSwitchingControlLeft->groupLen[i] = 0; blockSwitchingControlRight->groupLen[i] = 0; } } /* Short Blocks */ else { /* in case all two channels were detected as short-blocks before syncing, use the grouping of channel with higher maxWindowNrg */ if( (windowSequenceLeftOld == SHORT_WINDOW) && (windowSequenceRightOld == SHORT_WINDOW) ) { if(blockSwitchingControlLeft->maxWindowNrg > blockSwitchingControlRight->maxWindowNrg) { /* Left Channel wins */ blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups; for (i = 0; i < MAX_NO_OF_GROUPS; i++){ blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i]; } } else { /* Right Channel wins */ blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups; for (i = 0; i < MAX_NO_OF_GROUPS; i++){ blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i]; } } } else if ( (windowSequenceLeftOld == SHORT_WINDOW) && (windowSequenceRightOld != SHORT_WINDOW) ) { /* else use grouping of short-block channel */ blockSwitchingControlRight->noOfGroups = blockSwitchingControlLeft->noOfGroups; for (i = 0; i < MAX_NO_OF_GROUPS; i++){ blockSwitchingControlRight->groupLen[i] = blockSwitchingControlLeft->groupLen[i]; } } else if ( (windowSequenceRightOld == SHORT_WINDOW) && (windowSequenceLeftOld != SHORT_WINDOW) ) { blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups; for (i = 0; i < MAX_NO_OF_GROUPS; i++){ blockSwitchingControlLeft->groupLen[i] = blockSwitchingControlRight->groupLen[i]; } } else { /* syncing a start and stop window ... */ blockSwitchingControlLeft->noOfGroups = blockSwitchingControlRight->noOfGroups = 2; blockSwitchingControlLeft->groupLen[0] = blockSwitchingControlRight->groupLen[0] = 4; blockSwitchingControlLeft->groupLen[1] = blockSwitchingControlRight->groupLen[1] = 4; } } /* Short Blocks */ } else { /* stereo, no common window */ if (blockSwitchingControlLeft->lastWindowSequence!=SHORT_WINDOW){ blockSwitchingControlLeft->noOfGroups = 1; blockSwitchingControlLeft->groupLen[0] = 1; for (i = 1; i < MAX_NO_OF_GROUPS; i++) { blockSwitchingControlLeft->groupLen[i] = 0; } } if (blockSwitchingControlRight->lastWindowSequence!=SHORT_WINDOW){ blockSwitchingControlRight->noOfGroups = 1; blockSwitchingControlRight->groupLen[0] = 1; for (i = 1; i < MAX_NO_OF_GROUPS; i++) { blockSwitchingControlRight->groupLen[i] = 0; } } } /* common window */ } else { /* Mono */ if (blockSwitchingControlLeft->lastWindowSequence!=SHORT_WINDOW){ blockSwitchingControlLeft->noOfGroups = 1; blockSwitchingControlLeft->groupLen[0] = 1; for (i = 1; i < MAX_NO_OF_GROUPS; i++) { blockSwitchingControlLeft->groupLen[i] = 0; } } } } /* allowShortFrames */ /* Translate LOWOV_WINDOW block type to a meaningful window shape. */ if ( ! blockSwitchingControlLeft->allowShortFrames ) { if ( blockSwitchingControlLeft->lastWindowSequence != LONG_WINDOW && blockSwitchingControlLeft->lastWindowSequence != STOP_WINDOW ) { blockSwitchingControlLeft->lastWindowSequence = LONG_WINDOW; blockSwitchingControlLeft->windowShape = LOL_WINDOW; } } if (nChannels == 2) { if ( ! blockSwitchingControlRight->allowShortFrames ) { if ( blockSwitchingControlRight->lastWindowSequence != LONG_WINDOW && blockSwitchingControlRight->lastWindowSequence != STOP_WINDOW ) { blockSwitchingControlRight->lastWindowSequence = LONG_WINDOW; blockSwitchingControlRight->windowShape = LOL_WINDOW; } } } return 0; } fdk-aac-0.1.3/libAACenc/src/psy_main.cpp0000644000175000017500000016205612372261464020277 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Psychoaccoustic major function block ******************************************************************************/ #include "psy_const.h" #include "block_switch.h" #include "transform.h" #include "spreading.h" #include "pre_echo_control.h" #include "band_nrg.h" #include "psy_configuration.h" #include "psy_data.h" #include "ms_stereo.h" #include "interface.h" #include "psy_main.h" #include "grp_data.h" #include "tns_func.h" #include "pns_func.h" #include "tonality.h" #include "aacEnc_ram.h" #include "intensity.h" /* blending to reduce gibbs artifacts */ #define FADE_OUT_LEN 6 static const FIXP_DBL fadeOutFactor[FADE_OUT_LEN] = {1840644096, 1533870080, 1227096064, 920322048, 613548032, 306774016}; /* forward definitions */ /***************************************************************************** functionname: FDKaacEnc_PsyNew description: allocates memory for psychoacoustic returns: an error code input: pointer to a psych handle *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_PsyNew(PSY_INTERNAL **phpsy, const INT nElements, const INT nChannels ,UCHAR *dynamic_RAM ) { AAC_ENCODER_ERROR ErrorStatus; PSY_INTERNAL *hPsy; INT i; hPsy = GetRam_aacEnc_PsyInternal(); *phpsy = hPsy; if (hPsy == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } for (i=0; ipsyElement[i] = GetRam_aacEnc_PsyElement(i); if (hPsy->psyElement[i] == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } } for (i=0; ipStaticChannels[i] = GetRam_aacEnc_PsyStatic(i); if (hPsy->pStaticChannels[i]==NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } /* AUDIO INPUT BUFFER */ hPsy->pStaticChannels[i]->psyInputBuffer = GetRam_aacEnc_PsyInputBuffer(i); if (hPsy->pStaticChannels[i]->psyInputBuffer==NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } } /* reusable psych memory */ hPsy->psyDynamic = GetRam_aacEnc_PsyDynamic(0, dynamic_RAM); return AAC_ENC_OK; bail: FDKaacEnc_PsyClose(phpsy, NULL); return ErrorStatus; } /***************************************************************************** functionname: FDKaacEnc_PsyOutNew description: allocates memory for psyOut struc returns: an error code input: pointer to a psych handle *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_PsyOutNew(PSY_OUT **phpsyOut, const INT nElements, const INT nChannels, const INT nSubFrames ,UCHAR *dynamic_RAM ) { AAC_ENCODER_ERROR ErrorStatus; int n, i; int elInc = 0, chInc = 0; for (n=0; npPsyOutChannels[i] = GetRam_aacEnc_PsyOutChannel(chInc++); } for (i=0; ipsyOutElement[i] = GetRam_aacEnc_PsyOutElements(elInc++); if (phpsyOut[n]->psyOutElement[i] == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } } } /* nSubFrames */ return AAC_ENC_OK; bail: FDKaacEnc_PsyClose(NULL, phpsyOut); return ErrorStatus; } AAC_ENCODER_ERROR FDKaacEnc_psyInitStates(PSY_INTERNAL *hPsy, PSY_STATIC* psyStatic, AUDIO_OBJECT_TYPE audioObjectType) { /* init input buffer */ FDKmemclear(psyStatic->psyInputBuffer, MAX_INPUT_BUFFER_SIZE*sizeof(INT_PCM)); FDKaacEnc_InitBlockSwitching(&psyStatic->blockSwitchingControl, isLowDelay(audioObjectType) ); return AAC_ENC_OK; } AAC_ENCODER_ERROR FDKaacEnc_psyInit(PSY_INTERNAL *hPsy, PSY_OUT **phpsyOut, const INT nSubFrames, const INT nMaxChannels, const AUDIO_OBJECT_TYPE audioObjectType, CHANNEL_MAPPING *cm) { AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK; int i, ch, n, chInc = 0, resetChannels = 3; if ( (nMaxChannels>2) && (cm->nChannels==2) ) { chInc = 1; FDKaacEnc_psyInitStates(hPsy, hPsy->pStaticChannels[0], audioObjectType); } if ( (nMaxChannels==2) ) { resetChannels = 0; } for (i=0; inElements; i++) { for (ch=0; chelInfo[i].nChannelsInEl; ch++) { if (cm->elInfo[i].elType!=ID_LFE) { hPsy->psyElement[i]->psyStatic[ch] = hPsy->pStaticChannels[chInc]; if (chInc>=resetChannels) { FDKaacEnc_psyInitStates(hPsy, hPsy->psyElement[i]->psyStatic[ch], audioObjectType); } hPsy->psyElement[i]->psyStatic[ch]->isLFE = 0; } else { hPsy->psyElement[i]->psyStatic[ch] = hPsy->pStaticChannels[nMaxChannels-1]; hPsy->psyElement[i]->psyStatic[ch]->isLFE = 1; } chInc++; } } for (n=0; nnElements; i++) { for (ch=0; chelInfo[i].nChannelsInEl; ch++) { phpsyOut[n]->psyOutElement[i]->psyOutChannel[ch] = phpsyOut[n]->pPsyOutChannels[chInc++]; } } } return ErrorStatus; } /***************************************************************************** functionname: FDKaacEnc_psyMainInit description: initializes psychoacoustic returns: an error code *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_psyMainInit(PSY_INTERNAL *hPsy, AUDIO_OBJECT_TYPE audioObjectType, CHANNEL_MAPPING *cm, INT sampleRate, INT granuleLength, INT bitRate, INT tnsMask, INT bandwidth, INT usePns, INT useIS, UINT syntaxFlags, ULONG initFlags) { AAC_ENCODER_ERROR ErrorStatus; int i, ch; int channelsEff = cm->nChannelsEff; int tnsChannels = 0; FB_TYPE filterBank; switch(FDKaacEnc_GetMonoStereoMode(cm->encMode)) { /* ... and map to tnsChannels */ case EL_MODE_MONO: tnsChannels = 1; break; case EL_MODE_STEREO: tnsChannels = 2; break; default: tnsChannels = 0; } switch (audioObjectType) { default: filterBank = FB_LC; break; case AOT_ER_AAC_LD: filterBank = FB_LD; break; case AOT_ER_AAC_ELD: filterBank = FB_ELD; break; } hPsy->granuleLength = granuleLength; ErrorStatus = FDKaacEnc_InitPsyConfiguration(bitRate/channelsEff, sampleRate, bandwidth, LONG_WINDOW, hPsy->granuleLength, useIS, &(hPsy->psyConf[0]), filterBank); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; ErrorStatus = FDKaacEnc_InitTnsConfiguration( (bitRate*tnsChannels)/channelsEff, sampleRate, tnsChannels, LONG_WINDOW, hPsy->granuleLength, (syntaxFlags&AC_SBR_PRESENT)?1:0, &(hPsy->psyConf[0].tnsConf), &hPsy->psyConf[0], (INT)(tnsMask&2), (INT)(tnsMask&8) ); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; if (granuleLength > 512) { ErrorStatus = FDKaacEnc_InitPsyConfiguration(bitRate/channelsEff, sampleRate, bandwidth, SHORT_WINDOW, hPsy->granuleLength, useIS, &hPsy->psyConf[1], filterBank); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; ErrorStatus = FDKaacEnc_InitTnsConfiguration( (bitRate*tnsChannels)/channelsEff, sampleRate, tnsChannels, SHORT_WINDOW, hPsy->granuleLength, (syntaxFlags&AC_SBR_PRESENT)?1:0, &hPsy->psyConf[1].tnsConf, &hPsy->psyConf[1], (INT)(tnsMask&1), (INT)(tnsMask&4) ); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; } for (i=0; inElements; i++) { for (ch=0; chelInfo[i].nChannelsInEl; ch++) { if (initFlags) { /* reset states */ FDKaacEnc_psyInitStates(hPsy, hPsy->psyElement[i]->psyStatic[ch], audioObjectType); } FDKaacEnc_InitPreEchoControl(hPsy->psyElement[i]->psyStatic[ch]->sfbThresholdnm1, &hPsy->psyElement[i]->psyStatic[ch]->calcPreEcho, hPsy->psyConf[0].sfbCnt, hPsy->psyConf[0].sfbPcmQuantThreshold, &hPsy->psyElement[i]->psyStatic[ch]->mdctScalenm1); } } ErrorStatus = FDKaacEnc_InitPnsConfiguration(&hPsy->psyConf[0].pnsConf, bitRate/channelsEff, sampleRate, usePns, hPsy->psyConf[0].sfbCnt, hPsy->psyConf[0].sfbOffset, cm->elInfo[0].nChannelsInEl, (hPsy->psyConf[0].filterbank == FB_LC)); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; ErrorStatus = FDKaacEnc_InitPnsConfiguration(&hPsy->psyConf[1].pnsConf, bitRate/channelsEff, sampleRate, usePns, hPsy->psyConf[1].sfbCnt, hPsy->psyConf[1].sfbOffset, cm->elInfo[1].nChannelsInEl, (hPsy->psyConf[1].filterbank == FB_LC)); return ErrorStatus; } static void FDKaacEnc_deinterleaveInputBuffer(INT_PCM *pOutputSamples, INT_PCM *pInputSamples, INT nSamples, INT nChannels) { INT k; /* deinterlave input samples and write to output buffer */ for (k=0; kpsyOutChannel; FIXP_SGL sfbTonality[(2)][MAX_SFB_LONG]; PSY_STATIC **RESTRICT psyStatic = psyElement->psyStatic; PSY_DATA *RESTRICT psyData[(2)]; TNS_DATA *RESTRICT tnsData[(2)]; PNS_DATA *RESTRICT pnsData[(2)]; INT zeroSpec = TRUE; /* means all spectral lines are zero */ INT blockSwitchingOffset; PSY_CONFIGURATION *RESTRICT hThisPsyConf[(2)]; INT windowLength[(2)]; INT nWindows[(2)]; INT wOffset; INT maxSfb[(2)]; INT *pSfbMaxScaleSpec[(2)]; FIXP_DBL *pSfbEnergy[(2)]; FIXP_DBL *pSfbSpreadEnergy[(2)]; FIXP_DBL *pSfbEnergyLdData[(2)]; FIXP_DBL *pSfbEnergyMS[(2)]; FIXP_DBL *pSfbThreshold[(2)]; INT isShortWindow[(2)]; if (hPsyConfLong->filterbank == FB_LC) { blockSwitchingOffset = psyConf->granuleLength + (9*psyConf->granuleLength/(2*TRANS_FAC)); } else { blockSwitchingOffset = psyConf->granuleLength; } for(ch = 0; ch < channels; ch++) { psyData[ch] = &psyDynamic->psyData[ch]; tnsData[ch] = &psyDynamic->tnsData[ch]; pnsData[ch] = &psyDynamic->pnsData[ch]; psyData[ch]->mdctSpectrum = psyOutChannel[ch]->mdctSpectrum; } /* block switching */ if (hPsyConfLong->filterbank != FB_ELD) { int err; for(ch = 0; ch < channels; ch++) { C_ALLOC_SCRATCH_START(pTimeSignal, INT_PCM, (1024)) /* deinterleave input data and use for block switching */ FDKaacEnc_deinterleaveInputBuffer( pTimeSignal, &pInput[chIdx[ch]], psyConf->granuleLength, totalChannels); FDKaacEnc_BlockSwitching (&psyStatic[ch]->blockSwitchingControl, psyConf->granuleLength, psyStatic[ch]->isLFE, pTimeSignal ); /* fill up internal input buffer, to 2xframelength samples */ FDKmemcpy(psyStatic[ch]->psyInputBuffer+blockSwitchingOffset, pTimeSignal, (2*psyConf->granuleLength-blockSwitchingOffset)*sizeof(INT_PCM)); C_ALLOC_SCRATCH_END(pTimeSignal, INT_PCM, (1024)) } /* synch left and right block type */ err = FDKaacEnc_SyncBlockSwitching(&psyStatic[0]->blockSwitchingControl, &psyStatic[1]->blockSwitchingControl, channels, commonWindow); if (err) { return AAC_ENC_UNSUPPORTED_AOT; /* mixed up LC and LD */ } } else { for(ch = 0; ch < channels; ch++) { /* deinterleave input data and use for block switching */ FDKaacEnc_deinterleaveInputBuffer( psyStatic[ch]->psyInputBuffer + blockSwitchingOffset, &pInput[chIdx[ch]], psyConf->granuleLength, totalChannels); } } for(ch = 0; ch < channels; ch++) isShortWindow[ch]=(psyStatic[ch]->blockSwitchingControl.lastWindowSequence == SHORT_WINDOW); /* set parameters according to window length */ for(ch = 0; ch < channels; ch++) { if(isShortWindow[ch]) { hThisPsyConf[ch] = hPsyConfShort; windowLength[ch] = psyConf->granuleLength/TRANS_FAC; nWindows[ch] = TRANS_FAC; maxSfb[ch] = MAX_SFB_SHORT; pSfbMaxScaleSpec[ch] = psyData[ch]->sfbMaxScaleSpec.Short[0]; pSfbEnergy[ch] = psyData[ch]->sfbEnergy.Short[0]; pSfbSpreadEnergy[ch] = psyData[ch]->sfbSpreadEnergy.Short[0]; pSfbEnergyLdData[ch] = psyData[ch]->sfbEnergyLdData.Short[0]; pSfbEnergyMS[ch] = psyData[ch]->sfbEnergyMS.Short[0]; pSfbThreshold[ch] = psyData[ch]->sfbThreshold.Short[0]; } else { hThisPsyConf[ch] = hPsyConfLong; windowLength[ch] = psyConf->granuleLength; nWindows[ch] = 1; maxSfb[ch] = MAX_GROUPED_SFB; pSfbMaxScaleSpec[ch] = psyData[ch]->sfbMaxScaleSpec.Long; pSfbEnergy[ch] = psyData[ch]->sfbEnergy.Long; pSfbSpreadEnergy[ch] = psyData[ch]->sfbSpreadEnergy.Long; pSfbEnergyLdData[ch] = psyData[ch]->sfbEnergyLdData.Long; pSfbEnergyMS[ch] = psyData[ch]->sfbEnergyMS.Long; pSfbThreshold[ch] = psyData[ch]->sfbThreshold.Long; } } /* Transform and get mdctScaling for all channels and windows. */ for(ch = 0; ch < channels; ch++) { /* update number of active bands */ if (psyStatic[ch]->isLFE) { psyData[ch]->sfbActive = hThisPsyConf[ch]->sfbActiveLFE; psyData[ch]->lowpassLine = hThisPsyConf[ch]->lowpassLineLFE; } else { psyData[ch]->sfbActive = hThisPsyConf[ch]->sfbActive; psyData[ch]->lowpassLine = hThisPsyConf[ch]->lowpassLine; } for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; FDKaacEnc_Transform_Real( psyStatic[ch]->psyInputBuffer + wOffset, psyData[ch]->mdctSpectrum+wOffset, psyStatic[ch]->blockSwitchingControl.lastWindowSequence, psyStatic[ch]->blockSwitchingControl.windowShape, &psyStatic[ch]->blockSwitchingControl.lastWindowShape, psyConf->granuleLength, &mdctSpectrum_e, hThisPsyConf[ch]->filterbank ,psyStatic[ch]->overlapAddBuffer ); /* Low pass / highest sfb */ FDKmemclear(&psyData[ch]->mdctSpectrum[psyData[ch]->lowpassLine+wOffset], (windowLength[ch]-psyData[ch]->lowpassLine)*sizeof(FIXP_DBL)); if (hPsyConfLong->filterbank != FB_LC) { /* Do blending to reduce gibbs artifacts */ for (int i=0; imdctSpectrum[psyData[ch]->lowpassLine+wOffset - FADE_OUT_LEN + i] = fMult(psyData[ch]->mdctSpectrum[psyData[ch]->lowpassLine+wOffset - FADE_OUT_LEN + i], fadeOutFactor[i]); } } /* Check for zero spectrum. These loops will usually terminate very, very early. */ for(line=0; (linelowpassLine) && (zeroSpec==TRUE); line++) { if (psyData[ch]->mdctSpectrum[line+wOffset] != (FIXP_DBL)0) { zeroSpec = FALSE; break; } } } /* w loop */ psyData[ch]->mdctScale = mdctSpectrum_e; /* rotate internal time samples */ FDKmemmove(psyStatic[ch]->psyInputBuffer, psyStatic[ch]->psyInputBuffer+psyConf->granuleLength, psyConf->granuleLength*sizeof(INT_PCM)); /* ... and get remaining samples from input buffer */ FDKaacEnc_deinterleaveInputBuffer( psyStatic[ch]->psyInputBuffer+psyConf->granuleLength, &pInput[ (2*psyConf->granuleLength-blockSwitchingOffset)*totalChannels + chIdx[ch] ], blockSwitchingOffset-psyConf->granuleLength, totalChannels); } /* ch */ /* Do some rescaling to get maximum possible accuracy for energies */ if ( zeroSpec == FALSE) { /* Calc possible spectrum leftshift for each sfb (1 means: 1 bit left shift is possible without overflow) */ INT minSpecShift = MAX_SHIFT_DBL; INT nrgShift = MAX_SHIFT_DBL; INT finalShift = MAX_SHIFT_DBL; FIXP_DBL currNrg = 0; FIXP_DBL maxNrg = 0; for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; FDKaacEnc_CalcSfbMaxScaleSpec(psyData[ch]->mdctSpectrum+wOffset, hThisPsyConf[ch]->sfbOffset, pSfbMaxScaleSpec[ch]+w*maxSfb[ch], psyData[ch]->sfbActive); for (sfb = 0; sfbsfbActive; sfb++) minSpecShift = fixMin(minSpecShift, (pSfbMaxScaleSpec[ch]+w*maxSfb[ch])[sfb]); } } /* Calc possible energy leftshift for each sfb (1 means: 1 bit left shift is possible without overflow) */ for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; currNrg = FDKaacEnc_CheckBandEnergyOptim(psyData[ch]->mdctSpectrum+wOffset, pSfbMaxScaleSpec[ch]+w*maxSfb[ch], hThisPsyConf[ch]->sfbOffset, psyData[ch]->sfbActive, pSfbEnergy[ch]+w*maxSfb[ch], pSfbEnergyLdData[ch]+w*maxSfb[ch], minSpecShift-4); maxNrg = fixMax(maxNrg, currNrg); } } if ( maxNrg != (FIXP_DBL)0 ) { nrgShift = (CountLeadingBits(maxNrg)>>1) + (minSpecShift-4); } /* 2check: Hasn't this decision to be made for both channels? */ /* For short windows 1 additional bit headroom is necessary to prevent overflows when summing up energies in FDKaacEnc_groupShortData() */ if(isShortWindow[0]) nrgShift--; /* both spectrum and energies mustn't overflow */ finalShift = fixMin(minSpecShift, nrgShift); /* do not shift more than 3 bits more to the left than signal without blockfloating point * would be to avoid overflow of scaled PCM quantization thresholds */ if (finalShift > psyData[0]->mdctScale + 3 ) finalShift = psyData[0]->mdctScale + 3; FDK_ASSERT(finalShift >= 0); /* right shift is not allowed */ /* correct sfbEnergy and sfbEnergyLdData with new finalShift */ FIXP_DBL ldShift = finalShift * FL2FXCONST_DBL(2.0/64); for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { for(sfb=0; sfbsfbActive; sfb++) { INT scale = fixMax(0, (pSfbMaxScaleSpec[ch]+w*maxSfb[ch])[sfb]-4); scale = fixMin((scale-finalShift)<<1, DFRACT_BITS-1); if (scale >= 0) (pSfbEnergy[ch]+w*maxSfb[ch])[sfb] >>= (scale); else (pSfbEnergy[ch]+w*maxSfb[ch])[sfb] <<= (-scale); (pSfbThreshold[ch]+w*maxSfb[ch])[sfb] = fMult((pSfbEnergy[ch]+w*maxSfb[ch])[sfb], C_RATIO); (pSfbEnergyLdData[ch]+w*maxSfb[ch])[sfb] += ldShift; } } } if ( finalShift != 0 ) { for (ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; for(line=0; linelowpassLine; line++) { psyData[ch]->mdctSpectrum[line+wOffset] <<= finalShift; } /* update sfbMaxScaleSpec */ for (sfb = 0; sfbsfbActive; sfb++) (pSfbMaxScaleSpec[ch]+w*maxSfb[ch])[sfb] -= finalShift; } /* update mdctScale */ psyData[ch]->mdctScale -= finalShift; } } } else { /* all spectral lines are zero */ for (ch = 0; ch < channels; ch++) { psyData[ch]->mdctScale = 0; /* otherwise mdctScale would be for example 7 and PCM quantization thresholds would be shifted * 14 bits to the right causing some of them to become 0 (which causes problems later) */ /* clear sfbMaxScaleSpec */ for(w = 0; w < nWindows[ch]; w++) { for (sfb = 0; sfbsfbActive; sfb++) { (pSfbMaxScaleSpec[ch]+w*maxSfb[ch])[sfb] = 0; (pSfbEnergy[ch]+w*maxSfb[ch])[sfb] = (FIXP_DBL)0; (pSfbEnergyLdData[ch]+w*maxSfb[ch])[sfb] = FL2FXCONST_DBL(-1.0f); (pSfbThreshold[ch]+w*maxSfb[ch])[sfb] = (FIXP_DBL)0; } } } } /* Advance psychoacoustics: Tonality and TNS */ if (psyStatic[0]->isLFE) { tnsData[0]->dataRaw.Long.subBlockInfo.tnsActive = 0; } else { for(ch = 0; ch < channels; ch++) { if (!isShortWindow[ch]) { /* tonality */ FDKaacEnc_CalculateFullTonality( psyData[ch]->mdctSpectrum, pSfbMaxScaleSpec[ch], pSfbEnergyLdData[ch], sfbTonality[ch], psyData[ch]->sfbActive, hThisPsyConf[ch]->sfbOffset, hThisPsyConf[ch]->pnsConf.usePns); } } if (hPsyConfLong->tnsConf.tnsActive || hPsyConfShort->tnsConf.tnsActive) { INT tnsActive[TRANS_FAC]; INT nrgScaling[2] = {0,0}; INT tnsSpecShift = 0; for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; /* TNS */ FDKaacEnc_TnsDetect( tnsData[ch], &hThisPsyConf[ch]->tnsConf, &psyOutChannel[ch]->tnsInfo, hThisPsyConf[ch]->sfbCnt, psyData[ch]->mdctSpectrum+wOffset, w, psyStatic[ch]->blockSwitchingControl.lastWindowSequence ); } } if (channels == 2) { FDKaacEnc_TnsSync( tnsData[1], tnsData[0], &psyOutChannel[1]->tnsInfo, &psyOutChannel[0]->tnsInfo, psyStatic[1]->blockSwitchingControl.lastWindowSequence, psyStatic[0]->blockSwitchingControl.lastWindowSequence, &hThisPsyConf[1]->tnsConf); } FDK_ASSERT(commonWindow=1); /* all checks for TNS do only work for common windows (which is always set)*/ for(w = 0; w < nWindows[0]; w++) { if (isShortWindow[0]) tnsActive[w] = tnsData[0]->dataRaw.Short.subBlockInfo[w].tnsActive || ((channels == 2) ? tnsData[1]->dataRaw.Short.subBlockInfo[w].tnsActive : 0); else tnsActive[w] = tnsData[0]->dataRaw.Long.subBlockInfo.tnsActive || ((channels == 2) ? tnsData[1]->dataRaw.Long.subBlockInfo.tnsActive : 0); } for(ch = 0; ch < channels; ch++) { if (tnsActive[0] && !isShortWindow[ch]) { /* Scale down spectrum if tns is active in one of the two channels with same lastWindowSequence */ /* first part of threshold calculation; it's not necessary to update sfbMaxScaleSpec */ INT shift = 1; for(sfb=0; sfblowpassLine; sfb++) { psyData[ch]->mdctSpectrum[sfb] = psyData[ch]->mdctSpectrum[sfb] >> shift; } /* update thresholds */ for (sfb=0; sfbsfbActive; sfb++) { pSfbThreshold[ch][sfb] >>= (2*shift); } psyData[ch]->mdctScale += shift; /* update mdctScale */ /* calc sfbEnergies after tnsEncode again ! */ } } for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { wOffset = w*windowLength[ch]; FDKaacEnc_TnsEncode( &psyOutChannel[ch]->tnsInfo, tnsData[ch], hThisPsyConf[ch]->sfbCnt, &hThisPsyConf[ch]->tnsConf, hThisPsyConf[ch]->sfbOffset[psyData[ch]->sfbActive],/*hThisPsyConf[ch]->lowpassLine*/ /* filter stops before that line ! */ psyData[ch]->mdctSpectrum+wOffset, w, psyStatic[ch]->blockSwitchingControl.lastWindowSequence); if(tnsActive[w]) { /* Calc sfb-bandwise mdct-energies for left and right channel again, */ /* if tns active in current channel or in one channel with same lastWindowSequence left and right */ FDKaacEnc_CalcSfbMaxScaleSpec(psyData[ch]->mdctSpectrum+wOffset, hThisPsyConf[ch]->sfbOffset, pSfbMaxScaleSpec[ch]+w*maxSfb[ch], psyData[ch]->sfbActive); } } } for(ch = 0; ch < channels; ch++) { for(w = 0; w < nWindows[ch]; w++) { if (tnsActive[w]) { if (isShortWindow[ch]) { FDKaacEnc_CalcBandEnergyOptimShort(psyData[ch]->mdctSpectrum+w*windowLength[ch], pSfbMaxScaleSpec[ch]+w*maxSfb[ch], hThisPsyConf[ch]->sfbOffset, psyData[ch]->sfbActive, pSfbEnergy[ch]+w*maxSfb[ch]); } else { nrgScaling[ch] = /* with tns, energy calculation can overflow; -> scaling */ FDKaacEnc_CalcBandEnergyOptimLong(psyData[ch]->mdctSpectrum, pSfbMaxScaleSpec[ch], hThisPsyConf[ch]->sfbOffset, psyData[ch]->sfbActive, pSfbEnergy[ch], pSfbEnergyLdData[ch]); tnsSpecShift = fixMax(tnsSpecShift, nrgScaling[ch]); /* nrgScaling is set only if nrg would have an overflow */ } } /* if tnsActive */ } } /* end channel loop */ /* adapt scaling to prevent nrg overflow, only for long blocks */ for(ch = 0; ch < channels; ch++) { if ( (tnsSpecShift!=0) && !isShortWindow[ch] ) { /* scale down spectrum, nrg's and thresholds, if there was an overflow in sfbNrg calculation after tns */ for(line=0; linelowpassLine; line++) { psyData[ch]->mdctSpectrum[line] >>= tnsSpecShift; } INT scale = (tnsSpecShift-nrgScaling[ch])<<1; for(sfb=0; sfbsfbActive; sfb++) { pSfbEnergyLdData[ch][sfb] -= scale*FL2FXCONST_DBL(1.0/LD_DATA_SCALING); pSfbEnergy[ch][sfb] >>= scale; pSfbThreshold[ch][sfb] >>= (tnsSpecShift<<1); } psyData[ch]->mdctScale += tnsSpecShift; /* update mdctScale; not necessary to update sfbMaxScaleSpec */ } } /* end channel loop */ } /* TNS active */ } /* !isLFE */ /* Advance thresholds */ for(ch = 0; ch < channels; ch++) { INT headroom; FIXP_DBL clipEnergy; INT energyShift = psyData[ch]->mdctScale*2 ; INT clipNrgShift = energyShift - THR_SHIFTBITS ; if(isShortWindow[ch]) headroom = 6; else headroom = 0; if (clipNrgShift >= 0) clipEnergy = hThisPsyConf[ch]->clipEnergy >> clipNrgShift ; else if (clipNrgShift>=-headroom) clipEnergy = hThisPsyConf[ch]->clipEnergy << -clipNrgShift ; else clipEnergy = (FIXP_DBL)MAXVAL_DBL ; for(w = 0; w < nWindows[ch]; w++) { INT i; /* limit threshold to avoid clipping */ for (i=0; isfbActive; i++) { *(pSfbThreshold[ch]+w*maxSfb[ch]+i) = fixMin(*(pSfbThreshold[ch]+w*maxSfb[ch]+i), clipEnergy); } /* spreading */ FDKaacEnc_SpreadingMax(psyData[ch]->sfbActive, hThisPsyConf[ch]->sfbMaskLowFactor, hThisPsyConf[ch]->sfbMaskHighFactor, pSfbThreshold[ch]+w*maxSfb[ch]); /* PCM quantization threshold */ energyShift += PCM_QUANT_THR_SCALE; if (energyShift>=0) { energyShift = fixMin(DFRACT_BITS-1,energyShift); for (i=0; isfbActive;i++) { *(pSfbThreshold[ch]+w*maxSfb[ch]+i) = fixMax(*(pSfbThreshold[ch]+w*maxSfb[ch]+i) >> THR_SHIFTBITS, (hThisPsyConf[ch]->sfbPcmQuantThreshold[i] >> energyShift)); } } else { energyShift = fixMin(DFRACT_BITS-1,-energyShift); for (i=0; isfbActive;i++) { *(pSfbThreshold[ch]+w*maxSfb[ch]+i) = fixMax(*(pSfbThreshold[ch]+w*maxSfb[ch]+i) >> THR_SHIFTBITS, (hThisPsyConf[ch]->sfbPcmQuantThreshold[i] << energyShift)); } } if (!psyStatic[ch]->isLFE) { /* preecho control */ if(psyStatic[ch]->blockSwitchingControl.lastWindowSequence == STOP_WINDOW) { /* prevent FDKaacEnc_PreEchoControl from comparing stop thresholds with short thresholds */ for (i=0; isfbActive;i++) { psyStatic[ch]->sfbThresholdnm1[i] = (FIXP_DBL)MAXVAL_DBL; } psyStatic[ch]->mdctScalenm1 = 0; psyStatic[ch]->calcPreEcho = 0; } FDKaacEnc_PreEchoControl( psyStatic[ch]->sfbThresholdnm1, psyStatic[ch]->calcPreEcho, psyData[ch]->sfbActive, hThisPsyConf[ch]->maxAllowedIncreaseFactor, hThisPsyConf[ch]->minRemainingThresholdFactor, pSfbThreshold[ch]+w*maxSfb[ch], psyData[ch]->mdctScale, &psyStatic[ch]->mdctScalenm1); psyStatic[ch]->calcPreEcho = 1; if(psyStatic[ch]->blockSwitchingControl.lastWindowSequence == START_WINDOW) { /* prevent FDKaacEnc_PreEchoControl in next frame to compare start thresholds with short thresholds */ for (i=0; isfbActive;i++) { psyStatic[ch]->sfbThresholdnm1[i] = (FIXP_DBL)MAXVAL_DBL; } psyStatic[ch]->mdctScalenm1 = 0; psyStatic[ch]->calcPreEcho = 0; } } /* spread energy to avoid hole detection */ FDKmemcpy(pSfbSpreadEnergy[ch]+w*maxSfb[ch], pSfbEnergy[ch]+w*maxSfb[ch], psyData[ch]->sfbActive*sizeof(FIXP_DBL)); FDKaacEnc_SpreadingMax(psyData[ch]->sfbActive, hThisPsyConf[ch]->sfbMaskLowFactorSprEn, hThisPsyConf[ch]->sfbMaskHighFactorSprEn, pSfbSpreadEnergy[ch]+w*maxSfb[ch]); } } /* Calc bandwise energies for mid and side channel. Do it only if 2 channels exist */ if (channels==2) { for(w = 0; w < nWindows[1]; w++) { wOffset = w*windowLength[1]; FDKaacEnc_CalcBandNrgMSOpt(psyData[0]->mdctSpectrum+wOffset, psyData[1]->mdctSpectrum+wOffset, pSfbMaxScaleSpec[0]+w*maxSfb[0], pSfbMaxScaleSpec[1]+w*maxSfb[1], hThisPsyConf[1]->sfbOffset, psyData[0]->sfbActive, pSfbEnergyMS[0]+w*maxSfb[0], pSfbEnergyMS[1]+w*maxSfb[1], (psyStatic[1]->blockSwitchingControl.lastWindowSequence != SHORT_WINDOW), psyData[0]->sfbEnergyMSLdData, psyData[1]->sfbEnergyMSLdData); } } /* group short data (maxSfb[ch] for short blocks is determined here) */ for(ch=0;chblockSwitchingControl.noOfGroups * hPsyConfShort->sfbCnt; /* At this point, energies and thresholds are copied/regrouped from the ".Short" to the ".Long" arrays */ FDKaacEnc_groupShortData( psyData[ch]->mdctSpectrum, &psyData[ch]->sfbThreshold, &psyData[ch]->sfbEnergy, &psyData[ch]->sfbEnergyMS, &psyData[ch]->sfbSpreadEnergy, hPsyConfShort->sfbCnt, psyData[ch]->sfbActive, hPsyConfShort->sfbOffset, hPsyConfShort->sfbMinSnrLdData, psyData[ch]->groupedSfbOffset, &maxSfbPerGroup[ch], psyOutChannel[ch]->sfbMinSnrLdData, psyStatic[ch]->blockSwitchingControl.noOfGroups, psyStatic[ch]->blockSwitchingControl.groupLen, psyConf[1].granuleLength); /* calculate ldData arrays (short values are in .Long-arrays after FDKaacEnc_groupShortData) */ for (sfbGrp = 0; sfbGrp < noSfb; sfbGrp += hPsyConfShort->sfbCnt) { LdDataVector(&psyData[ch]->sfbEnergy.Long[sfbGrp], &psyOutChannel[ch]->sfbEnergyLdData[sfbGrp], psyData[ch]->sfbActive); } /* calc sfbThrld and set Values smaller 2^-31 to 2^-33*/ for (sfbGrp = 0; sfbGrp < noSfb; sfbGrp += hPsyConfShort->sfbCnt) { LdDataVector(&psyData[ch]->sfbThreshold.Long[sfbGrp], &psyOutChannel[ch]->sfbThresholdLdData[sfbGrp], psyData[ch]->sfbActive); for (sfb=0;sfbsfbActive;sfb++) { psyOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb] = fixMax(psyOutChannel[ch]->sfbThresholdLdData[sfbGrp+sfb], FL2FXCONST_DBL(-0.515625f)); } } if ( channels==2 ) { for (sfbGrp = 0; sfbGrp < noSfb; sfbGrp += hPsyConfShort->sfbCnt) { LdDataVector(&psyData[ch]->sfbEnergyMS.Long[sfbGrp], &psyData[ch]->sfbEnergyMSLdData[sfbGrp], psyData[ch]->sfbActive); } } FDKmemcpy(psyOutChannel[ch]->sfbOffsets, psyData[ch]->groupedSfbOffset, (MAX_GROUPED_SFB+1)*sizeof(INT)); } else { /* maxSfb[ch] for long blocks */ for (sfb = psyData[ch]->sfbActive-1; sfb >= 0; sfb--) { for (line = hPsyConfLong->sfbOffset[sfb+1]-1; line >= hPsyConfLong->sfbOffset[sfb]; line--) { if (psyData[ch]->mdctSpectrum[line] != FL2FXCONST_SGL(0.0f)) break; } if (line > hPsyConfLong->sfbOffset[sfb]) break; } maxSfbPerGroup[ch] = sfb + 1; /* ensure at least one section in ICS; workaround for existing decoder crc implementation */ maxSfbPerGroup[ch] = fixMax(fixMin(5,psyData[ch]->sfbActive),maxSfbPerGroup[ch]); /* sfbNrgLdData is calculated in FDKaacEnc_advancePsychLong, copy in psyOut structure */ FDKmemcpy(psyOutChannel[ch]->sfbEnergyLdData, psyData[ch]->sfbEnergyLdData.Long, psyData[ch]->sfbActive*sizeof(FIXP_DBL)); FDKmemcpy(psyOutChannel[ch]->sfbOffsets, hPsyConfLong->sfbOffset, (MAX_GROUPED_SFB+1)*sizeof(INT)); /* sfbMinSnrLdData modified in adjust threshold, copy necessary */ FDKmemcpy(psyOutChannel[ch]->sfbMinSnrLdData, hPsyConfLong->sfbMinSnrLdData, psyData[ch]->sfbActive*sizeof(FIXP_DBL)); /* sfbEnergyMSLdData ist already calculated in FDKaacEnc_CalcBandNrgMSOpt; only in long case */ /* calc sfbThrld and set Values smaller 2^-31 to 2^-33*/ LdDataVector(psyData[ch]->sfbThreshold.Long, psyOutChannel[ch]->sfbThresholdLdData, psyData[ch]->sfbActive); for (i=0;isfbActive;i++) { psyOutChannel[ch]->sfbThresholdLdData[i] = fixMax(psyOutChannel[ch]->sfbThresholdLdData[i], FL2FXCONST_DBL(-0.515625f)); } } } /* Intensity parameter intialization. */ for(ch=0;chisBook, MAX_GROUPED_SFB*sizeof(INT)); FDKmemclear(psyOutChannel[ch]->isScale, MAX_GROUPED_SFB*sizeof(INT)); } for(ch=0;chisLFE) { /* PNS Decision */ FDKaacEnc_PnsDetect( &(psyConf[0].pnsConf), pnsData[ch], psyStatic[ch]->blockSwitchingControl.lastWindowSequence, psyData[ch]->sfbActive, maxSfbPerGroup[ch], /* count of Sfb which are not zero. */ psyOutChannel[ch]->sfbThresholdLdData, psyConf[win].sfbOffset, psyData[ch]->mdctSpectrum, psyData[ch]->sfbMaxScaleSpec.Long, sfbTonality[ch], psyOutChannel[ch]->tnsInfo.order[0][0], tnsData[ch]->dataRaw.Long.subBlockInfo.predictionGain, tnsData[ch]->dataRaw.Long.subBlockInfo.tnsActive, psyOutChannel[ch]->sfbEnergyLdData, psyOutChannel[ch]->noiseNrg ); } /* !isLFE */ } /* stereo Processing */ if(channels == 2) { psyOutElement->toolsInfo.msDigest = MS_NONE; psyOutElement->commonWindow = commonWindow; if (psyOutElement->commonWindow) maxSfbPerGroup[0] = maxSfbPerGroup[1] = fixMax(maxSfbPerGroup[0], maxSfbPerGroup[1]); if(psyStatic[0]->blockSwitchingControl.lastWindowSequence != SHORT_WINDOW) { /* PNS preprocessing depending on ms processing: PNS not in Short Window! */ FDKaacEnc_PreProcessPnsChannelPair( psyData[0]->sfbActive, (&psyData[0]->sfbEnergy)->Long, (&psyData[1]->sfbEnergy)->Long, psyOutChannel[0]->sfbEnergyLdData, psyOutChannel[1]->sfbEnergyLdData, psyData[0]->sfbEnergyMS.Long, &(psyConf[0].pnsConf), pnsData[0], pnsData[1]); FDKaacEnc_IntensityStereoProcessing( psyData[0]->sfbEnergy.Long, psyData[1]->sfbEnergy.Long, psyData[0]->mdctSpectrum, psyData[1]->mdctSpectrum, psyData[0]->sfbThreshold.Long, psyData[1]->sfbThreshold.Long, psyOutChannel[1]->sfbThresholdLdData, psyData[0]->sfbSpreadEnergy.Long, psyData[1]->sfbSpreadEnergy.Long, psyOutChannel[0]->sfbEnergyLdData, psyOutChannel[1]->sfbEnergyLdData, &psyOutElement->toolsInfo.msDigest, psyOutElement->toolsInfo.msMask, psyConf[0].sfbCnt, psyConf[0].sfbCnt, maxSfbPerGroup[0], psyConf[0].sfbOffset, psyConf[0].allowIS && commonWindow, psyOutChannel[1]->isBook, psyOutChannel[1]->isScale, pnsData); FDKaacEnc_MsStereoProcessing( psyData, psyOutChannel, psyOutChannel[1]->isBook, &psyOutElement->toolsInfo.msDigest, psyOutElement->toolsInfo.msMask, psyData[0]->sfbActive, psyData[0]->sfbActive, maxSfbPerGroup[0], psyOutChannel[0]->sfbOffsets); /* PNS postprocessing */ FDKaacEnc_PostProcessPnsChannelPair(psyData[0]->sfbActive, &(psyConf[0].pnsConf), pnsData[0], pnsData[1], psyOutElement->toolsInfo.msMask, &psyOutElement->toolsInfo.msDigest); } else { FDKaacEnc_IntensityStereoProcessing( psyData[0]->sfbEnergy.Long, psyData[1]->sfbEnergy.Long, psyData[0]->mdctSpectrum, psyData[1]->mdctSpectrum, psyData[0]->sfbThreshold.Long, psyData[1]->sfbThreshold.Long, psyOutChannel[1]->sfbThresholdLdData, psyData[0]->sfbSpreadEnergy.Long, psyData[1]->sfbSpreadEnergy.Long, psyOutChannel[0]->sfbEnergyLdData, psyOutChannel[1]->sfbEnergyLdData, &psyOutElement->toolsInfo.msDigest, psyOutElement->toolsInfo.msMask, psyStatic[0]->blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt, psyConf[1].sfbCnt, maxSfbPerGroup[0], psyData[0]->groupedSfbOffset, psyConf[0].allowIS && commonWindow, psyOutChannel[1]->isBook, psyOutChannel[1]->isScale, pnsData); /* it's OK to pass the ".Long" arrays here. They contain grouped short data since FDKaacEnc_groupShortData() */ FDKaacEnc_MsStereoProcessing( psyData, psyOutChannel, psyOutChannel[1]->isBook, &psyOutElement->toolsInfo.msDigest, psyOutElement->toolsInfo.msMask, psyStatic[0]->blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt, hPsyConfShort->sfbCnt, maxSfbPerGroup[0], psyOutChannel[0]->sfbOffsets); } } /* PNS Coding */ for(ch=0;chisLFE) { /* no PNS coding */ for(sfb = 0; sfb < psyData[ch]->sfbActive; sfb++) { psyOutChannel[ch]->noiseNrg[sfb] = NO_NOISE_PNS; } } else { FDKaacEnc_CodePnsChannel(psyData[ch]->sfbActive, &(psyConf[ch].pnsConf), pnsData[ch]->pnsFlag, psyData[ch]->sfbEnergyLdData.Long, psyOutChannel[ch]->noiseNrg, /* this is the energy that will be written to the bitstream */ psyOutChannel[ch]->sfbThresholdLdData); } } /* build output */ for(ch=0;chmaxSfbPerGroup = maxSfbPerGroup[ch]; psyOutChannel[ch]->mdctScale = psyData[ch]->mdctScale; if(isShortWindow[ch]==0) { psyOutChannel[ch]->sfbCnt = hPsyConfLong->sfbActive; psyOutChannel[ch]->sfbPerGroup = hPsyConfLong->sfbActive; psyOutChannel[ch]->lastWindowSequence = psyStatic[ch]->blockSwitchingControl.lastWindowSequence; psyOutChannel[ch]->windowShape = psyStatic[ch]->blockSwitchingControl.windowShape; } else { INT sfbCnt = psyStatic[ch]->blockSwitchingControl.noOfGroups*hPsyConfShort->sfbCnt; psyOutChannel[ch]->sfbCnt = sfbCnt; psyOutChannel[ch]->sfbPerGroup = hPsyConfShort->sfbCnt; psyOutChannel[ch]->lastWindowSequence = SHORT_WINDOW; psyOutChannel[ch]->windowShape = SINE_WINDOW; } /* generate grouping mask */ mask = 0; for (grp = 0; grp < psyStatic[ch]->blockSwitchingControl.noOfGroups; grp++) { mask <<= 1; for (j=1; jblockSwitchingControl.groupLen[grp]; j++) { mask = (mask<<1) | 1 ; } } psyOutChannel[ch]->groupingMask = mask; /* build interface */ FDKmemcpy(psyOutChannel[ch]->groupLen,psyStatic[ch]->blockSwitchingControl.groupLen,MAX_NO_OF_GROUPS*sizeof(INT)); FDKmemcpy(psyOutChannel[ch]->sfbEnergy,(&psyData[ch]->sfbEnergy)->Long, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); FDKmemcpy(psyOutChannel[ch]->sfbSpreadEnergy,(&psyData[ch]->sfbSpreadEnergy)->Long, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); // FDKmemcpy(psyOutChannel[ch]->mdctSpectrum, psyData[ch]->mdctSpectrum, (1024)*sizeof(FIXP_DBL)); } return AAC_ENC_OK; } void FDKaacEnc_PsyClose(PSY_INTERNAL **phPsyInternal, PSY_OUT **phPsyOut) { int n, i; if(phPsyInternal!=NULL) { PSY_INTERNAL *hPsyInternal = *phPsyInternal; if (hPsyInternal) { for (i=0; i<(8); i++) { if (hPsyInternal->pStaticChannels[i]) { if (hPsyInternal->pStaticChannels[i]->psyInputBuffer) FreeRam_aacEnc_PsyInputBuffer(&hPsyInternal->pStaticChannels[i]->psyInputBuffer); /* AUDIO INPUT BUFFER */ FreeRam_aacEnc_PsyStatic(&hPsyInternal->pStaticChannels[i]); /* PSY_STATIC */ } } for (i=0; i<(8); i++) { if (hPsyInternal->psyElement[i]) FreeRam_aacEnc_PsyElement(&hPsyInternal->psyElement[i]); /* PSY_ELEMENT */ } FreeRam_aacEnc_PsyInternal(phPsyInternal); } } if (phPsyOut!=NULL) { for (n=0; n<(1); n++) { if (phPsyOut[n]) { for (i=0; i<(8); i++) { if (phPsyOut[n]->pPsyOutChannels[i]) FreeRam_aacEnc_PsyOutChannel(&phPsyOut[n]->pPsyOutChannels[i]); /* PSY_OUT_CHANNEL */ } for (i=0; i<(8); i++) { if (phPsyOut[n]->psyOutElement[i]) FreeRam_aacEnc_PsyOutElements(&phPsyOut[n]->psyOutElement[i]); /* PSY_OUT_ELEMENTS */ } FreeRam_aacEnc_PsyOut(&phPsyOut[n]); } } } } fdk-aac-0.1.3/libAACenc/src/bit_cnt.cpp0000644000175000017500000006750312372261464020103 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Huffman Bitcounter & coder ******************************************************************************/ #include "bit_cnt.h" #include "aacEnc_ram.h" #define HI_LTAB(a) (a>>16) #define LO_LTAB(a) (a & 0xffff) /***************************************************************************** functionname: FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11 description: counts tables 1-11 returns: input: quantized spectrum output: bitCount for tables 1-11 *****************************************************************************/ static void FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc1_2,bc3_4,bc5_6,bc7_8,bc9_10,bc11,sc; INT t0,t1,t2,t3; bc1_2=0; bc3_4=0; bc5_6=0; bc7_8=0; bc9_10=0; bc11=0; sc=0; for(i=0;i0)+(t1>0)+(t2>0)+(t3>0); } bitCount[1]=HI_LTAB(bc1_2); bitCount[2]=LO_LTAB(bc1_2); bitCount[3]=HI_LTAB(bc3_4)+sc; bitCount[4]=LO_LTAB(bc3_4)+sc; bitCount[5]=HI_LTAB(bc5_6); bitCount[6]=LO_LTAB(bc5_6); bitCount[7]=HI_LTAB(bc7_8)+sc; bitCount[8]=LO_LTAB(bc7_8)+sc; bitCount[9]=HI_LTAB(bc9_10)+sc; bitCount[10]=LO_LTAB(bc9_10)+sc; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_count3_4_5_6_7_8_9_10_11 description: counts tables 3-11 returns: input: quantized spectrum output: bitCount for tables 3-11 *****************************************************************************/ static void FDKaacEnc_count3_4_5_6_7_8_9_10_11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc3_4,bc5_6,bc7_8,bc9_10,bc11,sc; INT t0,t1,t2,t3; bc3_4=0; bc5_6=0; bc7_8=0; bc9_10=0; bc11=0; sc=0; for(i=0;i0)+(t1>0)+(t2>0)+(t3>0); } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; bitCount[3]=HI_LTAB(bc3_4)+sc; bitCount[4]=LO_LTAB(bc3_4)+sc; bitCount[5]=HI_LTAB(bc5_6); bitCount[6]=LO_LTAB(bc5_6); bitCount[7]=HI_LTAB(bc7_8)+sc; bitCount[8]=LO_LTAB(bc7_8)+sc; bitCount[9]=HI_LTAB(bc9_10)+sc; bitCount[10]=LO_LTAB(bc9_10)+sc; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_count5_6_7_8_9_10_11 description: counts tables 5-11 returns: input: quantized spectrum output: bitCount for tables 5-11 *****************************************************************************/ static void FDKaacEnc_count5_6_7_8_9_10_11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc5_6,bc7_8,bc9_10,bc11,sc; INT t0,t1; bc5_6=0; bc7_8=0; bc9_10=0; bc11=0; sc=0; for(i=0;i0)+(t1>0); } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; bitCount[3]=INVALID_BITCOUNT; bitCount[4]=INVALID_BITCOUNT; bitCount[5]=HI_LTAB(bc5_6); bitCount[6]=LO_LTAB(bc5_6); bitCount[7]=HI_LTAB(bc7_8)+sc; bitCount[8]=LO_LTAB(bc7_8)+sc; bitCount[9]=HI_LTAB(bc9_10)+sc; bitCount[10]=LO_LTAB(bc9_10)+sc; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_count7_8_9_10_11 description: counts tables 7-11 returns: input: quantized spectrum output: bitCount for tables 7-11 *****************************************************************************/ static void FDKaacEnc_count7_8_9_10_11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc7_8,bc9_10,bc11,sc; INT t0,t1; bc7_8=0; bc9_10=0; bc11=0; sc=0; for(i=0;i0)+(t1>0); } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; bitCount[3]=INVALID_BITCOUNT; bitCount[4]=INVALID_BITCOUNT; bitCount[5]=INVALID_BITCOUNT; bitCount[6]=INVALID_BITCOUNT; bitCount[7]=HI_LTAB(bc7_8)+sc; bitCount[8]=LO_LTAB(bc7_8)+sc; bitCount[9]=HI_LTAB(bc9_10)+sc; bitCount[10]=LO_LTAB(bc9_10)+sc; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_count9_10_11 description: counts tables 9-11 returns: input: quantized spectrum output: bitCount for tables 9-11 *****************************************************************************/ static void FDKaacEnc_count9_10_11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc9_10,bc11,sc; INT t0,t1; bc9_10=0; bc11=0; sc=0; for(i=0;i0)+(t1>0); } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; bitCount[3]=INVALID_BITCOUNT; bitCount[4]=INVALID_BITCOUNT; bitCount[5]=INVALID_BITCOUNT; bitCount[6]=INVALID_BITCOUNT; bitCount[7]=INVALID_BITCOUNT; bitCount[8]=INVALID_BITCOUNT; bitCount[9]=HI_LTAB(bc9_10)+sc; bitCount[10]=LO_LTAB(bc9_10)+sc; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_count11 description: counts table 11 returns: input: quantized spectrum output: bitCount for table 11 *****************************************************************************/ static void FDKaacEnc_count11(const SHORT *RESTRICT values, const INT width, INT *bitCount) { INT i; INT bc11,sc; INT t0,t1; bc11=0; sc=0; for(i=0;i0)+(t1>0); } bitCount[1]=INVALID_BITCOUNT; bitCount[2]=INVALID_BITCOUNT; bitCount[3]=INVALID_BITCOUNT; bitCount[4]=INVALID_BITCOUNT; bitCount[5]=INVALID_BITCOUNT; bitCount[6]=INVALID_BITCOUNT; bitCount[7]=INVALID_BITCOUNT; bitCount[8]=INVALID_BITCOUNT; bitCount[9]=INVALID_BITCOUNT; bitCount[10]=INVALID_BITCOUNT; bitCount[11]=bc11+sc; } /***************************************************************************** functionname: FDKaacEnc_countEsc description: counts table 11 (with Esc) returns: input: quantized spectrum output: bitCount for tables 11 (with Esc) *****************************************************************************/ static void FDKaacEnc_countEsc(const SHORT *RESTRICT values, const INT width, INT *RESTRICT bitCount) { INT i; INT bc11,ec,sc; INT t0,t1,t00,t01; bc11=0; sc=0; ec=0; for(i=0;i0)+(t1>0); t00 = fixMin(t0,16); t01 = fixMin(t1,16); bc11+= (INT) FDKaacEnc_huff_ltab11[t00][t01]; if(t0>=16){ ec+=5; while((t0>>=1) >= 16) ec+=2; } if(t1>=16){ ec+=5; while((t1>>=1) >= 16) ec+=2; } } for (i=0; i<11; i++) bitCount[i]=INVALID_BITCOUNT; bitCount[11]=bc11+sc+ec; } typedef void (*COUNT_FUNCTION)(const SHORT *RESTRICT values, const INT width, INT *RESTRICT bitCount); static const COUNT_FUNCTION countFuncTable[CODE_BOOK_ESC_LAV+1] = { FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11, /* 0 */ FDKaacEnc_count1_2_3_4_5_6_7_8_9_10_11, /* 1 */ FDKaacEnc_count3_4_5_6_7_8_9_10_11, /* 2 */ FDKaacEnc_count5_6_7_8_9_10_11, /* 3 */ FDKaacEnc_count5_6_7_8_9_10_11, /* 4 */ FDKaacEnc_count7_8_9_10_11, /* 5 */ FDKaacEnc_count7_8_9_10_11, /* 6 */ FDKaacEnc_count7_8_9_10_11, /* 7 */ FDKaacEnc_count9_10_11, /* 8 */ FDKaacEnc_count9_10_11, /* 9 */ FDKaacEnc_count9_10_11, /* 10 */ FDKaacEnc_count9_10_11, /* 11 */ FDKaacEnc_count9_10_11, /* 12 */ FDKaacEnc_count11, /* 13 */ FDKaacEnc_count11, /* 14 */ FDKaacEnc_count11, /* 15 */ FDKaacEnc_countEsc /* 16 */ }; INT FDKaacEnc_bitCount(const SHORT *values, const INT width, INT maxVal, INT *bitCount) { /* check if we can use codebook 0 */ if(maxVal == 0) bitCount[0] = 0; else bitCount[0] = INVALID_BITCOUNT; maxVal = fixMin(maxVal,(INT)CODE_BOOK_ESC_LAV); countFuncTable[maxVal](values,width,bitCount); return(0); } /* count difference between actual and zeroed lines */ INT FDKaacEnc_countValues(SHORT *RESTRICT values, INT width, INT codeBook) { INT i,t0,t1,t2,t3,t00,t01; INT codeLength; INT signLength; INT bitCnt=0; switch(codeBook){ case CODE_BOOK_ZERO_NO: break; case CODE_BOOK_1_NO: for(i=0; i=16){ INT n,p; n=0; p=t0; while((p>>=1) >=16){ bitCnt++; n++; } bitCnt+=(n+5); } if(t1 >=16){ INT n,p; n=0; p=t1; while((p>>=1) >=16){ bitCnt++; n++; } bitCnt+=(n+5); } } break; default: break; } return(bitCnt); } INT FDKaacEnc_codeValues(SHORT *RESTRICT values, INT width, INT codeBook, HANDLE_FDK_BITSTREAM hBitstream) { INT i,t0,t1,t2,t3,t00,t01; INT codeWord,codeLength; INT sign,signLength; switch(codeBook){ case CODE_BOOK_ZERO_NO: break; case CODE_BOOK_1_NO: for(i=0; i=16){ INT n,p; n=0; p=t0; while((p>>=1) >=16){ FDKwriteBits(hBitstream,1,1); n++; } FDKwriteBits(hBitstream,0,1); FDKwriteBits(hBitstream,t0-(1<<(n+4)),n+4); } if(t1 >=16){ INT n,p; n=0; p=t1; while((p>>=1) >=16){ FDKwriteBits(hBitstream,1,1); n++; } FDKwriteBits(hBitstream,0,1); FDKwriteBits(hBitstream,t1-(1<<(n+4)),n+4); } } break; default: break; } return(0); } INT FDKaacEnc_codeScalefactorDelta(INT delta, HANDLE_FDK_BITSTREAM hBitstream) { INT codeWord,codeLength; if(fixp_abs(delta) >CODE_BOOK_SCF_LAV) return(1); codeWord = FDKaacEnc_huff_ctabscf[delta+CODE_BOOK_SCF_LAV]; codeLength = (INT)FDKaacEnc_huff_ltabscf[delta+CODE_BOOK_SCF_LAV]; FDKwriteBits(hBitstream,codeWord,codeLength); return(0); } fdk-aac-0.1.3/libAACenc/src/psy_const.h0000644000175000017500000001457412372261464020147 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Global psychoaccoustic constants ******************************************************************************/ #ifndef _PSYCONST_H #define _PSYCONST_H #define TRUE 1 #define FALSE 0 #define TRANS_FAC 8 /* encoder short long ratio */ #define FRAME_MAXLEN_SHORT ((1024)/TRANS_FAC) #define FRAME_LEN_SHORT_128 ((1024)/TRANS_FAC) /* Filterbank type*/ enum FB_TYPE { FB_LC = 0, FB_LD = 1, FB_ELD = 2 }; /* Block types */ #define N_BLOCKTYPES 6 enum { LONG_WINDOW = 0, START_WINDOW, SHORT_WINDOW, STOP_WINDOW, _LOWOV_WINDOW, /* Do not use this block type out side of block_switch.cpp */ WRONG_WINDOW }; /* Window shapes */ enum { SINE_WINDOW = 0, KBD_WINDOW = 1, LOL_WINDOW = 2 /* Low OverLap window shape for AAC-LD */ }; /* MS stuff */ enum { SI_MS_MASK_NONE = 0, SI_MS_MASK_SOME = 1, SI_MS_MASK_ALL = 2 }; #define MAX_NO_OF_GROUPS 4 #define MAX_SFB_LONG 51 /* 51 for a memory optimized implementation, maybe 64 for convenient debugging */ #define MAX_SFB_SHORT 15 /* 15 for a memory optimized implementation, maybe 16 for convenient debugging */ #define MAX_SFB (MAX_SFB_SHORT > MAX_SFB_LONG ? MAX_SFB_SHORT : MAX_SFB_LONG) /* = 51 */ #define MAX_GROUPED_SFB (MAX_NO_OF_GROUPS*MAX_SFB_SHORT > MAX_SFB_LONG ? \ MAX_NO_OF_GROUPS*MAX_SFB_SHORT : MAX_SFB_LONG) /* = 60 */ #define MAX_INPUT_BUFFER_SIZE (2*(1024)) /* 2048 */ #define PCM_LEVEL 1.0f #define NORM_PCM (PCM_LEVEL/32768.0f) #define NORM_PCM_ENERGY (NORM_PCM*NORM_PCM) #define LOG_NORM_PCM -15 #define TNS_PREDGAIN_SCALE (1000) #define LFE_LOWPASS_LINE 12 #endif /* _PSYCONST_H */ fdk-aac-0.1.3/libAACenc/src/aacenc_pns.cpp0000644000175000017500000005303512372261464020546 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Lohwasser contents/description: pns.c ******************************************************************************/ #include "aacenc_pns.h" #include "psy_data.h" #include "pnsparam.h" #include "noisedet.h" #include "bit_cnt.h" #include "interface.h" /* minCorrelationEnergy = (1.0e-10f)^2 ~ 2^-67 = 2^-47 * 2^-20 */ static const FIXP_DBL minCorrelationEnergy = FL2FXCONST_DBL(0.0); /* FL2FXCONST_DBL((float)FDKpow(2.0,-47)); */ /* noiseCorrelationThresh = 0.6^2 */ static const FIXP_DBL noiseCorrelationThresh = FL2FXCONST_DBL(0.36); static void FDKaacEnc_FDKaacEnc_noiseDetection( PNS_CONFIG *pnsConf, PNS_DATA *pnsData, const INT sfbActive, const INT *sfbOffset, INT tnsOrder, INT tnsPredictionGain, INT tnsActive, FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, FIXP_SGL *sfbtonality ); static void FDKaacEnc_CalcNoiseNrgs( const INT sfbActive, INT *pnsFlag, FIXP_DBL *sfbEnergyLdData, INT *noiseNrg ); /***************************************************************************** functionname: initPnsConfiguration description: fill pnsConf with pns parameters returns: error status input: PNS Config struct (modified) bitrate, samplerate, usePns, number of sfb's, pointer to sfb offset output: error code *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_InitPnsConfiguration(PNS_CONFIG *pnsConf, INT bitRate, INT sampleRate, INT usePns, INT sfbCnt, const INT *sfbOffset, const INT numChan, const INT isLC) { AAC_ENCODER_ERROR ErrorStatus; /* init noise detection */ ErrorStatus = FDKaacEnc_GetPnsParam(&pnsConf->np, bitRate, sampleRate, sfbCnt, sfbOffset, &usePns, numChan, isLC); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; pnsConf->minCorrelationEnergy = minCorrelationEnergy; pnsConf->noiseCorrelationThresh = noiseCorrelationThresh; pnsConf->usePns = usePns; return AAC_ENC_OK; } /***************************************************************************** functionname: FDKaacEnc_PnsDetect description: do decision, if PNS shall used or not returns: input: pns config structure pns data structure (modified), lastWindowSequence (long or short blocks) sfbActive pointer to Sfb Energy, Threshold, Offset pointer to mdct Spectrum length of each group pointer to tonality calculated in chaosmeasure tns order and prediction gain calculated noiseNrg at active PNS output: pnsFlag in pns data structure *****************************************************************************/ void FDKaacEnc_PnsDetect(PNS_CONFIG *pnsConf, PNS_DATA *pnsData, const INT lastWindowSequence, const INT sfbActive, const INT maxSfbPerGroup, FIXP_DBL *sfbThresholdLdData, const INT *sfbOffset, FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, FIXP_SGL *sfbtonality, INT tnsOrder, INT tnsPredictionGain, INT tnsActive, FIXP_DBL *sfbEnergyLdData, INT *noiseNrg ) { int sfb; int startNoiseSfb; if (pnsConf->np.detectionAlgorithmFlags & IS_LOW_COMLEXITY) { if ( (!pnsConf->usePns) || /* pns enabled? */ (lastWindowSequence == SHORT_WINDOW) ) /* currently only long blocks */ { FDKmemclear(pnsData->pnsFlag, MAX_GROUPED_SFB*sizeof(INT)); /* clear all pnsFlags */ for (sfb=0; sfbusePns) return; /* PNS only for long Windows */ if (pnsConf->np.detectionAlgorithmFlags & JUST_LONG_WINDOW) { if(lastWindowSequence != LONG_WINDOW) { for (sfb = 0; sfb < sfbActive; sfb++) { pnsData->pnsFlag[sfb] = 0; /* clear all pnsFlags */ } return; } } } /* call noise detection */ FDKaacEnc_FDKaacEnc_noiseDetection( pnsConf, pnsData, sfbActive, sfbOffset, tnsOrder, tnsPredictionGain, tnsActive, mdctSpectrum, sfbMaxScaleSpec, sfbtonality ); /* set startNoiseSfb (long) */ startNoiseSfb = pnsConf->np.startSfb; /* Set noise substitution status */ for(sfb = 0; sfb < sfbActive; sfb++) { /* No PNS below startNoiseSfb */ if(sfb < startNoiseSfb){ pnsData->pnsFlag[sfb] = 0; continue; } /* do noise substitution if fuzzy measure is high enough sfb freq > minimum sfb freq signal in coder band is not masked */ if((pnsData->noiseFuzzyMeasure[sfb] > FL2FXCONST_SGL(0.5)) && ( (sfbThresholdLdData[sfb] + FL2FXCONST_DBL(0.5849625f/64.0f)) /* thr * 1.5 = thrLd +ld(1.5)/64 */ < sfbEnergyLdData[sfb] ) ) { /* mark in psyout flag array that we will code this band with PNS */ pnsData->pnsFlag[sfb] = 1; /* PNS_ON */ } else{ pnsData->pnsFlag[sfb] = 0; /* PNS_OFF */ } /* no PNS if LTP is active */ } /* avoid PNS holes */ if((pnsData->noiseFuzzyMeasure[0]>FL2FXCONST_SGL(0.5f)) && (pnsData->pnsFlag[1])) { pnsData->pnsFlag[0] = 1; } for(sfb=1; sfbnoiseFuzzyMeasure[sfb]>pnsConf->np.gapFillThr) && (pnsData->pnsFlag[sfb-1]) && (pnsData->pnsFlag[sfb+1])) { pnsData->pnsFlag[sfb] = 1; } } if(maxSfbPerGroup>0) { /* avoid PNS hole */ if((pnsData->noiseFuzzyMeasure[maxSfbPerGroup-1]>pnsConf->np.gapFillThr) && (pnsData->pnsFlag[maxSfbPerGroup-2])) { pnsData->pnsFlag[maxSfbPerGroup-1] = 1; } /* avoid single PNS band */ if(pnsData->pnsFlag[maxSfbPerGroup-2]==0) { pnsData->pnsFlag[maxSfbPerGroup-1] = 0; } } /* avoid single PNS bands */ if(pnsData->pnsFlag[1]==0) { pnsData->pnsFlag[0] = 0; } for(sfb=1; sfbpnsFlag[sfb-1]==0)&&(pnsData->pnsFlag[sfb+1]==0)) { pnsData->pnsFlag[sfb] = 0; } } /* calculate noiseNrg's */ FDKaacEnc_CalcNoiseNrgs( sfbActive, pnsData->pnsFlag, sfbEnergyLdData, noiseNrg ); } /***************************************************************************** functionname:FDKaacEnc_FDKaacEnc_noiseDetection description: wrapper for noisedet.c returns: input: pns config structure pns data structure (modified), sfbActive tns order and prediction gain pointer to mdct Spectrumand Sfb Energy pointer to Sfb tonality output: noiseFuzzyMeasure in structure pnsData flags tonal / nontonal *****************************************************************************/ static void FDKaacEnc_FDKaacEnc_noiseDetection( PNS_CONFIG *pnsConf, PNS_DATA *pnsData, const INT sfbActive, const INT *sfbOffset, int tnsOrder, INT tnsPredictionGain, INT tnsActive, FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, FIXP_SGL *sfbtonality ) { INT condition = TRUE; if ( !(pnsConf->np.detectionAlgorithmFlags & IS_LOW_COMLEXITY) ) { condition = (tnsOrder > 3); } /* no PNS if heavy TNS activity clear pnsData->noiseFuzzyMeasure */ if((pnsConf->np.detectionAlgorithmFlags & USE_TNS_GAIN_THR) && (tnsPredictionGain >= pnsConf->np.tnsGainThreshold) && condition && !((pnsConf->np.detectionAlgorithmFlags & USE_TNS_PNS) && (tnsPredictionGain >= pnsConf->np.tnsPNSGainThreshold) && (tnsActive)) ) { /* clear all noiseFuzzyMeasure */ FDKmemclear(pnsData->noiseFuzzyMeasure, sfbActive*sizeof(FIXP_SGL)); } else { /* call noise detection, output in pnsData->noiseFuzzyMeasure, use real mdct spectral data */ FDKaacEnc_noiseDetect( mdctSpectrum, sfbMaxScaleSpec, sfbActive, sfbOffset, pnsData->noiseFuzzyMeasure, &pnsConf->np, sfbtonality); } } /***************************************************************************** functionname:FDKaacEnc_CalcNoiseNrgs description: Calculate the NoiseNrg's returns: input: sfbActive if pnsFlag calculate NoiseNrg pointer to sfbEnergy and groupLen pointer to noiseNrg (modified) output: noiseNrg's in pnsFlaged sfb's *****************************************************************************/ static void FDKaacEnc_CalcNoiseNrgs( const INT sfbActive, INT *RESTRICT pnsFlag, FIXP_DBL *RESTRICT sfbEnergyLdData, INT *RESTRICT noiseNrg ) { int sfb; INT tmp = (-LOG_NORM_PCM)<<2; for(sfb = 0; sfb < sfbActive; sfb++) { if(pnsFlag[sfb]) { INT nrg = (-sfbEnergyLdData[sfb]+FL2FXCONST_DBL(0.5f/64.0f))>>(DFRACT_BITS-1-7); noiseNrg[sfb] = tmp - nrg; } } } /***************************************************************************** functionname:FDKaacEnc_CodePnsChannel description: Execute pns decission returns: input: sfbActive pns config structure use PNS if pnsFlag pointer to Sfb Energy, noiseNrg, Threshold output: set sfbThreshold high to code pe with 0, noiseNrg marks flag for pns coding *****************************************************************************/ void FDKaacEnc_CodePnsChannel(const INT sfbActive, PNS_CONFIG *pnsConf, INT *RESTRICT pnsFlag, FIXP_DBL *RESTRICT sfbEnergyLdData, INT *RESTRICT noiseNrg, FIXP_DBL *RESTRICT sfbThresholdLdData) { INT sfb; INT lastiNoiseEnergy = 0; INT firstPNSband = 1; /* TRUE for first PNS-coded band */ /* no PNS */ if(!pnsConf->usePns) { for(sfb = 0; sfb < sfbActive; sfb++) { /* no PNS coding */ noiseNrg[sfb] = NO_NOISE_PNS; } return; } /* code PNS */ for(sfb = 0; sfb < sfbActive; sfb++) { if(pnsFlag[sfb]) { /* high sfbThreshold causes pe = 0 */ if(noiseNrg[sfb] != NO_NOISE_PNS) sfbThresholdLdData[sfb] = sfbEnergyLdData[sfb] + FL2FXCONST_DBL(1.0f/LD_DATA_SCALING); /* set noiseNrg in valid region */ if(!firstPNSband) { INT deltaiNoiseEnergy = noiseNrg[sfb] - lastiNoiseEnergy; if(deltaiNoiseEnergy > CODE_BOOK_PNS_LAV) noiseNrg[sfb] -= deltaiNoiseEnergy - CODE_BOOK_PNS_LAV; else if(deltaiNoiseEnergy < -CODE_BOOK_PNS_LAV) noiseNrg[sfb] -= deltaiNoiseEnergy + CODE_BOOK_PNS_LAV; } else { firstPNSband = 0; } lastiNoiseEnergy = noiseNrg[sfb]; } else { /* no PNS coding */ noiseNrg[sfb] = NO_NOISE_PNS; } } } /***************************************************************************** functionname:FDKaacEnc_PreProcessPnsChannelPair description: Calculate the correlation of noise in a channel pair returns: input: sfbActive pointer to sfb energies left, right and mid channel pns config structure pns data structure left and right (modified) output: noiseEnergyCorrelation in pns data structure *****************************************************************************/ void FDKaacEnc_PreProcessPnsChannelPair(const INT sfbActive, FIXP_DBL *RESTRICT sfbEnergyLeft, FIXP_DBL *RESTRICT sfbEnergyRight, FIXP_DBL *RESTRICT sfbEnergyLeftLD, FIXP_DBL *RESTRICT sfbEnergyRightLD, FIXP_DBL *RESTRICT sfbEnergyMid, PNS_CONFIG *RESTRICT pnsConf, PNS_DATA *pnsDataLeft, PNS_DATA *pnsDataRight) { INT sfb; FIXP_DBL ccf; if(!pnsConf->usePns) return; FIXP_DBL *RESTRICT pNoiseEnergyCorrelationL = pnsDataLeft->noiseEnergyCorrelation; FIXP_DBL *RESTRICT pNoiseEnergyCorrelationR = pnsDataRight->noiseEnergyCorrelation; for(sfb=0;sfb< sfbActive;sfb++) { FIXP_DBL quot = (sfbEnergyLeftLD[sfb]>>1) + (sfbEnergyRightLD[sfb]>>1); if(quot < FL2FXCONST_DBL(-32.0f/(float)LD_DATA_SCALING)) ccf = FL2FXCONST_DBL(0.0f); else { FIXP_DBL accu = sfbEnergyMid[sfb]- (((sfbEnergyLeft[sfb]>>1)+(sfbEnergyRight[sfb]>>1))>>1); INT sign = (accu < FL2FXCONST_DBL(0.0f)) ? 1 : 0 ; accu = fixp_abs(accu); ccf = CalcLdData(accu) + FL2FXCONST_DBL((float)1.0f/(float)LD_DATA_SCALING) - quot; /* ld(accu*2) = ld(accu) + 1 */ ccf = (ccf>=FL2FXCONST_DBL(0.0)) ? ((FIXP_DBL)MAXVAL_DBL) : (sign) ? -CalcInvLdData(ccf) : CalcInvLdData(ccf); } pNoiseEnergyCorrelationL[sfb] = ccf; pNoiseEnergyCorrelationR[sfb] = ccf; } } /***************************************************************************** functionname:FDKaacEnc_PostProcessPnsChannelPair description: if PNS used at left and right channel, use msMask to flag correlation returns: input: sfbActive pns config structure pns data structure left and right (modified) pointer to msMask, flags correlation by pns coding (modified) Digest of MS coding output: pnsFlag in pns data structure, msFlag in msMask (flags correlation) *****************************************************************************/ void FDKaacEnc_PostProcessPnsChannelPair(const INT sfbActive, PNS_CONFIG *pnsConf, PNS_DATA *pnsDataLeft, PNS_DATA *pnsDataRight, INT *RESTRICT msMask, INT *msDigest ) { INT sfb; if(!pnsConf->usePns) return; for(sfb=0;sfbpnsFlag[sfb]) && (pnsDataRight->pnsFlag[sfb]) ) { /* AAC only: Standard */ /* do this to avoid ms flags in layers that should not have it */ if(pnsDataLeft->noiseEnergyCorrelation[sfb] <= pnsConf->noiseCorrelationThresh){ msMask[sfb] = 0; *msDigest = MS_SOME; } } else { /* No PNS coding */ pnsDataLeft->pnsFlag[sfb] = 0; pnsDataRight->pnsFlag[sfb] = 0; } } /* Use MS flag to signal noise correlation if pns is active in both channels */ if( (pnsDataLeft->pnsFlag[sfb]) && (pnsDataRight->pnsFlag[sfb]) ) { if(pnsDataLeft->noiseEnergyCorrelation[sfb] > pnsConf->noiseCorrelationThresh) { msMask[sfb] = 1; *msDigest = MS_SOME; } } } } fdk-aac-0.1.3/libAACenc/src/metadata_main.cpp0000644000175000017500000007760712372261464021253 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /********************** Fraunhofer IIS FDK AAC Encoder lib ****************** Author(s): V. Bacigalupo Description: Metadata Encoder library interface functions ******************************************************************************/ #include "metadata_main.h" #include "metadata_compressor.h" #include "FDK_bitstream.h" #include "FDK_audio.h" #include "genericStds.h" /*----------------- defines ----------------------*/ #define MAX_DRC_BANDS (1<<4) #define MAX_DRC_CHANNELS (8) #define MAX_DRC_FRAMELEN (2*1024) /*--------------- structure definitions --------------------*/ typedef struct AAC_METADATA { /* MPEG: Dynamic Range Control */ struct { UCHAR prog_ref_level_present; SCHAR prog_ref_level; UCHAR dyn_rng_sgn[MAX_DRC_BANDS]; UCHAR dyn_rng_ctl[MAX_DRC_BANDS]; UCHAR drc_bands_present; UCHAR drc_band_incr; UCHAR drc_band_top[MAX_DRC_BANDS]; UCHAR drc_interpolation_scheme; AACENC_METADATA_DRC_PROFILE drc_profile; INT drc_TargetRefLevel; /* used for Limiter */ /* excluded channels */ UCHAR excluded_chns_present; UCHAR exclude_mask[2]; /* MAX_NUMBER_CHANNELS/8 */ } mpegDrc; /* ETSI: addtl ancillary data */ struct { /* Heavy Compression */ UCHAR compression_on; /* flag, if compression value should be written */ UCHAR compression_value; /* compression value */ AACENC_METADATA_DRC_PROFILE comp_profile; INT comp_TargetRefLevel; /* used for Limiter */ INT timecode_coarse_status; INT timecode_fine_status; } etsiAncData; SCHAR centerMixLevel; /* center downmix level (0...7, according to table) */ SCHAR surroundMixLevel; /* surround downmix level (0...7, according to table) */ UCHAR WritePCEMixDwnIdx; /* flag */ UCHAR DmxLvl_On; /* flag */ UCHAR dolbySurroundMode; UCHAR metadataMode; /* indicate meta data mode in current frame (delay line) */ } AAC_METADATA; struct FDK_METADATA_ENCODER { INT metadataMode; HDRC_COMP hDrcComp; AACENC_MetaData submittedMetaData; INT nAudioDataDelay; INT nMetaDataDelay; INT nChannels; INT_PCM audioDelayBuffer[MAX_DRC_CHANNELS*MAX_DRC_FRAMELEN]; int audioDelayIdx; AAC_METADATA metaDataBuffer[3]; int metaDataDelayIdx; UCHAR drcInfoPayload[12]; UCHAR drcDsePayload[8]; INT matrix_mixdown_idx; AACENC_EXT_PAYLOAD exPayload[2]; INT nExtensions; INT finalizeMetaData; /* Delay switch off by one frame and write default configuration to finalize the metadata setup. */ }; /*---------------- constants -----------------------*/ static const AACENC_MetaData defaultMetaDataSetup = { AACENC_METADATA_DRC_NONE, AACENC_METADATA_DRC_NONE, -(31<<16), -(31<<16), 0, -(31<<16), 0, 0, 0, 0, 0 }; static const FIXP_DBL dmxTable[8] = { ((FIXP_DBL)MAXVAL_DBL), FL2FXCONST_DBL(0.841f), FL2FXCONST_DBL(0.707f), FL2FXCONST_DBL(0.596f), FL2FXCONST_DBL(0.500f), FL2FXCONST_DBL(0.422f), FL2FXCONST_DBL(0.355f), FL2FXCONST_DBL(0.000f) }; static const UCHAR surmix2matrix_mixdown_idx[8] = { 0, 0, 0, 1, 1, 2, 2, 3 }; /*--------------- function declarations --------------------*/ static FDK_METADATA_ERROR WriteMetadataPayload( const HANDLE_FDK_METADATA_ENCODER hMetaData, const AAC_METADATA * const pMetadata ); static INT WriteDynamicRangeInfoPayload( const AAC_METADATA* const pMetadata, UCHAR* const pExtensionPayload ); static INT WriteEtsiAncillaryDataPayload( const AAC_METADATA* const pMetadata, UCHAR* const pExtensionPayload ); static FDK_METADATA_ERROR CompensateAudioDelay( HANDLE_FDK_METADATA_ENCODER hMetaDataEnc, INT_PCM * const pAudioSamples, const INT nAudioSamples ); static FDK_METADATA_ERROR LoadSubmittedMetadata( const AACENC_MetaData * const hMetadata, const INT nChannels, const INT metadataMode, AAC_METADATA * const pAacMetaData ); static FDK_METADATA_ERROR ProcessCompressor( AAC_METADATA *pMetadata, HDRC_COMP hDrcComp, const INT_PCM * const pSamples, const INT nSamples ); /*------------- function definitions ----------------*/ static DRC_PROFILE convertProfile(AACENC_METADATA_DRC_PROFILE aacProfile) { DRC_PROFILE drcProfile = DRC_NONE; switch(aacProfile) { case AACENC_METADATA_DRC_NONE: drcProfile = DRC_NONE; break; case AACENC_METADATA_DRC_FILMSTANDARD: drcProfile = DRC_FILMSTANDARD; break; case AACENC_METADATA_DRC_FILMLIGHT: drcProfile = DRC_FILMLIGHT; break; case AACENC_METADATA_DRC_MUSICSTANDARD: drcProfile = DRC_MUSICSTANDARD; break; case AACENC_METADATA_DRC_MUSICLIGHT: drcProfile = DRC_MUSICLIGHT; break; case AACENC_METADATA_DRC_SPEECH: drcProfile = DRC_SPEECH; break; default: drcProfile = DRC_NONE; break; } return drcProfile; } /* convert dialog normalization to program reference level */ /* NOTE: this only is correct, if the decoder target level is set to -31dB for line mode / -20dB for RF mode */ static UCHAR dialnorm2progreflvl(const INT d) { return ((UCHAR)FDKmax(0, FDKmin((-d + (1<<13)) >> 14, 127))); } /* convert program reference level to dialog normalization */ static INT progreflvl2dialnorm(const UCHAR p) { return -((INT)(p<<(16-2))); } /* encode downmix levels to Downmixing_levels_MPEG4 */ static SCHAR encodeDmxLvls(const SCHAR cmixlev, const SCHAR surmixlev) { SCHAR dmxLvls = 0; dmxLvls |= 0x80 | (cmixlev << 4); /* center_mix_level_on */ dmxLvls |= 0x08 | surmixlev; /* surround_mix_level_on */ return dmxLvls; } /* encode AAC DRC gain (ISO/IEC 14496-3:2005 4.5.2.7) */ static void encodeDynrng(INT gain, UCHAR* const dyn_rng_ctl, UCHAR* const dyn_rng_sgn ) { if(gain < 0) { *dyn_rng_sgn = 1; gain = -gain; } else { *dyn_rng_sgn = 0; } gain = FDKmin(gain,(127<<14)); *dyn_rng_ctl = (UCHAR)((gain + (1<<13)) >> 14); } /* decode AAC DRC gain (ISO/IEC 14496-3:2005 4.5.2.7) */ static INT decodeDynrng(const UCHAR dyn_rng_ctl, const UCHAR dyn_rng_sgn) { INT tmp = ((INT)dyn_rng_ctl << (16-2)); if (dyn_rng_sgn) tmp = -tmp; return tmp; } /* encode AAC compression value (ETSI TS 101 154 page 99) */ static UCHAR encodeCompr(INT gain) { UCHAR x, y; INT tmp; /* tmp = (int)((48.164f - gain) / 6.0206f * 15 + 0.5f); */ tmp = ((3156476 - gain) * 15 + 197283) / 394566; if (tmp >= 240) { return 0xFF; } else if (tmp < 0) { return 0; } else { x = tmp / 15; y = tmp % 15; } return (x << 4) | y; } /* decode AAC compression value (ETSI TS 101 154 page 99) */ static INT decodeCompr(const UCHAR compr) { INT gain; SCHAR x = compr >> 4; /* 4 MSB of compr */ UCHAR y = (compr & 0x0F); /* 4 LSB of compr */ /* gain = (INT)((48.164f - 6.0206f * x - 0.4014f * y) ); */ gain = (INT)( scaleValue(((LONG)FL2FXCONST_DBL(6.0206f/128.f)*(8-x) - (LONG)FL2FXCONST_DBL(0.4014f/128.f)*y), -(DFRACT_BITS-1-7-16)) ); return gain; } FDK_METADATA_ERROR FDK_MetadataEnc_Open( HANDLE_FDK_METADATA_ENCODER *phMetaData ) { FDK_METADATA_ERROR err = METADATA_OK; HANDLE_FDK_METADATA_ENCODER hMetaData = NULL; if (phMetaData == NULL) { err = METADATA_INVALID_HANDLE; goto bail; } /* allocate memory */ hMetaData = (HANDLE_FDK_METADATA_ENCODER) FDKcalloc(1, sizeof(FDK_METADATA_ENCODER) ); if (hMetaData == NULL) { err = METADATA_MEMORY_ERROR; goto bail; } FDKmemclear(hMetaData, sizeof(FDK_METADATA_ENCODER)); /* Allocate DRC Compressor. */ if (FDK_DRC_Generator_Open(&hMetaData->hDrcComp)!=0) { err = METADATA_MEMORY_ERROR; goto bail; } /* Return metadata instance */ *phMetaData = hMetaData; return err; bail: FDK_MetadataEnc_Close(&hMetaData); return err; } FDK_METADATA_ERROR FDK_MetadataEnc_Close( HANDLE_FDK_METADATA_ENCODER *phMetaData ) { FDK_METADATA_ERROR err = METADATA_OK; if (phMetaData == NULL) { err = METADATA_INVALID_HANDLE; goto bail; } if (*phMetaData != NULL) { FDK_DRC_Generator_Close(&(*phMetaData)->hDrcComp); FDKfree(*phMetaData); *phMetaData = NULL; } bail: return err; } FDK_METADATA_ERROR FDK_MetadataEnc_Init( HANDLE_FDK_METADATA_ENCODER hMetaData, const INT resetStates, const INT metadataMode, const INT audioDelay, const UINT frameLength, const UINT sampleRate, const UINT nChannels, const CHANNEL_MODE channelMode, const CHANNEL_ORDER channelOrder ) { FDK_METADATA_ERROR err = METADATA_OK; int i, nFrames, delay; if (hMetaData==NULL) { err = METADATA_INVALID_HANDLE; goto bail; } /* Determine values for delay compensation. */ for (nFrames=0, delay=audioDelay-frameLength; delay>0; delay-=frameLength, nFrames++); if ( (hMetaData->nChannels>MAX_DRC_CHANNELS) || ((-delay)>MAX_DRC_FRAMELEN) ) { err = METADATA_INIT_ERROR; goto bail; } /* Initialize with default setup. */ FDKmemcpy(&hMetaData->submittedMetaData, &defaultMetaDataSetup, sizeof(AACENC_MetaData)); hMetaData->finalizeMetaData = 0; /* finalize meta data only while on/off switching, else disabled */ /* Reset delay lines. */ if ( resetStates || (hMetaData->nAudioDataDelay!=-delay) || (hMetaData->nChannels!=(INT)nChannels) ) { FDKmemclear(hMetaData->audioDelayBuffer, sizeof(hMetaData->audioDelayBuffer)); FDKmemclear(hMetaData->metaDataBuffer, sizeof(hMetaData->metaDataBuffer)); hMetaData->audioDelayIdx = 0; hMetaData->metaDataDelayIdx = 0; } else { /* Enable meta data. */ if ( (hMetaData->metadataMode==0) && (metadataMode!=0) ) { /* disable meta data in all delay lines */ for (i=0; i<(int)(sizeof(hMetaData->metaDataBuffer)/sizeof(AAC_METADATA)); i++) { LoadSubmittedMetadata(&hMetaData->submittedMetaData, nChannels, 0, &hMetaData->metaDataBuffer[i]); } } /* Disable meta data.*/ if ( (hMetaData->metadataMode!=0) && (metadataMode==0) ) { hMetaData->finalizeMetaData = hMetaData->metadataMode; } } /* Initialize delay. */ hMetaData->nAudioDataDelay = -delay; hMetaData->nMetaDataDelay = nFrames; hMetaData->nChannels = nChannels; hMetaData->metadataMode = metadataMode; /* Initialize compressor. */ if (metadataMode != 0) { if ( FDK_DRC_Generator_Initialize( hMetaData->hDrcComp, DRC_NONE, DRC_NONE, frameLength, sampleRate, channelMode, channelOrder, 1) != 0) { err = METADATA_INIT_ERROR; } } bail: return err; } static FDK_METADATA_ERROR ProcessCompressor( AAC_METADATA *pMetadata, HDRC_COMP hDrcComp, const INT_PCM * const pSamples, const INT nSamples ) { FDK_METADATA_ERROR err = METADATA_OK; INT dynrng, compr; DRC_PROFILE profileDrc = convertProfile(pMetadata->mpegDrc.drc_profile); DRC_PROFILE profileComp = convertProfile(pMetadata->etsiAncData.comp_profile); if ( (pMetadata==NULL) || (hDrcComp==NULL) ) { err = METADATA_INVALID_HANDLE; return err; } /* first, check if profile is same as last frame * otherwise, update setup */ if ( (profileDrc != FDK_DRC_Generator_getDrcProfile(hDrcComp)) || (profileComp != FDK_DRC_Generator_getCompProfile(hDrcComp)) ) { FDK_DRC_Generator_setDrcProfile(hDrcComp, profileDrc, profileComp); } /* Sanity check */ if (profileComp == DRC_NONE) { pMetadata->etsiAncData.compression_value = 0x80; /* to ensure no external values will be written if not configured */ } /* in case of embedding external values, copy this now (limiter may overwrite them) */ dynrng = decodeDynrng(pMetadata->mpegDrc.dyn_rng_ctl[0], pMetadata->mpegDrc.dyn_rng_sgn[0]); compr = decodeCompr(pMetadata->etsiAncData.compression_value); /* Call compressor */ if (FDK_DRC_Generator_Calc(hDrcComp, pSamples, progreflvl2dialnorm(pMetadata->mpegDrc.prog_ref_level), pMetadata->mpegDrc.drc_TargetRefLevel, pMetadata->etsiAncData.comp_TargetRefLevel, dmxTable[pMetadata->centerMixLevel], dmxTable[pMetadata->surroundMixLevel], &dynrng, &compr) != 0) { err = METADATA_ENCODE_ERROR; goto bail; } /* Write DRC values */ pMetadata->mpegDrc.drc_band_incr = 0; encodeDynrng(dynrng, pMetadata->mpegDrc.dyn_rng_ctl, pMetadata->mpegDrc.dyn_rng_sgn); pMetadata->etsiAncData.compression_value = encodeCompr(compr); bail: return err; } FDK_METADATA_ERROR FDK_MetadataEnc_Process( HANDLE_FDK_METADATA_ENCODER hMetaDataEnc, INT_PCM * const pAudioSamples, const INT nAudioSamples, const AACENC_MetaData * const pMetadata, AACENC_EXT_PAYLOAD ** ppMetaDataExtPayload, UINT * nMetaDataExtensions, INT * matrix_mixdown_idx ) { FDK_METADATA_ERROR err = METADATA_OK; int metaDataDelayWriteIdx, metaDataDelayReadIdx, metadataMode; /* Where to write new meta data info */ metaDataDelayWriteIdx = hMetaDataEnc->metaDataDelayIdx; /* How to write the data */ metadataMode = hMetaDataEnc->metadataMode; /* Compensate meta data delay. */ hMetaDataEnc->metaDataDelayIdx++; if (hMetaDataEnc->metaDataDelayIdx > hMetaDataEnc->nMetaDataDelay) hMetaDataEnc->metaDataDelayIdx = 0; /* Where to read pending meta data info from. */ metaDataDelayReadIdx = hMetaDataEnc->metaDataDelayIdx; /* Submit new data if available. */ if (pMetadata!=NULL) { FDKmemcpy(&hMetaDataEnc->submittedMetaData, pMetadata, sizeof(AACENC_MetaData)); } /* Write one additional frame with default configuration of meta data. Ensure defined behaviour on decoder side. */ if ( (hMetaDataEnc->finalizeMetaData!=0) && (hMetaDataEnc->metadataMode==0)) { FDKmemcpy(&hMetaDataEnc->submittedMetaData, &defaultMetaDataSetup, sizeof(AACENC_MetaData)); metadataMode = hMetaDataEnc->finalizeMetaData; hMetaDataEnc->finalizeMetaData = 0; } /* Get last submitted data. */ if ( (err = LoadSubmittedMetadata( &hMetaDataEnc->submittedMetaData, hMetaDataEnc->nChannels, metadataMode, &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx])) != METADATA_OK ) { goto bail; } /* Calculate compressor if necessary and updata meta data info */ if (hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx].metadataMode != 0) { if ( (err = ProcessCompressor( &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx], hMetaDataEnc->hDrcComp, pAudioSamples, nAudioSamples)) != METADATA_OK) { /* Get last submitted data again. */ LoadSubmittedMetadata( &hMetaDataEnc->submittedMetaData, hMetaDataEnc->nChannels, metadataMode, &hMetaDataEnc->metaDataBuffer[metaDataDelayWriteIdx]); } } /* Convert Meta Data side info to bitstream data. */ if ( (err = WriteMetadataPayload(hMetaDataEnc, &hMetaDataEnc->metaDataBuffer[metaDataDelayReadIdx])) != METADATA_OK ) { goto bail; } /* Assign meta data to output */ *ppMetaDataExtPayload = hMetaDataEnc->exPayload; *nMetaDataExtensions = hMetaDataEnc->nExtensions; *matrix_mixdown_idx = hMetaDataEnc->matrix_mixdown_idx; bail: /* Compensate audio delay, reset err status. */ err = CompensateAudioDelay(hMetaDataEnc, pAudioSamples, nAudioSamples); return err; } static FDK_METADATA_ERROR CompensateAudioDelay( HANDLE_FDK_METADATA_ENCODER hMetaDataEnc, INT_PCM * const pAudioSamples, const INT nAudioSamples ) { FDK_METADATA_ERROR err = METADATA_OK; if (hMetaDataEnc->nAudioDataDelay) { int i, delaySamples = hMetaDataEnc->nAudioDataDelay*hMetaDataEnc->nChannels; for (i = 0; i < nAudioSamples; i++) { INT_PCM tmp = pAudioSamples[i]; pAudioSamples[i] = hMetaDataEnc->audioDelayBuffer[hMetaDataEnc->audioDelayIdx]; hMetaDataEnc->audioDelayBuffer[hMetaDataEnc->audioDelayIdx] = tmp; hMetaDataEnc->audioDelayIdx++; if (hMetaDataEnc->audioDelayIdx >= delaySamples) hMetaDataEnc->audioDelayIdx = 0; } } return err; } /*----------------------------------------------------------------------------- functionname: WriteMetadataPayload description: fills anc data and extension payload returns: Error status ------------------------------------------------------------------------------*/ static FDK_METADATA_ERROR WriteMetadataPayload( const HANDLE_FDK_METADATA_ENCODER hMetaData, const AAC_METADATA * const pMetadata ) { FDK_METADATA_ERROR err = METADATA_OK; if ( (hMetaData==NULL) || (pMetadata==NULL) ) { err = METADATA_INVALID_HANDLE; goto bail; } hMetaData->nExtensions = 0; hMetaData->matrix_mixdown_idx = -1; /* AAC-DRC */ if (pMetadata->metadataMode != 0) { hMetaData->exPayload[hMetaData->nExtensions].pData = hMetaData->drcInfoPayload; hMetaData->exPayload[hMetaData->nExtensions].dataType = EXT_DYNAMIC_RANGE; hMetaData->exPayload[hMetaData->nExtensions].associatedChElement = -1; hMetaData->exPayload[hMetaData->nExtensions].dataSize = WriteDynamicRangeInfoPayload(pMetadata, hMetaData->exPayload[hMetaData->nExtensions].pData); hMetaData->nExtensions++; /* Matrix Mixdown Coefficient in PCE */ if (pMetadata->WritePCEMixDwnIdx) { hMetaData->matrix_mixdown_idx = surmix2matrix_mixdown_idx[pMetadata->surroundMixLevel]; } /* ETSI TS 101 154 (DVB) - MPEG4 ancillary_data() */ if (pMetadata->metadataMode == 2) /* MP4_METADATA_MPEG_ETSI */ { hMetaData->exPayload[hMetaData->nExtensions].pData = hMetaData->drcDsePayload; hMetaData->exPayload[hMetaData->nExtensions].dataType = EXT_DATA_ELEMENT; hMetaData->exPayload[hMetaData->nExtensions].associatedChElement = -1; hMetaData->exPayload[hMetaData->nExtensions].dataSize = WriteEtsiAncillaryDataPayload(pMetadata,hMetaData->exPayload[hMetaData->nExtensions].pData); hMetaData->nExtensions++; } /* metadataMode == 2 */ } /* metadataMode != 0 */ bail: return err; } static INT WriteDynamicRangeInfoPayload( const AAC_METADATA* const pMetadata, UCHAR* const pExtensionPayload ) { const INT pce_tag_present = 0; /* yet fixed setting! */ const INT prog_ref_lev_res_bits = 0; INT i, drc_num_bands = 1; FDK_BITSTREAM bsWriter; FDKinitBitStream(&bsWriter, pExtensionPayload, 16, 0, BS_WRITER); /* dynamic_range_info() */ FDKwriteBits(&bsWriter, pce_tag_present, 1); /* pce_tag_present */ if (pce_tag_present) { FDKwriteBits(&bsWriter, 0x0, 4); /* pce_instance_tag */ FDKwriteBits(&bsWriter, 0x0, 4); /* drc_tag_reserved_bits */ } /* Exclude channels */ FDKwriteBits(&bsWriter, (pMetadata->mpegDrc.excluded_chns_present) ? 1 : 0, 1); /* excluded_chns_present*/ /* Multiband DRC */ FDKwriteBits(&bsWriter, (pMetadata->mpegDrc.drc_bands_present) ? 1 : 0, 1); /* drc_bands_present */ if (pMetadata->mpegDrc.drc_bands_present) { FDKwriteBits(&bsWriter, pMetadata->mpegDrc.drc_band_incr, 4); /* drc_band_incr */ FDKwriteBits(&bsWriter, pMetadata->mpegDrc.drc_interpolation_scheme, 4); /* drc_interpolation_scheme */ drc_num_bands += pMetadata->mpegDrc.drc_band_incr; for (i=0; impegDrc.drc_band_top[i], 8); /* drc_band_top */ } } /* Program Reference Level */ FDKwriteBits(&bsWriter, pMetadata->mpegDrc.prog_ref_level_present, 1); /* prog_ref_level_present */ if (pMetadata->mpegDrc.prog_ref_level_present) { FDKwriteBits(&bsWriter, pMetadata->mpegDrc.prog_ref_level, 7); /* prog_ref_level */ FDKwriteBits(&bsWriter, prog_ref_lev_res_bits, 1); /* prog_ref_level_reserved_bits */ } /* DRC Values */ for (i=0; impegDrc.dyn_rng_sgn[i]) ? 1 : 0, 1); /* dyn_rng_sgn[ */ FDKwriteBits(&bsWriter, pMetadata->mpegDrc.dyn_rng_ctl[i], 7); /* dyn_rng_ctl */ } /* return number of valid bits in extension payload. */ return FDKgetValidBits(&bsWriter); } static INT WriteEtsiAncillaryDataPayload( const AAC_METADATA* const pMetadata, UCHAR* const pExtensionPayload ) { FDK_BITSTREAM bsWriter; FDKinitBitStream(&bsWriter, pExtensionPayload, 16, 0, BS_WRITER); /* ancillary_data_sync */ FDKwriteBits(&bsWriter, 0xBC, 8); /* bs_info */ FDKwriteBits(&bsWriter, 0x3, 2); /* mpeg_audio_type */ FDKwriteBits(&bsWriter, pMetadata->dolbySurroundMode, 2); /* dolby_surround_mode */ FDKwriteBits(&bsWriter, 0x0, 4); /* reserved */ /* ancillary_data_status */ FDKwriteBits(&bsWriter, 0, 3); /* 3 bit Reserved, set to "0" */ FDKwriteBits(&bsWriter, (pMetadata->DmxLvl_On) ? 1 : 0, 1); /* downmixing_levels_MPEG4_status */ FDKwriteBits(&bsWriter, 0, 1); /* Reserved, set to "0" */ FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.compression_on) ? 1 : 0, 1); /* audio_coding_mode_and_compression status */ FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.timecode_coarse_status) ? 1 : 0, 1); /* coarse_grain_timecode_status */ FDKwriteBits(&bsWriter, (pMetadata->etsiAncData.timecode_fine_status) ? 1 : 0, 1); /* fine_grain_timecode_status */ /* downmixing_levels_MPEG4_status */ if (pMetadata->DmxLvl_On) { FDKwriteBits(&bsWriter, encodeDmxLvls(pMetadata->centerMixLevel, pMetadata->surroundMixLevel), 8); } /* audio_coding_mode_and_compression_status */ if (pMetadata->etsiAncData.compression_on) { FDKwriteBits(&bsWriter, 0x01, 8); /* audio coding mode */ FDKwriteBits(&bsWriter, pMetadata->etsiAncData.compression_value, 8); /* compression value */ } /* grain-timecode coarse/fine */ if (pMetadata->etsiAncData.timecode_coarse_status) { FDKwriteBits(&bsWriter, 0x0, 16); /* not yet supported */ } if (pMetadata->etsiAncData.timecode_fine_status) { FDKwriteBits(&bsWriter, 0x0, 16); /* not yet supported */ } return FDKgetValidBits(&bsWriter); } static FDK_METADATA_ERROR LoadSubmittedMetadata( const AACENC_MetaData * const hMetadata, const INT nChannels, const INT metadataMode, AAC_METADATA * const pAacMetaData ) { FDK_METADATA_ERROR err = METADATA_OK; if (pAacMetaData==NULL) { err = METADATA_INVALID_HANDLE; } else { /* init struct */ FDKmemclear(pAacMetaData, sizeof(AAC_METADATA)); if (hMetadata!=NULL) { /* convert data */ pAacMetaData->mpegDrc.drc_profile = hMetadata->drc_profile; pAacMetaData->etsiAncData.comp_profile = hMetadata->comp_profile; pAacMetaData->mpegDrc.drc_TargetRefLevel = hMetadata->drc_TargetRefLevel; pAacMetaData->etsiAncData.comp_TargetRefLevel= hMetadata->comp_TargetRefLevel; pAacMetaData->mpegDrc.prog_ref_level_present = hMetadata->prog_ref_level_present; pAacMetaData->mpegDrc.prog_ref_level = dialnorm2progreflvl(hMetadata->prog_ref_level); pAacMetaData->centerMixLevel = hMetadata->centerMixLevel; pAacMetaData->surroundMixLevel = hMetadata->surroundMixLevel; pAacMetaData->WritePCEMixDwnIdx = hMetadata->PCE_mixdown_idx_present; pAacMetaData->DmxLvl_On = hMetadata->ETSI_DmxLvl_present; pAacMetaData->etsiAncData.compression_on = 1; if (nChannels == 2) { pAacMetaData->dolbySurroundMode = hMetadata->dolbySurroundMode; /* dolby_surround_mode */ } else { pAacMetaData->dolbySurroundMode = 0; } pAacMetaData->etsiAncData.timecode_coarse_status = 0; /* not yet supported - attention: Update GetEstMetadataBytesPerFrame() if enable this! */ pAacMetaData->etsiAncData.timecode_fine_status = 0; /* not yet supported - attention: Update GetEstMetadataBytesPerFrame() if enable this! */ pAacMetaData->metadataMode = metadataMode; } else { pAacMetaData->metadataMode = 0; /* there is no configuration available */ } } return err; } INT FDK_MetadataEnc_GetDelay( HANDLE_FDK_METADATA_ENCODER hMetadataEnc ) { INT delay = 0; if (hMetadataEnc!=NULL) { delay = hMetadataEnc->nAudioDataDelay; } return delay; } fdk-aac-0.1.3/libAACenc/src/aacenc_hcr.cpp0000644000175000017500000001161612372261464020521 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** MPEG AAC Audio Encoder ************************* Initial author: R. Boehm contents/description: huffman codeword reordering based on source from aacErrRobTrans ******************************************************************************/ #include "aacenc_hcr.h" fdk-aac-0.1.3/libAACenc/src/quantize.h0000644000175000017500000001326112372261464017756 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Quantization ******************************************************************************/ #ifndef _QUANTIZE_H_ #define _QUANTIZE_H_ #include "common_fix.h" /* quantizing */ #define MAX_QUANT 8191 void FDKaacEnc_QuantizeSpectrum(INT sfbCnt, INT maxSfbPerGroup, INT sfbPerGroup, INT *sfbOffset, FIXP_DBL *mdctSpectrum, INT globalGain, INT *scalefactors, SHORT *quantizedSpectrum); FIXP_DBL FDKaacEnc_calcSfbDist(FIXP_DBL *mdctSpectrum, SHORT *quantSpectrum, INT noOfLines, INT gain); void FDKaacEnc_calcSfbQuantEnergyAndDist(FIXP_DBL *mdctSpectrum, SHORT *quantSpectrum, INT noOfLines, INT gain, FIXP_DBL *en, FIXP_DBL *dist); #endif /* _QUANTIZE_H_ */ fdk-aac-0.1.3/libAACenc/src/transform.cpp0000644000175000017500000002411612372261464020465 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************************************************************** Description: FDKaacLdEnc_MdctTransform480: The module FDKaacLdEnc_MdctTransform will perform the MDCT. The MDCT supports the sine window and the zero padded window. The algorithm of the MDCT can be divided in Windowing, PreModulation, Fft and PostModulation. ******************************************************************************/ #include "transform.h" #include "dct.h" #include "psy_const.h" #include "aacEnc_rom.h" #include "FDK_tools_rom.h" INT FDKaacEnc_Transform_Real (const INT_PCM * pTimeData, FIXP_DBL *RESTRICT mdctData, const INT blockType, const INT windowShape, INT *prevWindowShape, const INT frameLength, INT *mdctData_e, INT filterType ,FIXP_DBL * RESTRICT overlapAddBuffer ) { const INT_PCM * RESTRICT timeData; INT i; /* tl: transform length fl: left window slope length nl: left window slope offset fr: right window slope length nr: right window slope offset See FDK_tools/doc/intern/mdct.tex for more detail. */ int tl, fl, nl, fr, nr; const FIXP_WTP * RESTRICT pLeftWindowPart; const FIXP_WTP * RESTRICT pRightWindowPart; /* * MDCT scale: * + 1: fMultDiv2() in windowing. * + 1: Because of factor 1/2 in Princen-Bradley compliant windowed TDAC. */ *mdctData_e = 1+1; tl = frameLength; timeData = pTimeData; switch( blockType ) { case LONG_WINDOW: { int offset = (windowShape == LOL_WINDOW) ? ((frameLength * 3)>>2) : 0; fl = frameLength - offset; fr = frameLength - offset; } break; case STOP_WINDOW: fl = frameLength >> 3; fr = frameLength; break; case START_WINDOW: /* or StopStartSequence */ fl = frameLength; fr = frameLength >> 3; break; case SHORT_WINDOW: fl = fr = frameLength >> 3; tl >>= 3; timeData = pTimeData + 3*fl + (fl/2); break; default: FDK_ASSERT(0); return -1; break; } /* Taken from FDK_tools/src/mdct.cpp Derive NR and NL */ nr = (tl - fr)>>1; nl = (tl - fl)>>1; pLeftWindowPart = FDKgetWindowSlope(fl, *prevWindowShape); pRightWindowPart = FDKgetWindowSlope(fr, windowShape); /* windowing */ if (filterType != FB_ELD) { /* Left window slope offset */ for (i=0; i> ( 1 ); #else mdctData[(tl/2)+i] = - (FIXP_DBL) timeData[tl-i-1] << (DFRACT_BITS - SAMPLE_BITS - 1); #endif } /* Left window slope */ for (i=0; i> (1); #else mdctData[(tl/2)-1-i] = - (FIXP_DBL) timeData[tl+i] << (DFRACT_BITS - SAMPLE_BITS - 1); #endif } /* Right window slope */ for (i=0; i> (-WTS1)); outval += (fMultDiv2((FIXP_PCM)timeData[L+N*3/4+i], pWindowELD[N+N/2+i]) >> (-WTS1) ); outval += (fMultDiv2(overlapAddBuffer[N/2+i], pWindowELD[2*N+i])>> (-WTS2-1)); overlapAddBuffer[N/2+i] = overlapAddBuffer[i]; overlapAddBuffer[i] = z0; mdctData[i] = overlapAddBuffer[N/2+i] + (fMultDiv2(overlapAddBuffer[N+N/2-1-i], pWindowELD[2*N+N/2+i]) >> (-WTS2-1)); mdctData[N-1-i] = outval; overlapAddBuffer[N+N/2-1-i] = outval; } for(i=N/4;i> (-WTS1)) ; outval += (fMultDiv2(overlapAddBuffer[N/2+i], pWindowELD[2*N+i]) >> (-WTS2-1)); overlapAddBuffer[N/2+i] = overlapAddBuffer[i] + (fMult((FIXP_PCM)timeData[L-N/4+i], pWindowELD[N/2+i])<< (WTS0-1) ); overlapAddBuffer[i] = z0; mdctData[i] = overlapAddBuffer[N/2+i] + (fMultDiv2(overlapAddBuffer[N+N/2-1-i], pWindowELD[2*N+N/2+i]) >> (-WTS2-1)); mdctData[N-1-i] = outval; overlapAddBuffer[N+N/2-1-i] = outval; } } dct_IV(mdctData, tl, mdctData_e); *prevWindowShape = windowShape; return 0; } fdk-aac-0.1.3/libAACenc/src/aacEnc_ram.h0000644000175000017500000002132612372261464020130 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /****************************************************************************** Initial authors: M. Lohwasser, M. Gayer Contents/description: ******************************************************************************/ /*! \file \brief Memory layout \author Markus Lohwasser */ #ifndef AAC_ENC_RAM_H #define AAC_ENC_RAM_H #include "common_fix.h" #include "aacenc.h" #include "psy_data.h" #include "interface.h" #include "psy_main.h" #include "bitenc.h" #include "bit_cnt.h" #include "psy_const.h" #define OUTPUTBUFFER_SIZE (8192) /*!< Output buffer size has to be at least 6144 bits per channel (768 bytes). FDK bitbuffer implementation expects buffer of size 2^n. */ /* Moved AAC_ENC struct definition from aac_enc.cpp into aacEnc_ram.h to get size and respective static memory in aacEnc_ram.cpp. aac_enc.h is the outward visible header file and putting the struct into would cause necessity of additional visible header files outside library. */ /* define hBitstream size: max AAC framelength is 6144 bits/channel */ /*#define BUFFER_BITSTR_SIZE ((6400*(8)/bbWordSize) +((bbWordSize - 1) / bbWordSize))*/ struct AAC_ENC { AACENC_CONFIG *config; INT ancillaryBitsPerFrame; /* ancillary bits per frame calculated from ancillary rate */ CHANNEL_MAPPING channelMapping; QC_STATE *qcKernel; QC_OUT *qcOut[(1)]; PSY_OUT *psyOut[(1)]; PSY_INTERNAL *psyKernel; /* lifetime vars */ CHANNEL_MODE encoderMode; INT bandwidth90dB; AACENC_BITRATE_MODE bitrateMode; INT dontWriteAdif; /* use: write ADIF header only before 1st frame */ FIXP_DBL *dynamic_RAM; INT maxChannels; /* used while allocation */ INT maxElements; INT maxFrames; AUDIO_OBJECT_TYPE aot; /* AOT to be used while encoding. */ } ; #define maxSize(a,b) ( ((a)>(b)) ? (a) : (b) ) #define BIT_LOOK_UP_SIZE ( sizeof(INT)*(MAX_SFB_LONG*(CODE_BOOK_ESC_NDX+1)) ) #define MERGE_GAIN_LOOK_UP_SIZE ( sizeof(INT)*MAX_SFB_LONG ) /* Dynamic RAM - Allocation */ /* ++++++++++++++++++++++++++++++++++++++++++++ | P_BUF_0 | P_BUF_1 | ++++++++++++++++++++++++++++++++++++++++++++ | QC_OUT_CH | PSY_DYN | ++++++++++++++++++++++++++++++++++++++++++++ | | BitLookUp+MergeGainLookUp | ++++++++++++++++++++++++++++++++++++++++++++ | | Bitstream output buffer | ++++++++++++++++++++++++++++++++++++++++++++ */ #define BUF_SIZE_0 ( ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)*(8)) ) #define BUF_SIZE_1 ( ALIGN_SIZE(maxSize(sizeof(PSY_DYNAMIC), \ (BIT_LOOK_UP_SIZE+MERGE_GAIN_LOOK_UP_SIZE))) ) #define P_BUF_0 ( 0 ) #define P_BUF_1 ( P_BUF_0 + BUF_SIZE_0 ) #define AAC_ENC_DYN_RAM_SIZE ( BUF_SIZE_0 + BUF_SIZE_1 ) H_ALLOC_MEM (AACdynamic_RAM, FIXP_DBL) /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ END - Dynamic RAM - Allocation */ /* See further Memory Allocation details in aacEnc_ram.cpp */ H_ALLOC_MEM (Ram_aacEnc_AacEncoder, AAC_ENC) H_ALLOC_MEM (Ram_aacEnc_PsyElement, PSY_ELEMENT) H_ALLOC_MEM (Ram_aacEnc_PsyInternal, PSY_INTERNAL) H_ALLOC_MEM (Ram_aacEnc_PsyStatic, PSY_STATIC) H_ALLOC_MEM (Ram_aacEnc_PsyInputBuffer, INT_PCM) PSY_DYNAMIC *GetRam_aacEnc_PsyDynamic (int n, UCHAR* dynamic_RAM); H_ALLOC_MEM (Ram_bsOutbuffer, UCHAR) H_ALLOC_MEM (Ram_aacEnc_PsyOutChannel, PSY_OUT_CHANNEL) H_ALLOC_MEM (Ram_aacEnc_PsyOut, PSY_OUT) H_ALLOC_MEM (Ram_aacEnc_PsyOutElements, PSY_OUT_ELEMENT) H_ALLOC_MEM (Ram_aacEnc_QCstate, QC_STATE) H_ALLOC_MEM (Ram_aacEnc_AdjustThreshold, ADJ_THR_STATE) H_ALLOC_MEM (Ram_aacEnc_AdjThrStateElement, ATS_ELEMENT) H_ALLOC_MEM (Ram_aacEnc_ElementBits, ELEMENT_BITS) H_ALLOC_MEM (Ram_aacEnc_BitCntrState, BITCNTR_STATE) INT *GetRam_aacEnc_BitLookUp(int n, UCHAR* dynamic_RAM); INT *GetRam_aacEnc_MergeGainLookUp(int n, UCHAR* dynamic_RAM); QC_OUT_CHANNEL *GetRam_aacEnc_QCchannel (int n, UCHAR* dynamic_RAM); H_ALLOC_MEM (Ram_aacEnc_QCout, QC_OUT) H_ALLOC_MEM (Ram_aacEnc_QCelement, QC_OUT_ELEMENT) #endif /* #ifndef AAC_ENC_RAM_H */ fdk-aac-0.1.3/libAACenc/src/quantize.cpp0000644000175000017500000003423112372261464020311 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Quantization ******************************************************************************/ #include "quantize.h" #include "aacEnc_rom.h" /***************************************************************************** functionname: FDKaacEnc_quantizeLines description: quantizes spectrum lines returns: input: global gain, number of lines to process, spectral data output: quantized spectrum *****************************************************************************/ static void FDKaacEnc_quantizeLines(INT gain, INT noOfLines, FIXP_DBL *mdctSpectrum, SHORT *quaSpectrum) { int line; FIXP_DBL k = FL2FXCONST_DBL(-0.0946f + 0.5f)>>16; FIXP_QTD quantizer = FDKaacEnc_quantTableQ[(-gain)&3]; INT quantizershift = ((-gain)>>2)+1; for (line = 0; line < noOfLines; line++) { FIXP_DBL accu = fMultDiv2(mdctSpectrum[line],quantizer); if (accu < FL2FXCONST_DBL(0.0f)) { accu=-accu; /* normalize */ INT accuShift = CntLeadingZeros(accu) - 1; /* CountLeadingBits() is not necessary here since test value is always > 0 */ accu <<= accuShift; INT tabIndex = (INT)(accu>>(DFRACT_BITS-2-MANT_DIGITS))&(~MANT_SIZE); INT totalShift = quantizershift-accuShift+1; accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]); totalShift = (16-4)-(3*(totalShift>>2)); FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */ accu >>= fixMin(totalShift,DFRACT_BITS-1); quaSpectrum[line] = (SHORT)(-((LONG)(k + accu) >> (DFRACT_BITS-1-16))); } else if(accu > FL2FXCONST_DBL(0.0f)) { /* normalize */ INT accuShift = CntLeadingZeros(accu) - 1; /* CountLeadingBits() is not necessary here since test value is always > 0 */ accu <<= accuShift; INT tabIndex = (INT)(accu>>(DFRACT_BITS-2-MANT_DIGITS))&(~MANT_SIZE); INT totalShift = quantizershift-accuShift+1; accu = fMultDiv2(FDKaacEnc_mTab_3_4[tabIndex],FDKaacEnc_quantTableE[totalShift&3]); totalShift = (16-4)-(3*(totalShift>>2)); FDK_ASSERT(totalShift >=0); /* MAX_QUANT_VIOLATION */ accu >>= fixMin(totalShift,DFRACT_BITS-1); quaSpectrum[line] = (SHORT)((LONG)(k + accu) >> (DFRACT_BITS-1-16)); } else quaSpectrum[line]=0; } } /***************************************************************************** functionname:iFDKaacEnc_quantizeLines description: iquantizes spectrum lines mdctSpectrum = iquaSpectrum^4/3 *2^(0.25*gain) input: global gain, number of lines to process,quantized spectrum output: spectral data *****************************************************************************/ static void FDKaacEnc_invQuantizeLines(INT gain, INT noOfLines, SHORT *quantSpectrum, FIXP_DBL *mdctSpectrum) { INT iquantizermod; INT iquantizershift; INT line; iquantizermod = gain&3; iquantizershift = gain>>2; for (line = 0; line < noOfLines; line++) { if(quantSpectrum[line] < 0) { FIXP_DBL accu; INT ex,specExp,tabIndex; FIXP_DBL s,t; accu = (FIXP_DBL) -quantSpectrum[line]; ex = CountLeadingBits(accu); accu <<= ex; specExp = (DFRACT_BITS-1) - ex; FDK_ASSERT(specExp < 14); /* this fails if abs(value) > 8191 */ tabIndex = (INT)(accu>>(DFRACT_BITS-2-MANT_DIGITS))&(~MANT_SIZE); /* calculate "mantissa" ^4/3 */ s = FDKaacEnc_mTab_4_3Elc[tabIndex]; /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */ t = FDKaacEnc_specExpMantTableCombElc[iquantizermod][specExp]; /* multiply "mantissa" ^4/3 with exponent multiplier */ accu = fMult(s,t); /* get approperiate exponent shifter */ specExp = FDKaacEnc_specExpTableComb[iquantizermod][specExp]-1; /* -1 to avoid overflows in accu */ if ((-iquantizershift-specExp) < 0) accu <<= -(-iquantizershift-specExp); else accu >>= -iquantizershift-specExp; mdctSpectrum[line] = -accu; } else if (quantSpectrum[line] > 0) { FIXP_DBL accu; INT ex,specExp,tabIndex; FIXP_DBL s,t; accu = (FIXP_DBL)(INT)quantSpectrum[line]; ex = CountLeadingBits(accu); accu <<= ex; specExp = (DFRACT_BITS-1) - ex; FDK_ASSERT(specExp < 14); /* this fails if abs(value) > 8191 */ tabIndex = (INT)(accu>>(DFRACT_BITS-2-MANT_DIGITS))&(~MANT_SIZE); /* calculate "mantissa" ^4/3 */ s = FDKaacEnc_mTab_4_3Elc[tabIndex]; /* get approperiate exponent multiplier for specExp^3/4 combined with scfMod */ t = FDKaacEnc_specExpMantTableCombElc[iquantizermod][specExp]; /* multiply "mantissa" ^4/3 with exponent multiplier */ accu = fMult(s,t); /* get approperiate exponent shifter */ specExp = FDKaacEnc_specExpTableComb[iquantizermod][specExp]-1; /* -1 to avoid overflows in accu */ if (( -iquantizershift-specExp) < 0) accu <<= -(-iquantizershift-specExp); else accu >>= -iquantizershift-specExp; mdctSpectrum[line] = accu; } else { mdctSpectrum[line] = FL2FXCONST_DBL(0.0f); } } } /***************************************************************************** functionname: FDKaacEnc_QuantizeSpectrum description: quantizes the entire spectrum returns: input: number of scalefactor bands to be quantized, ... output: quantized spectrum *****************************************************************************/ void FDKaacEnc_QuantizeSpectrum(INT sfbCnt, INT maxSfbPerGroup, INT sfbPerGroup, INT *sfbOffset, FIXP_DBL *mdctSpectrum, INT globalGain, INT *scalefactors, SHORT *quantizedSpectrum) { INT sfbOffs,sfb; /* in FDKaacEnc_quantizeLines quaSpectrum is calculated with: spec^(3/4) * 2^(-3/16*QSS) * 2^(3/4*scale) + k simplify scaling calculation and reduce QSS before: spec^(3/4) * 2^(-3/16*(QSS - 4*scale)) */ for(sfbOffs=0;sfbOffsMAX_QUANT) { return FL2FXCONST_DBL(0.0f); } /* inverse quantization */ FDKaacEnc_invQuantizeLines(gain,1,&quantSpectrum[i],&invQuantSpec); /* dist */ diff = fixp_abs(fixp_abs(invQuantSpec) - fixp_abs(mdctSpectrum[i]>>1)); scale = CountLeadingBits(diff); diff = scaleValue(diff, scale); diff = fPow2(diff); scale = fixMin(2*(scale-1), DFRACT_BITS-1); diff = scaleValue(diff, -scale); xfsf = xfsf + diff; } xfsf = CalcLdData(xfsf); return xfsf; } /***************************************************************************** functionname: FDKaacEnc_calcSfbQuantEnergyAndDist description: calculates energy and distortion of quantized values returns: input: gain, number of lines to process, quantized spectral data, spectral data output: energy, distortion *****************************************************************************/ void FDKaacEnc_calcSfbQuantEnergyAndDist(FIXP_DBL *mdctSpectrum, SHORT *quantSpectrum, INT noOfLines, INT gain, FIXP_DBL *en, FIXP_DBL *dist) { INT i,scale; FIXP_DBL invQuantSpec; FIXP_DBL diff; FIXP_DBL energy = FL2FXCONST_DBL(0.0f); FIXP_DBL distortion = FL2FXCONST_DBL(0.0f); for (i=0; iMAX_QUANT) { *en = FL2FXCONST_DBL(0.0f); *dist = FL2FXCONST_DBL(0.0f); return; } /* inverse quantization */ FDKaacEnc_invQuantizeLines(gain,1,&quantSpectrum[i],&invQuantSpec); /* energy */ energy += fPow2(invQuantSpec); /* dist */ diff = fixp_abs(fixp_abs(invQuantSpec) - fixp_abs(mdctSpectrum[i]>>1)); scale = CountLeadingBits(diff); diff = scaleValue(diff, scale); diff = fPow2(diff); scale = fixMin(2*(scale-1), DFRACT_BITS-1); diff = scaleValue(diff, -scale); distortion += diff; } *en = CalcLdData(energy)+FL2FXCONST_DBL(0.03125f); *dist = CalcLdData(distortion); } fdk-aac-0.1.3/libAACenc/src/adj_thr.h0000644000175000017500000001463312372261464017535 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Threshold compensation ******************************************************************************/ #ifndef __ADJ_THR_H #define __ADJ_THR_H #include "adj_thr_data.h" #include "qc_data.h" #include "line_pe.h" #include "interface.h" void FDKaacEnc_peCalculation( PE_DATA *peData, PSY_OUT_CHANNEL* psyOutChannel[(2)], QC_OUT_CHANNEL* qcOutChannel[(2)], struct TOOLSINFO *toolsInfo, ATS_ELEMENT* adjThrStateElement, const INT nChannels ); INT FDKaacEnc_AdjThrNew(ADJ_THR_STATE** phAdjThr, INT nElements); void FDKaacEnc_AdjThrInit(ADJ_THR_STATE *hAdjThr, const INT peMean, ELEMENT_BITS* elBits[(8)], INT invQuant, INT nElements, INT nChannelsEff, INT sampleRate, INT advancedBitsToPe, FIXP_DBL vbrQualFactor); void FDKaacEnc_DistributeBits(ADJ_THR_STATE *adjThrState, ATS_ELEMENT *AdjThrStateElement, PSY_OUT_CHANNEL *psyOutChannel[(2)], PE_DATA *peData, INT *grantedPe, INT *grantedPeCorr, const INT nChannels, const INT commonWindow, const INT avgBits, const INT bitresBits, const INT maxBitresBits, const FIXP_DBL maxBitFac, const INT bitDistributionMode); void FDKaacEnc_AdjustThresholds(ATS_ELEMENT* AdjThrStateElement[(8)], QC_OUT_ELEMENT* qcElement[(8)], QC_OUT* qcOut, PSY_OUT_ELEMENT* psyOutElement[(8)], INT CBRbitrateMode, CHANNEL_MAPPING* cm); void FDKaacEnc_AdjThrClose(ADJ_THR_STATE** hAdjThr); #endif fdk-aac-0.1.3/libAACenc/src/chaosmeasure.h0000644000175000017500000001211312372261464020570 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Chaos measure calculation ******************************************************************************/ #ifndef __CHAOSMEASURE_H #define __CHAOSMEASURE_H #include "common_fix.h" #include "psy_const.h" void FDKaacEnc_CalculateChaosMeasure( FIXP_DBL *paMDCTDataNM0, INT numberOfLines, FIXP_DBL *chaosMeasure ); #endif fdk-aac-0.1.3/libAACenc/src/bitenc.cpp0000644000175000017500000014130312372261464017714 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Bitstream encoder ******************************************************************************/ #include "bitenc.h" #include "bit_cnt.h" #include "dyn_bits.h" #include "qc_data.h" #include "interface.h" #include "aacEnc_ram.h" #include "tpenc_lib.h" #include "FDK_tools_rom.h" /* needed for the bitstream syntax tables */ static const int globalGainOffset = 100; static const int icsReservedBit = 0; static const int noiseOffset = 90; /***************************************************************************** functionname: FDKaacEnc_encodeSpectralData description: encode spectral data returns: the number of written bits input: output: *****************************************************************************/ static INT FDKaacEnc_encodeSpectralData(INT *sfbOffset, SECTION_DATA *sectionData, SHORT *quantSpectrum, HANDLE_FDK_BITSTREAM hBitStream) { INT i,sfb; INT dbgVal = FDKgetValidBits(hBitStream); for(i=0;inoOfSections;i++) { if(sectionData->huffsection[i].codeBook != CODE_BOOK_PNS_NO) { /* huffencode spectral data for this huffsection */ INT tmp = sectionData->huffsection[i].sfbStart+sectionData->huffsection[i].sfbCnt; for(sfb=sectionData->huffsection[i].sfbStart; sfbhuffsection[i].codeBook, hBitStream); } } } return(FDKgetValidBits(hBitStream)-dbgVal); } /***************************************************************************** functionname:FDKaacEnc_encodeGlobalGain description: encodes Global Gain (common scale factor) returns: the number of static bits input: output: *****************************************************************************/ static INT FDKaacEnc_encodeGlobalGain(INT globalGain, INT scalefac, HANDLE_FDK_BITSTREAM hBitStream, INT mdctScale) { if (hBitStream != NULL) { FDKwriteBits(hBitStream,globalGain - scalefac + globalGainOffset-4*(LOG_NORM_PCM-mdctScale),8); } return (8); } /***************************************************************************** functionname:FDKaacEnc_encodeIcsInfo description: encodes Ics Info returns: the number of static bits input: output: *****************************************************************************/ static INT FDKaacEnc_encodeIcsInfo(INT blockType, INT windowShape, INT groupingMask, INT maxSfbPerGroup, HANDLE_FDK_BITSTREAM hBitStream, UINT syntaxFlags) { INT statBits; if (blockType == SHORT_WINDOW) { statBits = 8 + TRANS_FAC - 1; } else { if (syntaxFlags & AC_ELD) { statBits = 6; } else { statBits = (!(syntaxFlags & AC_SCALABLE)) ? 11 : 10; } } if (hBitStream != NULL) { if (!(syntaxFlags & AC_ELD)){ FDKwriteBits(hBitStream,icsReservedBit,1); FDKwriteBits(hBitStream,blockType,2); FDKwriteBits(hBitStream, (windowShape == LOL_WINDOW) ? KBD_WINDOW : windowShape,1); } switch(blockType){ case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: FDKwriteBits(hBitStream,maxSfbPerGroup,6); if (!(syntaxFlags & (AC_SCALABLE|AC_ELD)) ) { /* If not scalable syntax then ... */ /* No predictor data present */ FDKwriteBits(hBitStream, 0, 1); } break; case SHORT_WINDOW: FDKwriteBits(hBitStream,maxSfbPerGroup,4); /* Write grouping bits */ FDKwriteBits(hBitStream,groupingMask,TRANS_FAC-1); break; } } return (statBits); } /***************************************************************************** functionname: FDKaacEnc_encodeSectionData description: encode section data (common Huffman codebooks for adjacent SFB's) returns: none input: output: *****************************************************************************/ static INT FDKaacEnc_encodeSectionData(SECTION_DATA *sectionData, HANDLE_FDK_BITSTREAM hBitStream, UINT useVCB11) { if (hBitStream != NULL) { INT sectEscapeVal=0,sectLenBits=0; INT sectLen; INT i; INT dbgVal=FDKgetValidBits(hBitStream); INT sectCbBits = 4; switch(sectionData->blockType) { case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: sectEscapeVal = SECT_ESC_VAL_LONG; sectLenBits = SECT_BITS_LONG; break; case SHORT_WINDOW: sectEscapeVal = SECT_ESC_VAL_SHORT; sectLenBits = SECT_BITS_SHORT; break; } for(i=0;inoOfSections;i++) { INT codeBook = sectionData->huffsection[i].codeBook; FDKwriteBits(hBitStream,codeBook,sectCbBits); { sectLen = sectionData->huffsection[i].sfbCnt; while(sectLen >= sectEscapeVal) { FDKwriteBits(hBitStream,sectEscapeVal,sectLenBits); sectLen-=sectEscapeVal; } FDKwriteBits(hBitStream,sectLen,sectLenBits); } } return(FDKgetValidBits(hBitStream)-dbgVal); } return (0); } /***************************************************************************** functionname: FDKaacEnc_encodeScaleFactorData description: encode DPCM coded scale factors returns: none input: output: *****************************************************************************/ static INT FDKaacEnc_encodeScaleFactorData(UINT *maxValueInSfb, SECTION_DATA *sectionData, INT *scalefac, HANDLE_FDK_BITSTREAM hBitStream, INT *RESTRICT noiseNrg, const INT *isScale, INT globalGain) { if (hBitStream != NULL) { INT i,j,lastValScf,deltaScf; INT deltaPns; INT lastValPns = 0; INT noisePCMFlag = TRUE; INT lastValIs; INT dbgVal = FDKgetValidBits(hBitStream); lastValScf=scalefac[sectionData->firstScf]; lastValPns = globalGain-scalefac[sectionData->firstScf]+globalGainOffset-4*LOG_NORM_PCM-noiseOffset; lastValIs = 0; for(i=0; inoOfSections; i++){ if (sectionData->huffsection[i].codeBook != CODE_BOOK_ZERO_NO) { if ((sectionData->huffsection[i].codeBook == CODE_BOOK_IS_OUT_OF_PHASE_NO) || (sectionData->huffsection[i].codeBook == CODE_BOOK_IS_IN_PHASE_NO)) { INT sfbStart = sectionData->huffsection[i].sfbStart; INT tmp = sfbStart + sectionData->huffsection[i].sfbCnt; for(j=sfbStart; jhuffsection[i].codeBook == CODE_BOOK_PNS_NO) { INT sfbStart = sectionData->huffsection[i].sfbStart; INT tmp = sfbStart + sectionData->huffsection[i].sfbCnt; for(j=sfbStart; jhuffsection[i].sfbStart+sectionData->huffsection[i].sfbCnt; for(j=sectionData->huffsection[i].sfbStart; jhuffsection[i].codeBook != CODE_BOOK_ZERO_NO */ } /* section loop */ return(FDKgetValidBits(hBitStream)-dbgVal); } /* if (hBitStream != NULL) */ return (0); } /***************************************************************************** functionname:encodeMsInfo description: encodes MS-Stereo Info returns: the number of static bits input: output: *****************************************************************************/ static INT FDKaacEnc_encodeMSInfo(INT sfbCnt, INT grpSfb, INT maxSfb, INT msDigest, INT *jsFlags, HANDLE_FDK_BITSTREAM hBitStream) { INT sfb, sfbOff, msBits = 0; if (hBitStream != NULL) { switch(msDigest) { case MS_NONE: FDKwriteBits(hBitStream,SI_MS_MASK_NONE,2); msBits += 2; break; case MS_ALL: FDKwriteBits(hBitStream,SI_MS_MASK_ALL,2); msBits += 2; break; case MS_SOME: FDKwriteBits(hBitStream,SI_MS_MASK_SOME,2); msBits += 2; for(sfbOff = 0; sfbOff < sfbCnt; sfbOff+=grpSfb) { for(sfb=0; sfbnumOfFilters[i]!=0) { tnsPresent=1; break; } } if (tnsPresent==0) { FDKwriteBits(hBitStream,0,1); } else { FDKwriteBits(hBitStream,1,1); } } return (1); } /***************************************************************************** functionname: FDKaacEnc_encodeTnsData description: encode TNS data (filter order, coeffs, ..) returns: the number of static bits input: output: *****************************************************************************/ static INT FDKaacEnc_encodeTnsData(TNS_INFO *tnsInfo, INT blockType, HANDLE_FDK_BITSTREAM hBitStream) { INT tnsBits = 0; if (tnsInfo!=NULL) { INT i,j,k; INT tnsPresent = 0; INT coefBits; INT numOfWindows=(blockType==SHORT_WINDOW?TRANS_FAC:1); for (i=0; inumOfFilters[i]!=0) { tnsPresent=1; } } if (hBitStream != NULL) { if (tnsPresent==1) { /* there is data to be written*/ for (i=0; inumOfFilters[i],(blockType==SHORT_WINDOW?1:2)); tnsBits += (blockType==SHORT_WINDOW?1:2); if (tnsInfo->numOfFilters[i]) { FDKwriteBits(hBitStream,(tnsInfo->coefRes[i]==4?1:0),1); tnsBits += 1; } for (j=0; jnumOfFilters[i]; j++) { FDKwriteBits(hBitStream,tnsInfo->length[i][j],(blockType==SHORT_WINDOW?4:6)); tnsBits += (blockType==SHORT_WINDOW?4:6); FDK_ASSERT(tnsInfo->order[i][j] <= 12); FDKwriteBits(hBitStream,tnsInfo->order[i][j],(blockType==SHORT_WINDOW?3:5)); tnsBits += (blockType==SHORT_WINDOW?3:5); if (tnsInfo->order[i][j]){ FDKwriteBits(hBitStream,tnsInfo->direction[i][j],1); tnsBits +=1; /*direction*/ if(tnsInfo->coefRes[i] == 4) { coefBits = 3; for(k=0; korder[i][j]; k++) { if (tnsInfo->coef[i][j][k]> 3 || tnsInfo->coef[i][j][k]< -4) { coefBits = 4; break; } } } else { coefBits = 2; for(k=0; korder[i][j]; k++) { if ( tnsInfo->coef[i][j][k]> 1 || tnsInfo->coef[i][j][k]< -2) { coefBits = 3; break; } } } FDKwriteBits(hBitStream,-(coefBits - tnsInfo->coefRes[i]),1); /*coef_compres*/ tnsBits +=1; /*coef_compression */ for (k=0; korder[i][j]; k++ ) { static const INT rmask[] = {0,1,3,7,15}; FDKwriteBits(hBitStream,tnsInfo->coef[i][j][k] & rmask[coefBits],coefBits); tnsBits += coefBits; } } } } } } else { if (tnsPresent != 0) { for (i=0; inumOfFilters[i]) { tnsBits += 1; for (j=0; jnumOfFilters[i]; j++) { tnsBits += (blockType==SHORT_WINDOW?4:6); tnsBits += (blockType==SHORT_WINDOW?3:5); if (tnsInfo->order[i][j]) { tnsBits +=1; /*direction*/ tnsBits +=1; /*coef_compression */ if (tnsInfo->coefRes[i] == 4) { coefBits=3; for (k=0; korder[i][j]; k++) { if (tnsInfo->coef[i][j][k]> 3 || tnsInfo->coef[i][j][k]< -4) { coefBits = 4; break; } } } else { coefBits = 2; for (k=0; korder[i][j]; k++) { if (tnsInfo->coef[i][j][k]> 1 || tnsInfo->coef[i][j][k]< -2) { coefBits = 3; break; } } } for (k=0; korder[i][j]; k++) { tnsBits += coefBits; } } } } } } } } /* (tnsInfo!=NULL) */ return (tnsBits); } /***************************************************************************** functionname: FDKaacEnc_encodeGainControlData description: unsupported returns: none input: output: *****************************************************************************/ static INT FDKaacEnc_encodeGainControlData(HANDLE_FDK_BITSTREAM hBitStream) { if (hBitStream != NULL) { FDKwriteBits(hBitStream,0,1); } return (1); } /***************************************************************************** functionname: FDKaacEnc_encodePulseData description: not supported yet (dummy) returns: none input: output: *****************************************************************************/ static INT FDKaacEnc_encodePulseData(HANDLE_FDK_BITSTREAM hBitStream) { if (hBitStream != NULL) { FDKwriteBits(hBitStream,0,1); } return (1); } /***************************************************************************** functionname: FDKaacEnc_writeExtensionPayload description: write extension payload to bitstream returns: number of written bits input: output: *****************************************************************************/ static INT FDKaacEnc_writeExtensionPayload( HANDLE_FDK_BITSTREAM hBitStream, EXT_PAYLOAD_TYPE extPayloadType, const UCHAR *extPayloadData, INT extPayloadBits ) { #define EXT_TYPE_BITS ( 4 ) #define DATA_EL_VERSION_BITS ( 4 ) #define FILL_NIBBLE_BITS ( 4 ) INT extBitsUsed = 0; if (extPayloadBits >= EXT_TYPE_BITS) { UCHAR fillByte = 0x00; /* for EXT_FIL and EXT_FILL_DATA */ if (hBitStream != NULL) { FDKwriteBits(hBitStream, extPayloadType, EXT_TYPE_BITS); } extBitsUsed += EXT_TYPE_BITS; switch (extPayloadType) { case EXT_DYNAMIC_RANGE: /* case EXT_SAC_DATA: */ case EXT_SBR_DATA: case EXT_SBR_DATA_CRC: if (hBitStream != NULL) { int i, writeBits = extPayloadBits; for (i=0; writeBits >= 8; i++) { FDKwriteBits(hBitStream, extPayloadData[i], 8); writeBits -= 8; } if (writeBits > 0) { FDKwriteBits(hBitStream, extPayloadData[i]>>(8-writeBits), writeBits); } } extBitsUsed += extPayloadBits; break; case EXT_DATA_ELEMENT: { INT dataElementLength = (extPayloadBits+7)>>3; INT cnt = dataElementLength; int loopCounter = 1; while (dataElementLength >= 255) { loopCounter++; dataElementLength -= 255; } if (hBitStream != NULL) { int i; FDKwriteBits(hBitStream, 0x00, DATA_EL_VERSION_BITS); /* data_element_version = ANC_DATA */ for (i=1; i= 8) { FDKwriteBits(hBitStream, fillByte, 8); writeBits -= 8; } } extBitsUsed += FILL_NIBBLE_BITS + (extPayloadBits & ~0x7) - 8; break; } } return (extBitsUsed); } /***************************************************************************** functionname: FDKaacEnc_writeDataStreamElement description: write data stream elements like ancillary data ... returns: the amount of used bits input: output: ******************************************************************************/ static INT FDKaacEnc_writeDataStreamElement( HANDLE_TRANSPORTENC hTpEnc, INT elementInstanceTag, INT dataPayloadBytes, UCHAR *dataBuffer, UINT alignAnchor ) { #define DATA_BYTE_ALIGN_FLAG ( 0 ) #define EL_INSTANCE_TAG_BITS ( 4 ) #define DATA_BYTE_ALIGN_FLAG_BITS ( 1 ) #define DATA_LEN_COUNT_BITS ( 8 ) #define DATA_LEN_ESC_COUNT_BITS ( 8 ) #define MAX_DATA_ALIGN_BITS ( 7 ) #define MAX_DSE_DATA_BYTES ( 510 ) INT dseBitsUsed = 0; while (dataPayloadBytes > 0) { int esc_count = -1; int cnt = 0; INT crcReg = -1; dseBitsUsed += EL_ID_BITS + EL_INSTANCE_TAG_BITS + DATA_BYTE_ALIGN_FLAG_BITS + DATA_LEN_COUNT_BITS; if (DATA_BYTE_ALIGN_FLAG) { dseBitsUsed += MAX_DATA_ALIGN_BITS; } cnt = fixMin(MAX_DSE_DATA_BYTES, dataPayloadBytes); if ( cnt >= 255 ) { esc_count = cnt - 255; dseBitsUsed += DATA_LEN_ESC_COUNT_BITS; } dataPayloadBytes -= cnt; dseBitsUsed += cnt * 8; if (hTpEnc != NULL) { HANDLE_FDK_BITSTREAM hBitStream = transportEnc_GetBitstream(hTpEnc); int i; FDKwriteBits(hBitStream, ID_DSE, EL_ID_BITS); crcReg = transportEnc_CrcStartReg(hTpEnc, 0); FDKwriteBits(hBitStream, elementInstanceTag, EL_INSTANCE_TAG_BITS); FDKwriteBits(hBitStream, DATA_BYTE_ALIGN_FLAG, DATA_BYTE_ALIGN_FLAG_BITS); /* write length field(s) */ if ( esc_count >= 0 ) { FDKwriteBits(hBitStream, 255, DATA_LEN_COUNT_BITS); FDKwriteBits(hBitStream, esc_count, DATA_LEN_ESC_COUNT_BITS); } else { FDKwriteBits(hBitStream, cnt, DATA_LEN_COUNT_BITS); } if (DATA_BYTE_ALIGN_FLAG) { INT tmp = (INT)FDKgetValidBits(hBitStream); FDKbyteAlign(hBitStream, alignAnchor); /* count actual bits */ dseBitsUsed += (INT)FDKgetValidBits(hBitStream) - tmp - MAX_DATA_ALIGN_BITS; } /* write payload */ for (i=0; inPayloadBits; INT extBitsUsed = 0; if (hTpEnc != NULL) { hBitStream = transportEnc_GetBitstream(hTpEnc); } if (syntaxFlags & (AC_SCALABLE|AC_ER)) { if ( syntaxFlags & AC_DRM ) { /* CAUTION: The caller has to assure that fill data is written before the SBR payload. */ UCHAR *extPayloadData = pExtension->pPayload; switch (pExtension->type) { case EXT_SBR_DATA: case EXT_SBR_DATA_CRC: /* SBR payload is written in reverse */ if (hBitStream != NULL) { int i, writeBits = payloadBits; FDKpushFor(hBitStream, payloadBits-1); /* Does a cache sync internally */ for (i=0; writeBits >= 8; i++) { FDKwriteBitsBwd(hBitStream, extPayloadData[i], 8); writeBits -= 8; } if (writeBits > 0) { FDKwriteBitsBwd(hBitStream, extPayloadData[i]>>(8-writeBits), writeBits); } FDKsyncCacheBwd (hBitStream); FDKpushFor (hBitStream, payloadBits+1); } extBitsUsed += payloadBits; break; case EXT_FILL_DATA: case EXT_FIL: default: if (hBitStream != NULL) { int writeBits = payloadBits; while (writeBits >= 8) { FDKwriteBits(hBitStream, 0x00, 8); writeBits -= 8; } FDKwriteBits(hBitStream, 0x00, writeBits); } extBitsUsed += payloadBits; break; } } else { if ( (syntaxFlags & AC_ELD) && ((pExtension->type==EXT_SBR_DATA) || (pExtension->type==EXT_SBR_DATA_CRC)) ) { if (hBitStream != NULL) { int i, writeBits = payloadBits; UCHAR *extPayloadData = pExtension->pPayload; for (i=0; writeBits >= 8; i++) { FDKwriteBits(hBitStream, extPayloadData[i], 8); writeBits -= 8; } if (writeBits > 0) { FDKwriteBits(hBitStream, extPayloadData[i]>>(8-writeBits), writeBits); } } extBitsUsed += payloadBits; } else { /* ER or scalable syntax -> write extension en bloc */ extBitsUsed += FDKaacEnc_writeExtensionPayload( hBitStream, pExtension->type, pExtension->pPayload, payloadBits ); } } } else { /* We have normal GA bitstream payload (AOT 2,5,29) so pack the data into a fill elements or DSEs */ if ( pExtension->type == EXT_DATA_ELEMENT ) { extBitsUsed += FDKaacEnc_writeDataStreamElement( hTpEnc, elInstanceTag, pExtension->nPayloadBits>>3, pExtension->pPayload, alignAnchor ); } else { while (payloadBits >= (EL_ID_BITS + FILL_EL_COUNT_BITS)) { INT cnt, esc_count=-1, alignBits=7; if ( (pExtension->type == EXT_FILL_DATA) || (pExtension->type == EXT_FIL) ) { payloadBits -= EL_ID_BITS + FILL_EL_COUNT_BITS; if (payloadBits >= 15*8) { payloadBits -= FILL_EL_ESC_COUNT_BITS; esc_count = 0; /* write esc_count even if cnt becomes smaller 15 */ } alignBits = 0; } cnt = fixMin(MAX_FILL_DATA_BYTES, (payloadBits+alignBits)>>3); if (cnt >= 15) { esc_count = cnt - 15 + 1; } if (hBitStream != NULL) { /* write bitstream */ FDKwriteBits(hBitStream, ID_FIL, EL_ID_BITS); if (esc_count >= 0) { FDKwriteBits(hBitStream, 15, FILL_EL_COUNT_BITS); FDKwriteBits(hBitStream, esc_count, FILL_EL_ESC_COUNT_BITS); } else { FDKwriteBits(hBitStream, cnt, FILL_EL_COUNT_BITS); } } extBitsUsed += EL_ID_BITS + FILL_EL_COUNT_BITS + ((esc_count>=0) ? FILL_EL_ESC_COUNT_BITS : 0); cnt = fixMin(cnt*8, payloadBits); /* convert back to bits */ extBitsUsed += FDKaacEnc_writeExtensionPayload( hBitStream, pExtension->type, pExtension->pPayload, cnt ); payloadBits -= cnt; } } } return (extBitsUsed); } /***************************************************************************** functionname: FDKaacEnc_ByteAlignment description: returns: input: output: *****************************************************************************/ static void FDKaacEnc_ByteAlignment(HANDLE_FDK_BITSTREAM hBitStream, int alignBits) { FDKwriteBits(hBitStream, 0, alignBits); } AAC_ENCODER_ERROR FDKaacEnc_ChannelElementWrite( HANDLE_TRANSPORTENC hTpEnc, ELEMENT_INFO *pElInfo, QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_CHANNEL *psyOutChannel[(2)], UINT syntaxFlags, AUDIO_OBJECT_TYPE aot, SCHAR epConfig, INT *pBitDemand, UCHAR minCnt ) { AAC_ENCODER_ERROR error = AAC_ENC_OK; HANDLE_FDK_BITSTREAM hBitStream = NULL; INT bitDemand = 0; const element_list_t *list; int i, ch, decision_bit; INT crcReg1 = -1, crcReg2 = -1; UCHAR numberOfChannels; if (hTpEnc != NULL) { /* Get bitstream handle */ hBitStream = transportEnc_GetBitstream(hTpEnc); } if ( (pElInfo->elType==ID_SCE) || (pElInfo->elType==ID_LFE) ) { numberOfChannels = 1; } else { numberOfChannels = 2; } /* Get channel element sequence table */ list = getBitstreamElementList(aot, epConfig, numberOfChannels, 0); if (list == NULL) { error = AAC_ENC_UNSUPPORTED_AOT; goto bail; } if (!(syntaxFlags & (AC_SCALABLE|AC_ER))) { if (hBitStream != NULL) { FDKwriteBits(hBitStream, pElInfo->elType, EL_ID_BITS); } bitDemand += EL_ID_BITS; } /* Iterate through sequence table */ i = 0; ch = 0; decision_bit = 0; do { /* some tmp values */ SECTION_DATA *pChSectionData = NULL; INT *pChScf = NULL; UINT *pChMaxValueInSfb = NULL; TNS_INFO *pTnsInfo = NULL; INT chGlobalGain = 0; INT chBlockType = 0; INT chMaxSfbPerGrp = 0; INT chSfbPerGrp = 0; INT chSfbCnt = 0; INT chFirstScf = 0; if (minCnt==0) { if ( qcOutChannel!=NULL ) { pChSectionData = &(qcOutChannel[ch]->sectionData); pChScf = qcOutChannel[ch]->scf; chGlobalGain = qcOutChannel[ch]->globalGain; pChMaxValueInSfb = qcOutChannel[ch]->maxValueInSfb; chBlockType = pChSectionData->blockType; chMaxSfbPerGrp = pChSectionData->maxSfbPerGroup; chSfbPerGrp = pChSectionData->sfbPerGroup; chSfbCnt = pChSectionData->sfbCnt; chFirstScf = pChScf[pChSectionData->firstScf]; } else { /* get values from PSY */ chSfbCnt = psyOutChannel[ch]->sfbCnt; chSfbPerGrp = psyOutChannel[ch]->sfbPerGroup; chMaxSfbPerGrp = psyOutChannel[ch]->maxSfbPerGroup; } pTnsInfo = &psyOutChannel[ch]->tnsInfo; } /* minCnt==0 */ if ( qcOutChannel==NULL ) { chBlockType = psyOutChannel[ch]->lastWindowSequence; } switch (list->id[i]) { case element_instance_tag: /* Write element instance tag */ if (hBitStream != NULL) { FDKwriteBits(hBitStream, pElInfo->instanceTag, 4); } bitDemand += 4; break; case common_window: /* Write common window flag */ decision_bit = psyOutElement->commonWindow; if (hBitStream != NULL) { FDKwriteBits(hBitStream, psyOutElement->commonWindow, 1); } bitDemand += 1; break; case ics_info: /* Write individual channel info */ bitDemand += FDKaacEnc_encodeIcsInfo( chBlockType, psyOutChannel[ch]->windowShape, psyOutChannel[ch]->groupingMask, chMaxSfbPerGrp, hBitStream, syntaxFlags); break; case ltp_data_present: /* Write LTP data present flag */ if (hBitStream != NULL) { FDKwriteBits(hBitStream, 0, 1); } bitDemand += 1; break; case ltp_data: /* Predictor data not supported. Nothing to do here. */ break; case ms: /* Write MS info */ bitDemand += FDKaacEnc_encodeMSInfo( chSfbCnt, chSfbPerGrp, chMaxSfbPerGrp, (minCnt==0) ? psyOutElement->toolsInfo.msDigest : MS_NONE, psyOutElement->toolsInfo.msMask, hBitStream); break; case global_gain: bitDemand += FDKaacEnc_encodeGlobalGain( chGlobalGain, chFirstScf, hBitStream, psyOutChannel[ch]->mdctScale ); break; case section_data: { INT siBits = FDKaacEnc_encodeSectionData(pChSectionData, hBitStream, (syntaxFlags & AC_ER_VCB11)?1:0); if (hBitStream != NULL) { if (siBits != qcOutChannel[ch]->sectionData.sideInfoBits) { error = AAC_ENC_WRITE_SEC_ERROR; } } bitDemand += siBits; } break; case scale_factor_data: { INT sfDataBits = FDKaacEnc_encodeScaleFactorData( pChMaxValueInSfb, pChSectionData, pChScf, hBitStream, psyOutChannel[ch]->noiseNrg, psyOutChannel[ch]->isScale, chGlobalGain ); if ( (hBitStream != NULL) && (sfDataBits != (qcOutChannel[ch]->sectionData.scalefacBits + qcOutChannel[ch]->sectionData.noiseNrgBits)) ) { error = AAC_ENC_WRITE_SCAL_ERROR; } bitDemand += sfDataBits; } break; case esc2_rvlc: if (syntaxFlags & AC_ER_RVLC) { /* write RVLC data into bitstream (error sens. cat. 2) */ error = AAC_ENC_UNSUPPORTED_AOT; } break; case pulse: /* Write pulse data */ bitDemand += FDKaacEnc_encodePulseData(hBitStream); break; case tns_data_present: /* Write TNS data present flag */ bitDemand += FDKaacEnc_encodeTnsDataPresent(pTnsInfo, chBlockType, hBitStream); break; case tns_data: /* Write TNS data */ bitDemand += FDKaacEnc_encodeTnsData(pTnsInfo, chBlockType, hBitStream); break; case gain_control_data: /* Nothing to do here */ break; case gain_control_data_present: bitDemand += FDKaacEnc_encodeGainControlData(hBitStream); break; case esc1_hcr: if (syntaxFlags & AC_ER_HCR) { error = AAC_ENC_UNKNOWN; } break; case spectral_data: if (hBitStream != NULL) { INT spectralBits = 0; spectralBits = FDKaacEnc_encodeSpectralData( psyOutChannel[ch]->sfbOffsets, pChSectionData, qcOutChannel[ch]->quantSpec, hBitStream ); if (spectralBits != qcOutChannel[ch]->sectionData.huffmanBits) { return AAC_ENC_WRITE_SPEC_ERROR; } bitDemand += spectralBits; } break; /* Non data cases */ case adtscrc_start_reg1: if (hTpEnc != NULL) { crcReg1 = transportEnc_CrcStartReg(hTpEnc, 192); } break; case adtscrc_start_reg2: if (hTpEnc != NULL) { crcReg2 = transportEnc_CrcStartReg(hTpEnc, 128); } break; case adtscrc_end_reg1: case drmcrc_end_reg: if (hTpEnc != NULL) { transportEnc_CrcEndReg(hTpEnc, crcReg1); } break; case adtscrc_end_reg2: if (hTpEnc != NULL) { transportEnc_CrcEndReg(hTpEnc, crcReg2); } break; case drmcrc_start_reg: if (hTpEnc != NULL) { crcReg1 = transportEnc_CrcStartReg(hTpEnc, 0); } break; case next_channel: ch = (ch + 1) % numberOfChannels; break; case link_sequence: list = list->next[decision_bit]; i=-1; break; default: error = AAC_ENC_UNKNOWN; break; } if (error != AAC_ENC_OK) { return error; } i++; } while (list->id[i] != end_of_sequence); bail: if (pBitDemand != NULL) { *pBitDemand = bitDemand; } return error; } //----------------------------------------------------------------------------------------------- AAC_ENCODER_ERROR FDKaacEnc_WriteBitstream(HANDLE_TRANSPORTENC hTpEnc, CHANNEL_MAPPING *channelMapping, QC_OUT *qcOut, PSY_OUT* psyOut, QC_STATE *qcKernel, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig ) { HANDLE_FDK_BITSTREAM hBs = transportEnc_GetBitstream(hTpEnc); AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK; int i, n, doByteAlign = 1; INT bitMarkUp; INT frameBits; /* Get first bit of raw data block. In case of ADTS+PCE, AU would start at PCE. This is okay because PCE assures alignment. */ UINT alignAnchor = FDKgetValidBits(hBs); frameBits = bitMarkUp = alignAnchor; /* Channel element loop */ for (i=0; inElements; i++) { ELEMENT_INFO elInfo = channelMapping->elInfo[i]; INT elementUsedBits = 0; switch (elInfo.elType) { case ID_SCE: /* single channel */ case ID_CPE: /* channel pair */ case ID_LFE: /* low freq effects channel */ { if ( AAC_ENC_OK != (ErrorStatus = FDKaacEnc_ChannelElementWrite( hTpEnc, &elInfo, qcOut->qcElement[i]->qcOutChannel, psyOut->psyOutElement[i], psyOut->psyOutElement[i]->psyOutChannel, syntaxFlags, /* syntaxFlags (ER tools ...) */ aot, /* aot: AOT_AAC_LC, AOT_SBR, AOT_PS */ epConfig, /* epConfig -1, 0, 1 */ NULL, 0 )) ) { return ErrorStatus; } if ( !(syntaxFlags & AC_ER) ) { /* Write associated extension payload */ for (n = 0; n < qcOut->qcElement[i]->nExtensions; n++) { FDKaacEnc_writeExtensionData( hTpEnc, &qcOut->qcElement[i]->extension[n], 0, alignAnchor, syntaxFlags, aot, epConfig ); } } } break; /* In FDK, DSE signalling explicit done in elDSE. See channel_map.cpp */ default: return AAC_ENC_INVALID_ELEMENTINFO_TYPE; } /* switch */ if(elInfo.elType != ID_DSE) { elementUsedBits -= bitMarkUp; bitMarkUp = FDKgetValidBits(hBs); elementUsedBits += bitMarkUp; frameBits += elementUsedBits; } } /* for (i=0; inElements; i++) { for (n = 0; n < qcOut->qcElement[i]->nExtensions; n++) { if ( (qcOut->qcElement[i]->extension[n].type==EXT_SBR_DATA) || (qcOut->qcElement[i]->extension[n].type==EXT_SBR_DATA_CRC) ) { /* Write sbr extension payload */ FDKaacEnc_writeExtensionData( hTpEnc, &qcOut->qcElement[i]->extension[n], 0, alignAnchor, syntaxFlags, aot, epConfig ); channelElementExtensionWritten[i][n] = 1; } /* SBR */ } /* n */ } /* i */ } /* AC_ELD */ for (i=0; inElements; i++) { for (n = 0; n < qcOut->qcElement[i]->nExtensions; n++) { if (channelElementExtensionWritten[i][n]==0) { /* Write all ramaining extension payloads in element */ FDKaacEnc_writeExtensionData( hTpEnc, &qcOut->qcElement[i]->extension[n], 0, alignAnchor, syntaxFlags, aot, epConfig ); } } /* n */ } /* i */ } /* if AC_ER */ /* Extend global extension payload table with fill bits */ if ( syntaxFlags & AC_DRM ) { /* Exception for Drm */ for (n = 0; n < qcOut->nExtensions; n++) { if ( (qcOut->extension[n].type == EXT_SBR_DATA) || (qcOut->extension[n].type == EXT_SBR_DATA_CRC) ) { /* SBR data must be the last extension! */ FDKmemcpy(&qcOut->extension[qcOut->nExtensions], &qcOut->extension[n], sizeof(QC_OUT_EXTENSION)); break; } } /* Do byte alignment after AAC (+ MPS) payload. Assure that MPS has been written as channel assigned extension payload! */ if (((FDKgetValidBits(hBs)-alignAnchor+(UINT)qcOut->totFillBits)&0x7)!=(UINT)qcOut->alignBits) { return AAC_ENC_WRITTEN_BITS_ERROR; } FDKaacEnc_ByteAlignment(hBs, qcOut->alignBits); doByteAlign = 0; } /* AC_DRM */ /* Add fill data / stuffing bits */ n = qcOut->nExtensions; qcOut->extension[n].type = EXT_FILL_DATA; qcOut->extension[n].nPayloadBits = qcOut->totFillBits; qcOut->nExtensions++; /* Write global extension payload and fill data */ for (n = 0; (n < qcOut->nExtensions) && (n < (2+2)); n++) { FDKaacEnc_writeExtensionData( hTpEnc, &qcOut->extension[n], 0, alignAnchor, syntaxFlags, aot, epConfig ); /* For EXT_FIL or EXT_FILL_DATA we could do an additional sanity check here */ } if (!(syntaxFlags & (AC_SCALABLE|AC_ER))) { FDKwriteBits(hBs, ID_END, EL_ID_BITS); } if (doByteAlign) { /* Assure byte alignment*/ if (((alignAnchor-FDKgetValidBits(hBs))&0x7)!=(UINT)qcOut->alignBits) { return AAC_ENC_WRITTEN_BITS_ERROR; } FDKaacEnc_ByteAlignment(hBs, qcOut->alignBits); } frameBits -= bitMarkUp; frameBits += FDKgetValidBits(hBs); transportEnc_EndAccessUnit(hTpEnc, &frameBits); if (frameBits != qcOut->totalBits + qcKernel->globHdrBits){ return AAC_ENC_WRITTEN_BITS_ERROR; } return ErrorStatus; } fdk-aac-0.1.3/libAACenc/src/pnsparam.h0000644000175000017500000001451412372261464017741 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Lohwasser contents/description: PNS parameters depending on bitrate and bandwidth ******************************************************************************/ #ifndef __PNSPARAM_H #define __PNSPARAM_H #include "aacenc.h" #include "common_fix.h" #include "psy_const.h" #define NUM_PNSINFOTAB 4 #define PNS_TABLE_ERROR -1 /* detection algorithm flags */ #define USE_POWER_DISTRIBUTION (1<<0) #define USE_PSYCH_TONALITY (1<<1) #define USE_TNS_GAIN_THR (1<<2) #define USE_TNS_PNS (1<<3) #define JUST_LONG_WINDOW (1<<4) /* additional algorithm flags */ #define IS_LOW_COMLEXITY (1<<5) typedef struct { /* PNS start band */ short startSfb; /* detection algorithm flags */ USHORT detectionAlgorithmFlags; /* Parameters for detection */ FIXP_DBL refPower; FIXP_DBL refTonality; INT tnsGainThreshold; INT tnsPNSGainThreshold; INT minSfbWidth; FIXP_SGL powDistPSDcurve[MAX_GROUPED_SFB]; FIXP_SGL gapFillThr; } NOISEPARAMS; int FDKaacEnc_lookUpPnsUse (int bitRate, int sampleRate, int numChan, const int isLC); /****** Definition of prototypes ******/ AAC_ENCODER_ERROR FDKaacEnc_GetPnsParam(NOISEPARAMS *np, INT bitRate, INT sampleRate, INT sfbCnt, const INT *sfbOffset, INT *usePns, INT numChan, const INT isLC); #endif fdk-aac-0.1.3/libAACenc/src/spreading.h0000644000175000017500000001223512372261464020072 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Spreading of energy and weighted tonality ******************************************************************************/ #ifndef _SPREADING_H #define _SPREADING_H #include "common_fix.h" void FDKaacEnc_SpreadingMax(const INT pbCnt, const FIXP_DBL *RESTRICT maskLowFactor, const FIXP_DBL *RESTRICT maskHighFactor, FIXP_DBL *RESTRICT pbSpreadEnergy); #endif /* #ifndef _SPREADING_H */ fdk-aac-0.1.3/libAACenc/src/tns_func.h0000644000175000017500000001436512372261464017743 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Goeschel contents/description: Temporal noise shaping ******************************************************************************/ #ifndef _TNS_FUNC_H #define _TNS_FUNC_H #include "common_fix.h" #include "psy_configuration.h" AAC_ENCODER_ERROR FDKaacEnc_InitTnsConfiguration(INT bitrate, INT samplerate, INT channels, INT blocktype, INT granuleLength, INT ldSbrPresent, TNS_CONFIG *tnsConfig, PSY_CONFIGURATION *psyConfig, INT active, INT useTnsPeak ); INT FDKaacEnc_TnsDetect( TNS_DATA *tnsData, const TNS_CONFIG *tC, TNS_INFO* tnsInfo, INT sfbCnt, FIXP_DBL *spectrum, INT subBlockNumber, INT blockType ); void FDKaacEnc_TnsSync( TNS_DATA *tnsDataDest, const TNS_DATA *tnsDataSrc, TNS_INFO *tnsInfoDest, TNS_INFO *tnsInfoSrc, const INT blockTypeDest, const INT blockTypeSrc, const TNS_CONFIG *tC ); INT FDKaacEnc_TnsEncode( TNS_INFO* tnsInfo, TNS_DATA* tnsData, const INT numOfSfb, const TNS_CONFIG *tC, const INT lowPassLine, FIXP_DBL* spectrum, const INT subBlockNumber, const INT blockType ); #endif /* _TNS_FUNC_H */ fdk-aac-0.1.3/libAACenc/src/psy_main.h0000644000175000017500000001741612372261464017743 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Psychoaccoustic major function block ******************************************************************************/ #ifndef _PSYMAIN_H #define _PSYMAIN_H #include "psy_configuration.h" #include "qc_data.h" #include "aacenc_pns.h" /* psych internal */ typedef struct { PSY_STATIC* psyStatic[(2)]; }PSY_ELEMENT; typedef struct { PSY_DATA psyData[(2)]; TNS_DATA tnsData[(2)]; PNS_DATA pnsData[(2)]; }PSY_DYNAMIC; typedef struct { PSY_CONFIGURATION psyConf[2]; /* LONG / SHORT */ PSY_ELEMENT* psyElement[(8)]; PSY_STATIC* pStaticChannels[(8)]; PSY_DYNAMIC* psyDynamic; INT granuleLength; }PSY_INTERNAL; AAC_ENCODER_ERROR FDKaacEnc_PsyNew(PSY_INTERNAL **phpsy, const INT nElements, const INT nChannels ,UCHAR *dynamic_RAM ); AAC_ENCODER_ERROR FDKaacEnc_PsyOutNew(PSY_OUT **phpsyOut, const INT nElements, const INT nChannels, const INT nSubFrames ,UCHAR *dynamic_RAM ); AAC_ENCODER_ERROR FDKaacEnc_psyInit(PSY_INTERNAL *hPsy, PSY_OUT **phpsyOut, const INT nSubFrames, const INT nMaxChannels, const AUDIO_OBJECT_TYPE audioObjectType, CHANNEL_MAPPING *cm); AAC_ENCODER_ERROR FDKaacEnc_psyMainInit(PSY_INTERNAL *hPsy, AUDIO_OBJECT_TYPE audioObjectType, CHANNEL_MAPPING *cm, INT sampleRate, INT granuleLength, INT bitRate, INT tnsMask, INT bandwidth, INT usePns, INT useIS, UINT syntaxFlags, ULONG initFlags); AAC_ENCODER_ERROR FDKaacEnc_psyMain(INT channels, PSY_ELEMENT *psyElement, PSY_DYNAMIC *psyDynamic, PSY_CONFIGURATION *psyConf, PSY_OUT_ELEMENT *psyOutElement, INT_PCM *pInput, INT *chIdx, INT totalChannels ); void FDKaacEnc_PsyClose(PSY_INTERNAL **phPsyInternal, PSY_OUT **phPsyOut); #endif /* _PSYMAIN_H */ fdk-aac-0.1.3/libAACenc/src/aacenc_tns.h0000644000175000017500000001747112372261464020223 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Groeschel contents/description: Temporal noise shaping ******************************************************************************/ #ifndef _TNS_H #define _TNS_H #include "common_fix.h" #include "psy_const.h" #ifndef PI #define PI 3.1415926535897931f #endif /** * TNS_ENABLE_MASK * This bitfield defines which TNS features are enabled * The TNS mask is composed of 4 bits. * tnsMask |= 0x1; activate TNS short blocks * tnsMask |= 0x2; activate TNS for long blocks * tnsMask |= 0x4; activate TNS PEAK tool for short blocks * tnsMask |= 0x8; activate TNS PEAK tool for long blocks */ #define TNS_ENABLE_MASK 0xf /* TNS max filter order for Low Complexity MPEG4 profile */ #define TNS_MAX_ORDER 12 #define MAX_NUM_OF_FILTERS 2 typedef struct{ /*stuff that is tabulated dependent on bitrate etc. */ INT filterEnabled[MAX_NUM_OF_FILTERS]; INT threshOn[MAX_NUM_OF_FILTERS]; /* min. prediction gain for using tns TABUL*/ INT tnsLimitOrder[MAX_NUM_OF_FILTERS]; /* Limit for TNS order TABUL*/ INT tnsFilterDirection[MAX_NUM_OF_FILTERS]; /* Filtering direction, 0=up, 1=down TABUL */ INT acfSplit[MAX_NUM_OF_FILTERS]; INT seperateFiltersAllowed; }TNS_CONFIG_TABULATED; typedef struct { /*assigned at InitTime*/ TNS_CONFIG_TABULATED confTab; INT tnsActive; INT maxOrder; /* max. order of tns filter */ INT coefRes; FIXP_DBL acfWindow[MAX_NUM_OF_FILTERS][TNS_MAX_ORDER+3+1]; /* now some things that only probably can be done at Init time; could be they have to be split up for each individual (short) window or even filter. */ INT lpcStartBand[MAX_NUM_OF_FILTERS]; INT lpcStartLine[MAX_NUM_OF_FILTERS]; INT lpcStopBand; INT lpcStopLine; }TNS_CONFIG; typedef struct { INT tnsActive; INT predictionGain; } TNS_SUBBLOCK_INFO; typedef struct{ /*changed at runTime*/ TNS_SUBBLOCK_INFO subBlockInfo[TRANS_FAC]; FIXP_DBL ratioMultTable[TRANS_FAC][MAX_SFB_SHORT]; } TNS_DATA_SHORT; typedef struct{ /*changed at runTime*/ TNS_SUBBLOCK_INFO subBlockInfo; FIXP_DBL ratioMultTable[MAX_SFB_LONG]; } TNS_DATA_LONG; /* can be implemented as union */ typedef shouldBeUnion{ TNS_DATA_LONG Long; TNS_DATA_SHORT Short; }TNS_DATA_RAW; typedef struct{ INT numOfSubblocks; TNS_DATA_RAW dataRaw; INT tnsMaxScaleSpec; INT filtersMerged; }TNS_DATA; typedef struct{ INT numOfFilters[TRANS_FAC]; INT coefRes[TRANS_FAC]; INT length[TRANS_FAC][MAX_NUM_OF_FILTERS]; INT order[TRANS_FAC][MAX_NUM_OF_FILTERS]; INT direction[TRANS_FAC][MAX_NUM_OF_FILTERS]; INT coefCompress[TRANS_FAC][MAX_NUM_OF_FILTERS]; /* for Long: length TNS_MAX_ORDER (12 for LC) is required -> 12 */ /* for Short: length TRANS_FAC*TNS_MAX_ORDER (only 5 for short LC) is required -> 8*5=40 */ /* Currently TRANS_FAC*TNS_MAX_ORDER = 8*12 = 96 (for LC) is used (per channel)! Memory could be saved here! */ INT coef[TRANS_FAC][MAX_NUM_OF_FILTERS][TNS_MAX_ORDER]; }TNS_INFO; INT FDKaacEnc_FreqToBandWithRounding( const INT freq, const INT fs, const INT numOfBands, const INT *bandStartOffset ); #endif /* _TNS_H */ fdk-aac-0.1.3/libAACenc/src/interface.h0000644000175000017500000001444412372261464020062 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Interface psychoaccoustic/quantizer ******************************************************************************/ #ifndef _INTERFACE_H #define _INTERFACE_H #include "common_fix.h" #include "FDK_audio.h" #include "psy_data.h" #include "aacenc_tns.h" enum { MS_NONE = 0, MS_SOME = 1, MS_ALL = 2 }; enum { MS_ON = 1 }; struct TOOLSINFO { INT msDigest; /* 0 = no MS; 1 = some MS, 2 = all MS */ INT msMask[MAX_GROUPED_SFB]; }; typedef struct { INT sfbCnt; INT sfbPerGroup; INT maxSfbPerGroup; INT lastWindowSequence; INT windowShape; INT groupingMask; INT sfbOffsets[MAX_GROUPED_SFB+1]; INT mdctScale; /* number of transform shifts */ INT groupLen[MAX_NO_OF_GROUPS]; TNS_INFO tnsInfo; INT noiseNrg[MAX_GROUPED_SFB]; INT isBook[MAX_GROUPED_SFB]; INT isScale[MAX_GROUPED_SFB]; /* memory located in QC_OUT_CHANNEL */ FIXP_DBL *mdctSpectrum; FIXP_DBL *sfbEnergy; FIXP_DBL *sfbSpreadEnergy; FIXP_DBL *sfbThresholdLdData; FIXP_DBL *sfbMinSnrLdData; FIXP_DBL *sfbEnergyLdData; }PSY_OUT_CHANNEL; typedef struct { /* information specific to each channel */ PSY_OUT_CHANNEL* psyOutChannel[(2)]; /* information shared by both channels */ INT commonWindow; struct TOOLSINFO toolsInfo; } PSY_OUT_ELEMENT; typedef struct { PSY_OUT_ELEMENT* psyOutElement[(8)]; PSY_OUT_CHANNEL* pPsyOutChannels[(8)]; }PSY_OUT; inline int isLowDelay( AUDIO_OBJECT_TYPE aot ) { return (aot==AOT_ER_AAC_LD || aot==AOT_ER_AAC_ELD); } #endif /* _INTERFACE_H */ fdk-aac-0.1.3/libAACenc/src/metadata_main.h0000644000175000017500000002316312372261464020704 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /********************** Fraunhofer IIS FDK AAC Encoder lib ****************** Author(s): V. Bacigalupo Description: Metadata Encoder library interface functions ******************************************************************************/ #ifndef _METADATA_MAIN_H #define _METADATA_MAIN_H /* Includes ******************************************************************/ #include "aacenc_lib.h" #include "aacenc.h" /* Defines *******************************************************************/ /* Data Types ****************************************************************/ typedef enum { METADATA_OK = 0x0000, /*!< No error happened. All fine. */ METADATA_INVALID_HANDLE = 0x0020, /*!< Handle passed to function call was invalid. */ METADATA_MEMORY_ERROR = 0x0021, /*!< Memory allocation failed. */ METADATA_INIT_ERROR = 0x0040, /*!< General initialization error. */ METADATA_ENCODE_ERROR = 0x0060 /*!< The encoding process was interrupted by an unexpected error. */ } FDK_METADATA_ERROR; /** * Meta Data handle. */ typedef struct FDK_METADATA_ENCODER *HANDLE_FDK_METADATA_ENCODER; /** * \brief Open a Meta Data instance. * * \param phMetadataEnc A pointer to a Meta Data handle to be allocated. Initialized on return. * * \return * - METADATA_OK, on succes. * - METADATA_INVALID_HANDLE, METADATA_MEMORY_ERROR, on failure. */ FDK_METADATA_ERROR FDK_MetadataEnc_Open( HANDLE_FDK_METADATA_ENCODER *phMetadataEnc ); /** * \brief Initialize a Meta Data instance. * * \param hMetadataEnc Meta Data handle. * \param resetStates Indication for full reset of all states. * \param metadataMode Configures metat data output format (0,1,2). * \param audioDelay Delay cause by the audio encoder. * \param frameLength Number of samples to be processes within one frame. * \param sampleRate Sampling rat in Hz of audio input signal. * \param nChannels Number of audio input channels. * \param channelMode Channel configuration which is used by the encoder. * \param channelOrder Channel order of the input data. (WAV, MPEG) * * \return * - METADATA_OK, on succes. * - METADATA_INVALID_HANDLE, METADATA_INIT_ERROR, on failure. */ FDK_METADATA_ERROR FDK_MetadataEnc_Init( HANDLE_FDK_METADATA_ENCODER hMetadataEnc, const INT resetStates, const INT metadataMode, const INT audioDelay, const UINT frameLength, const UINT sampleRate, const UINT nChannels, const CHANNEL_MODE channelMode, const CHANNEL_ORDER channelOrder ); /** * \brief Calculate Meta Data processing. * * This function treats all step necessary for meta data processing. * - Receive new meta data and make usable. * - Calculate DRC compressor and extract meta data info. * - Make meta data available for extern use. * - Apply audio data and meta data delay compensation. * * \param hMetadataEnc Meta Data handle. * \param pAudioSamples Pointer to audio input data. Existing function overwrites audio data with delayed audio samples. * \param nAudioSamples Number of input audio samples to be prcessed. * \param pMetadata Pointer to Metat Data input. * \param ppMetaDataExtPayload Pointer to extension payload array. Filled on return. * \param nMetaDataExtensions Pointer to variable to describe number of available extension payloads. Filled on return. * \param matrix_mixdown_idx Pointer to variable for matrix mixdown coefficient. Filled on return. * * \return * - METADATA_OK, on succes. * - METADATA_INVALID_HANDLE, METADATA_ENCODE_ERROR, on failure. */ FDK_METADATA_ERROR FDK_MetadataEnc_Process( HANDLE_FDK_METADATA_ENCODER hMetadataEnc, INT_PCM * const pAudioSamples, const INT nAudioSamples, const AACENC_MetaData * const pMetadata, AACENC_EXT_PAYLOAD ** ppMetaDataExtPayload, UINT * nMetaDataExtensions, INT * matrix_mixdown_idx ); /** * \brief Close the Meta Data instance. * * Deallocate instance and free whole memory. * * \param phMetaData Pointer to the Meta Data handle to be deallocated. * * \return * - METADATA_OK, on succes. * - METADATA_INVALID_HANDLE, on failure. */ FDK_METADATA_ERROR FDK_MetadataEnc_Close( HANDLE_FDK_METADATA_ENCODER *phMetaData ); /** * \brief Get Meta Data Encoder delay. * * \param hMetadataEnc Meta Data Encoder handle. * * \return Delay caused by Meta Data module. */ INT FDK_MetadataEnc_GetDelay( HANDLE_FDK_METADATA_ENCODER hMetadataEnc ); #endif /* _METADATA_MAIN_H */ fdk-aac-0.1.3/libAACenc/src/bit_cnt.h0000644000175000017500000001610312372261464017536 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Huffman Bitcounter & coder ******************************************************************************/ #ifndef __BITCOUNT_H #define __BITCOUNT_H #include "common_fix.h" #include "FDK_bitstream.h" #include "aacEnc_rom.h" #define INVALID_BITCOUNT (FDK_INT_MAX/4) /* code book number table */ enum codeBookNo{ CODE_BOOK_ZERO_NO= 0, CODE_BOOK_1_NO= 1, CODE_BOOK_2_NO= 2, CODE_BOOK_3_NO= 3, CODE_BOOK_4_NO= 4, CODE_BOOK_5_NO= 5, CODE_BOOK_6_NO= 6, CODE_BOOK_7_NO= 7, CODE_BOOK_8_NO= 8, CODE_BOOK_9_NO= 9, CODE_BOOK_10_NO= 10, CODE_BOOK_ESC_NO= 11, CODE_BOOK_RES_NO= 12, CODE_BOOK_PNS_NO= 13, CODE_BOOK_IS_OUT_OF_PHASE_NO= 14, CODE_BOOK_IS_IN_PHASE_NO= 15 }; /* code book index table */ enum codeBookNdx{ CODE_BOOK_ZERO_NDX, CODE_BOOK_1_NDX, CODE_BOOK_2_NDX, CODE_BOOK_3_NDX, CODE_BOOK_4_NDX, CODE_BOOK_5_NDX, CODE_BOOK_6_NDX, CODE_BOOK_7_NDX, CODE_BOOK_8_NDX, CODE_BOOK_9_NDX, CODE_BOOK_10_NDX, CODE_BOOK_ESC_NDX, CODE_BOOK_RES_NDX, CODE_BOOK_PNS_NDX, CODE_BOOK_IS_OUT_OF_PHASE_NDX, CODE_BOOK_IS_IN_PHASE_NDX, NUMBER_OF_CODE_BOOKS }; /* code book lav table */ enum codeBookLav{ CODE_BOOK_ZERO_LAV=0, CODE_BOOK_1_LAV=1, CODE_BOOK_2_LAV=1, CODE_BOOK_3_LAV=2, CODE_BOOK_4_LAV=2, CODE_BOOK_5_LAV=4, CODE_BOOK_6_LAV=4, CODE_BOOK_7_LAV=7, CODE_BOOK_8_LAV=7, CODE_BOOK_9_LAV=12, CODE_BOOK_10_LAV=12, CODE_BOOK_ESC_LAV=16, CODE_BOOK_SCF_LAV=60, CODE_BOOK_PNS_LAV=60 }; INT FDKaacEnc_bitCount(const SHORT *aQuantSpectrum, const INT noOfSpecLines, INT maxVal, INT *bitCountLut); INT FDKaacEnc_countValues(SHORT *values, INT width, INT codeBook); INT FDKaacEnc_codeValues(SHORT *values, INT width, INT codeBook, HANDLE_FDK_BITSTREAM hBitstream); INT FDKaacEnc_codeScalefactorDelta(INT scalefactor, HANDLE_FDK_BITSTREAM hBitstream); inline INT FDKaacEnc_bitCountScalefactorDelta(const INT delta) { FDK_ASSERT( (0 <= (delta+CODE_BOOK_SCF_LAV)) && ((delta+CODE_BOOK_SCF_LAV)<(int)(sizeof(FDKaacEnc_huff_ltabscf)/sizeof((FDKaacEnc_huff_ltabscf[0])))) ); return((INT)FDKaacEnc_huff_ltabscf[delta+CODE_BOOK_SCF_LAV]); } #endif fdk-aac-0.1.3/libAACenc/src/qc_main.cpp0000644000175000017500000017430512372261464020067 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Quantizing & coding ******************************************************************************/ #include "qc_main.h" #include "quantize.h" #include "interface.h" #include "adj_thr.h" #include "sf_estim.h" #include "bit_cnt.h" #include "dyn_bits.h" #include "channel_map.h" #include "aacEnc_ram.h" #include "genericStds.h" typedef struct { QCDATA_BR_MODE bitrateMode; LONG vbrQualFactor; } TAB_VBR_QUAL_FACTOR; static const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = { {QCDATA_BR_MODE_CBR, FL2FXCONST_DBL(0.00f)}, {QCDATA_BR_MODE_VBR_1, FL2FXCONST_DBL(0.160f)}, /* 32 kbps mono AAC-LC + SBR + PS */ {QCDATA_BR_MODE_VBR_2, FL2FXCONST_DBL(0.148f)}, /* 64 kbps stereo AAC-LC + SBR */ {QCDATA_BR_MODE_VBR_3, FL2FXCONST_DBL(0.135f)}, /* 80 - 96 kbps stereo AAC-LC */ {QCDATA_BR_MODE_VBR_4, FL2FXCONST_DBL(0.111f)}, /* 128 kbps stereo AAC-LC */ {QCDATA_BR_MODE_VBR_5, FL2FXCONST_DBL(0.070f)}, /* 192 kbps stereo AAC-LC */ {QCDATA_BR_MODE_SFR, FL2FXCONST_DBL(0.00f)}, {QCDATA_BR_MODE_FF, FL2FXCONST_DBL(0.00f)} }; static INT isConstantBitrateMode( const QCDATA_BR_MODE bitrateMode ) { return ( ((bitrateMode==QCDATA_BR_MODE_CBR) || (bitrateMode==QCDATA_BR_MODE_SFR) || (bitrateMode==QCDATA_BR_MODE_FF)) ? 1 : 0 ); } typedef enum{ FRAME_LEN_BYTES_MODULO = 1, FRAME_LEN_BYTES_INT = 2 }FRAME_LEN_RESULT_MODE; /* forward declarations */ static INT FDKaacEnc_calcMaxValueInSfb(INT sfbCnt, INT maxSfbPerGroup, INT sfbPerGroup, INT *RESTRICT sfbOffset, SHORT *RESTRICT quantSpectrum, UINT *RESTRICT maxValue); static void FDKaacEnc_crashRecovery(INT nChannels, PSY_OUT_ELEMENT* psyOutElement, QC_OUT* qcOut, QC_OUT_ELEMENT *qcElement, INT bitsToSave, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig); static AAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int* iterations, const int maxIterations, int gainAdjustment, int* chConstraintsFulfilled, int* calculateQuant, int nChannels, PSY_OUT_ELEMENT* psyOutElement, QC_OUT* qcOut, QC_OUT_ELEMENT* qcOutElement, ELEMENT_BITS* elBits, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig); void FDKaacEnc_QCClose (QC_STATE **phQCstate, QC_OUT **phQC); /***************************************************************************** functionname: FDKaacEnc_calcFrameLen description: returns: input: output: *****************************************************************************/ static INT FDKaacEnc_calcFrameLen(INT bitRate, INT sampleRate, INT granuleLength, FRAME_LEN_RESULT_MODE mode) { INT result; result = ((granuleLength)>>3)*(bitRate); switch(mode) { case FRAME_LEN_BYTES_MODULO: result %= sampleRate; break; case FRAME_LEN_BYTES_INT: result /= sampleRate; break; } return(result); } /***************************************************************************** functionname:FDKaacEnc_framePadding description: Calculates if padding is needed for actual frame returns: input: output: *****************************************************************************/ static INT FDKaacEnc_framePadding(INT bitRate, INT sampleRate, INT granuleLength, INT *paddingRest) { INT paddingOn; INT difference; paddingOn = 0; difference = FDKaacEnc_calcFrameLen( bitRate, sampleRate, granuleLength, FRAME_LEN_BYTES_MODULO ); *paddingRest-=difference; if (*paddingRest <= 0 ) { paddingOn = 1; *paddingRest += sampleRate; } return( paddingOn ); } /********************************************************************************* functionname: FDKaacEnc_QCOutNew description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_QCOutNew(QC_OUT **phQC, const INT nElements, const INT nChannels, const INT nSubFrames ,UCHAR *dynamic_RAM ) { AAC_ENCODER_ERROR ErrorStatus; int n, i; int elInc = 0, chInc = 0; for (n=0; npQcOutChannels[i] = GetRam_aacEnc_QCchannel(chInc, dynamic_RAM); if ( phQC[n]->pQcOutChannels[i] == NULL ) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCOutNew_bail; } chInc++; } /* nChannels */ for (i=0; iqcElement[i] = GetRam_aacEnc_QCelement(elInc); if (phQC[n]->qcElement[i] == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCOutNew_bail; } elInc++; } /* nElements */ } /* nSubFrames */ return AAC_ENC_OK; QCOutNew_bail: return ErrorStatus; } /********************************************************************************* functionname: FDKaacEnc_QCOutInit description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_QCOutInit(QC_OUT *phQC[(1)], const INT nSubFrames, const CHANNEL_MAPPING *cm) { INT n,i,ch; for (n=0; nnElements; i++) { for (ch=0; chelInfo[i].nChannelsInEl; ch++) { phQC[n]->qcElement[i]->qcOutChannel[ch] = phQC[n]->pQcOutChannels[chInc]; chInc++; } /* chInEl */ } /* nElements */ } /* nSubFrames */ return AAC_ENC_OK; } /********************************************************************************* functionname: FDKaacEnc_QCNew description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_QCNew(QC_STATE **phQC, INT nElements ,UCHAR* dynamic_RAM ) { AAC_ENCODER_ERROR ErrorStatus; int i; QC_STATE* hQC = GetRam_aacEnc_QCstate(); *phQC = hQC; if (hQC == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCNew_bail; } if (FDKaacEnc_AdjThrNew(&hQC->hAdjThr, nElements)) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCNew_bail; } if (FDKaacEnc_BCNew(&(hQC->hBitCounter), dynamic_RAM)) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCNew_bail; } for (i=0; ielementBits[i] = GetRam_aacEnc_ElementBits(i); if (hQC->elementBits[i] == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto QCNew_bail; } } return AAC_ENC_OK; QCNew_bail: FDKaacEnc_QCClose(phQC, NULL); return ErrorStatus; } /********************************************************************************* functionname: FDKaacEnc_QCInit description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_QCInit(QC_STATE *hQC, struct QC_INIT *init) { hQC->maxBitsPerFrame = init->maxBits; hQC->minBitsPerFrame = init->minBits; hQC->nElements = init->channelMapping->nElements; hQC->bitResTotMax = init->bitRes; hQC->bitResTot = init->bitRes; hQC->maxBitFac = init->maxBitFac; hQC->bitrateMode = init->bitrateMode; hQC->invQuant = init->invQuant; hQC->maxIterations = init->maxIterations; if ( isConstantBitrateMode(hQC->bitrateMode) ) { INT bitresPerChannel = (hQC->bitResTotMax / init->channelMapping->nChannelsEff); /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */ hQC->bitDistributionMode = (bitresPerChannel>100) ? 0 : (bitresPerChannel>0) ? 1 : 2; } else { hQC->bitDistributionMode = 0; /* full bitreservoir */ } hQC->padding.paddingRest = init->padding.paddingRest; hQC->globHdrBits = init->staticBits; /* Bit overhead due to transport */ FDKaacEnc_InitElementBits(hQC, init->channelMapping, init->bitrate, (init->averageBits/init->nSubFrames) - hQC->globHdrBits, hQC->maxBitsPerFrame/init->channelMapping->nChannelsEff); switch(hQC->bitrateMode){ case QCDATA_BR_MODE_CBR: case QCDATA_BR_MODE_VBR_1: case QCDATA_BR_MODE_VBR_2: case QCDATA_BR_MODE_VBR_3: case QCDATA_BR_MODE_VBR_4: case QCDATA_BR_MODE_VBR_5: case QCDATA_BR_MODE_SFR: case QCDATA_BR_MODE_FF: if((int)hQC->bitrateMode < (int)(sizeof(tableVbrQualFactor)/sizeof(TAB_VBR_QUAL_FACTOR))){ hQC->vbrQualFactor = (FIXP_DBL)tableVbrQualFactor[hQC->bitrateMode].vbrQualFactor; } else { hQC->vbrQualFactor = FL2FXCONST_DBL(0.f); /* default setting */ } break; case QCDATA_BR_MODE_INVALID: default: hQC->vbrQualFactor = FL2FXCONST_DBL(0.f); break; } FDKaacEnc_AdjThrInit( hQC->hAdjThr, init->meanPe, hQC->elementBits, /* or channelBitrates, was: channelBitrate */ hQC->invQuant, init->channelMapping->nElements, init->channelMapping->nChannelsEff, init->sampleRate, /* output sample rate */ init->advancedBitsToPe, /* if set, calc bits2PE factor depending on samplerate */ hQC->vbrQualFactor ); return AAC_ENC_OK; } /********************************************************************************* functionname: FDKaacEnc_QCMainPrepare description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_QCMainPrepare(ELEMENT_INFO *elInfo, ATS_ELEMENT* RESTRICT adjThrStateElement, PSY_OUT_ELEMENT* RESTRICT psyOutElement, QC_OUT_ELEMENT* RESTRICT qcOutElement, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig ) { AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK; INT nChannels = elInfo->nChannelsInEl; PSY_OUT_CHANNEL** RESTRICT psyOutChannel = psyOutElement->psyOutChannel; /* may be modified in-place */ FDKaacEnc_CalcFormFactor(qcOutElement->qcOutChannel, psyOutChannel, nChannels); /* prepare and calculate PE without reduction */ FDKaacEnc_peCalculation(&qcOutElement->peData, psyOutChannel, qcOutElement->qcOutChannel, &psyOutElement->toolsInfo, adjThrStateElement, nChannels); ErrorStatus = FDKaacEnc_ChannelElementWrite( NULL, elInfo, NULL, psyOutElement, psyOutElement->psyOutChannel, syntaxFlags, aot, epConfig, &qcOutElement->staticBitsUsed, 0 ); return ErrorStatus; } /********************************************************************************* functionname: FDKaacEnc_AdjustBitrate description: adjusts framelength via padding on a frame to frame basis, to achieve a bitrate that demands a non byte aligned framelength return: errorcode **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_AdjustBitrate(QC_STATE *RESTRICT hQC, CHANNEL_MAPPING *RESTRICT cm, INT *avgTotalBits, INT bitRate, /* total bitrate */ INT sampleRate, /* output sampling rate */ INT granuleLength) /* frame length */ { INT paddingOn; INT frameLen; /* Do we need an extra padding byte? */ paddingOn = FDKaacEnc_framePadding(bitRate, sampleRate, granuleLength, &hQC->padding.paddingRest); frameLen = paddingOn + FDKaacEnc_calcFrameLen(bitRate, sampleRate, granuleLength, FRAME_LEN_BYTES_INT); *avgTotalBits = frameLen<<3; return AAC_ENC_OK; } static AAC_ENCODER_ERROR FDKaacEnc_distributeElementDynBits(QC_STATE* hQC, QC_OUT_ELEMENT* qcElement[(8)], CHANNEL_MAPPING* cm, INT codeBits) { INT i, firstEl = cm->nElements-1; INT totalBits = 0; for (i=(cm->nElements-1); i>=0; i--) { if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) || (cm->elInfo[i].elType == ID_LFE)) { qcElement[i]->grantedDynBits = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)codeBits); totalBits += qcElement[i]->grantedDynBits; firstEl = i; } } qcElement[firstEl]->grantedDynBits += codeBits - totalBits; return AAC_ENC_OK; } /** * \brief Verify whether minBitsPerFrame criterion can be satisfied. * * This function evaluates the bit consumption only if minBitsPerFrame parameter is not 0. * In hyperframing mode the difference between grantedDynBits and usedDynBits of all sub frames * results the number of fillbits to be written. * This bits can be distrubitued in superframe to reach minBitsPerFrame bit consumption in single AU's. * The return value denotes if enough desired fill bits are available to achieve minBitsPerFrame in all frames. * This check can only be used within superframes. * * \param qcOut Pointer to coding data struct. * \param minBitsPerFrame Minimal number of bits to be consumed in each frame. * \param nSubFrames Number of frames in superframe * * \return * - 1: all fine * - 0: criterion not fulfilled */ static int checkMinFrameBitsDemand( QC_OUT** qcOut, const INT minBitsPerFrame, const INT nSubFrames ) { int result = 1; /* all fine*/ return result; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /********************************************************************************* functionname: FDKaacEnc_getMinimalStaticBitdemand description: calculate minmal size of static bits by reduction , to zero spectrum and deactivating tns and MS return: number of static bits **********************************************************************************/ static int FDKaacEnc_getMinimalStaticBitdemand(CHANNEL_MAPPING* cm, PSY_OUT** psyOut) { AUDIO_OBJECT_TYPE aot = AOT_AAC_LC; UINT syntaxFlags = 0; SCHAR epConfig = -1; int i, bitcount = 0; for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ( (elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE) ) { INT minElBits = 0; FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL, psyOut[0]->psyOutElement[i], psyOut[0]->psyOutElement[i]->psyOutChannel, syntaxFlags, aot, epConfig, &minElBits, 1 ); bitcount += minElBits; } } return bitcount; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static AAC_ENCODER_ERROR FDKaacEnc_prepareBitDistribution(QC_STATE* hQC, PSY_OUT** psyOut, QC_OUT** qcOut, CHANNEL_MAPPING* cm, QC_OUT_ELEMENT* qcElement[(1)][(8)], INT avgTotalBits, INT *totalAvailableBits, INT *avgTotalDynBits) { int i; /* get maximal allowed dynamic bits */ qcOut[0]->grantedDynBits = (fixMin(hQC->maxBitsPerFrame, avgTotalBits) - hQC->globHdrBits)&~7; qcOut[0]->grantedDynBits -= (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits); qcOut[0]->maxDynBits = ((hQC->maxBitsPerFrame)&~7) - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits); /* assure that enough bits are available */ if ((qcOut[0]->grantedDynBits+hQC->bitResTot) < 0) { /* crash recovery allows to reduce static bits to a minimum */ if ( (qcOut[0]->grantedDynBits+hQC->bitResTot) < (FDKaacEnc_getMinimalStaticBitdemand(cm, psyOut)-qcOut[0]->staticBits) ) return AAC_ENC_BITRES_TOO_LOW; } /* distribute dynamic bits to each element */ FDKaacEnc_distributeElementDynBits(hQC, qcElement[0], cm, qcOut[0]->grantedDynBits); *avgTotalDynBits = 0; /*frameDynBits;*/ *totalAvailableBits = avgTotalBits; /* sum up corrected granted PE */ qcOut[0]->totalGrantedPeCorr = 0; for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; int nChannels = elInfo.nChannelsInEl; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* for ( all sub frames ) ... */ FDKaacEnc_DistributeBits(hQC->hAdjThr, hQC->hAdjThr->adjThrStateElem[i], psyOut[0]->psyOutElement[i]->psyOutChannel, &qcElement[0][i]->peData, &qcElement[0][i]->grantedPe, &qcElement[0][i]->grantedPeCorr, nChannels, psyOut[0]->psyOutElement[i]->commonWindow, qcElement[0][i]->grantedDynBits, hQC->elementBits[i]->bitResLevelEl, hQC->elementBits[i]->maxBitResBitsEl, hQC->maxBitFac, hQC->bitDistributionMode); *totalAvailableBits += hQC->elementBits[i]->bitResLevelEl; /* get total corrected granted PE */ qcOut[0]->totalGrantedPeCorr += qcElement[0][i]->grantedPeCorr; } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ *totalAvailableBits = FDKmin(hQC->maxBitsPerFrame, (*totalAvailableBits)); return AAC_ENC_OK; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static AAC_ENCODER_ERROR FDKaacEnc_updateUsedDynBits(INT* sumDynBitsConsumed, QC_OUT_ELEMENT* qcElement[(8)], CHANNEL_MAPPING* cm) { INT i; *sumDynBitsConsumed = 0; for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* sum up bits consumed */ *sumDynBitsConsumed += qcElement[i]->dynBitsUsed; } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ return AAC_ENC_OK; } static INT FDKaacEnc_getTotalConsumedDynBits(QC_OUT** qcOut, INT nSubFrames) { INT c, totalBits=0; /* sum up bit consumption for all sub frames */ for (c=0; cusedDynBits==-1) return -1; totalBits += qcOut[c]->usedDynBits; } return totalBits; } static INT FDKaacEnc_getTotalConsumedBits(QC_OUT** qcOut, QC_OUT_ELEMENT* qcElement[(1)][(8)], CHANNEL_MAPPING* cm, INT globHdrBits, INT nSubFrames) { int c, i; int totalUsedBits = 0; for (c = 0 ; c < nSubFrames ; c++ ) { int dataBits = 0; for (i=0; inElements; i++) { if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) || (cm->elInfo[i].elType == ID_LFE)) { dataBits += qcElement[c][i]->dynBitsUsed + qcElement[c][i]->staticBitsUsed + qcElement[c][i]->extBitsUsed; } } dataBits += qcOut[c]->globalExtBits; totalUsedBits += (8 - (dataBits) % 8) % 8; totalUsedBits += dataBits + globHdrBits; /* header bits for every frame */ } return totalUsedBits; } static AAC_ENCODER_ERROR FDKaacEnc_BitResRedistribution( QC_STATE *const hQC, const CHANNEL_MAPPING *const cm, const INT avgTotalBits ) { /* check bitreservoir fill level */ if (hQC->bitResTot < 0) { return AAC_ENC_BITRES_TOO_LOW; } else if (hQC->bitResTot > hQC->bitResTotMax) { return AAC_ENC_BITRES_TOO_HIGH; } else { INT i, firstEl = cm->nElements-1; INT totalBits = 0, totalBits_max = 0; int totalBitreservoir = FDKmin(hQC->bitResTot, (hQC->maxBitsPerFrame-avgTotalBits)); int totalBitreservoirMax = FDKmin(hQC->bitResTotMax, (hQC->maxBitsPerFrame-avgTotalBits)); int sc_bitResTot = CountLeadingBits(totalBitreservoir); int sc_bitResTotMax = CountLeadingBits(totalBitreservoirMax); for (i=(cm->nElements-1); i>=0; i--) { if ((cm->elInfo[i].elType == ID_SCE) || (cm->elInfo[i].elType == ID_CPE) || (cm->elInfo[i].elType == ID_LFE)) { hQC->elementBits[i]->bitResLevelEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoir<>sc_bitResTot; totalBits += hQC->elementBits[i]->bitResLevelEl; hQC->elementBits[i]->maxBitResBitsEl = (INT)fMult(hQC->elementBits[i]->relativeBitsEl, (FIXP_DBL)(totalBitreservoirMax<>sc_bitResTotMax; totalBits_max += hQC->elementBits[i]->maxBitResBitsEl; firstEl = i; } } hQC->elementBits[firstEl]->bitResLevelEl += totalBitreservoir - totalBits; hQC->elementBits[firstEl]->maxBitResBitsEl += totalBitreservoirMax - totalBits_max; } return AAC_ENC_OK; } AAC_ENCODER_ERROR FDKaacEnc_QCMain(QC_STATE* RESTRICT hQC, PSY_OUT** psyOut, QC_OUT** qcOut, INT avgTotalBits, CHANNEL_MAPPING* cm ,AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig ) { int i, c; AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK; INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */ INT totalAvailableBits = 0; INT nSubFrames = 1; /*-------------------------------------------- */ /* redistribute total bitreservoir to elements */ ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits); if (ErrorStatus != AAC_ENC_OK) { return ErrorStatus; } /*-------------------------------------------- */ /* fastenc needs one time threshold simulation, in case of multiple frames, one more guess has to be calculated */ /*-------------------------------------------- */ /* helper pointer */ QC_OUT_ELEMENT* qcElement[(1)][(8)]; /* work on a copy of qcChannel and qcElement */ for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* for ( all sub frames ) ... */ for (c = 0 ; c < nSubFrames ; c++ ) { { qcElement[c][i] = qcOut[c]->qcElement[i]; } } } } /*-------------------------------------------- */ /*-------------------------------------------- */ if ( isConstantBitrateMode(hQC->bitrateMode) ) { /* calc granted dynamic bits for sub frame and distribute it to each element */ ErrorStatus = FDKaacEnc_prepareBitDistribution( hQC, psyOut, qcOut, cm, qcElement, avgTotalBits, &totalAvailableBits, &avgTotalDynBits); if (ErrorStatus != AAC_ENC_OK) { return ErrorStatus; } } else { qcOut[0]->grantedDynBits = ((hQC->maxBitsPerFrame - (hQC->globHdrBits))&~7) - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + qcOut[0]->elementExtBits); qcOut[0]->maxDynBits = qcOut[0]->grantedDynBits; totalAvailableBits = hQC->maxBitsPerFrame; avgTotalDynBits = 0; } #ifdef PNS_PRECOUNT_ENABLE /* Calculate estimated pns bits and substract them from grantedDynBits to get a more accurate number of available bits. */ if (syntaxFlags & (AC_LD|AC_ELD)) { int estimatedPnsBits = 0, ch; for (ch=0; chnChannels; ch++) { qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits = noisePreCount(psyOut[0]->pPsyOutChannels[ch]->noiseNrg, psyOut[0]->pPsyOutChannels[ch]->maxSfbPerGroup); estimatedPnsBits += qcOut[0]->pQcOutChannels[ch]->sectionData.noiseNrgBits; } qcOut[0]->grantedDynBits -= estimatedPnsBits; } #endif /* for ( all sub frames ) ... */ for (c = 0 ; c < nSubFrames ; c++ ) { /* for CBR and VBR mode */ FDKaacEnc_AdjustThresholds(hQC->hAdjThr->adjThrStateElem, qcElement[c], qcOut[c], psyOut[c]->psyOutElement, isConstantBitrateMode(hQC->bitrateMode), cm); } /* -end- sub frame counter */ /*-------------------------------------------- */ INT iterations[(1)][(8)]; INT chConstraintsFulfilled[(1)][(8)][(2)]; INT calculateQuant[(1)][(8)][(2)]; INT constraintsFulfilled[(1)][(8)]; /*-------------------------------------------- */ /* for ( all sub frames ) ... */ for (c = 0 ; c < nSubFrames ; c++ ) { for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; INT ch, nChannels = elInfo.nChannelsInEl; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* Turn thresholds into scalefactors, optimize bit consumption and verify conformance */ FDKaacEnc_EstimateScaleFactors(psyOut[c]->psyOutElement[i]->psyOutChannel, qcElement[c][i]->qcOutChannel, hQC->invQuant, cm->elInfo[i].nChannelsInEl); /*-------------------------------------------- */ constraintsFulfilled[c][i] = 1; iterations[c][i] = 0 ; for (ch = 0; ch < nChannels; ch++) { chConstraintsFulfilled[c][i][ch] = 1; calculateQuant[c][i][ch] = 1; } /*-------------------------------------------- */ } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ qcOut[c]->usedDynBits = -1; } /* -end- sub frame counter */ INT quantizationDone = 0; INT sumDynBitsConsumedTotal = 0; INT decreaseBitConsumption = -1; /* no direction yet! */ /*-------------------------------------------- */ /* -start- Quantization loop ... */ /*-------------------------------------------- */ do /* until max allowed bits per frame and maxDynBits!=-1*/ { quantizationDone = 0; c = 0; /* get frame to process */ for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; INT ch, nChannels = elInfo.nChannelsInEl; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { do /* until spectral values < MAX_QUANT */ { /*-------------------------------------------- */ if (!constraintsFulfilled[c][i]) { FDKaacEnc_reduceBitConsumption(&iterations[c][i], hQC->maxIterations, (decreaseBitConsumption) ? 1 : -1, chConstraintsFulfilled[c][i], calculateQuant[c][i], nChannels, psyOut[c]->psyOutElement[i], qcOut[c], qcElement[c][i], hQC->elementBits[i], aot, syntaxFlags, epConfig); } /*-------------------------------------------- */ /*-------------------------------------------- */ constraintsFulfilled[c][i] = 1 ; /*-------------------------------------------- */ /* quantize spectrum (per each channel) */ for (ch = 0; ch < nChannels; ch++) { /*-------------------------------------------- */ chConstraintsFulfilled[c][i][ch] = 1; /*-------------------------------------------- */ if (calculateQuant[c][i][ch]) { QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch]; PSY_OUT_CHANNEL* psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch]; calculateQuant[c][i][ch] = 0; /* calculate quantization only if necessary */ /*-------------------------------------------- */ FDKaacEnc_QuantizeSpectrum(psyOutCh->sfbCnt, psyOutCh->maxSfbPerGroup, psyOutCh->sfbPerGroup, psyOutCh->sfbOffsets, qcOutCh->mdctSpectrum, qcOutCh->globalGain, qcOutCh->scf, qcOutCh->quantSpec) ; /*-------------------------------------------- */ if (FDKaacEnc_calcMaxValueInSfb(psyOutCh->sfbCnt, psyOutCh->maxSfbPerGroup, psyOutCh->sfbPerGroup, psyOutCh->sfbOffsets, qcOutCh->quantSpec, qcOutCh->maxValueInSfb) > MAX_QUANT) { chConstraintsFulfilled[c][i][ch] = 0; constraintsFulfilled[c][i] = 0 ; /* if quanizted value out of range; increase global gain! */ decreaseBitConsumption = 1; } /*-------------------------------------------- */ } /* if calculateQuant[c][i][ch] */ } /* channel loop */ /*-------------------------------------------- */ /* quantize spectrum (per each channel) */ /*-------------------------------------------- */ } while (!constraintsFulfilled[c][i]) ; /* does not regard bit consumption */ /*-------------------------------------------- */ /*-------------------------------------------- */ qcElement[c][i]->dynBitsUsed = 0 ; /* reset dynamic bits */ /* quantization valid in current channel! */ for (ch = 0; ch < nChannels; ch++) { QC_OUT_CHANNEL* qcOutCh = qcElement[c][i]->qcOutChannel[ch]; PSY_OUT_CHANNEL *psyOutCh = psyOut[c]->psyOutElement[i]->psyOutChannel[ch]; /* count dynamic bits */ INT chDynBits = FDKaacEnc_dynBitCount(hQC->hBitCounter, qcOutCh->quantSpec, qcOutCh->maxValueInSfb, qcOutCh->scf, psyOutCh->lastWindowSequence, psyOutCh->sfbCnt, psyOutCh->maxSfbPerGroup, psyOutCh->sfbPerGroup, psyOutCh->sfbOffsets, &qcOutCh->sectionData, psyOutCh->noiseNrg, psyOutCh->isBook, psyOutCh->isScale, syntaxFlags) ; /* sum up dynamic channel bits */ qcElement[c][i]->dynBitsUsed += chDynBits; } /* save dynBitsUsed for correction of bits2pe relation */ if(hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast==-1) { hQC->hAdjThr->adjThrStateElem[i]->dynBitsLast = qcElement[c][i]->dynBitsUsed; } } /* -end- if(ID_SCE || ID_CPE || ID_LFE) */ } /* -end- element loop */ /* update dynBits of current subFrame */ FDKaacEnc_updateUsedDynBits(&qcOut[c]->usedDynBits, qcElement[c], cm); /* get total consumed bits, dyn bits in all sub frames have to be valid */ sumDynBitsConsumedTotal = FDKaacEnc_getTotalConsumedDynBits(qcOut, nSubFrames); if (sumDynBitsConsumedTotal==-1) { quantizationDone = 0; /* bit consumption not valid in all sub frames */ } else { int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames); /* in all frames are valid dynamic bits */ if ( ((sumBitsConsumedTotal < totalAvailableBits) || qcOut[c]->usedDynBits==0) && (decreaseBitConsumption==1) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames) /*()*/ ) { quantizationDone = 1; /* exit bit adjustment */ } if (sumBitsConsumedTotal > totalAvailableBits && (decreaseBitConsumption==0) ) // /*()*/ ) { quantizationDone = 0; /* reset! */ break; } } /*-------------------------------------------- */ int emergencyIterations = 1; int dynBitsOvershoot = 0; for (c = 0 ; c < nSubFrames ; c++ ) { for (i=0; inElements; i++) { ELEMENT_INFO elInfo = cm->elInfo[i]; if ((elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE)) { /* iteration limitation */ emergencyIterations &= ((iterations[c][i] < hQC->maxIterations) ? 0 : 1); } } /* detection if used dyn bits exceeds the maximal allowed criterion */ dynBitsOvershoot |= ((qcOut[c]->usedDynBits > qcOut[c]->maxDynBits) ? 1 : 0); } if (quantizationDone==0 || dynBitsOvershoot) { int sumBitsConsumedTotal = FDKaacEnc_getTotalConsumedBits(qcOut, qcElement, cm, hQC->globHdrBits, nSubFrames); if ( (sumDynBitsConsumedTotal >= avgTotalDynBits) || (sumDynBitsConsumedTotal==0) ) { quantizationDone = 1; } if (emergencyIterations && (sumBitsConsumedTotal < totalAvailableBits)) { quantizationDone = 1; } if ((sumBitsConsumedTotal > totalAvailableBits) || !checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) { quantizationDone = 0; } if ((sumBitsConsumedTotal < totalAvailableBits) && checkMinFrameBitsDemand(qcOut,hQC->minBitsPerFrame,nSubFrames)) { decreaseBitConsumption = 0; } else { decreaseBitConsumption = 1; } if (dynBitsOvershoot) { quantizationDone = 0; decreaseBitConsumption = 1; } /* reset constraints fullfilled flags */ FDKmemclear(constraintsFulfilled, sizeof(constraintsFulfilled)); FDKmemclear(chConstraintsFulfilled, sizeof(chConstraintsFulfilled)); }/* quantizationDone */ } while (!quantizationDone) ; /*-------------------------------------------- */ /* ... -end- Quantization loop */ /*-------------------------------------------- */ /*-------------------------------------------- */ /*-------------------------------------------- */ return AAC_ENC_OK; } static AAC_ENCODER_ERROR FDKaacEnc_reduceBitConsumption(int* iterations, const int maxIterations, int gainAdjustment, int* chConstraintsFulfilled, int* calculateQuant, int nChannels, PSY_OUT_ELEMENT* psyOutElement, QC_OUT* qcOut, QC_OUT_ELEMENT* qcOutElement, ELEMENT_BITS* elBits, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig) { int ch; /** SOLVING PROBLEM **/ if ((*iterations)++ >= maxIterations) { if (qcOutElement->dynBitsUsed==0) { } /* crash recovery */ else { INT bitsToSave = 0; if ( (bitsToSave = fixMax((qcOutElement->dynBitsUsed + 8) - (elBits->bitResLevelEl + qcOutElement->grantedDynBits), (qcOutElement->dynBitsUsed + qcOutElement->staticBitsUsed + 8) - (elBits->maxBitsEl))) > 0 ) { FDKaacEnc_crashRecovery(nChannels, psyOutElement, qcOut, qcOutElement, bitsToSave, aot, syntaxFlags, epConfig) ; } else { for (ch = 0; ch < nChannels; ch++) { qcOutElement->qcOutChannel[ch]->globalGain += 1; } } for (ch = 0; ch < nChannels; ch++) { calculateQuant[ch] = 1; } } } else /* iterations >= maxIterations */ { /* increase gain (+ next iteration) */ for (ch = 0; ch < nChannels; ch++) { if(!chConstraintsFulfilled[ch]) { qcOutElement->qcOutChannel[ch]->globalGain += gainAdjustment ; calculateQuant[ch] = 1; /* global gain has changed, recalculate quantization in next iteration! */ } } } return AAC_ENC_OK; } AAC_ENCODER_ERROR FDKaacEnc_updateFillBits(CHANNEL_MAPPING* cm, QC_STATE* qcKernel, ELEMENT_BITS* RESTRICT elBits[(8)], QC_OUT** qcOut) { switch (qcKernel->bitrateMode) { case QCDATA_BR_MODE_SFR: break; case QCDATA_BR_MODE_FF: break; case QCDATA_BR_MODE_VBR_1: case QCDATA_BR_MODE_VBR_2: case QCDATA_BR_MODE_VBR_3: case QCDATA_BR_MODE_VBR_4: case QCDATA_BR_MODE_VBR_5: qcOut[0]->totFillBits = (qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits)&7; /* precalculate alignment bits */ break; case QCDATA_BR_MODE_CBR: case QCDATA_BR_MODE_INVALID: default: INT bitResSpace = qcKernel->bitResTotMax - qcKernel->bitResTot ; /* processing fill-bits */ INT deltaBitRes = qcOut[0]->grantedDynBits - qcOut[0]->usedDynBits ; qcOut[0]->totFillBits = fixMax((deltaBitRes&7), (deltaBitRes - (fixMax(0,bitResSpace-7)&~7))); break; } /* switch (qcKernel->bitrateMode) */ return AAC_ENC_OK; } /********************************************************************************* functionname: FDKaacEnc_calcMaxValueInSfb description: return: **********************************************************************************/ static INT FDKaacEnc_calcMaxValueInSfb(INT sfbCnt, INT maxSfbPerGroup, INT sfbPerGroup, INT *RESTRICT sfbOffset, SHORT *RESTRICT quantSpectrum, UINT *RESTRICT maxValue) { INT sfbOffs,sfb; INT maxValueAll = 0; for (sfbOffs=0;sfbOffsbitrateMode) { case QCDATA_BR_MODE_FF: case QCDATA_BR_MODE_VBR_1: case QCDATA_BR_MODE_VBR_2: case QCDATA_BR_MODE_VBR_3: case QCDATA_BR_MODE_VBR_4: case QCDATA_BR_MODE_VBR_5: /* variable bitrate */ qcKernel->bitResTot = FDKmin(qcKernel->maxBitsPerFrame, qcKernel->bitResTotMax); break; case QCDATA_BR_MODE_CBR: case QCDATA_BR_MODE_SFR: case QCDATA_BR_MODE_INVALID: default: int c = 0; /* constant bitrate */ { qcKernel->bitResTot += qcOut[c]->grantedDynBits - (qcOut[c]->usedDynBits + qcOut[c]->totFillBits + qcOut[c]->alignBits); } break; } } /********************************************************************************* functionname: FDKaacEnc_FinalizeBitConsumption description: return: **********************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_FinalizeBitConsumption(CHANNEL_MAPPING *cm, QC_STATE *qcKernel, QC_OUT *qcOut, QC_OUT_ELEMENT** qcElement, HANDLE_TRANSPORTENC hTpEnc, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig) { QC_OUT_EXTENSION fillExtPayload; INT totFillBits, alignBits; /* Get total consumed bits in AU */ qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits + qcOut->totFillBits + qcOut->elementExtBits + qcOut->globalExtBits; if (qcKernel->bitrateMode==QCDATA_BR_MODE_CBR) { /* Now we can get the exact transport bit amount, and hopefully it is equal to the estimated value */ INT exactTpBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits); if (exactTpBits != qcKernel->globHdrBits) { INT diffFillBits = 0; /* How many bits can be taken by bitreservoir */ const INT bitresSpace = qcKernel->bitResTotMax - (qcKernel->bitResTot + (qcOut->grantedDynBits - (qcOut->usedDynBits + qcOut->totFillBits) ) ); /* Number of bits which can be moved to bitreservoir. */ const INT bitsToBitres = qcKernel->globHdrBits - exactTpBits; FDK_ASSERT(bitsToBitres>=0); /* is always positive */ /* If bitreservoir can not take all bits, move ramaining bits to fillbits */ diffFillBits = FDKmax(0, bitsToBitres - bitresSpace); /* Assure previous alignment */ diffFillBits = (diffFillBits+7)&~7; /* Move as many bits as possible to bitreservoir */ qcKernel->bitResTot += (bitsToBitres-diffFillBits); /* Write remaing bits as fill bits */ qcOut->totFillBits += diffFillBits; qcOut->totalBits += diffFillBits; qcOut->grantedDynBits += diffFillBits; /* Get new header bits */ qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits); if (qcKernel->globHdrBits != exactTpBits) { /* In previous step, fill bits and corresponding total bits were changed when bitreservoir was completely filled. Now we can take the too much taken bits caused by header overhead from bitreservoir. */ qcKernel->bitResTot -= (qcKernel->globHdrBits - exactTpBits); } } } /* MODE_CBR */ /* Update exact number of consumed header bits. */ qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, qcOut->totalBits); /* Save total fill bits and distribut to alignment and fill bits */ totFillBits = qcOut->totFillBits; /* fake a fill extension payload */ FDKmemclear(&fillExtPayload, sizeof(QC_OUT_EXTENSION)); fillExtPayload.type = EXT_FILL_DATA; fillExtPayload.nPayloadBits = totFillBits; /* ask bitstream encoder how many of that bits can be written in a fill extension data entity */ qcOut->totFillBits = FDKaacEnc_writeExtensionData( NULL, &fillExtPayload, 0, 0, syntaxFlags, aot, epConfig ); /* now distribute extra fillbits and alignbits */ alignBits = 7 - (qcOut->staticBits + qcOut->usedDynBits + qcOut->elementExtBits + qcOut->totFillBits + qcOut->globalExtBits -1)%8; /* Maybe we could remove this */ if( ((alignBits + qcOut->totFillBits - totFillBits)==8) && (qcOut->totFillBits>8) ) qcOut->totFillBits -= 8; qcOut->totalBits = qcOut->staticBits + qcOut->usedDynBits + qcOut->totFillBits + alignBits + qcOut->elementExtBits + qcOut->globalExtBits; if ( (qcOut->totalBits>qcKernel->maxBitsPerFrame) || (qcOut->totalBitsminBitsPerFrame) ) { return AAC_ENC_QUANT_ERROR; } qcOut->alignBits = alignBits; return AAC_ENC_OK; } /********************************************************************************* functionname: FDKaacEnc_crashRecovery description: fulfills constraints by means of brute force... => bits are saved by cancelling out spectral lines!! (beginning at the highest frequencies) return: errorcode **********************************************************************************/ static void FDKaacEnc_crashRecovery(INT nChannels, PSY_OUT_ELEMENT* psyOutElement, QC_OUT* qcOut, QC_OUT_ELEMENT *qcElement, INT bitsToSave, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig) { INT ch ; INT savedBits = 0 ; INT sfb, sfbGrp ; INT bitsPerScf[(2)][MAX_GROUPED_SFB] ; INT sectionToScf[(2)][MAX_GROUPED_SFB] ; INT *sfbOffset ; INT sect, statBitsNew ; QC_OUT_CHANNEL **qcChannel = qcElement->qcOutChannel; PSY_OUT_CHANNEL **psyChannel = psyOutElement->psyOutChannel; /* create a table which converts frq-bins to bit-demand... [bitsPerScf] */ /* ...and another one which holds the corresponding sections [sectionToScf] */ for (ch = 0; ch < nChannels; ch++) { sfbOffset = psyChannel[ch]->sfbOffsets ; for (sect = 0; sect < qcChannel[ch]->sectionData.noOfSections; sect++) { INT sfb ; INT codeBook = qcChannel[ch]->sectionData.huffsection[sect].codeBook ; for (sfb = qcChannel[ch]->sectionData.huffsection[sect].sfbStart; sfb < qcChannel[ch]->sectionData.huffsection[sect].sfbStart + qcChannel[ch]->sectionData.huffsection[sect].sfbCnt; sfb++) { bitsPerScf[ch][sfb] = 0; if ( (codeBook != CODE_BOOK_PNS_NO) /*&& (sfb < (qcChannel[ch]->sectionData.noOfGroups*qcChannel[ch]->sectionData.maxSfbPerGroup))*/ ) { INT sfbStartLine = sfbOffset[sfb] ; INT noOfLines = sfbOffset[sfb+1] - sfbStartLine ; bitsPerScf[ch][sfb] = FDKaacEnc_countValues(&(qcChannel[ch]->quantSpec[sfbStartLine]), noOfLines, codeBook) ; } sectionToScf[ch][sfb] = sect ; } } } /* LOWER [maxSfb] IN BOTH CHANNELS!! */ /* Attention: in case of stereo: maxSfbL == maxSfbR, GroupingL == GroupingR ; */ for (sfb = qcChannel[0]->sectionData.maxSfbPerGroup-1; sfb >= 0; sfb--) { for (sfbGrp = 0; sfbGrp < psyChannel[0]->sfbCnt; sfbGrp += psyChannel[0]->sfbPerGroup) { for (ch = 0; ch < nChannels; ch++) { int sect = sectionToScf[ch][sfbGrp+sfb]; qcChannel[ch]->sectionData.huffsection[sect].sfbCnt-- ; savedBits += bitsPerScf[ch][sfbGrp+sfb] ; if (qcChannel[ch]->sectionData.huffsection[sect].sfbCnt == 0) { savedBits += (psyChannel[ch]->lastWindowSequence!=SHORT_WINDOW) ? FDKaacEnc_sideInfoTabLong[0] : FDKaacEnc_sideInfoTabShort[0]; } } } /* ...have enough bits been saved? */ if (savedBits >= bitsToSave) break ; } /* sfb loop */ /* if not enough bits saved, clean whole spectrum and remove side info overhead */ if (sfb == -1) { sfb = 0 ; } for (ch = 0; ch < nChannels; ch++) { qcChannel[ch]->sectionData.maxSfbPerGroup = sfb ; psyChannel[ch]->maxSfbPerGroup = sfb ; /* when no spectrum is coded save tools info in bitstream */ if(sfb==0) { FDKmemclear(&psyChannel[ch]->tnsInfo, sizeof(TNS_INFO)); FDKmemclear(&psyOutElement->toolsInfo, sizeof(TOOLSINFO)); } } /* dynamic bits will be updated in iteration loop */ { /* if stop sfb has changed save bits in side info, e.g. MS or TNS coding */ ELEMENT_INFO elInfo; FDKmemclear(&elInfo, sizeof(ELEMENT_INFO)); elInfo.nChannelsInEl = nChannels; elInfo.elType = (nChannels == 2) ? ID_CPE : ID_SCE; FDKaacEnc_ChannelElementWrite( NULL, &elInfo, NULL, psyOutElement, psyChannel, syntaxFlags, aot, epConfig, &statBitsNew, 0 ); } savedBits = qcElement->staticBitsUsed - statBitsNew; /* update static and dynamic bits */ qcElement->staticBitsUsed -= savedBits; qcElement->grantedDynBits += savedBits; qcOut->staticBits -= savedBits; qcOut->grantedDynBits += savedBits; qcOut->maxDynBits += savedBits; } void FDKaacEnc_QCClose (QC_STATE **phQCstate, QC_OUT **phQC) { int n, i; if (phQC!=NULL) { for (n=0;n<(1);n++) { if (phQC[n] != NULL) { QC_OUT *hQC = phQC[n]; for (i=0; i<(8); i++) { } for (i=0; i<(8); i++) { if (hQC->qcElement[i]) FreeRam_aacEnc_QCelement(&hQC->qcElement[i]); } FreeRam_aacEnc_QCout(&phQC[n]); } } } if (phQCstate!=NULL) { if (*phQCstate != NULL) { QC_STATE *hQCstate = *phQCstate; if (hQCstate->hAdjThr != NULL) FDKaacEnc_AdjThrClose(&hQCstate->hAdjThr); if (hQCstate->hBitCounter != NULL) FDKaacEnc_BCClose(&hQCstate->hBitCounter); for (i=0; i<(8); i++) { if (hQCstate->elementBits[i]!=NULL) { FreeRam_aacEnc_ElementBits(&hQCstate->elementBits[i]); } } FreeRam_aacEnc_QCstate(phQCstate); } } } fdk-aac-0.1.3/libAACenc/src/dyn_bits.h0000644000175000017500000001537212372261464017736 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Noiseless coder module ******************************************************************************/ #ifndef __DYN_BITS_H #define __DYN_BITS_H #include "common_fix.h" #include "psy_const.h" #include "aacenc_tns.h" #define MAX_SECTIONS MAX_GROUPED_SFB #define SECT_ESC_VAL_LONG 31 #define SECT_ESC_VAL_SHORT 7 #define CODE_BOOK_BITS 4 #define SECT_BITS_LONG 5 #define SECT_BITS_SHORT 3 #define PNS_PCM_BITS 9 typedef struct { INT codeBook; INT sfbStart; INT sfbCnt; INT sectionBits; /* huff + si ! */ } SECTION_INFO; typedef struct { INT blockType; INT noOfGroups; INT sfbCnt; INT maxSfbPerGroup; INT sfbPerGroup; INT noOfSections; SECTION_INFO huffsection[MAX_SECTIONS]; INT sideInfoBits; /* sectioning bits */ INT huffmanBits; /* huffman coded bits */ INT scalefacBits; /* scalefac coded bits */ INT noiseNrgBits; /* noiseEnergy coded bits */ INT firstScf; /* first scf to be coded */ } SECTION_DATA; struct BITCNTR_STATE { INT *bitLookUp; INT *mergeGainLookUp; }; INT FDKaacEnc_BCNew(BITCNTR_STATE **phBC ,UCHAR* dynamic_RAM ); void FDKaacEnc_BCClose(BITCNTR_STATE **phBC); #if defined(PNS_PRECOUNT_ENABLE) INT noisePreCount(const INT *noiseNrg, INT maxSfb); #endif INT FDKaacEnc_dynBitCount( BITCNTR_STATE* const hBC, const SHORT* const quantSpectrum, const UINT* const maxValueInSfb, const INT* const scalefac, const INT blockType, const INT sfbCnt, const INT maxSfbPerGroup, const INT sfbPerGroup, const INT* const sfbOffset, SECTION_DATA* const RESTRICT sectionData, const INT* const noiseNrg, const INT* const isBook, const INT* const isScale, const UINT syntaxFlags ); #endif fdk-aac-0.1.3/libAACenc/src/metadata_compressor.cpp0000644000175000017500000013305612372261464022512 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /********************** Fraunhofer IIS FDK AAC Encoder lib ****************** Author(s): M. Neusinger Description: Compressor for AAC Metadata Generator ******************************************************************************/ #include "metadata_compressor.h" #include "channel_map.h" #define LOG2 0.69314718056f /* natural logarithm of 2 */ #define ILOG2 1.442695041f /* 1/LOG2 */ #define FIXP_ILOG2_DIV2 (FL2FXCONST_DBL(ILOG2/2)) /*----------------- defines ----------------------*/ #define MAX_DRC_CHANNELS (8) /*!< Max number of audio input channels. */ #define DOWNMIX_SHIFT (3) /*!< Max 8 channel. */ #define WEIGHTING_FILTER_SHIFT (2) /*!< Scaling used in weighting filter. */ #define METADATA_INT_BITS 10 #define METADATA_LINT_BITS 20 #define METADATA_INT_SCALE (INT64(1)<<(METADATA_INT_BITS)) #define METADATA_FRACT_BITS (DFRACT_BITS-1-METADATA_INT_BITS) #define METADATA_FRACT_SCALE (INT64(1)<<(METADATA_FRACT_BITS)) /** * Enum for channel assignment. */ enum { L = 0, R = 1, C = 2, LFE = 3, LS = 4, RS = 5, S = 6, LS2 = 7, RS2 = 8 }; /*--------------- structure definitions --------------------*/ /** * Structure holds weighting filter filter states. */ struct WEIGHTING_STATES { FIXP_DBL x1; FIXP_DBL x2; FIXP_DBL y1; FIXP_DBL y2; }; /** * Dynamic Range Control compressor structure. */ struct DRC_COMP { FIXP_DBL maxBoostThr[2]; /*!< Max boost threshold. */ FIXP_DBL boostThr[2]; /*!< Boost threshold. */ FIXP_DBL earlyCutThr[2]; /*!< Early cut threshold. */ FIXP_DBL cutThr[2]; /*!< Cut threshold. */ FIXP_DBL maxCutThr[2]; /*!< Max cut threshold. */ FIXP_DBL boostFac[2]; /*!< Precalculated factor for boost compression. */ FIXP_DBL earlyCutFac[2]; /*!< Precalculated factor for early cut compression. */ FIXP_DBL cutFac[2]; /*!< Precalculated factor for cut compression. */ FIXP_DBL maxBoost[2]; /*!< Maximum boost. */ FIXP_DBL maxCut[2]; /*!< Maximum cut. */ FIXP_DBL maxEarlyCut[2]; /*!< Maximum early cut. */ FIXP_DBL fastAttack[2]; /*!< Fast attack coefficient. */ FIXP_DBL fastDecay[2]; /*!< Fast release coefficient. */ FIXP_DBL slowAttack[2]; /*!< Slow attack coefficient. */ FIXP_DBL slowDecay[2]; /*!< Slow release coefficient. */ UINT holdOff[2]; /*!< Hold time in blocks. */ FIXP_DBL attackThr[2]; /*!< Slow/fast attack threshold. */ FIXP_DBL decayThr[2]; /*!< Slow/fast release threshold. */ DRC_PROFILE profile[2]; /*!< DRC profile. */ INT blockLength; /*!< Block length in samples. */ UINT sampleRate; /*!< Sample rate. */ CHANNEL_MODE chanConfig; /*!< Channel configuration. */ UCHAR useWeighting; /*!< Use weighting filter. */ UINT channels; /*!< Number of channels. */ UINT fullChannels; /*!< Number of full range channels. */ INT channelIdx[9]; /*!< Offsets of interleaved channel samples (L, R, C, LFE, Ls, Rs, S, Ls2, Rs2). */ FIXP_DBL smoothLevel[2]; /*!< level smoothing states */ FIXP_DBL smoothGain[2]; /*!< gain smoothing states */ UINT holdCnt[2]; /*!< hold counter */ FIXP_DBL limGain[2]; /*!< limiter gain */ FIXP_DBL limDecay; /*!< limiter decay (linear) */ FIXP_DBL prevPeak[2]; /*!< max peak of previous block (stereo/mono)*/ WEIGHTING_STATES filter[MAX_DRC_CHANNELS]; /*!< array holds weighting filter states */ }; /*---------------- constants -----------------------*/ /** * Profile tables. */ static const FIXP_DBL tabMaxBoostThr[] = { (FIXP_DBL)(-43<limDecay = FL2FXCONST_DBL( ((0.006f / 256) * blockLength) / METADATA_INT_SCALE ); /* Save parameters. */ drcComp->blockLength = blockLength; drcComp->sampleRate = sampleRate; drcComp->chanConfig = channelMode; drcComp->useWeighting = useWeighting; if (FDK_DRC_Generator_setDrcProfile(drcComp, profileLine, profileRF)!=0) { /* expects initialized blockLength and sampleRate */ return (-1); } /* Set number of channels and channel offsets. */ if (FDKaacEnc_InitChannelMapping(channelMode, channelOrder, &channelMapping)!=AAC_ENC_OK) { return (-2); } for (i = 0; i < 9; i++) drcComp->channelIdx[i] = -1; switch (channelMode) { case MODE_1: /* mono */ drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; break; case MODE_2: /* stereo */ drcComp->channelIdx[L] = channelMapping.elInfo[0].ChannelIndex[0]; drcComp->channelIdx[R] = channelMapping.elInfo[0].ChannelIndex[1]; break; case MODE_1_2: /* 3ch */ drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; break; case MODE_1_2_1: /* 4ch */ drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; drcComp->channelIdx[S] = channelMapping.elInfo[2].ChannelIndex[0]; break; case MODE_1_2_2: /* 5ch */ drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; drcComp->channelIdx[LS] = channelMapping.elInfo[2].ChannelIndex[0]; drcComp->channelIdx[RS] = channelMapping.elInfo[2].ChannelIndex[1]; break; case MODE_1_2_2_1: /* 5.1 ch */ drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; drcComp->channelIdx[LFE] = channelMapping.elInfo[3].ChannelIndex[0]; drcComp->channelIdx[LS] = channelMapping.elInfo[2].ChannelIndex[0]; drcComp->channelIdx[RS] = channelMapping.elInfo[2].ChannelIndex[1]; break; case MODE_1_2_2_2_1: /* 7.1 ch */ case MODE_7_1_FRONT_CENTER: drcComp->channelIdx[L] = channelMapping.elInfo[2].ChannelIndex[0]; /* l */ drcComp->channelIdx[R] = channelMapping.elInfo[2].ChannelIndex[1]; /* r */ drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; /* c */ drcComp->channelIdx[LFE] = channelMapping.elInfo[4].ChannelIndex[0]; /* lfe */ drcComp->channelIdx[LS] = channelMapping.elInfo[3].ChannelIndex[0]; /* ls */ drcComp->channelIdx[RS] = channelMapping.elInfo[3].ChannelIndex[1]; /* rs */ drcComp->channelIdx[LS2] = channelMapping.elInfo[1].ChannelIndex[0]; /* lc */ drcComp->channelIdx[RS2] = channelMapping.elInfo[1].ChannelIndex[1]; /* rc */ break; case MODE_7_1_REAR_SURROUND: drcComp->channelIdx[L] = channelMapping.elInfo[1].ChannelIndex[0]; /* l */ drcComp->channelIdx[R] = channelMapping.elInfo[1].ChannelIndex[1]; /* r */ drcComp->channelIdx[C] = channelMapping.elInfo[0].ChannelIndex[0]; /* c */ drcComp->channelIdx[LFE] = channelMapping.elInfo[4].ChannelIndex[0]; /* lfe */ drcComp->channelIdx[LS] = channelMapping.elInfo[3].ChannelIndex[0]; /* lrear */ drcComp->channelIdx[RS] = channelMapping.elInfo[3].ChannelIndex[1]; /* rrear */ drcComp->channelIdx[LS2] = channelMapping.elInfo[2].ChannelIndex[0]; /* ls */ drcComp->channelIdx[RS2] = channelMapping.elInfo[2].ChannelIndex[1]; /* rs */ break; case MODE_1_1: case MODE_1_1_1_1: case MODE_1_1_1_1_1_1: case MODE_1_1_1_1_1_1_1_1: case MODE_1_1_1_1_1_1_1_1_1_1_1_1: case MODE_2_2: case MODE_2_2_2: case MODE_2_2_2_2: case MODE_2_2_2_2_2_2: default: return (-1); } drcComp->fullChannels = channelMapping.nChannelsEff; drcComp->channels = channelMapping.nChannels; /* Init states. */ drcComp->smoothLevel[0] = drcComp->smoothLevel[1] = (FIXP_DBL)(-135<smoothGain, sizeof(drcComp->smoothGain)); FDKmemclear(drcComp->holdCnt, sizeof(drcComp->holdCnt)); FDKmemclear(drcComp->limGain, sizeof(drcComp->limGain)); FDKmemclear(drcComp->prevPeak, sizeof(drcComp->prevPeak)); FDKmemclear(drcComp->filter, sizeof(drcComp->filter)); return (0); } INT FDK_DRC_Generator_setDrcProfile( HDRC_COMP drcComp, const DRC_PROFILE profileLine, const DRC_PROFILE profileRF ) { int profileIdx, i; drcComp->profile[0] = profileLine; drcComp->profile[1] = profileRF; for (i = 0; i < 2; i++) { /* get profile index */ switch (drcComp->profile[i]) { case DRC_NONE: case DRC_FILMSTANDARD: profileIdx = 0; break; case DRC_FILMLIGHT: profileIdx = 1; break; case DRC_MUSICSTANDARD: profileIdx = 2; break; case DRC_MUSICLIGHT: profileIdx = 3; break; case DRC_SPEECH: profileIdx = 4; break; case DRC_DELAY_TEST: profileIdx = 5; break; default: return (-1); } /* get parameters for selected profile */ if (profileIdx >= 0) { drcComp->maxBoostThr[i] = tabMaxBoostThr[profileIdx]; drcComp->boostThr[i] = tabBoostThr[profileIdx]; drcComp->earlyCutThr[i] = tabEarlyCutThr[profileIdx]; drcComp->cutThr[i] = tabCutThr[profileIdx]; drcComp->maxCutThr[i] = tabMaxCutThr[profileIdx]; drcComp->boostFac[i] = tabBoostRatio[profileIdx]; drcComp->earlyCutFac[i] = tabEarlyCutRatio[profileIdx]; drcComp->cutFac[i] = tabCutRatio[profileIdx]; drcComp->maxBoost[i] = tabMaxBoost[profileIdx]; drcComp->maxCut[i] = tabMaxCut[profileIdx]; drcComp->maxEarlyCut[i] = - fMult((drcComp->cutThr[i] - drcComp->earlyCutThr[i]), drcComp->earlyCutFac[i]); /* no scaling after mult needed, earlyCutFac is in FIXP_DBL */ drcComp->fastAttack[i] = tc2Coeff(tabFastAttack[profileIdx], drcComp->sampleRate, drcComp->blockLength); drcComp->fastDecay[i] = tc2Coeff(tabFastDecay[profileIdx], drcComp->sampleRate, drcComp->blockLength); drcComp->slowAttack[i] = tc2Coeff(tabSlowAttack[profileIdx], drcComp->sampleRate, drcComp->blockLength); drcComp->slowDecay[i] = tc2Coeff(tabSlowDecay[profileIdx], drcComp->sampleRate, drcComp->blockLength); drcComp->holdOff[i] = tabHoldOff[profileIdx] * 256 / drcComp->blockLength; drcComp->attackThr[i] = tabAttackThr[profileIdx]; drcComp->decayThr[i] = tabDecayThr[profileIdx]; } drcComp->smoothGain[i] = FL2FXCONST_DBL(0.f); } return (0); } INT FDK_DRC_Generator_Calc( HDRC_COMP drcComp, const INT_PCM * const inSamples, const INT dialnorm, const INT drc_TargetRefLevel, const INT comp_TargetRefLevel, FIXP_DBL clev, FIXP_DBL slev, INT * const pDynrng, INT * const pCompr ) { int i, c; FIXP_DBL peak[2]; /************************************************************************** * compressor **************************************************************************/ if ((drcComp->profile[0] != DRC_NONE) || (drcComp->profile[1] != DRC_NONE)) { /* Calc loudness level */ FIXP_DBL level_b = FL2FXCONST_DBL(0.f); int level_e = DFRACT_BITS-1; /* Increase energy time resolution with shorter processing blocks. 32 is an empiric value. */ const int granuleLength = fixMin(32, drcComp->blockLength); if (drcComp->useWeighting) { FIXP_DBL x1, x2, y, y1, y2; /* sum of filter coefficients about 2.5 -> squared value is 6.25 WEIGHTING_FILTER_SHIFT is 2 -> scaling about 16, therefore reduce granuleShift by 1. */ const int granuleShift = getShiftFactor(granuleLength)-1; for (c = 0; c < (int)drcComp->channels; c++) { const INT_PCM* pSamples = &inSamples[c]; if (c == drcComp->channelIdx[LFE]) { continue; /* skip LFE */ } /* get filter states */ x1 = drcComp->filter[c].x1; x2 = drcComp->filter[c].x2; y1 = drcComp->filter[c].y1; y2 = drcComp->filter[c].y2; i = 0; do { int offset = i; FIXP_DBL accu = FL2FXCONST_DBL(0.f); for (i=offset; i < fixMin(offset+granuleLength,drcComp->blockLength); i++) { /* apply weighting filter */ FIXP_DBL x = FX_PCM2FX_DBL((FIXP_PCM)pSamples[i*drcComp->channels]) >> WEIGHTING_FILTER_SHIFT; /* y = b0 * (x - x2) - a1 * y1 - a2 * y2; */ y = fMult(b0,x-x2) - fMult(a1,y1) - fMult(a2,y2); x2 = x1; x1 = x; y2 = y1; y1 = y; accu += fPow2Div2(y)>>(granuleShift-1); /* partial energy */ } /* i */ fixpAdd(accu, granuleShift+2*WEIGHTING_FILTER_SHIFT, &level_b, &level_e); /* sup up partial energies */ } while ( i < drcComp->blockLength ); /* save filter states */ drcComp->filter[c].x1 = x1; drcComp->filter[c].x2 = x2; drcComp->filter[c].y1 = y1; drcComp->filter[c].y2 = y2; } /* c */ } /* weighting */ else { const int granuleShift = getShiftFactor(granuleLength); for (c = 0; c < (int)drcComp->channels; c++) { const INT_PCM* pSamples = &inSamples[c]; if ((int)c == drcComp->channelIdx[LFE]) { continue; /* skip LFE */ } i = 0; do { int offset = i; FIXP_DBL accu = FL2FXCONST_DBL(0.f); for (i=offset; i < fixMin(offset+granuleLength,drcComp->blockLength); i++) { /* partial energy */ accu += fPow2Div2((FIXP_PCM)pSamples[i*drcComp->channels])>>(granuleShift-1); } /* i */ fixpAdd(accu, granuleShift, &level_b, &level_e); /* sup up partial energies */ } while ( i < drcComp->blockLength ); } } /* weighting */ /* * Convert to dBFS, apply dialnorm */ /* level scaling */ /* descaled level in ld64 representation */ FIXP_DBL ldLevel = CalcLdData(level_b) + (FIXP_DBL)((level_e-12)<<(DFRACT_BITS-1-LD_DATA_SHIFT)) - CalcLdData((FIXP_DBL)(drcComp->blockLength<<(DFRACT_BITS-1-12))); /* if (level < 1e-10) level = 1e-10f; */ ldLevel = FDKmax(ldLevel, FL2FXCONST_DBL(-0.51905126482615036685473741085772f)); /* level = 10 * log(level)/log(10) + 3; * = 10*log(2)/log(10) * ld(level) + 3; * = 10 * 0.30102999566398119521373889472449 * ld(level) + 3 * = 10 * (0.30102999566398119521373889472449 * ld(level) + 0.3) * = 10 * (0.30102999566398119521373889472449 * ld64(level) + 0.3/64) * 64 * * additional scaling with METADATA_FRACT_BITS: * = 10 * (0.30102999566398119521373889472449 * ld64(level) + 0.3/64) * 64 * 2^(METADATA_FRACT_BITS) * = 10 * (0.30102999566398119521373889472449 * ld64(level) + 0.3/64) * 2^(METADATA_FRACT_BITS+LD_DATA_SHIFT) * = 10*2^(METADATA_FRACT_BITS+LD_DATA_SHIFT) * ( 0.30102999566398119521373889472449 * ld64(level) + 0.3/64 ) * */ FIXP_DBL level = fMult((FIXP_DBL)(10<<(METADATA_FRACT_BITS+LD_DATA_SHIFT)), fMult( FL2FXCONST_DBL(0.30102999566398119521373889472449f), ldLevel) + (FIXP_DBL)(FL2FXCONST_DBL(0.3f)>>LD_DATA_SHIFT) ); /* level -= dialnorm + 31 */ /* this is fixed to Dolby-ReferenceLevel as compressor profiles are defined relative to this */ level -= ((FIXP_DBL)(dialnorm<<(METADATA_FRACT_BITS-16)) + (FIXP_DBL)(31<profile[i] == DRC_NONE) { /* no compression */ drcComp->smoothGain[i] = FL2FXCONST_DBL(0.f); } else { FIXP_DBL gain, alpha, lvl2smthlvl; /* calc static gain */ if (level <= drcComp->maxBoostThr[i]) { /* max boost */ gain = drcComp->maxBoost[i]; } else if (level < drcComp->boostThr[i]) { /* boost range */ gain = fMult((level - drcComp->boostThr[i]),drcComp->boostFac[i]); } else if (level <= drcComp->earlyCutThr[i]) { /* null band */ gain = FL2FXCONST_DBL(0.f); } else if (level <= drcComp->cutThr[i]) { /* early cut range */ gain = fMult((level - drcComp->earlyCutThr[i]), drcComp->earlyCutFac[i]); } else if (level < drcComp->maxCutThr[i]) { /* cut range */ gain = fMult((level - drcComp->cutThr[i]), drcComp->cutFac[i]) - drcComp->maxEarlyCut[i]; } else { /* max cut */ gain = -drcComp->maxCut[i]; } /* choose time constant */ lvl2smthlvl = level - drcComp->smoothLevel[i]; if (gain < drcComp->smoothGain[i]) { /* attack */ if (lvl2smthlvl > drcComp->attackThr[i]) { /* fast attack */ alpha = drcComp->fastAttack[i]; } else { /* slow attack */ alpha = drcComp->slowAttack[i]; } } else { /* release */ if (lvl2smthlvl < -drcComp->decayThr[i]) { /* fast release */ alpha = drcComp->fastDecay[i]; } else { /* slow release */ alpha = drcComp->slowDecay[i]; } } /* smooth gain & level */ if ((gain < drcComp->smoothGain[i]) || (drcComp->holdCnt[i] == 0)) { /* hold gain unless we have an attack or hold period is over */ FIXP_DBL accu; /* drcComp->smoothLevel[i] = (1-alpha) * drcComp->smoothLevel[i] + alpha * level; */ accu = fMult(((FIXP_DBL)MAXVAL_DBL-alpha), drcComp->smoothLevel[i]); accu += fMult(alpha,level); drcComp->smoothLevel[i] = accu; /* drcComp->smoothGain[i] = (1-alpha) * drcComp->smoothGain[i] + alpha * gain; */ accu = fMult(((FIXP_DBL)MAXVAL_DBL-alpha), drcComp->smoothGain[i]); accu += fMult(alpha,gain); drcComp->smoothGain[i] = accu; } /* hold counter */ if (drcComp->holdCnt[i]) { drcComp->holdCnt[i]--; } if (gain < drcComp->smoothGain[i]) { drcComp->holdCnt[i] = drcComp->holdOff[i]; } } /* profile != DRC_NONE */ } /* for i=1..2 */ } else { /* no compression */ drcComp->smoothGain[0] = FL2FXCONST_DBL(0.f); drcComp->smoothGain[1] = FL2FXCONST_DBL(0.f); } /************************************************************************** * limiter **************************************************************************/ /* find peak level */ peak[0] = peak[1] = FL2FXCONST_DBL(0.f); for (i = 0; i < drcComp->blockLength; i++) { FIXP_DBL tmp; const INT_PCM* pSamples = &inSamples[i*drcComp->channels]; INT_PCM maxSample = 0; /* single channels */ for (c = 0; c < (int)drcComp->channels; c++) { maxSample = FDKmax(maxSample, fAbs(pSamples[c])); } peak[0] = fixMax(peak[0], FX_PCM2FX_DBL(maxSample)>>DOWNMIX_SHIFT); /* Lt/Rt downmix */ if (drcComp->fullChannels > 2) { /* Lt */ tmp = FL2FXCONST_DBL(0.f); if (drcComp->channelIdx[LS] >= 0) tmp -= fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[LS]])>>(DOWNMIX_SHIFT-1); /* Ls */ if (drcComp->channelIdx[LS2] >= 0) tmp -= fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[LS2]])>>(DOWNMIX_SHIFT-1); /* Ls2 */ if (drcComp->channelIdx[RS] >= 0) tmp -= fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[RS]])>>(DOWNMIX_SHIFT-1); /* Rs */ if (drcComp->channelIdx[RS2] >= 0) tmp -= fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[RS2]])>>(DOWNMIX_SHIFT-1); /* Rs2 */ if ((drcComp->channelIdx[LS] >= 0) && (drcComp->channelIdx[LS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ if (drcComp->channelIdx[S] >= 0) tmp -= fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]])>>(DOWNMIX_SHIFT-1); /* S */ if (drcComp->channelIdx[C] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[L]])>>DOWNMIX_SHIFT); /* L */ peak[0] = fixMax(peak[0], fixp_abs(tmp)); /* Rt */ tmp = FL2FXCONST_DBL(0.f); if (drcComp->channelIdx[LS] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[LS]])>>(DOWNMIX_SHIFT-1); /* Ls */ if (drcComp->channelIdx[LS2] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[LS2]])>>(DOWNMIX_SHIFT-1); /* Ls2 */ if (drcComp->channelIdx[RS] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[RS]])>>(DOWNMIX_SHIFT-1); /* Rs */ if (drcComp->channelIdx[RS2] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[RS2]])>>(DOWNMIX_SHIFT-1); /* Rs2 */ if ((drcComp->channelIdx[RS] >= 0) && (drcComp->channelIdx[RS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ if (drcComp->channelIdx[S] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]])>>(DOWNMIX_SHIFT-1); /* S */ if (drcComp->channelIdx[C] >= 0) tmp += fMultDiv2(FL2FXCONST_DBL(0.707f), (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[R]])>>DOWNMIX_SHIFT); /* R */ peak[0] = fixMax(peak[0], fixp_abs(tmp)); } /* Lo/Ro downmix */ if (drcComp->fullChannels > 2) { /* Lo */ tmp = FL2FXCONST_DBL(0.f); if (drcComp->channelIdx[LS] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[LS]])>>(DOWNMIX_SHIFT-1); /* Ls */ if (drcComp->channelIdx[LS2] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[LS2]])>>(DOWNMIX_SHIFT-1); /* Ls2 */ if ((drcComp->channelIdx[LS] >= 0) && (drcComp->channelIdx[LS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ if (drcComp->channelIdx[S] >= 0) tmp += fMultDiv2(slev, fMult(FL2FXCONST_DBL(0.7f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]]))>>(DOWNMIX_SHIFT-1); /* S */ if (drcComp->channelIdx[C] >= 0) tmp += fMultDiv2(clev, (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[L]])>>DOWNMIX_SHIFT); /* L */ peak[0] = fixMax(peak[0], fixp_abs(tmp)); /* Ro */ tmp = FL2FXCONST_DBL(0.f); if (drcComp->channelIdx[RS] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[RS]])>>(DOWNMIX_SHIFT-1); /* Rs */ if (drcComp->channelIdx[RS2] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[RS2]])>>(DOWNMIX_SHIFT-1); /* Rs2 */ if ((drcComp->channelIdx[RS] >= 0) && (drcComp->channelIdx[RS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ if (drcComp->channelIdx[S] >= 0) tmp += fMultDiv2(slev, fMult(FL2FXCONST_DBL(0.7f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]]))>>(DOWNMIX_SHIFT-1); /* S */ if (drcComp->channelIdx[C] >= 0) tmp += fMultDiv2(clev, (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[R]])>>DOWNMIX_SHIFT); /* R */ peak[0] = fixMax(peak[0], fixp_abs(tmp)); } peak[1] = fixMax(peak[0], peak[1]); /* Mono Downmix - for comp_val only */ if (drcComp->fullChannels > 1) { tmp = FL2FXCONST_DBL(0.f); if (drcComp->channelIdx[LS] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[LS]])>>(DOWNMIX_SHIFT-1); /* Ls */ if (drcComp->channelIdx[LS2] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[LS2]])>>(DOWNMIX_SHIFT-1); /* Ls2 */ if (drcComp->channelIdx[RS] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[RS]])>>(DOWNMIX_SHIFT-1); /* Rs */ if (drcComp->channelIdx[RS2] >= 0) tmp += fMultDiv2(slev, (FIXP_PCM)pSamples[drcComp->channelIdx[RS2]])>>(DOWNMIX_SHIFT-1); /* Rs2 */ if ((drcComp->channelIdx[LS] >= 0) && (drcComp->channelIdx[LS2] >= 0)) tmp = fMult(FL2FXCONST_DBL(0.707f), tmp); /* 7.1ch */ /*if ((drcComp->channelIdx[RS] >= 0) && (drcComp->channelIdx[RS2] >= 0)) tmp *=0.707f;*/ /* 7.1ch */ if (drcComp->channelIdx[S] >= 0) tmp += fMultDiv2(slev, fMult(FL2FXCONST_DBL(0.7f), (FIXP_PCM)pSamples[drcComp->channelIdx[S]]))>>(DOWNMIX_SHIFT-1); /* S */ if (drcComp->channelIdx[C] >= 0) tmp += fMult(clev, (FIXP_PCM)pSamples[drcComp->channelIdx[C]])>>(DOWNMIX_SHIFT-1); /* C (2*clev) */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[L]])>>DOWNMIX_SHIFT); /* L */ tmp += (FX_PCM2FX_DBL((FIXP_PCM)pSamples[drcComp->channelIdx[R]])>>DOWNMIX_SHIFT); /* R */ peak[1] = fixMax(peak[1], fixp_abs(tmp)); } } for (i=0; i<2; i++) { FIXP_DBL tmp = drcComp->prevPeak[i]; drcComp->prevPeak[i] = peak[i]; peak[i] = fixMax(peak[i], tmp); /* * Convert to dBFS, apply dialnorm */ /* descaled peak in ld64 representation */ FIXP_DBL ld_peak = CalcLdData(peak[i]) + (FIXP_DBL)((LONG)DOWNMIX_SHIFT<<(DFRACT_BITS-1-LD_DATA_SHIFT)); /* if (peak < 1e-6) level = 1e-6f; */ ld_peak = FDKmax(ld_peak, FL2FXCONST_DBL(-0.31143075889569022011284244651463f)); /* peak[i] = 20 * log(peak[i])/log(10) + 0.2f + (drcComp->smoothGain[i]*2^METADATA_FRACT_BITS) * peak[i] = 20 * log(2)/log(10) * ld(peak[i]) + 0.2f + (drcComp->smoothGain[i]*2^METADATA_FRACT_BITS) * peak[i] = 10 * 2*0.30102999566398119521373889472449 * ld(peak[i]) + 0.2f + (drcComp->smoothGain[i]*2^METADATA_FRACT_BITS) * * additional scaling with METADATA_FRACT_BITS: * peak[i] = (10 * 2*0.30102999566398119521373889472449 * ld64(peak[i]) * 64 + 0.2f + (drcComp->smoothGain[i]*2^METADATA_FRACT_BITS))*2^(-METADATA_FRACT_BITS) * peak[i] = 10*2^(METADATA_FRACT_BITS+LD_DATA_SHIFT) * 2*0.30102999566398119521373889472449 * ld64(peak[i]) * + 0.2f*2^(-METADATA_FRACT_BITS) + drcComp->smoothGain[i] */ peak[i] = fMult((FIXP_DBL)(10<<(METADATA_FRACT_BITS+LD_DATA_SHIFT)), fMult( FL2FX_DBL(2*0.30102999566398119521373889472449f), ld_peak)); peak[i] += (FL2FX_DBL(0.5f)>>METADATA_INT_BITS); /* add a little bit headroom */ peak[i] += drcComp->smoothGain[i]; } /* peak -= dialnorm + 31; */ /* this is Dolby style only */ peak[0] -= (FIXP_DBL)((dialnorm-drc_TargetRefLevel)<<(METADATA_FRACT_BITS-16)); /* peak[0] -= dialnorm - drc_TargetRefLevel */ /* peak += 11; */ /* this is Dolby style only */ /* RF mode output is 11dB higher */ /*peak += comp_TargetRefLevel - drc_TargetRefLevel;*/ peak[1] -= (FIXP_DBL)((dialnorm-comp_TargetRefLevel)<<(METADATA_FRACT_BITS-16)); /* peak[1] -= dialnorm - comp_TargetRefLevel */ /* limiter gain */ drcComp->limGain[0] += drcComp->limDecay; /* linear limiter release */ drcComp->limGain[0] = fixMin(drcComp->limGain[0], -peak[0]); drcComp->limGain[1] += 2*drcComp->limDecay; /* linear limiter release */ drcComp->limGain[1] = fixMin(drcComp->limGain[1], -peak[1]); /*************************************************************************/ /* apply limiting, return DRC gains*/ { FIXP_DBL tmp; tmp = drcComp->smoothGain[0]; if (drcComp->limGain[0] < FL2FXCONST_DBL(0.f)) { tmp += drcComp->limGain[0]; } *pDynrng = (LONG) scaleValue(tmp, -(METADATA_FRACT_BITS-16)); tmp = drcComp->smoothGain[1]; if (drcComp->limGain[1] < FL2FXCONST_DBL(0.f)) { tmp += drcComp->limGain[1]; } *pCompr = (LONG) scaleValue(tmp, -(METADATA_FRACT_BITS-16)); } return 0; } DRC_PROFILE FDK_DRC_Generator_getDrcProfile(const HDRC_COMP drcComp) { return drcComp->profile[0]; } DRC_PROFILE FDK_DRC_Generator_getCompProfile(const HDRC_COMP drcComp) { return drcComp->profile[1]; } fdk-aac-0.1.3/libAACenc/src/chaosmeasure.cpp0000644000175000017500000001666112372261464021137 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Chaos measure calculation ******************************************************************************/ #include "chaosmeasure.h" /***************************************************************************** functionname: FDKaacEnc_FDKaacEnc_CalculateChaosMeasurePeakFast description: Eberlein method of chaos measure calculation by high-pass filtering amplitude spectrum A special case of FDKaacEnc_CalculateChaosMeasureTonalGeneric -- highly optimized *****************************************************************************/ static void FDKaacEnc_FDKaacEnc_CalculateChaosMeasurePeakFast( FIXP_DBL *RESTRICT paMDCTDataNM0, INT numberOfLines, FIXP_DBL *RESTRICT chaosMeasure ) { INT i, j; /* calculate chaos measure by "peak filter" */ for (i=0; i<2; i++) { /* make even and odd pass through data */ FIXP_DBL left,center; /* left, center tap of filter */ left = (FIXP_DBL)((LONG)paMDCTDataNM0[i]^((LONG)paMDCTDataNM0[i]>>(DFRACT_BITS-1))); center = (FIXP_DBL)((LONG)paMDCTDataNM0[i+2]^((LONG)paMDCTDataNM0[i+2]>>(DFRACT_BITS-1))); for (j = i+2; j < numberOfLines - 2; j+=2) { FIXP_DBL right = (FIXP_DBL)((LONG)paMDCTDataNM0[j+2]^((LONG)paMDCTDataNM0[j+2]>>(DFRACT_BITS-1))); FIXP_DBL tmp = (left>>1)+(right>>1); if (tmp < center ) { INT leadingBits = CntLeadingZeros(center)-1; tmp = schur_div(tmp<>shift)) / (coreSamplingRate>>shift) / nSubFrames; if (pAverageBitsPerFrame != NULL) { *pAverageBitsPerFrame = averageBitsPerFrame; } if (hTpEnc != NULL) { transportBits = transportEnc_GetStaticBits(hTpEnc, averageBitsPerFrame); } else { /* Assume some worst case */ transportBits = 208; } bitRate = FDKmax(bitRate, ((((40 * nChannels) + transportBits) * (coreSamplingRate)) / frameLength) ); FDK_ASSERT(bitRate >= 0); bitRate = FDKmin(bitRate, ((nChannelsEff * MIN_BUFSIZE_PER_EFF_CHAN)*(coreSamplingRate>>shift)) / (frameLength>>shift)) ; FDK_ASSERT(bitRate >= 0); } while (prevBitRate != bitRate && iter++ < 3) ; return bitRate; } typedef struct { AACENC_BITRATE_MODE bitrateMode; int chanBitrate[2]; /* mono/stereo settings */ } CONFIG_TAB_ENTRY_VBR; static const CONFIG_TAB_ENTRY_VBR configTabVBR[] = { {AACENC_BR_MODE_CBR, { 0, 0}} , {AACENC_BR_MODE_VBR_1, { 32000, 20000}} , {AACENC_BR_MODE_VBR_2, { 40000, 32000}} , {AACENC_BR_MODE_VBR_3, { 56000, 48000}} , {AACENC_BR_MODE_VBR_4, { 72000, 64000}} , {AACENC_BR_MODE_VBR_5, {112000, 96000}} }; /*----------------------------------------------------------------------------- functionname: FDKaacEnc_GetVBRBitrate description: Get VBR bitrate from vbr quality input params: int vbrQuality (VBR0, VBR1, VBR2) channelMode returns: vbr bitrate ------------------------------------------------------------------------------*/ INT FDKaacEnc_GetVBRBitrate(INT bitrateMode, CHANNEL_MODE channelMode) { INT bitrate = 0; INT monoStereoMode = 0; /* default mono */ if (FDKaacEnc_GetMonoStereoMode(channelMode)==EL_MODE_STEREO) { monoStereoMode = 1; } switch((AACENC_BITRATE_MODE)bitrateMode){ case AACENC_BR_MODE_VBR_1: case AACENC_BR_MODE_VBR_2: case AACENC_BR_MODE_VBR_3: case AACENC_BR_MODE_VBR_4: case AACENC_BR_MODE_VBR_5: bitrate = configTabVBR[bitrateMode].chanBitrate[monoStereoMode]; break; case AACENC_BR_MODE_INVALID: case AACENC_BR_MODE_CBR: case AACENC_BR_MODE_SFR: case AACENC_BR_MODE_FF: default: bitrate = 0; break; } /* convert channel bitrate to overall bitrate*/ bitrate *= FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; return bitrate; } /** * \brief Convert encoder bitreservoir value for transport library. * * \param bitrateMode Bitratemode used in current encoder instance. Se ::AACENC_BITRATE_MODE * \param bitresTotal Encoder bitreservoir level in bits. * * \return Corrected bitreservoir level used in transport library. */ static INT FDKaacEnc_EncBitresToTpBitres( const AACENC_BITRATE_MODE bitrateMode, const INT bitresTotal ) { INT transporBitreservoir = 0; switch (bitrateMode) { case AACENC_BR_MODE_CBR: transporBitreservoir = bitresTotal; /* encoder bitreservoir level */ break; case AACENC_BR_MODE_VBR_1: case AACENC_BR_MODE_VBR_2: case AACENC_BR_MODE_VBR_3: case AACENC_BR_MODE_VBR_4: case AACENC_BR_MODE_VBR_5: transporBitreservoir = FDK_INT_MAX; /* signal variable bitrate */ break; case AACENC_BR_MODE_FF: case AACENC_BR_MODE_SFR: transporBitreservoir = 0; /* super framing and fixed framing */ break; /* without bitreservoir signaling */ default: case AACENC_BR_MODE_INVALID: transporBitreservoir = 0; /* invalid configuration*/ FDK_ASSERT(0); } return transporBitreservoir; } /*----------------------------------------------------------------------------- functionname: FDKaacEnc_AacInitDefaultConfig description: gives reasonable default configuration returns: --- ------------------------------------------------------------------------------*/ void FDKaacEnc_AacInitDefaultConfig(AACENC_CONFIG *config) { /* make thepre initialization of the structs flexible */ FDKmemclear(config, sizeof(AACENC_CONFIG)); /* default ancillary */ config->anc_Rate = 0; /* no ancillary data */ config->ancDataBitRate = 0; /* no additional consumed bitrate */ /* default configurations */ config->bitRate = -1; /* bitrate must be set*/ config->averageBits = -1; /* instead of bitrate/s we can configure bits/superframe */ config->bitrateMode = 0; config->bandWidth = 0; /* get bandwidth from table */ config->useTns = TNS_ENABLE_MASK; /* tns enabled completly */ config->usePns = 1; /* depending on channelBitrate this might be set to 0 later */ config->useIS = 1; /* Intensity Stereo Configuration */ config->framelength = -1; /* Framesize not configured */ config->syntaxFlags = 0; /* default syntax with no specialities */ config->epConfig = -1; /* no ER syntax -> no additional error protection */ config->nSubFrames = 1; /* default, no sub frames */ config->channelOrder = CH_ORDER_MPEG; /* Use MPEG channel ordering. */ config->channelMode = MODE_UNKNOWN; config->minBitsPerFrame = -1; /* minum number of bits in each AU */ config->maxBitsPerFrame = -1; /* minum number of bits in each AU */ config->bitreservoir = -1; /* default, uninitialized value */ /* init tabs in fixpoint_math */ InitLdInt(); InitInvSqrtTab(); } /*--------------------------------------------------------------------------- functionname: FDKaacEnc_Open description: allocate and initialize a new encoder instance returns: error code ---------------------------------------------------------------------------*/ AAC_ENCODER_ERROR FDKaacEnc_Open(HANDLE_AAC_ENC *phAacEnc, const INT nElements, const INT nChannels, const INT nSubFrames) { AAC_ENCODER_ERROR ErrorStatus; AAC_ENC *hAacEnc = NULL; UCHAR *dynamicRAM = NULL; if (phAacEnc==NULL) { return AAC_ENC_INVALID_HANDLE; } /* allocate encoder structure */ hAacEnc = GetRam_aacEnc_AacEncoder(); if (hAacEnc == NULL) { ErrorStatus = AAC_ENC_NO_MEMORY; goto bail; } FDKmemclear(hAacEnc, sizeof(AAC_ENC)); hAacEnc->dynamic_RAM = GetAACdynamic_RAM(); dynamicRAM = (UCHAR*)hAacEnc->dynamic_RAM; /* allocate the Psy aud Psy Out structure */ ErrorStatus = FDKaacEnc_PsyNew(&hAacEnc->psyKernel, nElements, nChannels ,dynamicRAM ); if (ErrorStatus != AAC_ENC_OK) goto bail; ErrorStatus = FDKaacEnc_PsyOutNew(hAacEnc->psyOut, nElements, nChannels, nSubFrames ,dynamicRAM ); if (ErrorStatus != AAC_ENC_OK) goto bail; /* allocate the Q&C Out structure */ ErrorStatus = FDKaacEnc_QCOutNew(hAacEnc->qcOut, nElements, nChannels, nSubFrames ,dynamicRAM ); if (ErrorStatus != AAC_ENC_OK) goto bail; /* allocate the Q&C kernel */ ErrorStatus = FDKaacEnc_QCNew(&hAacEnc->qcKernel, nElements ,dynamicRAM ); if (ErrorStatus != AAC_ENC_OK) goto bail; hAacEnc->maxChannels = nChannels; hAacEnc->maxElements = nElements; hAacEnc->maxFrames = nSubFrames; bail: *phAacEnc = hAacEnc; return ErrorStatus; } AAC_ENCODER_ERROR FDKaacEnc_Initialize(HANDLE_AAC_ENC hAacEnc, AACENC_CONFIG *config, /* pre-initialized config struct */ HANDLE_TRANSPORTENC hTpEnc, ULONG initFlags) { AAC_ENCODER_ERROR ErrorStatus; INT psyBitrate, tnsMask; //INT profile = 1; CHANNEL_MAPPING *cm = NULL; INT qmbfac, qbw; FIXP_DBL mbfac, bw_ratio; QC_INIT qcInit; INT averageBitsPerFrame = 0; if (config==NULL) return AAC_ENC_INVALID_HANDLE; /******************* sanity checks *******************/ /* check config structure */ if (config->nChannels < 1 || config->nChannels > (8)) { return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; } /* check sample rate */ switch (config->sampleRate) { case 8000: case 11025: case 12000: case 16000: case 22050: case 24000: case 32000: case 44100: case 48000: case 64000: case 88200: case 96000: break; default: return AAC_ENC_UNSUPPORTED_SAMPLINGRATE; } /* bitrate has to be set */ if (config->bitRate==-1) { return AAC_ENC_UNSUPPORTED_BITRATE; } /* check bit rate */ if (FDKaacEnc_LimitBitrate( hTpEnc, config->sampleRate, config->framelength, config->nChannels, FDKaacEnc_GetChannelModeConfiguration(config->channelMode)->nChannelsEff, config->bitRate, config->averageBits, &averageBitsPerFrame, config->bitrateMode, config->nSubFrames ) != config->bitRate ) { return AAC_ENC_UNSUPPORTED_BITRATE; } if (config->syntaxFlags & AC_ER_VCB11) { return AAC_ENC_UNSUPPORTED_ER_FORMAT; } if (config->syntaxFlags & AC_ER_HCR) { return AAC_ENC_UNSUPPORTED_ER_FORMAT; } /* check frame length */ switch (config->framelength) { case 1024: if ( config->audioObjectType == AOT_ER_AAC_LD || config->audioObjectType == AOT_ER_AAC_ELD ) { return AAC_ENC_INVALID_FRAME_LENGTH; } break; case 512: case 480: if ( config->audioObjectType != AOT_ER_AAC_LD && config->audioObjectType != AOT_ER_AAC_ELD ) { return AAC_ENC_INVALID_FRAME_LENGTH; } break; default: return AAC_ENC_INVALID_FRAME_LENGTH; } if (config->anc_Rate != 0) { ErrorStatus = FDKaacEnc_InitCheckAncillary(config->bitRate, config->framelength, config->anc_Rate, &hAacEnc->ancillaryBitsPerFrame, config->sampleRate); if (ErrorStatus != AAC_ENC_OK) goto bail; /* update estimated consumed bitrate */ config->ancDataBitRate += ( (hAacEnc->ancillaryBitsPerFrame * config->sampleRate) / config->framelength ); } /* maximal allowed DSE bytes in frame */ { /* fixpoint calculation*/ INT q_res, encBitrate, sc; FIXP_DBL tmp = fDivNorm(config->framelength, config->sampleRate, &q_res); encBitrate = (config->bitRate/*-config->ancDataBitRate*/)- (INT)(config->nChannels*8000); sc = CountLeadingBits(encBitrate); config->maxAncBytesPerAU = FDKmin( (256), FDKmax(0,(INT)(fMultDiv2(tmp, (FIXP_DBL)(encBitrate<>(-q_res+sc-1+3))) ); } /* bind config to hAacEnc->config */ hAacEnc->config = config; /* set hAacEnc->bitrateMode */ hAacEnc->bitrateMode = (AACENC_BITRATE_MODE)config->bitrateMode; hAacEnc->encoderMode = config->channelMode; ErrorStatus = FDKaacEnc_InitChannelMapping(hAacEnc->encoderMode, config->channelOrder, &hAacEnc->channelMapping); if (ErrorStatus != AAC_ENC_OK) goto bail; cm = &hAacEnc->channelMapping; ErrorStatus = FDKaacEnc_DetermineBandWidth(&hAacEnc->config->bandWidth, config->bandWidth, config->bitRate - config->ancDataBitRate, hAacEnc->bitrateMode, config->sampleRate, config->framelength, cm, hAacEnc->encoderMode); if (ErrorStatus != AAC_ENC_OK) goto bail; hAacEnc->bandwidth90dB = (INT)hAacEnc->config->bandWidth; tnsMask = config->useTns ? TNS_ENABLE_MASK : 0x0; psyBitrate = config->bitRate - config->ancDataBitRate; ErrorStatus = FDKaacEnc_psyInit(hAacEnc->psyKernel, hAacEnc->psyOut, hAacEnc->maxFrames, hAacEnc->maxChannels, config->audioObjectType, cm); if (ErrorStatus != AAC_ENC_OK) goto bail; ErrorStatus = FDKaacEnc_psyMainInit(hAacEnc->psyKernel, config->audioObjectType, cm, config->sampleRate, config->framelength, psyBitrate, tnsMask, hAacEnc->bandwidth90dB, config->usePns, config->useIS, config->syntaxFlags, initFlags); if (ErrorStatus != AAC_ENC_OK) goto bail; ErrorStatus = FDKaacEnc_QCOutInit(hAacEnc->qcOut, hAacEnc->maxFrames, cm); if (ErrorStatus != AAC_ENC_OK) goto bail; qcInit.channelMapping = &hAacEnc->channelMapping; qcInit.sceCpe = 0; if ((config->bitrateMode>=1) && (config->bitrateMode<=5)) { qcInit.averageBits = (averageBitsPerFrame+7)&~7; qcInit.bitRes = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff; qcInit.maxBits = MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff; qcInit.minBits = 0; } else { int maxBitres; qcInit.averageBits = (averageBitsPerFrame+7)&~7; maxBitres = (MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff) - qcInit.averageBits; qcInit.bitRes = (config->bitreservoir!=-1) ? FDKmin(config->bitreservoir, maxBitres) : maxBitres; qcInit.maxBits = fixMin(MIN_BUFSIZE_PER_EFF_CHAN*cm->nChannelsEff, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes); qcInit.maxBits = (config->maxBitsPerFrame!=-1) ? fixMin(qcInit.maxBits, config->maxBitsPerFrame) : qcInit.maxBits; qcInit.minBits = fixMax(0, ((averageBitsPerFrame-1)&~7)-qcInit.bitRes-transportEnc_GetStaticBits(hTpEnc, ((averageBitsPerFrame+7)&~7)+qcInit.bitRes)); qcInit.minBits = (config->minBitsPerFrame!=-1) ? fixMax(qcInit.minBits, config->minBitsPerFrame) : qcInit.minBits; } qcInit.sampleRate = config->sampleRate; qcInit.advancedBitsToPe = isLowDelay(config->audioObjectType) ? 1 : 0 ; qcInit.nSubFrames = config->nSubFrames; qcInit.padding.paddingRest = config->sampleRate; /* Calc meanPe */ bw_ratio = fDivNorm((FIXP_DBL)hAacEnc->bandwidth90dB, (FIXP_DBL)(config->sampleRate>>1), &qbw); qbw = DFRACT_BITS-1-qbw; /* qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f); */ qcInit.meanPe = fMult(bw_ratio, (FIXP_DBL)((10*config->framelength)<<16)) >> (qbw-15); /* Calc maxBitFac */ mbfac = fDivNorm((MIN_BUFSIZE_PER_EFF_CHAN-744)*cm->nChannelsEff, qcInit.averageBits/qcInit.nSubFrames, &qmbfac); qmbfac = DFRACT_BITS-1-qmbfac; qcInit.maxBitFac = (qmbfac > 24) ? (mbfac >> (qmbfac - 24)):(mbfac << (24 - qmbfac)); switch(config->bitrateMode){ case AACENC_BR_MODE_CBR: qcInit.bitrateMode = QCDATA_BR_MODE_CBR; break; case AACENC_BR_MODE_VBR_1: qcInit.bitrateMode = QCDATA_BR_MODE_VBR_1; break; case AACENC_BR_MODE_VBR_2: qcInit.bitrateMode = QCDATA_BR_MODE_VBR_2; break; case AACENC_BR_MODE_VBR_3: qcInit.bitrateMode = QCDATA_BR_MODE_VBR_3; break; case AACENC_BR_MODE_VBR_4: qcInit.bitrateMode = QCDATA_BR_MODE_VBR_4; break; case AACENC_BR_MODE_VBR_5: qcInit.bitrateMode = QCDATA_BR_MODE_VBR_5; break; case AACENC_BR_MODE_SFR: qcInit.bitrateMode = QCDATA_BR_MODE_SFR; break; case AACENC_BR_MODE_FF: qcInit.bitrateMode = QCDATA_BR_MODE_FF; break; default: ErrorStatus = AAC_ENC_UNSUPPORTED_BITRATE_MODE; goto bail; } qcInit.invQuant = (config->useRequant)?2:0; /* maxIterations should be set to the maximum number of requantization iterations that are * allowed before the crash recovery functionality is activated. This setting should be adjusted * to the processing power available, i.e. to the processing power headroom in one frame that is * still left after normal encoding without requantization. Please note that if activated this * functionality is used most likely only in cases where the encoder is operating beyond * recommended settings, i.e. the audio quality is suboptimal anyway. Activating the crash * recovery does not further reduce audio quality significantly in these cases. */ if ( (config->audioObjectType == AOT_ER_AAC_LD) || (config->audioObjectType == AOT_ER_AAC_ELD) ) { qcInit.maxIterations = 2; } else { qcInit.maxIterations = 5; } qcInit.bitrate = config->bitRate - config->ancDataBitRate; qcInit.staticBits = transportEnc_GetStaticBits(hTpEnc, qcInit.averageBits/qcInit.nSubFrames); ErrorStatus = FDKaacEnc_QCInit(hAacEnc->qcKernel, &qcInit); if (ErrorStatus != AAC_ENC_OK) goto bail; /* Map virtual aot's to intern aot used in bitstream writer. */ switch (hAacEnc->config->audioObjectType) { case AOT_MP2_AAC_LC: case AOT_DABPLUS_AAC_LC: hAacEnc->aot = AOT_AAC_LC; break; case AOT_MP2_SBR: case AOT_DABPLUS_SBR: hAacEnc->aot = AOT_SBR; break; case AOT_MP2_PS: case AOT_DABPLUS_PS: hAacEnc->aot = AOT_PS; break; default: hAacEnc->aot = hAacEnc->config->audioObjectType; } /* common things */ return AAC_ENC_OK; bail: return ErrorStatus; } /*--------------------------------------------------------------------------- functionname: FDKaacEnc_EncodeFrame description: encodes one frame returns: error code ---------------------------------------------------------------------------*/ AAC_ENCODER_ERROR FDKaacEnc_EncodeFrame( HANDLE_AAC_ENC hAacEnc, /* encoder handle */ HANDLE_TRANSPORTENC hTpEnc, INT_PCM* RESTRICT inputBuffer, INT* nOutBytes, AACENC_EXT_PAYLOAD extPayload[MAX_TOTAL_EXT_PAYLOADS] ) { AAC_ENCODER_ERROR ErrorStatus; int el, n, c=0; UCHAR extPayloadUsed[MAX_TOTAL_EXT_PAYLOADS]; CHANNEL_MAPPING *cm = &hAacEnc->channelMapping; PSY_OUT *psyOut = hAacEnc->psyOut[c]; QC_OUT *qcOut = hAacEnc->qcOut[c]; FDKmemclear(extPayloadUsed, MAX_TOTAL_EXT_PAYLOADS * sizeof(UCHAR)); qcOut->elementExtBits = 0; /* sum up all extended bit of each element */ qcOut->staticBits = 0; /* sum up side info bits of each element */ qcOut->totalNoRedPe = 0; /* sum up PE */ /* advance psychoacoustics */ for (el=0; elnElements; el++) { ELEMENT_INFO elInfo = cm->elInfo[el]; if ( (elInfo.elType == ID_SCE) || (elInfo.elType == ID_CPE) || (elInfo.elType == ID_LFE) ) { int ch; /* update pointer!*/ for(ch=0;chpsyOutElement[el]->psyOutChannel[ch]; QC_OUT_CHANNEL *qcOutChan = qcOut->qcElement[el]->qcOutChannel[ch]; psyOutChan->mdctSpectrum = qcOutChan->mdctSpectrum; psyOutChan->sfbSpreadEnergy = qcOutChan->sfbSpreadEnergy; psyOutChan->sfbEnergy = qcOutChan->sfbEnergy; psyOutChan->sfbEnergyLdData = qcOutChan->sfbEnergyLdData; psyOutChan->sfbMinSnrLdData = qcOutChan->sfbMinSnrLdData; psyOutChan->sfbThresholdLdData = qcOutChan->sfbThresholdLdData; } FDKaacEnc_psyMain(elInfo.nChannelsInEl, hAacEnc->psyKernel->psyElement[el], hAacEnc->psyKernel->psyDynamic, hAacEnc->psyKernel->psyConf, psyOut->psyOutElement[el], inputBuffer, cm->elInfo[el].ChannelIndex, cm->nChannels ); /* FormFactor, Pe and staticBitDemand calculation */ ErrorStatus = FDKaacEnc_QCMainPrepare(&elInfo, hAacEnc->qcKernel->hAdjThr->adjThrStateElem[el], psyOut->psyOutElement[el], qcOut->qcElement[el], hAacEnc->aot, hAacEnc->config->syntaxFlags, hAacEnc->config->epConfig); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /*-------------------------------------------- */ qcOut->qcElement[el]->extBitsUsed = 0; qcOut->qcElement[el]->nExtensions = 0; /* reset extension payload */ FDKmemclear(&qcOut->qcElement[el]->extension, (1)*sizeof(QC_OUT_EXTENSION)); for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { if ( !extPayloadUsed[n] && (extPayload[n].associatedChElement == el) && (extPayload[n].dataSize > 0) && (extPayload[n].pData != NULL) ) { int idx = qcOut->qcElement[el]->nExtensions++; qcOut->qcElement[el]->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ qcOut->qcElement[el]->extension[idx].nPayloadBits = extPayload[n].dataSize; qcOut->qcElement[el]->extension[idx].pPayload = extPayload[n].pData; /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ qcOut->qcElement[el]->extBitsUsed += FDKaacEnc_writeExtensionData( NULL, &qcOut->qcElement[el]->extension[idx], 0, 0, hAacEnc->config->syntaxFlags, hAacEnc->aot, hAacEnc->config->epConfig ); extPayloadUsed[n] = 1; } } /* sum up extension and static bits for all channel elements */ qcOut->elementExtBits += qcOut->qcElement[el]->extBitsUsed; qcOut->staticBits += qcOut->qcElement[el]->staticBitsUsed; /* sum up pe */ qcOut->totalNoRedPe += qcOut->qcElement[el]->peData.pe; } } qcOut->nExtensions = 0; qcOut->globalExtBits = 0; /* reset extension payload */ FDKmemclear(&qcOut->extension, (2+2)*sizeof(QC_OUT_EXTENSION)); /* Add extension payload not assigned to an channel element (Ancillary data is the only supported type up to now) */ for ( n = 0; n < MAX_TOTAL_EXT_PAYLOADS; n++ ) { if ( !extPayloadUsed[n] && (extPayload[n].associatedChElement == -1) && (extPayload[n].pData != NULL) ) { UINT payloadBits = 0; if (extPayload[n].dataType == EXT_DATA_ELEMENT) { if (hAacEnc->ancillaryBitsPerFrame) { /* granted frame dse bitrate */ payloadBits = hAacEnc->ancillaryBitsPerFrame; } else { /* write anc data if bitrate constraint fulfilled */ if ((extPayload[n].dataSize>>3) <= hAacEnc->config->maxAncBytesPerAU) { payloadBits = extPayload[n].dataSize; } } payloadBits = fixMin( extPayload[n].dataSize, payloadBits ); } else { payloadBits = extPayload[n].dataSize; } if (payloadBits > 0) { int idx = qcOut->nExtensions++; qcOut->extension[idx].type = extPayload[n].dataType; /* Perform a sanity check on the type? */ qcOut->extension[idx].nPayloadBits = payloadBits; qcOut->extension[idx].pPayload = extPayload[n].pData; /* Now ask the bitstream encoder how many bits we need to encode the data with the current bitstream syntax: */ qcOut->globalExtBits += FDKaacEnc_writeExtensionData( NULL, &qcOut->extension[idx], 0, 0, hAacEnc->config->syntaxFlags, hAacEnc->aot, hAacEnc->config->epConfig ); if (extPayload[n].dataType == EXT_DATA_ELEMENT) { /* substract the processed bits */ extPayload[n].dataSize -= payloadBits; } extPayloadUsed[n] = 1; } } } if (!(hAacEnc->config->syntaxFlags & (AC_SCALABLE|AC_ER))) { qcOut->globalExtBits += EL_ID_BITS; /* add bits for ID_END */ } /* build bitstream all nSubFrames */ { INT totalBits = 0; /* Total AU bits */; INT avgTotalBits = 0; /*-------------------------------------------- */ /* Get average total bits */ /*-------------------------------------------- */ { /* frame wise bitrate adaption */ FDKaacEnc_AdjustBitrate(hAacEnc->qcKernel, cm, &avgTotalBits, hAacEnc->config->bitRate, hAacEnc->config->sampleRate, hAacEnc->config->framelength); /* adjust super frame bitrate */ avgTotalBits *= hAacEnc->config->nSubFrames; } /* Make first estimate of transport header overhead. Take maximum possible frame size into account to prevent bitreservoir underrun. */ hAacEnc->qcKernel->globHdrBits = transportEnc_GetStaticBits(hTpEnc, avgTotalBits + hAacEnc->qcKernel->bitResTot); /*-------------------------------------------- */ /*-------------------------------------------- */ /*-------------------------------------------- */ ErrorStatus = FDKaacEnc_QCMain(hAacEnc->qcKernel, hAacEnc->psyOut, hAacEnc->qcOut, avgTotalBits, cm ,hAacEnc->aot, hAacEnc->config->syntaxFlags, hAacEnc->config->epConfig); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /*-------------------------------------------- */ /*-------------------------------------------- */ ErrorStatus = FDKaacEnc_updateFillBits(cm, hAacEnc->qcKernel, hAacEnc->qcKernel->elementBits, hAacEnc->qcOut); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /*-------------------------------------------- */ ErrorStatus = FDKaacEnc_FinalizeBitConsumption(cm, hAacEnc->qcKernel, qcOut, qcOut->qcElement, hTpEnc, hAacEnc->aot, hAacEnc->config->syntaxFlags, hAacEnc->config->epConfig); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /*-------------------------------------------- */ totalBits += qcOut->totalBits; /*-------------------------------------------- */ FDKaacEnc_updateBitres(cm, hAacEnc->qcKernel, hAacEnc->qcOut); /*-------------------------------------------- */ /* for ( all sub frames ) ... */ /* write bitstream header */ transportEnc_WriteAccessUnit( hTpEnc, totalBits, FDKaacEnc_EncBitresToTpBitres(hAacEnc->bitrateMode, hAacEnc->qcKernel->bitResTot), cm->nChannelsEff); /* write bitstream */ ErrorStatus = FDKaacEnc_WriteBitstream( hTpEnc, cm, qcOut, psyOut, hAacEnc->qcKernel, hAacEnc->aot, hAacEnc->config->syntaxFlags, hAacEnc->config->epConfig); if (ErrorStatus != AAC_ENC_OK) return ErrorStatus; /* transportEnc_EndAccessUnit() is being called inside FDKaacEnc_WriteBitstream() */ transportEnc_GetFrame(hTpEnc, nOutBytes); } /* -end- if (curFrame==hAacEnc->qcKernel->nSubFrames) */ /*-------------------------------------------- */ return AAC_ENC_OK; } /*--------------------------------------------------------------------------- functionname:FDKaacEnc_Close description: delete encoder instance returns: ---------------------------------------------------------------------------*/ void FDKaacEnc_Close( HANDLE_AAC_ENC* phAacEnc) /* encoder handle */ { if (*phAacEnc == NULL) { return; } AAC_ENC *hAacEnc = (AAC_ENC*)*phAacEnc; if (hAacEnc->dynamic_RAM != NULL) FreeAACdynamic_RAM(&hAacEnc->dynamic_RAM); FDKaacEnc_PsyClose(&hAacEnc->psyKernel,hAacEnc->psyOut); FDKaacEnc_QCClose(&hAacEnc->qcKernel, hAacEnc->qcOut); FreeRam_aacEnc_AacEncoder(phAacEnc); } /* The following functions are in this source file only for convenience and */ /* need not be visible outside of a possible encoder library. */ /* basic defines for ancillary data */ #define MAX_ANCRATE 19200 /* ancillary rate >= 19200 isn't valid */ /*--------------------------------------------------------------------------- functionname: FDKaacEnc_InitCheckAncillary description: initialize and check ancillary data struct return: if success or NULL if error ---------------------------------------------------------------------------*/ static AAC_ENCODER_ERROR FDKaacEnc_InitCheckAncillary(INT bitRate, INT framelength, INT ancillaryRate, INT *ancillaryBitsPerFrame, INT sampleRate) { INT diffToByteAlign; /* don't use negative ancillary rates */ if ( ancillaryRate < -1 ) return AAC_ENC_UNSUPPORTED_ANC_BITRATE; /* check if ancillary rate is ok */ if ( (ancillaryRate != (-1)) && (ancillaryRate != 0) ) { /* ancRate <= 15% of bitrate && ancRate < 19200 */ if ( ( ancillaryRate >= MAX_ANCRATE ) || ( (ancillaryRate * 20) > (bitRate * 3) ) ) { return AAC_ENC_UNSUPPORTED_ANC_BITRATE; } } else if (ancillaryRate == -1) { /* if no special ancRate is requested but a ancillary file is stated, then generate a ancillary rate matching to the bitrate */ if (bitRate >= (MAX_ANCRATE * 10)) { /* ancillary rate is 19199 */ ancillaryRate = (MAX_ANCRATE - 1); } else { /* 10% of bitrate */ ancillaryRate = bitRate / 10; } } /* make ancillaryBitsPerFrame byte align */ *ancillaryBitsPerFrame = (ancillaryRate * framelength ) / sampleRate; diffToByteAlign = *ancillaryBitsPerFrame % 8; *ancillaryBitsPerFrame = *ancillaryBitsPerFrame - diffToByteAlign; return AAC_ENC_OK; } fdk-aac-0.1.3/libAACenc/src/psy_data.h0000644000175000017500000001636512372261464017732 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Psychoaccoustic data ******************************************************************************/ #ifndef _PSY_DATA_H #define _PSY_DATA_H #include "block_switch.h" /* Be careful with MAX_SFB_LONG as length of the .Long arrays. * sfbEnergy.Long and sfbEnergyMS.Long and sfbThreshold.Long are used as a temporary storage for the regrouped * short energies and thresholds between FDKaacEnc_groupShortData() and BuildInterface() in FDKaacEnc_psyMain(). * The space required for this is MAX_GROUPED_SFB ( = MAX_NO_OF_GROUPS*MAX_SFB_SHORT ). * However, this is not important if unions are used (which is not possible with pfloat). */ typedef shouldBeUnion{ FIXP_DBL Long[MAX_GROUPED_SFB]; FIXP_DBL Short[TRANS_FAC][MAX_SFB_SHORT]; }SFB_THRESHOLD; typedef shouldBeUnion{ FIXP_DBL Long[MAX_GROUPED_SFB]; FIXP_DBL Short[TRANS_FAC][MAX_SFB_SHORT]; }SFB_ENERGY; typedef shouldBeUnion{ FIXP_DBL Long[MAX_GROUPED_SFB]; FIXP_DBL Short[TRANS_FAC][MAX_SFB_SHORT]; }SFB_LD_ENERGY; typedef shouldBeUnion{ INT Long[MAX_GROUPED_SFB]; INT Short[TRANS_FAC][MAX_SFB_SHORT]; }SFB_MAX_SCALE; typedef struct{ INT_PCM* psyInputBuffer; FIXP_DBL overlapAddBuffer[1024]; BLOCK_SWITCHING_CONTROL blockSwitchingControl; /* block switching */ FIXP_DBL sfbThresholdnm1[MAX_SFB]; /* FDKaacEnc_PreEchoControl */ INT mdctScalenm1; /* scale of last block's mdct (FDKaacEnc_PreEchoControl) */ INT calcPreEcho; INT isLFE; }PSY_STATIC; typedef struct{ FIXP_DBL *mdctSpectrum; SFB_THRESHOLD sfbThreshold; /* adapt */ SFB_ENERGY sfbEnergy; /* sfb energies */ SFB_LD_ENERGY sfbEnergyLdData; /* sfb energies in ldData format */ SFB_MAX_SCALE sfbMaxScaleSpec; SFB_ENERGY sfbEnergyMS; /* mid/side sfb energies */ FIXP_DBL sfbEnergyMSLdData[MAX_GROUPED_SFB]; /* mid/side sfb energies in ldData format */ SFB_ENERGY sfbSpreadEnergy; INT mdctScale; /* exponent of data in mdctSpectrum */ INT groupedSfbOffset[MAX_GROUPED_SFB+1]; INT sfbActive; INT lowpassLine; }PSY_DATA; #endif /* _PSY_DATA_H */ fdk-aac-0.1.3/libAACenc/src/transform.h0000644000175000017500000001414412372261464020132 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: MDCT Transform ******************************************************************************/ #ifndef _TRANSFORM_H #define _TRANSFORM_H #include "common_fix.h" #define WTS0 1 #define WTS1 0 #define WTS2 -2 /** * \brief: Performe MDCT transform of time domain data. * \param timeData pointer to time domain input signal. * \param mdctData pointer to store frequency domain output data. * \param blockType index indicating the type of block. Either * LONG_WINDOW, START_WINDOW, SHORT_WINDOW or STOP_WINDOW. * \param windowShape index indicating the window slope type to be used. * Values allowed are either SINE_WINDOW or KBD_WINDOW. * \param frameLength length of the block. * \param mdctData_e pointer to an INT where the exponent of the frequency * domain output data is stored into. * \return 0 in case of success, non-zero in case of error (inconsistent parameters). */ INT FDKaacEnc_Transform_Real (const INT_PCM *timeData, FIXP_DBL *RESTRICT mdctData, const INT blockType, const INT windowShape, INT *prevWindowShape, const INT frameLength, INT *mdctData_e, INT filterType ,FIXP_DBL * RESTRICT overlapAddBuffer ); #endif fdk-aac-0.1.3/libAACenc/src/grp_data.cpp0000644000175000017500000002403012372261464020226 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Short block grouping ******************************************************************************/ #include "psy_const.h" #include "interface.h" /* * this routine does not work in-place */ static inline FIXP_DBL nrgAddSaturate(const FIXP_DBL a, const FIXP_DBL b) { return ( (a>=(FIXP_DBL)MAXVAL_DBL-b) ? (FIXP_DBL)MAXVAL_DBL : (a + b) ); } void FDKaacEnc_groupShortData(FIXP_DBL *mdctSpectrum, /* in-out */ SFB_THRESHOLD *sfbThreshold, /* in-out */ SFB_ENERGY *sfbEnergy, /* in-out */ SFB_ENERGY *sfbEnergyMS, /* in-out */ SFB_ENERGY *sfbSpreadEnergy, const INT sfbCnt, const INT sfbActive, const INT *sfbOffset, const FIXP_DBL *sfbMinSnrLdData, INT *groupedSfbOffset, /* out */ INT *maxSfbPerGroup, /* out */ FIXP_DBL *groupedSfbMinSnrLdData, const INT noOfGroups, const INT *groupLen, const INT granuleLength) { INT i,j; INT line; /* counts through lines */ INT sfb; /* counts through scalefactor bands */ INT grp; /* counts through groups */ INT wnd; /* counts through windows in a group */ INT offset; /* needed in sfbOffset grouping */ INT highestSfb; INT granuleLength_short = granuleLength/TRANS_FAC; /* for short blocks: regroup spectrum and */ /* group energies and thresholds according to grouping */ C_ALLOC_SCRATCH_START(tmpSpectrum, FIXP_DBL, (1024)); /* calculate maxSfbPerGroup */ highestSfb = 0; for (wnd = 0; wnd < TRANS_FAC; wnd++) { for (sfb = sfbActive-1; sfb >= highestSfb; sfb--) { for (line = sfbOffset[sfb+1]-1; line >= sfbOffset[sfb]; line--) { if ( mdctSpectrum[wnd*granuleLength_short+line] != FL2FXCONST_SPC(0.0) ) break; /* this band is not completely zero */ } if (line >= sfbOffset[sfb]) break; /* this band was not completely zero */ } highestSfb = fixMax(highestSfb, sfb); } highestSfb = highestSfb > 0 ? highestSfb : 0; *maxSfbPerGroup = highestSfb+1; /* calculate groupedSfbOffset */ i = 0; offset = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive+1; sfb++) { groupedSfbOffset[i++] = offset + sfbOffset[sfb] * groupLen[grp]; } i += sfbCnt-sfb; offset += groupLen[grp] * granuleLength_short; } groupedSfbOffset[i++] = granuleLength; /* calculate groupedSfbMinSnr */ i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { groupedSfbMinSnrLdData[i++] = sfbMinSnrLdData[sfb]; } i += sfbCnt-sfb; } /* sum up sfbThresholds */ wnd = 0; i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { FIXP_DBL thresh = sfbThreshold->Short[wnd][sfb]; for (j=1; jShort[wnd+j][sfb]); } sfbThreshold->Long[i++] = thresh; } i += sfbCnt-sfb; wnd += groupLen[grp]; } /* sum up sfbEnergies left/right */ wnd = 0; i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { FIXP_DBL energy = sfbEnergy->Short[wnd][sfb]; for (j=1; jShort[wnd+j][sfb]); } sfbEnergy->Long[i++] = energy; } i += sfbCnt-sfb; wnd += groupLen[grp]; } /* sum up sfbEnergies mid/side */ wnd = 0; i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { FIXP_DBL energy = sfbEnergyMS->Short[wnd][sfb]; for (j=1; jShort[wnd+j][sfb]); } sfbEnergyMS->Long[i++] = energy; } i += sfbCnt-sfb; wnd += groupLen[grp]; } /* sum up sfbSpreadEnergies */ wnd = 0; i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { FIXP_DBL energy = sfbSpreadEnergy->Short[wnd][sfb]; for (j=1; jShort[wnd+j][sfb]); } sfbSpreadEnergy->Long[i++] = energy; } i += sfbCnt-sfb; wnd += groupLen[grp]; } /* re-group spectrum */ wnd = 0; i = 0; for (grp = 0; grp < noOfGroups; grp++) { for (sfb = 0; sfb < sfbActive; sfb++) { int width = sfbOffset[sfb+1]-sfbOffset[sfb]; FIXP_DBL *pMdctSpectrum = &mdctSpectrum[sfbOffset[sfb]] + wnd*granuleLength_short; for (j = 0; j < groupLen[grp]; j++) { FIXP_DBL *pTmp = pMdctSpectrum; for (line = width; line > 0; line--) { tmpSpectrum[i++] = *pTmp++; } pMdctSpectrum += granuleLength_short; } } i += (groupLen[grp]*(sfbOffset[sfbCnt]-sfbOffset[sfb])); wnd += groupLen[grp]; } FDKmemcpy(mdctSpectrum, tmpSpectrum, granuleLength*sizeof(FIXP_DBL)); C_ALLOC_SCRATCH_END(tmpSpectrum, FIXP_DBL, (1024)) } fdk-aac-0.1.3/libAACenc/src/aacenc_lib.cpp0000644000175000017500000022267412372261464020523 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /**************************** MPEG-4 HE-AAC Encoder ************************* Initial author: M. Lohwasser contents/description: FDK HE-AAC Encoder interface library functions ****************************************************************************/ #include "aacenc_lib.h" #include "FDK_audio.h" #include "aacenc.h" #include "aacEnc_ram.h" #include "FDK_core.h" /* FDK_tools versioning info */ /* Encoder library info */ #define AACENCODER_LIB_VL0 3 #define AACENCODER_LIB_VL1 4 #define AACENCODER_LIB_VL2 12 #define AACENCODER_LIB_TITLE "AAC Encoder" #define AACENCODER_LIB_BUILD_DATE __DATE__ #define AACENCODER_LIB_BUILD_TIME __TIME__ #include "sbr_encoder.h" #include "../src/sbr_ram.h" #include "channel_map.h" #include "psy_const.h" #include "bitenc.h" #include "tpenc_lib.h" #include "metadata_main.h" #define SBL(fl) (fl/8) /*!< Short block length (hardcoded to 8 short blocks per long block) */ #define BSLA(fl) (4*SBL(fl)+SBL(fl)/2) /*!< AAC block switching look-ahead */ #define DELAY_AAC(fl) (fl+BSLA(fl)) /*!< MDCT + blockswitching */ #define DELAY_AACELD(fl) ((fl)/2) /*!< ELD FB delay (no framing delay included) */ #define INPUTBUFFER_SIZE (1537+100+2048) #define DEFAULT_HEADER_PERIOD_REPETITION_RATE 10 /*!< Default header repetition rate used in transport library and for SBR header. */ //////////////////////////////////////////////////////////////////////////////////// /** * Flags to characterize encoder modules to be supported in present instance. */ enum { ENC_MODE_FLAG_AAC = 0x0001, ENC_MODE_FLAG_SBR = 0x0002, ENC_MODE_FLAG_PS = 0x0004, ENC_MODE_FLAG_SAC = 0x0008, ENC_MODE_FLAG_META = 0x0010 }; //////////////////////////////////////////////////////////////////////////////////// typedef struct { AUDIO_OBJECT_TYPE userAOT; /*!< Audio Object Type. */ UINT userSamplerate; /*!< Sampling frequency. */ UINT nChannels; /*!< will be set via channelMode. */ CHANNEL_MODE userChannelMode; UINT userBitrate; UINT userBitrateMode; UINT userBandwidth; UINT userAfterburner; UINT userFramelength; UINT userAncDataRate; UCHAR userTns; /*!< Use TNS coding. */ UCHAR userPns; /*!< Use PNS coding. */ UCHAR userIntensity; /*!< Use Intensity coding. */ TRANSPORT_TYPE userTpType; /*!< Transport type */ UCHAR userTpSignaling; /*!< Extension AOT signaling mode. */ UCHAR userTpNsubFrames; /*!< Number of sub frames in a transport frame for LOAS/LATM or ADTS (default 1). */ UCHAR userTpAmxv; /*!< AudioMuxVersion to be used for LATM (default 0). */ UCHAR userTpProtection; UCHAR userTpHeaderPeriod; /*!< Parameter used to configure LATM/LOAS SMC rate. Moreover this parameters is used to configure repetition rate of PCE in raw_data_block. */ UCHAR userErTools; /*!< Use VCB11, HCR and/or RVLC ER tool. */ UINT userPceAdditions; /*!< Configure additional bits in PCE. */ UCHAR userMetaDataMode; /*!< Meta data library configuration. */ UCHAR userSbrEnabled; /*!< Enable SBR for ELD. */ UINT userSbrRatio; /*!< SBR sampling rate ratio. Dual- or single-rate. */ } USER_PARAM; //////////////////////////////////////////////////////////////////////////////////// /**************************************************************************** Structure Definitions ****************************************************************************/ typedef struct AACENC_CONFIG *HANDLE_AACENC_CONFIG; struct AACENCODER { USER_PARAM extParam; CODER_CONFIG coderConfig; /* AAC */ AACENC_CONFIG aacConfig; HANDLE_AAC_ENC hAacEnc; /* SBR */ HANDLE_SBR_ENCODER hEnvEnc; /* Meta Data */ HANDLE_FDK_METADATA_ENCODER hMetadataEnc; INT metaDataAllowed; /* Signal whether chosen configuration allows metadata. Necessary for delay compensation. Metadata mode is a separate parameter. */ /* Transport */ HANDLE_TRANSPORTENC hTpEnc; /* Output */ UCHAR *outBuffer; /* Internal bitstream buffer */ INT outBufferInBytes; /* Size of internal bitstream buffer*/ /* Input */ INT_PCM *inputBuffer; /* Internal input buffer. Input source for AAC encoder */ INT inputBufferOffset; /* Where to write new input samples. */ INT nSamplesToRead; /* number of input samples neeeded for encoding one frame */ INT nSamplesRead; /* number of input samples already in input buffer */ INT nZerosAppended; /* appended zeros at end of file*/ INT nDelay; /* encoder delay */ AACENC_EXT_PAYLOAD extPayload [MAX_TOTAL_EXT_PAYLOADS]; /* Extension payload */ UCHAR extPayloadData [(1)][(8)][MAX_PAYLOAD_SIZE]; UINT extPayloadSize [(1)][(8)]; /* payload sizes in bits */ ULONG InitFlags; /* internal status to treggier re-initialization */ /* Memory allocation info. */ INT nMaxAacElements; INT nMaxAacChannels; INT nMaxSbrElements; INT nMaxSbrChannels; UINT nMaxSubFrames; UINT encoder_modis; /* Capability flags */ UINT CAPF_tpEnc; } ; typedef struct { ULONG samplingRate; /*!< Encoder output sampling rate. */ ULONG bitrateRange; /*!< Lower bitrate range for config entry. */ UCHAR lowDelaySbr; /*!< 0: ELD sbr off, 1: ELD sbr on */ UCHAR downsampledSbr; /*!< 0: ELD with dualrate sbr, 1: ELD with downsampled sbr */ } ELD_SBR_CONFIGURATOR; /** * \brief This table defines ELD/SBR default configurations. */ static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] = { { 48000, 0, 1, 0 }, { 48000, 64001, 0, 0 }, { 44100, 0, 1, 0 }, { 44100, 64001, 0, 0 }, { 32000, 0, 1, 0 }, { 32000, 28000, 1, 1 }, { 32000, 56000, 0, 0 }, { 24000, 0, 1, 1 }, { 24000, 40000, 0, 0 }, { 16000, 0, 1, 1 }, { 16000, 28000, 0, 0 } }; /* * \brief Configure SBR for ELD configuration. * * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate. * Outputparameters are SBR on/off, and SBR ratio. * * \param samplingRate Audio signal sampling rate. * \param channelMode Channel configuration to be used. * \param totalBitrate Overall bitrate. * \param eldSbr Pointer to eldSbr parameter, filled on return. * \param eldSbrRatio Pointer to eldSbrRatio parameter, filled on return. * * \return - AACENC_OK, all fine. * - AACENC_INVALID_CONFIG, on failure. */ static AACENC_ERROR eldSbrConfigurator( const ULONG samplingRate, const CHANNEL_MODE channelMode, const ULONG totalBitrate, UINT * const eldSbr, UINT * const eldSbrRatio ) { AACENC_ERROR err = AACENC_OK; int i, cfgIdx = -1; const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; for (i=0; i<(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) { if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate) && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) ) { cfgIdx = i; } } if (cfgIdx != -1) { *eldSbr = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1; *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1; } else { err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */ } return err; } static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) { INT sbrUsed = 0; if ( (hAacConfig->audioObjectType==AOT_SBR) || (hAacConfig->audioObjectType==AOT_PS) || (hAacConfig->audioObjectType==AOT_MP2_SBR) || (hAacConfig->audioObjectType==AOT_MP2_PS) || (hAacConfig->audioObjectType==AOT_DABPLUS_SBR) || (hAacConfig->audioObjectType==AOT_DABPLUS_PS) || (hAacConfig->audioObjectType==AOT_DRM_SBR) || (hAacConfig->audioObjectType==AOT_DRM_MPEG_PS) ) { sbrUsed = 1; } if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD && (hAacConfig->syntaxFlags & AC_SBR_PRESENT)) { sbrUsed = 1; } return ( sbrUsed ); } static inline INT isPsActive(const AUDIO_OBJECT_TYPE audioObjectType) { INT psUsed = 0; if ( (audioObjectType==AOT_PS) || (audioObjectType==AOT_MP2_PS) || (audioObjectType==AOT_DABPLUS_PS) || (audioObjectType==AOT_DRM_MPEG_PS) ) { psUsed = 1; } return ( psUsed ); } static SBR_PS_SIGNALING getSbrSignalingMode( const AUDIO_OBJECT_TYPE audioObjectType, const TRANSPORT_TYPE transportType, const UCHAR transportSignaling, const UINT sbrRatio ) { SBR_PS_SIGNALING sbrSignaling; if (transportType==TT_UNKNOWN || sbrRatio==0) { sbrSignaling = SIG_UNKNOWN; /* Needed parameters have not been set */ return sbrSignaling; } else { sbrSignaling = SIG_IMPLICIT; /* default: implicit signaling */ } if ((audioObjectType==AOT_AAC_LC) || (audioObjectType==AOT_SBR) || (audioObjectType==AOT_PS) || (audioObjectType==AOT_MP2_AAC_LC) || (audioObjectType==AOT_MP2_SBR) || (audioObjectType==AOT_MP2_PS) ) { switch (transportType) { case TT_MP4_ADIF: case TT_MP4_ADTS: sbrSignaling = SIG_IMPLICIT; /* For MPEG-2 transport types, only implicit signaling is possible */ break; case TT_MP4_RAW: case TT_MP4_LATM_MCP1: case TT_MP4_LATM_MCP0: case TT_MP4_LOAS: default: if ( transportSignaling==0xFF ) { /* Defaults */ if ( sbrRatio==1 ) { sbrSignaling = SIG_EXPLICIT_HIERARCHICAL; /* For downsampled SBR, explicit signaling is mandatory */ } else { sbrSignaling = SIG_IMPLICIT; /* For dual-rate SBR, implicit signaling is default */ } } else { /* User set parameters */ /* Attention: Backward compatible explicit signaling does only work with AMV1 for LATM/LOAS */ sbrSignaling = (SBR_PS_SIGNALING)transportSignaling; } break; } } return sbrSignaling; } /**************************************************************************** Allocate Encoder ****************************************************************************/ H_ALLOC_MEM (_AacEncoder, AACENCODER) C_ALLOC_MEM (_AacEncoder, AACENCODER, 1) /* * Map Encoder specific config structures to CODER_CONFIG. */ static void FDKaacEnc_MapConfig( CODER_CONFIG *const cc, const USER_PARAM *const extCfg, const SBR_PS_SIGNALING sbrSignaling, const HANDLE_AACENC_CONFIG hAacConfig ) { AUDIO_OBJECT_TYPE transport_AOT = AOT_NULL_OBJECT; FDKmemclear(cc, sizeof(CODER_CONFIG)); cc->flags = 0; /* Map virtual aot to transport aot. */ switch (hAacConfig->audioObjectType) { case AOT_MP2_AAC_LC: transport_AOT = AOT_AAC_LC; break; case AOT_MP2_SBR: transport_AOT = AOT_SBR; cc->flags |= CC_SBR; break; case AOT_MP2_PS: transport_AOT = AOT_PS; cc->flags |= CC_SBR; break; default: transport_AOT = hAacConfig->audioObjectType; } if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { cc->flags |= (hAacConfig->syntaxFlags & AC_SBR_PRESENT) ? CC_SBR : 0; } /* transport type is usually AAC-LC. */ if ( (transport_AOT == AOT_SBR) || (transport_AOT == AOT_PS) ) { cc->aot = AOT_AAC_LC; } else { cc->aot = transport_AOT; } /* Configure extension aot. */ if (sbrSignaling==SIG_IMPLICIT) { cc->extAOT = AOT_NULL_OBJECT; /* implicit */ } else { if ( (sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) && ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) ) { cc->extAOT = AOT_SBR; /* explicit backward compatible */ } else { cc->extAOT = transport_AOT; /* explicit hierarchical */ } } if ( (transport_AOT==AOT_SBR) || (transport_AOT==AOT_PS) ) { cc->sbrPresent=1; if (transport_AOT==AOT_PS) { cc->psPresent=1; } } cc->sbrSignaling = sbrSignaling; cc->extSamplingRate = extCfg->userSamplerate; cc->bitRate = hAacConfig->bitRate; cc->noChannels = hAacConfig->nChannels; cc->flags |= CC_IS_BASELAYER; cc->channelMode = hAacConfig->channelMode; cc->nSubFrames = (hAacConfig->nSubFrames > 1 && extCfg->userTpNsubFrames == 1) ? hAacConfig->nSubFrames : extCfg->userTpNsubFrames; cc->flags |= (extCfg->userTpProtection) ? CC_PROTECTION : 0; if (extCfg->userTpHeaderPeriod!=0xFF) { cc->headerPeriod = extCfg->userTpHeaderPeriod; } else { /* auto-mode */ switch (extCfg->userTpType) { case TT_MP4_ADTS: case TT_MP4_LOAS: case TT_MP4_LATM_MCP1: cc->headerPeriod = DEFAULT_HEADER_PERIOD_REPETITION_RATE; break; default: cc->headerPeriod = 0; } } cc->samplesPerFrame = hAacConfig->framelength; cc->samplingRate = hAacConfig->sampleRate; /* Mpeg-4 signaling for transport library. */ switch ( hAacConfig->audioObjectType ) { case AOT_MP2_AAC_LC: case AOT_MP2_SBR: case AOT_MP2_PS: cc->flags &= ~CC_MPEG_ID; /* Required for ADTS. */ cc->extAOT = AOT_NULL_OBJECT; break; default: cc->flags |= CC_MPEG_ID; } /* ER-tools signaling. */ cc->flags |= (hAacConfig->syntaxFlags & AC_ER_VCB11) ? CC_VCB11 : 0; cc->flags |= (hAacConfig->syntaxFlags & AC_ER_HCR) ? CC_HCR : 0; cc->flags |= (hAacConfig->syntaxFlags & AC_ER_RVLC) ? CC_RVLC : 0; /* Matrix mixdown coefficient configuration. */ if ( (extCfg->userPceAdditions&0x1) && (hAacConfig->epConfig==-1) && ((cc->channelMode==MODE_1_2_2)||(cc->channelMode==MODE_1_2_2_1)) ) { cc->matrixMixdownA = ((extCfg->userPceAdditions>>1)&0x3)+1; cc->flags |= (extCfg->userPceAdditions>>3)&0x1 ? CC_PSEUDO_SURROUND : 0; } else { cc->matrixMixdownA = 0; } } /* * Examine buffer descriptor regarding choosen identifier. * * \param pBufDesc Pointer to buffer descriptor * \param identifier Buffer identifier to look for. * \return - Buffer descriptor index. * -1, if there is no entry available. */ static INT getBufDescIdx( const AACENC_BufDesc *pBufDesc, const AACENC_BufferIdentifier identifier ) { INT i, idx = -1; for (i=0; inumBufs; i++) { if ( (AACENC_BufferIdentifier)pBufDesc->bufferIdentifiers[i] == identifier ) { idx = i; break; } } return idx; } /**************************************************************************** Function Declarations ****************************************************************************/ AAC_ENCODER_ERROR aacEncDefaultConfig(HANDLE_AACENC_CONFIG hAacConfig, USER_PARAM *config) { /* make reasonable default settings */ FDKaacEnc_AacInitDefaultConfig (hAacConfig); /* clear configuration structure and copy default settings */ FDKmemclear(config, sizeof(USER_PARAM)); /* copy encoder configuration settings */ config->nChannels = hAacConfig->nChannels; config->userAOT = hAacConfig->audioObjectType = AOT_AAC_LC; config->userSamplerate = hAacConfig->sampleRate; config->userChannelMode = hAacConfig->channelMode; config->userBitrate = hAacConfig->bitRate; config->userBitrateMode = hAacConfig->bitrateMode; config->userBandwidth = hAacConfig->bandWidth; config->userTns = hAacConfig->useTns; config->userPns = hAacConfig->usePns; config->userIntensity = hAacConfig->useIS; config->userAfterburner = hAacConfig->useRequant; config->userFramelength = (UINT)-1; if (hAacConfig->syntaxFlags & AC_ER_VCB11) { config->userErTools |= 0x01; } if (hAacConfig->syntaxFlags & AC_ER_HCR) { config->userErTools |= 0x02; } /* initialize transport parameters */ config->userTpType = TT_UNKNOWN; config->userTpAmxv = 0; config->userTpSignaling = 0xFF; /* choose signaling automatically */ config->userTpNsubFrames = 1; config->userTpProtection = 0; /* not crc protected*/ config->userTpHeaderPeriod = 0xFF; /* header period in auto mode */ config->userPceAdditions = 0; /* no matrix mixdown coefficient */ config->userMetaDataMode = 0; /* do not embed any meta data info */ config->userAncDataRate = 0; /* SBR rate is set to 0 here, which means it should be set automatically in FDKaacEnc_AdjustEncSettings() if the user did not set a rate expilicitely. */ config->userSbrRatio = 0; /* SBR enable set to -1 means to inquire ELD audio configurator for reasonable configuration. */ config->userSbrEnabled = -1; return AAC_ENC_OK; } static void aacEncDistributeSbrBits(CHANNEL_MAPPING *channelMapping, SBR_ELEMENT_INFO *sbrElInfo, INT bitRate) { INT codebits = bitRate; int el; /* Copy Element info */ for (el=0; elnElements; el++) { sbrElInfo[el].ChannelIndex[0] = channelMapping->elInfo[el].ChannelIndex[0]; sbrElInfo[el].ChannelIndex[1] = channelMapping->elInfo[el].ChannelIndex[1]; sbrElInfo[el].elType = channelMapping->elInfo[el].elType; sbrElInfo[el].bitRate = (INT)(fMultNorm(channelMapping->elInfo[el].relativeBits, (FIXP_DBL)bitRate)); sbrElInfo[el].instanceTag = channelMapping->elInfo[el].instanceTag; sbrElInfo[el].nChannelsInEl = channelMapping->elInfo[el].nChannelsInEl; codebits -= sbrElInfo[el].bitRate; } sbrElInfo[0].bitRate += codebits; } static INT aacEncoder_LimitBitrate( const HANDLE_TRANSPORTENC hTpEnc, const INT samplingRate, const INT frameLength, const INT nChannels, const CHANNEL_MODE channelMode, INT bitRate, const INT nSubFrames, const INT sbrActive, const INT sbrDownSampleRate, const AUDIO_OBJECT_TYPE aot ) { INT coreSamplingRate; CHANNEL_MAPPING cm; FDKaacEnc_InitChannelMapping(channelMode, CH_ORDER_MPEG, &cm); if (sbrActive) { coreSamplingRate = samplingRate >> (sbrEncoder_IsSingleRatePossible(aot) ? (sbrDownSampleRate-1):1); } else { coreSamplingRate = samplingRate; } /* Consider bandwidth channel bit rate limit (see bandwidth.cpp: GetBandwidthEntry()) */ if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) { bitRate = FDKmin(360000*nChannels, bitRate); bitRate = FDKmax(8000*nChannels, bitRate); } if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) { bitRate = FDKmin(576000*nChannels, bitRate); /*bitRate = FDKmax(0*nChannels, bitRate);*/ } /* Limit bit rate in respect to the core coder */ bitRate = FDKaacEnc_LimitBitrate( hTpEnc, coreSamplingRate, frameLength, nChannels, cm.nChannelsEff, bitRate, -1, NULL, -1, nSubFrames ); /* Limit bit rate in respect to available SBR modes if active */ if (sbrActive) { int numIterations = 0; INT initialBitrate, adjustedBitrate; initialBitrate = adjustedBitrate = bitRate; /* Find total bitrate which provides valid configuration for each SBR element. */ do { int e; SBR_ELEMENT_INFO sbrElInfo[(8)]; FDK_ASSERT(cm.nElements <= (8)); initialBitrate = adjustedBitrate; /* Get bit rate for each SBR element */ aacEncDistributeSbrBits(&cm, sbrElInfo, initialBitrate); for (e=0; e sbrBitRateOut) { adjustedBitrate = fMin(initialBitrate, (INT)fDivNorm((FIXP_DBL)(sbrBitRateOut-8), cm.elInfo[e].relativeBits)); break; } } /* sbrElementBitRateIn != sbrBitRateOut */ } /* elements */ numIterations++; /* restrict iteration to worst case of num elements */ } while ( (initialBitrate!=adjustedBitrate) && (numIterations<=cm.nElements) ); /* Unequal bitrates mean that no reasonable bitrate configuration found. */ bitRate = (initialBitrate==adjustedBitrate) ? adjustedBitrate : 0; } FDK_ASSERT(bitRate > 0); return bitRate; } /* * \brief Consistency check of given USER_PARAM struct and * copy back configuration from public struct into internal * encoder configuration struct. * * \hAacEncoder Internal encoder config which is to be updated * \param config User provided config (public struct) * \return ´returns always AAC_ENC_OK */ static AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, USER_PARAM *config) { AACENC_ERROR err = AACENC_OK; /* Get struct pointers. */ HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; hAacConfig->nChannels = config->nChannels; /* Encoder settings update. */ hAacConfig->sampleRate = config->userSamplerate; hAacConfig->useTns = config->userTns; hAacConfig->usePns = config->userPns; hAacConfig->useIS = config->userIntensity; hAacConfig->bitRate = config->userBitrate; hAacConfig->channelMode = config->userChannelMode; hAacConfig->bitrateMode = config->userBitrateMode; hAacConfig->bandWidth = config->userBandwidth; hAacConfig->useRequant = config->userAfterburner; hAacConfig->audioObjectType = config->userAOT; hAacConfig->anc_Rate = config->userAncDataRate; hAacConfig->syntaxFlags = 0; hAacConfig->epConfig = -1; /* Adapt internal AOT when necessary. */ switch ( hAacConfig->audioObjectType ) { case AOT_MP2_AAC_LC: case AOT_MP2_SBR: case AOT_MP2_PS: hAacConfig->usePns = 0; case AOT_AAC_LC: case AOT_SBR: case AOT_PS: config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_ADTS; hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 1024; if (hAacConfig->framelength != 1024) { return AACENC_INVALID_CONFIG; } break; case AOT_ER_AAC_LD: hAacConfig->epConfig = 0; hAacConfig->syntaxFlags |= AC_ER|AC_LD; hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512; if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { return AACENC_INVALID_CONFIG; } break; case AOT_ER_AAC_ELD: hAacConfig->epConfig = 0; hAacConfig->syntaxFlags |= AC_ER|AC_ELD; hAacConfig->syntaxFlags |= ((config->userErTools & 0x1) ? AC_ER_VCB11 : 0); hAacConfig->syntaxFlags |= ((config->userErTools & 0x2) ? AC_ER_HCR : 0); hAacConfig->syntaxFlags |= ((config->userErTools & 0x4) ? AC_ER_RVLC : 0); hAacConfig->syntaxFlags |= ((config->userSbrEnabled==1) ? AC_SBR_PRESENT : 0); config->userTpType = (config->userTpType!=TT_UNKNOWN) ? config->userTpType : TT_MP4_LOAS; hAacConfig->framelength = (config->userFramelength!=(UINT)-1) ? config->userFramelength : 512; if (hAacConfig->framelength != 512 && hAacConfig->framelength != 480) { return AACENC_INVALID_CONFIG; } break; default: break; } switch ( hAacConfig->audioObjectType ) { case AOT_ER_AAC_LD: case AOT_ER_AAC_ELD: if (config->userBitrateMode==8) { hAacConfig->bitrateMode = 0; } if (config->userBitrateMode==0) { hAacConfig->bitreservoir = 100*config->nChannels; /* default, reduced bitreservoir */ } if (hAacConfig->bitrateMode!=0) { return AACENC_INVALID_CONFIG; } break; default: break; } hAacConfig->bitRate = config->userBitrate; /* get bitrate in VBR configuration */ if ( (hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5) ) { /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */ hAacConfig->bitRate = FDKaacEnc_GetVBRBitrate(hAacConfig->bitrateMode, hAacConfig->channelMode); } /* Set default bitrate if no external bitrate declared. */ if ( (hAacConfig->bitrateMode==0) && (config->userBitrate==(UINT)-1) ) { INT bitrate = FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff * hAacConfig->sampleRate; if ( isPsActive(hAacConfig->audioObjectType) ) { hAacConfig->bitRate = (bitrate>>1); /* 0.5 bit per sample */ } else if ( isSbrActive(hAacConfig) ) { if ( (config->userSbrRatio==2) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType!=AOT_ER_AAC_ELD)) ) { hAacConfig->bitRate = (bitrate + (bitrate>>2))>>1; /* 0.625 bits per sample */ } if ( (config->userSbrRatio==1) || ((config->userSbrRatio==0)&&(hAacConfig->audioObjectType==AOT_ER_AAC_ELD)) ) { hAacConfig->bitRate = (bitrate + (bitrate>>3)); /* 1.125 bits per sample */ } } else { hAacConfig->bitRate = bitrate + (bitrate>>1); /* 1.5 bits per sample */ } } /* Initialize SBR parameters */ if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) ) { UINT eldSbr = 0; UINT eldSbrRatio = 0; if ( AACENC_OK!=(err=eldSbrConfigurator( hAacConfig->sampleRate, hAacConfig->channelMode, hAacConfig->bitRate, &eldSbr, &eldSbrRatio)) ) { return err; } hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0); hAacConfig->sbrRatio = eldSbrRatio; } else if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) { /* Automatic SBR ratio configuration * - downsampled SBR for ELD * - otherwise always dualrate SBR */ hAacConfig->sbrRatio = (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) ? 1 : 2; } else { /* SBR ratio has been set by the user, so use it. */ hAacConfig->sbrRatio = config->userSbrRatio; } { UCHAR tpSignaling=getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio); if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) && (config->userTpType==TT_MP4_LATM_MCP1 || config->userTpType==TT_MP4_LATM_MCP0 || config->userTpType==TT_MP4_LOAS) && (tpSignaling==1) && (config->userTpAmxv==0) ) { /* For backward compatible explicit signaling, AMV1 has to be active */ return AACENC_INVALID_CONFIG; } if ( (hAacConfig->audioObjectType==AOT_AAC_LC || hAacConfig->audioObjectType==AOT_SBR || hAacConfig->audioObjectType==AOT_PS) && (tpSignaling==0) && (hAacConfig->sbrRatio==1)) { /* Downsampled SBR has to be signaled explicitely (for transmission of SBR sampling fequency) */ return AACENC_INVALID_CONFIG; } } /* We need the frame length to call aacEncoder_LimitBitrate() */ hAacConfig->bitRate = aacEncoder_LimitBitrate( NULL, hAacConfig->sampleRate, hAacConfig->framelength, hAacConfig->nChannels, hAacConfig->channelMode, hAacConfig->bitRate, hAacConfig->nSubFrames, isSbrActive(hAacConfig), hAacConfig->sbrRatio, hAacConfig->audioObjectType ); /* Configure PNS */ if ( ((hAacConfig->bitrateMode>=1) && (hAacConfig->bitrateMode<=5)) /* VBR without PNS. */ || (hAacConfig->useTns == 0) ) /* TNS required. */ { hAacConfig->usePns = 0; } if (hAacConfig->epConfig >= 0) { hAacConfig->syntaxFlags |= AC_ER; if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) { return AACENC_INVALID_CONFIG; /* Cannel config 0 not supported. */ } } if ( FDKaacEnc_DetermineEncoderMode(&hAacConfig->channelMode, hAacConfig->nChannels) != AAC_ENC_OK) { return AACENC_INVALID_CONFIG; /* nChannels doesn't match chMode, this is just a check-up */ } if ( (hAacConfig->nChannels > hAacEncoder->nMaxAacChannels) || ( (FDKaacEnc_GetChannelModeConfiguration(hAacConfig->channelMode)->nChannelsEff > hAacEncoder->nMaxSbrChannels) && isSbrActive(hAacConfig) ) ) { return AACENC_INVALID_CONFIG; /* not enough channels allocated */ } /* Meta data restriction. */ switch (hAacConfig->audioObjectType) { /* Allow metadata support */ case AOT_AAC_LC: case AOT_SBR: case AOT_PS: hAacEncoder->metaDataAllowed = 1; if (((INT)hAacConfig->channelMode < 1) || ((INT)hAacConfig->channelMode > 7)) { config->userMetaDataMode = 0; } break; /* Prohibit metadata support */ default: hAacEncoder->metaDataAllowed = 0; } return err; } static INT aacenc_SbrCallback( void * self, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, const INT sampleRateOut, const INT samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const INT elementIndex ) { HANDLE_AACENCODER hAacEncoder = (HANDLE_AACENCODER)self; sbrEncoder_GetHeader(hAacEncoder->hEnvEnc, hBs, elementIndex, 0); return 0; } static AACENC_ERROR aacEncInit(HANDLE_AACENCODER hAacEncoder, ULONG InitFlags, USER_PARAM *config) { AACENC_ERROR err = AACENC_OK; INT aacBufferOffset = 0; HANDLE_SBR_ENCODER *hSbrEncoder = &hAacEncoder->hEnvEnc; HANDLE_AACENC_CONFIG hAacConfig = &hAacEncoder->aacConfig; hAacEncoder->nZerosAppended = 0; /* count appended zeros */ INT frameLength = hAacConfig->framelength; if ( (InitFlags & AACENC_INIT_CONFIG) ) { CHANNEL_MODE prevChMode = hAacConfig->channelMode; /* Verify settings and update: config -> heAacEncoder */ if ( (err=FDKaacEnc_AdjustEncSettings(hAacEncoder, config)) != AACENC_OK ) { return err; } frameLength = hAacConfig->framelength; /* adapt temporal framelength */ /* Seamless channel reconfiguration in sbr not fully implemented */ if ( (prevChMode!=hAacConfig->channelMode) && isSbrActive(hAacConfig) ) { InitFlags |= AACENC_INIT_STATES; } } /* Clear input buffer */ if ( (InitFlags == AACENC_INIT_ALL) ) { FDKmemclear(hAacEncoder->inputBuffer, sizeof(INT_PCM)*hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE); } if ( (InitFlags & AACENC_INIT_CONFIG) ) { aacBufferOffset = 0; if (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) { hAacEncoder->nDelay = DELAY_AACELD(hAacConfig->framelength); } else { hAacEncoder->nDelay = DELAY_AAC(hAacConfig->framelength); /* AAC encoder delay */ } hAacConfig->ancDataBitRate = 0; } if ( isSbrActive(hAacConfig) && ((InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES)) ) { INT sbrError; SBR_ELEMENT_INFO sbrElInfo[(8)]; CHANNEL_MAPPING channelMapping; if ( FDKaacEnc_InitChannelMapping(hAacConfig->channelMode, hAacConfig->channelOrder, &channelMapping) != AAC_ENC_OK ) { return AACENC_INIT_ERROR; } /* Check return value and if the SBR encoder can handle enough elements */ if (channelMapping.nElements > (8)) { return AACENC_INIT_ERROR; } aacEncDistributeSbrBits(&channelMapping, sbrElInfo, hAacConfig->bitRate); UINT initFlag = 0; initFlag += (InitFlags & AACENC_INIT_STATES) ? 1 : 0; /* Let the SBR encoder take a look at the configuration and change if required. */ sbrError = sbrEncoder_Init( *hSbrEncoder, sbrElInfo, channelMapping.nElements, hAacEncoder->inputBuffer, &hAacConfig->bandWidth, &aacBufferOffset, &hAacConfig->nChannels, &hAacConfig->sampleRate, &hAacConfig->sbrRatio, &frameLength, hAacConfig->audioObjectType, &hAacEncoder->nDelay, (hAacConfig->audioObjectType == AOT_ER_AAC_ELD) ? 1 : TRANS_FAC, (config->userTpHeaderPeriod!=0xFF) ? config->userTpHeaderPeriod : DEFAULT_HEADER_PERIOD_REPETITION_RATE, initFlag ); /* Suppress AOT reconfiguration and check error status. */ if (sbrError) { return AACENC_INIT_SBR_ERROR; } if (hAacConfig->nChannels == 1) { hAacConfig->channelMode = MODE_1; } /* Never use PNS if SBR is active */ if ( hAacConfig->usePns ) { hAacConfig->usePns = 0; } /* estimated bitrate consumed by SBR or PS */ hAacConfig->ancDataBitRate = sbrEncoder_GetEstimateBitrate(*hSbrEncoder) ; } /* sbr initialization */ /* * Initialize Transport - Module. */ if ( (InitFlags & AACENC_INIT_TRANSPORT) ) { UINT flags = 0; FDKaacEnc_MapConfig( &hAacEncoder->coderConfig, config, getSbrSignalingMode(hAacConfig->audioObjectType, config->userTpType, config->userTpSignaling, hAacConfig->sbrRatio), hAacConfig); /* create flags for transport encoder */ if (config->userTpAmxv == 1) { flags |= TP_FLAG_LATM_AMV; } /* Clear output buffer */ FDKmemclear(hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes*sizeof(UCHAR)); /* Initialize Bitstream encoder */ if ( transportEnc_Init(hAacEncoder->hTpEnc, hAacEncoder->outBuffer, hAacEncoder->outBufferInBytes, config->userTpType, &hAacEncoder->coderConfig, flags) != 0) { return AACENC_INIT_TP_ERROR; } } /* transport initialization */ /* * Initialize AAC - Core. */ if ( (InitFlags & AACENC_INIT_CONFIG) || (InitFlags & AACENC_INIT_STATES) ) { AAC_ENCODER_ERROR err; err = FDKaacEnc_Initialize(hAacEncoder->hAacEnc, hAacConfig, hAacEncoder->hTpEnc, (InitFlags & AACENC_INIT_STATES) ? 1 : 0); if (err != AAC_ENC_OK) { return AACENC_INIT_AAC_ERROR; } } /* aac initialization */ /* * Initialize Meta Data - Encoder. */ if ( hAacEncoder->hMetadataEnc && (hAacEncoder->metaDataAllowed!=0) && ((InitFlags & AACENC_INIT_CONFIG) ||(InitFlags & AACENC_INIT_STATES)) ) { INT inputDataDelay = DELAY_AAC(hAacConfig->framelength); if ( isSbrActive(hAacConfig) && hSbrEncoder!=NULL) { inputDataDelay = hAacConfig->sbrRatio*inputDataDelay + sbrEncoder_GetInputDataDelay(*hSbrEncoder); } if ( FDK_MetadataEnc_Init(hAacEncoder->hMetadataEnc, ((InitFlags&AACENC_INIT_STATES) ? 1 : 0), config->userMetaDataMode, inputDataDelay, frameLength, config->userSamplerate, config->nChannels, config->userChannelMode, hAacConfig->channelOrder) != 0) { return AACENC_INIT_META_ERROR; } hAacEncoder->nDelay += FDK_MetadataEnc_GetDelay(hAacEncoder->hMetadataEnc); } /* * Update pointer to working buffer. */ if ( (InitFlags & AACENC_INIT_CONFIG) ) { hAacEncoder->inputBufferOffset = aacBufferOffset; hAacEncoder->nSamplesToRead = frameLength * config->nChannels; /* Make nDelay comparison compatible with config->nSamplesRead */ hAacEncoder->nDelay *= config->nChannels; } /* parameter changed */ return AACENC_OK; } AACENC_ERROR aacEncOpen( HANDLE_AACENCODER *phAacEncoder, const UINT encModules, const UINT maxChannels ) { AACENC_ERROR err = AACENC_OK; HANDLE_AACENCODER hAacEncoder = NULL; if (phAacEncoder == NULL) { err = AACENC_INVALID_HANDLE; goto bail; } /* allocate memory */ hAacEncoder = Get_AacEncoder(); if (hAacEncoder == NULL) { err = AACENC_MEMORY_ERROR; goto bail; } FDKmemclear(hAacEncoder, sizeof(AACENCODER)); /* Specify encoder modules to be allocated. */ if (encModules==0) { hAacEncoder->encoder_modis = ENC_MODE_FLAG_AAC; hAacEncoder->encoder_modis |= ENC_MODE_FLAG_SBR; hAacEncoder->encoder_modis |= ENC_MODE_FLAG_PS; hAacEncoder->encoder_modis |= ENC_MODE_FLAG_META; } else { /* consider SAC and PS module */ hAacEncoder->encoder_modis = encModules; } /* Determine max channel configuration. */ if (maxChannels==0) { hAacEncoder->nMaxAacChannels = (8); hAacEncoder->nMaxSbrChannels = (8); } else { hAacEncoder->nMaxAacChannels = (maxChannels&0x00FF); if ( (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) ) { hAacEncoder->nMaxSbrChannels = (maxChannels&0xFF00) ? (maxChannels>>8) : hAacEncoder->nMaxAacChannels; } if ( (hAacEncoder->nMaxAacChannels>(8)) || (hAacEncoder->nMaxSbrChannels>(8)) ) { err = AACENC_INVALID_CONFIG; goto bail; } } /* maxChannels==0 */ /* Max number of elements could be tuned any more. */ hAacEncoder->nMaxAacElements = fixMin((8), hAacEncoder->nMaxAacChannels); hAacEncoder->nMaxSbrElements = fixMin((8), hAacEncoder->nMaxSbrChannels); hAacEncoder->nMaxSubFrames = (1); /* In case of memory overlay, allocate memory out of libraries */ hAacEncoder->inputBuffer = (INT_PCM*)FDKcalloc(hAacEncoder->nMaxAacChannels*INPUTBUFFER_SIZE, sizeof(INT_PCM)); /* Open SBR Encoder */ if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_SBR) { if ( sbrEncoder_Open(&hAacEncoder->hEnvEnc, hAacEncoder->nMaxSbrElements, hAacEncoder->nMaxSbrChannels, (hAacEncoder->encoder_modis&ENC_MODE_FLAG_PS) ? 1 : 0 ) ) { err = AACENC_MEMORY_ERROR; goto bail; } } /* (encoder_modis&ENC_MODE_FLAG_SBR) */ /* Open Aac Encoder */ if ( FDKaacEnc_Open(&hAacEncoder->hAacEnc, hAacEncoder->nMaxAacElements, hAacEncoder->nMaxAacChannels, (1)) != AAC_ENC_OK ) { err = AACENC_MEMORY_ERROR; goto bail; } { /* Get bitstream outputbuffer size */ UINT ld_M; for (ld_M=1; (UINT)(1<nMaxSubFrames*hAacEncoder->nMaxAacChannels*6144)>>3; ld_M++) ; hAacEncoder->outBufferInBytes = (1<outBuffer = GetRam_bsOutbuffer(); if (OUTPUTBUFFER_SIZE < hAacEncoder->outBufferInBytes ) { err = AACENC_MEMORY_ERROR; goto bail; } /* Open Meta Data Encoder */ if (hAacEncoder->encoder_modis&ENC_MODE_FLAG_META) { if ( FDK_MetadataEnc_Open(&hAacEncoder->hMetadataEnc) ) { err = AACENC_MEMORY_ERROR; goto bail; } } /* (encoder_modis&ENC_MODE_FLAG_META) */ /* Open Transport Encoder */ if ( transportEnc_Open(&hAacEncoder->hTpEnc) != 0 ) { err = AACENC_MEMORY_ERROR; goto bail; } else { C_ALLOC_SCRATCH_START(pLibInfo, LIB_INFO, FDK_MODULE_LAST); FDKinitLibInfo( pLibInfo); transportEnc_GetLibInfo( pLibInfo ); /* Get capabilty flag for transport encoder. */ hAacEncoder->CAPF_tpEnc = FDKlibInfo_getCapabilities( pLibInfo, FDK_TPENC); C_ALLOC_SCRATCH_END(pLibInfo, LIB_INFO, FDK_MODULE_LAST); } if ( transportEnc_RegisterSbrCallback(hAacEncoder->hTpEnc, aacenc_SbrCallback, hAacEncoder) != 0 ) { err = AACENC_INIT_TP_ERROR; goto bail; } /* Initialize encoder instance with default parameters. */ aacEncDefaultConfig(&hAacEncoder->aacConfig, &hAacEncoder->extParam); /* Initialize headerPeriod in coderConfig for aacEncoder_GetParam(). */ hAacEncoder->coderConfig.headerPeriod = hAacEncoder->extParam.userTpHeaderPeriod; /* All encoder modules have to be initialized */ hAacEncoder->InitFlags = AACENC_INIT_ALL; /* Return encoder instance */ *phAacEncoder = hAacEncoder; return err; bail: aacEncClose(&hAacEncoder); return err; } AACENC_ERROR aacEncClose(HANDLE_AACENCODER *phAacEncoder) { AACENC_ERROR err = AACENC_OK; if (phAacEncoder == NULL) { err = AACENC_INVALID_HANDLE; goto bail; } if (*phAacEncoder != NULL) { HANDLE_AACENCODER hAacEncoder = *phAacEncoder; if (hAacEncoder->inputBuffer!=NULL) { FDKfree(hAacEncoder->inputBuffer); hAacEncoder->inputBuffer = NULL; } if (hAacEncoder->outBuffer) { FreeRam_bsOutbuffer(&hAacEncoder->outBuffer); } if (hAacEncoder->hEnvEnc) { sbrEncoder_Close (&hAacEncoder->hEnvEnc); } if (hAacEncoder->hAacEnc) { FDKaacEnc_Close (&hAacEncoder->hAacEnc); } transportEnc_Close(&hAacEncoder->hTpEnc); if (hAacEncoder->hMetadataEnc) { FDK_MetadataEnc_Close (&hAacEncoder->hMetadataEnc); } Free_AacEncoder(phAacEncoder); } bail: return err; } AACENC_ERROR aacEncEncode( const HANDLE_AACENCODER hAacEncoder, const AACENC_BufDesc *inBufDesc, const AACENC_BufDesc *outBufDesc, const AACENC_InArgs *inargs, AACENC_OutArgs *outargs ) { AACENC_ERROR err = AACENC_OK; INT i, nBsBytes = 0; INT outBytes[(1)]; int nExtensions = 0; int ancDataExtIdx = -1; /* deal with valid encoder handle */ if (hAacEncoder==NULL) { err = AACENC_INVALID_HANDLE; goto bail; } /* * Adjust user settings and trigger reinitialization. */ if (hAacEncoder->InitFlags!=0) { err = aacEncInit(hAacEncoder, hAacEncoder->InitFlags, &hAacEncoder->extParam); if (err!=AACENC_OK) { /* keep init flags alive! */ goto bail; } hAacEncoder->InitFlags = AACENC_INIT_NONE; } if (outargs!=NULL) { FDKmemclear(outargs, sizeof(AACENC_OutArgs)); } if (outBufDesc!=NULL) { for (i=0; inumBufs; i++) { if (outBufDesc->bufs[i]!=NULL) { FDKmemclear(outBufDesc->bufs[i], outBufDesc->bufSizes[i]); } } } /* * If only encoder handle given, independent (re)initialization can be triggered. */ if ( (hAacEncoder!=NULL) & (inBufDesc==NULL) && (outBufDesc==NULL) && (inargs==NULL) && (outargs==NULL) ) { goto bail; } /* reset buffer wich signals number of valid bytes in output bitstream buffer */ FDKmemclear(outBytes, hAacEncoder->aacConfig.nSubFrames*sizeof(INT)); /* * Manage incoming audio samples. */ if ( (inargs->numInSamples > 0) && (getBufDescIdx(inBufDesc,IN_AUDIO_DATA) != -1) ) { /* Fetch data until nSamplesToRead reached */ INT idx = getBufDescIdx(inBufDesc,IN_AUDIO_DATA); INT newSamples = fixMax(0,fixMin(inargs->numInSamples, hAacEncoder->nSamplesToRead-hAacEncoder->nSamplesRead)); INT_PCM *pIn = hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead; /* Copy new input samples to internal buffer */ if (inBufDesc->bufElSizes[idx]==(INT)sizeof(INT_PCM)) { FDKmemcpy(pIn, (INT_PCM*)inBufDesc->bufs[idx], newSamples*sizeof(INT_PCM)); /* Fast copy. */ } else if (inBufDesc->bufElSizes[idx]>(INT)sizeof(INT_PCM)) { for (i=0; ibufs[idx])[i]>>16); /* Convert 32 to 16 bit. */ } } else { for (i=0; ibufs[idx])[i]))<<16; /* Convert 16 to 32 bit. */ } } hAacEncoder->nSamplesRead += newSamples; /* Number of fetched input buffer samples. */ outargs->numInSamples = newSamples; } /* input buffer completely filled ? */ if (hAacEncoder->nSamplesRead < hAacEncoder->nSamplesToRead) { /* - eof reached and flushing enabled, or - return to main and wait for further incoming audio samples */ if (inargs->numInSamples==-1) { if ( (hAacEncoder->nZerosAppended < hAacEncoder->nDelay) ) { int nZeros = hAacEncoder->nSamplesToRead - hAacEncoder->nSamplesRead; FDK_ASSERT(nZeros >= 0); /* clear out until end-of-buffer */ if (nZeros) { FDKmemclear(hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset+hAacEncoder->nSamplesRead, sizeof(INT_PCM)*nZeros ); hAacEncoder->nZerosAppended += nZeros; hAacEncoder->nSamplesRead = hAacEncoder->nSamplesToRead; } } else { /* flushing completed */ err = AACENC_ENCODE_EOF; /* eof reached */ goto bail; } } else { /* inargs->numInSamples!= -1 */ goto bail; /* not enough samples in input buffer and no flushing enabled */ } } /* init payload */ FDKmemclear(hAacEncoder->extPayload, sizeof(AACENC_EXT_PAYLOAD) * MAX_TOTAL_EXT_PAYLOADS); for (i = 0; i < MAX_TOTAL_EXT_PAYLOADS; i++) { hAacEncoder->extPayload[i].associatedChElement = -1; } FDKmemclear(hAacEncoder->extPayloadData, sizeof(hAacEncoder->extPayloadData)); FDKmemclear(hAacEncoder->extPayloadSize, sizeof(hAacEncoder->extPayloadSize)); /* * Calculate Meta Data info. */ if ( (hAacEncoder->hMetadataEnc!=NULL) && (hAacEncoder->metaDataAllowed!=0) ) { const AACENC_MetaData *pMetaData = NULL; AACENC_EXT_PAYLOAD *pMetaDataExtPayload = NULL; UINT nMetaDataExtensions = 0; INT matrix_mixdown_idx = 0; /* New meta data info available ? */ if ( getBufDescIdx(inBufDesc,IN_METADATA_SETUP) != -1 ) { pMetaData = (AACENC_MetaData*)inBufDesc->bufs[getBufDescIdx(inBufDesc,IN_METADATA_SETUP)]; } FDK_MetadataEnc_Process(hAacEncoder->hMetadataEnc, hAacEncoder->inputBuffer+hAacEncoder->inputBufferOffset, hAacEncoder->nSamplesRead, pMetaData, &pMetaDataExtPayload, &nMetaDataExtensions, &matrix_mixdown_idx ); for (i=0; i<(INT)nMetaDataExtensions; i++) { /* Get meta data extension payload. */ hAacEncoder->extPayload[nExtensions++] = pMetaDataExtPayload[i]; } if ( (matrix_mixdown_idx!=-1) && ((hAacEncoder->extParam.userChannelMode==MODE_1_2_2)||(hAacEncoder->extParam.userChannelMode==MODE_1_2_2_1)) ) { /* Set matrix mixdown coefficient. */ UINT pceValue = (UINT)( (1<<3) | ((matrix_mixdown_idx&0x3)<<1) | 1 ); if (hAacEncoder->extParam.userPceAdditions != pceValue) { hAacEncoder->extParam.userPceAdditions = pceValue; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } } } if ( isSbrActive(&hAacEncoder->aacConfig) ) { INT nPayload = 0; /* * Encode SBR data. */ if (sbrEncoder_EncodeFrame(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer, hAacEncoder->extParam.nChannels, hAacEncoder->extPayloadSize[nPayload], hAacEncoder->extPayloadData[nPayload] #if defined(EVAL_PACKAGE_SILENCE) || defined(EVAL_PACKAGE_SBR_SILENCE) ,hAacEncoder->hAacEnc->clearOutput #endif )) { err = AACENC_ENCODE_ERROR; goto bail; } else { /* Add SBR extension payload */ for (i = 0; i < (8); i++) { if (hAacEncoder->extPayloadSize[nPayload][i] > 0) { hAacEncoder->extPayload[nExtensions].pData = hAacEncoder->extPayloadData[nPayload][i]; { hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->extPayloadSize[nPayload][i]; hAacEncoder->extPayload[nExtensions].associatedChElement = i; } hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set EXT_SBR_DATA_CRC */ nExtensions++; /* or EXT_SBR_DATA according to configuration. */ FDK_ASSERT(nExtensions<=MAX_TOTAL_EXT_PAYLOADS); } } nPayload++; } } /* sbrEnabled */ if ( (inargs->numAncBytes > 0) && ( getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA)!=-1 ) ) { INT idx = getBufDescIdx(inBufDesc,IN_ANCILLRY_DATA); hAacEncoder->extPayload[nExtensions].dataSize = inargs->numAncBytes * 8; hAacEncoder->extPayload[nExtensions].pData = (UCHAR*)inBufDesc->bufs[idx]; hAacEncoder->extPayload[nExtensions].dataType = EXT_DATA_ELEMENT; hAacEncoder->extPayload[nExtensions].associatedChElement = -1; ancDataExtIdx = nExtensions; /* store index */ nExtensions++; } /* * Encode AAC - Core. */ if ( FDKaacEnc_EncodeFrame( hAacEncoder->hAacEnc, hAacEncoder->hTpEnc, hAacEncoder->inputBuffer, outBytes, hAacEncoder->extPayload ) != AAC_ENC_OK ) { err = AACENC_ENCODE_ERROR; goto bail; } if (ancDataExtIdx >= 0) { outargs->numAncBytes = inargs->numAncBytes - (hAacEncoder->extPayload[ancDataExtIdx].dataSize>>3); } /* samples exhausted */ hAacEncoder->nSamplesRead -= hAacEncoder->nSamplesToRead; /* * Delay balancing buffer handling */ if (isSbrActive(&hAacEncoder->aacConfig)) { sbrEncoder_UpdateBuffers(hAacEncoder->hEnvEnc, hAacEncoder->inputBuffer); } /* * Make bitstream public */ if (outBufDesc->numBufs>=1) { INT bsIdx = getBufDescIdx(outBufDesc,OUT_BITSTREAM_DATA); INT auIdx = getBufDescIdx(outBufDesc,OUT_AU_SIZES); for (i=0,nBsBytes=0; iaacConfig.nSubFrames; i++) { nBsBytes += outBytes[i]; if (auIdx!=-1) { ((INT*)outBufDesc->bufs[auIdx])[i] = outBytes[i]; } } if ( (bsIdx!=-1) && (outBufDesc->bufSizes[bsIdx]>=nBsBytes) ) { FDKmemcpy(outBufDesc->bufs[bsIdx], hAacEncoder->outBuffer, sizeof(UCHAR)*nBsBytes); outargs->numOutBytes = nBsBytes; } else { /* output buffer too small, can't write valid bitstream */ err = AACENC_ENCODE_ERROR; goto bail; } } bail: if (err == AACENC_ENCODE_ERROR) { /* All encoder modules have to be initialized */ hAacEncoder->InitFlags = AACENC_INIT_ALL; } return err; } static AAC_ENCODER_ERROR aacEncGetConf(HANDLE_AACENCODER hAacEncoder, UINT *size, UCHAR *confBuffer) { FDK_BITSTREAM tmpConf; UINT confType; UCHAR buf[64]; int err; /* Init bit buffer */ FDKinitBitStream(&tmpConf, buf, 64, 0, BS_WRITER); /* write conf in tmp buffer */ err = transportEnc_GetConf(hAacEncoder->hTpEnc, &hAacEncoder->coderConfig, &tmpConf, &confType); /* copy data to outbuffer: length in bytes */ FDKbyteAlign(&tmpConf, 0); /* Check buffer size */ if (FDKgetValidBits(&tmpConf) > ((*size)<<3)) return AAC_ENC_UNKNOWN; FDKfetchBuffer(&tmpConf, confBuffer, size); if (err != 0) return AAC_ENC_UNKNOWN; else return AAC_ENC_OK; } AACENC_ERROR aacEncGetLibInfo(LIB_INFO *info) { int i = 0; if (info == NULL) { return AACENC_INVALID_HANDLE; } FDK_toolsGetLibInfo( info ); transportEnc_GetLibInfo( info ); sbrEncoder_GetLibInfo( info ); /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) { return AACENC_INIT_ERROR; } info[i].module_id = FDK_AACENC; info[i].build_date = (char*)AACENCODER_LIB_BUILD_DATE; info[i].build_time = (char*)AACENCODER_LIB_BUILD_TIME; info[i].title = (char*)AACENCODER_LIB_TITLE; info[i].version = LIB_VERSION(AACENCODER_LIB_VL0, AACENCODER_LIB_VL1, AACENCODER_LIB_VL2);; LIB_VERSION_STRING(&info[i]); /* Capability flags */ info[i].flags = 0 | CAPF_AAC_1024 | CAPF_AAC_LC | CAPF_AAC_512 | CAPF_AAC_480 | CAPF_AAC_DRC ; /* End of flags */ return AACENC_OK; } AACENC_ERROR aacEncoder_SetParam( const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param, const UINT value ) { AACENC_ERROR err = AACENC_OK; USER_PARAM *settings = &hAacEncoder->extParam; /* check encoder handle */ if (hAacEncoder == NULL) { err = AACENC_INVALID_HANDLE; goto bail; } /* apply param value */ switch (param) { case AACENC_AOT: if (settings->userAOT != (AUDIO_OBJECT_TYPE)value) { /* check if AOT matches the allocated modules */ switch ( value ) { case AOT_PS: case AOT_MP2_PS: if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_PS))) { err = AACENC_INVALID_CONFIG; goto bail; } case AOT_SBR: case AOT_MP2_SBR: if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_SBR))) { err = AACENC_INVALID_CONFIG; goto bail; } case AOT_AAC_LC: case AOT_MP2_AAC_LC: case AOT_ER_AAC_LD: case AOT_ER_AAC_ELD: if (!(hAacEncoder->encoder_modis & (ENC_MODE_FLAG_AAC))) { err = AACENC_INVALID_CONFIG; goto bail; } break; default: err = AACENC_INVALID_CONFIG; goto bail; }/* switch value */ settings->userAOT = (AUDIO_OBJECT_TYPE)value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; } break; case AACENC_BITRATE: if (settings->userBitrate != value) { settings->userBitrate = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; } break; case AACENC_BITRATEMODE: if (settings->userBitrateMode != value) { switch ( value ) { case 0: case 1: case 2: case 3: case 4: case 5: case 8: settings->userBitrateMode = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; break; default: err = AACENC_INVALID_CONFIG; break; } /* switch value */ } break; case AACENC_SAMPLERATE: if (settings->userSamplerate != value) { if ( !( (value==8000) || (value==11025) || (value==12000) || (value==16000) || (value==22050) || (value==24000) || (value==32000) || (value==44100) || (value==48000) || (value==64000) || (value==88200) || (value==96000) ) ) { err = AACENC_INVALID_CONFIG; break; } settings->userSamplerate = value; hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; } break; case AACENC_CHANNELMODE: if (settings->userChannelMode != (CHANNEL_MODE)value) { const CHANNEL_MODE_CONFIG_TAB* pConfig = FDKaacEnc_GetChannelModeConfiguration((CHANNEL_MODE)value); if (pConfig==NULL) { err = AACENC_INVALID_CONFIG; break; } if ( (pConfig->nElements > hAacEncoder->nMaxAacElements) || (pConfig->nChannelsEff > hAacEncoder->nMaxAacChannels) || !(((value>=1) && (value<=7))||((value>=33) && (value<=34))) ) { err = AACENC_INVALID_CONFIG; break; } settings->userChannelMode = (CHANNEL_MODE)value; settings->nChannels = pConfig->nChannels; hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; } break; case AACENC_BANDWIDTH: if (settings->userBandwidth != value) { settings->userBandwidth = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; } break; case AACENC_CHANNELORDER: if (hAacEncoder->aacConfig.channelOrder != (CHANNEL_ORDER)value) { if (! ((value==0) || (value==1) || (value==2)) ) { err = AACENC_INVALID_CONFIG; break; } hAacEncoder->aacConfig.channelOrder = (CHANNEL_ORDER)value; hAacEncoder->nSamplesRead = 0; /* reset internal inputbuffer */ hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; } break; case AACENC_AFTERBURNER: if (settings->userAfterburner != value) { if (! ((value==0) || (value==1)) ) { err = AACENC_INVALID_CONFIG; break; } settings->userAfterburner = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; } break; case AACENC_GRANULE_LENGTH: if (settings->userFramelength != value) { switch (value) { case 1024: case 512: case 480: settings->userFramelength = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_TRANSPORT; break; default: err = AACENC_INVALID_CONFIG; break; } } break; case AACENC_SBR_RATIO: if (settings->userSbrRatio != value) { if (! ((value==0) || (value==1) || (value==2)) ) { err = AACENC_INVALID_CONFIG; break; } settings->userSbrRatio = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; } break; case AACENC_SBR_MODE: if (settings->userSbrEnabled != value) { settings->userSbrEnabled = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG | AACENC_INIT_STATES | AACENC_INIT_TRANSPORT; } break; case AACENC_TRANSMUX: if (settings->userTpType != (TRANSPORT_TYPE)value) { TRANSPORT_TYPE type = (TRANSPORT_TYPE)value; UINT flags = hAacEncoder->CAPF_tpEnc; if ( !( ((type==TT_MP4_ADIF) && (flags&CAPF_ADIF)) || ((type==TT_MP4_ADTS) && (flags&CAPF_ADTS)) || ((type==TT_MP4_LATM_MCP0) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS))) || ((type==TT_MP4_LATM_MCP1) && ((flags&CAPF_LATM) && (flags&CAPF_RAWPACKETS))) || ((type==TT_MP4_LOAS) && (flags&CAPF_LOAS)) || ((type==TT_MP4_RAW) && (flags&CAPF_RAWPACKETS)) ) ) { err = AACENC_INVALID_CONFIG; break; } settings->userTpType = (TRANSPORT_TYPE)value; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } break; case AACENC_SIGNALING_MODE: if (settings->userTpSignaling != value) { if ( !((value==0) || (value==1) || (value==2)) ) { err = AACENC_INVALID_CONFIG; break; } settings->userTpSignaling = value; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } break; case AACENC_PROTECTION: if (settings->userTpProtection != value) { if ( !((value==0) || (value==1)) ) { err = AACENC_INVALID_CONFIG; break; } settings->userTpProtection = value; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } break; case AACENC_HEADER_PERIOD: if (settings->userTpHeaderPeriod != value) { settings->userTpHeaderPeriod = value; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } break; case AACENC_TPSUBFRAMES: if (settings->userTpNsubFrames != value) { if (! ( (value>=1) && (value<=4) ) ) { err = AACENC_INVALID_CONFIG; break; } settings->userTpNsubFrames = value; hAacEncoder->InitFlags |= AACENC_INIT_TRANSPORT; } break; case AACENC_ANCILLARY_BITRATE: if (settings->userAncDataRate != value) { settings->userAncDataRate = value; } break; case AACENC_CONTROL_STATE: if (hAacEncoder->InitFlags != value) { if (value&AACENC_RESET_INBUFFER) { hAacEncoder->nSamplesRead = 0; } hAacEncoder->InitFlags = value; } break; case AACENC_METADATA_MODE: if ((UINT)settings->userMetaDataMode != value) { if ( !((value>=0) && (value<=2)) ) { err = AACENC_INVALID_CONFIG; break; } settings->userMetaDataMode = value; hAacEncoder->InitFlags |= AACENC_INIT_CONFIG; } break; default: err = AACENC_UNSUPPORTED_PARAMETER; break; } /* switch(param) */ bail: return err; } UINT aacEncoder_GetParam( const HANDLE_AACENCODER hAacEncoder, const AACENC_PARAM param ) { UINT value = 0; USER_PARAM *settings = &hAacEncoder->extParam; /* check encoder handle */ if (hAacEncoder == NULL) { goto bail; } /* apply param value */ switch (param) { case AACENC_AOT: value = (UINT)hAacEncoder->aacConfig.audioObjectType; break; case AACENC_BITRATE: value = (UINT)((hAacEncoder->aacConfig.bitrateMode==AACENC_BR_MODE_CBR) ? hAacEncoder->aacConfig.bitRate : -1); break; case AACENC_BITRATEMODE: value = (UINT)hAacEncoder->aacConfig.bitrateMode; break; case AACENC_SAMPLERATE: value = (UINT)hAacEncoder->coderConfig.extSamplingRate; break; case AACENC_CHANNELMODE: value = (UINT)hAacEncoder->aacConfig.channelMode; break; case AACENC_BANDWIDTH: value = (UINT)hAacEncoder->aacConfig.bandWidth; break; case AACENC_CHANNELORDER: value = (UINT)hAacEncoder->aacConfig.channelOrder; break; case AACENC_AFTERBURNER: value = (UINT)hAacEncoder->aacConfig.useRequant; break; case AACENC_GRANULE_LENGTH: value = (UINT)hAacEncoder->aacConfig.framelength; break; case AACENC_SBR_RATIO: value = isSbrActive(&hAacEncoder->aacConfig) ? hAacEncoder->aacConfig.sbrRatio : 0; break; case AACENC_SBR_MODE: value = (UINT) (hAacEncoder->aacConfig.syntaxFlags & AC_SBR_PRESENT) ? 1 : 0; break; case AACENC_TRANSMUX: value = (UINT)settings->userTpType; break; case AACENC_SIGNALING_MODE: value = (UINT)getSbrSignalingMode(hAacEncoder->aacConfig.audioObjectType, settings->userTpType, settings->userTpSignaling, hAacEncoder->aacConfig.sbrRatio); break; case AACENC_PROTECTION: value = (UINT)settings->userTpProtection; break; case AACENC_HEADER_PERIOD: value = (UINT)hAacEncoder->coderConfig.headerPeriod; break; case AACENC_TPSUBFRAMES: value = (UINT)settings->userTpNsubFrames; break; case AACENC_ANCILLARY_BITRATE: value = (UINT)hAacEncoder->aacConfig.anc_Rate; break; case AACENC_CONTROL_STATE: value = (UINT)hAacEncoder->InitFlags; break; case AACENC_METADATA_MODE: value = (hAacEncoder->metaDataAllowed==0) ? 0 : (UINT)settings->userMetaDataMode; break; default: //err = MPS_INVALID_PARAMETER; break; } /* switch(param) */ bail: return value; } AACENC_ERROR aacEncInfo( const HANDLE_AACENCODER hAacEncoder, AACENC_InfoStruct *pInfo ) { AACENC_ERROR err = AACENC_OK; FDKmemclear(pInfo, sizeof(AACENC_InfoStruct)); pInfo->confSize = 64; /* pre-initialize */ pInfo->maxOutBufBytes = ((hAacEncoder->nMaxAacChannels*6144)+7)>>3; pInfo->maxAncBytes = hAacEncoder->aacConfig.maxAncBytesPerAU; pInfo->inBufFillLevel = hAacEncoder->nSamplesRead/hAacEncoder->extParam.nChannels; pInfo->inputChannels = hAacEncoder->extParam.nChannels; pInfo->frameLength = hAacEncoder->nSamplesToRead/hAacEncoder->extParam.nChannels; pInfo->encoderDelay = hAacEncoder->nDelay/hAacEncoder->extParam.nChannels; /* Get encoder configuration */ if ( aacEncGetConf(hAacEncoder, &pInfo->confSize, &pInfo->confBuf[0]) != AAC_ENC_OK) { err = AACENC_INIT_ERROR; goto bail; } bail: return err; } fdk-aac-0.1.3/libAACenc/src/block_switch.h0000644000175000017500000001556612372261464020603 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): M. Werner Description: Block switching ******************************************************************************/ #ifndef _BLOCK_SWITCH_H #define _BLOCK_SWITCH_H #include "common_fix.h" #include "psy_const.h" /****************** Defines ******************************/ #define BLOCK_SWITCH_WINDOWS 8 /* number of windows for energy calculation */ #define BLOCK_SWITCHING_IIR_LEN 2 /* Length of HighPass-IIR-Filter for Attack-Detection */ #define BLOCK_SWITCH_ENERGY_SHIFT 7 /* should be logDualis(BLOCK_SWITCH_WINDOW_LEN) to avoid overflow in windowNrgs. */ #define LAST_WINDOW 0 #define THIS_WINDOW 1 /****************** Structures ***************************/ typedef struct{ INT lastWindowSequence; INT windowShape; INT lastWindowShape; UINT nBlockSwitchWindows; /* number of windows for energy calculation */ INT attack; INT lastattack; INT attackIndex; INT lastAttackIndex; INT allowShortFrames; /* for Low Delay, don't allow short frames */ INT allowLookAhead; /* for Low Delay, don't do look-ahead */ INT noOfGroups; INT groupLen[MAX_NO_OF_GROUPS]; FIXP_DBL maxWindowNrg; /* max energy in subwindows */ FIXP_DBL windowNrg[2][BLOCK_SWITCH_WINDOWS]; /* time signal energy in Subwindows (last and current) */ FIXP_DBL windowNrgF[2][BLOCK_SWITCH_WINDOWS]; /* filtered time signal energy in segments (last and current) */ FIXP_DBL accWindowNrg; /* recursively accumulated windowNrgF */ FIXP_DBL iirStates[BLOCK_SWITCHING_IIR_LEN]; /* filter delay-line */ } BLOCK_SWITCHING_CONTROL; void FDKaacEnc_InitBlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, INT isLowDelay); int FDKaacEnc_BlockSwitching(BLOCK_SWITCHING_CONTROL *blockSwitchingControl, const INT granuleLength, const int isLFE, const INT_PCM *pTimeSignal); int FDKaacEnc_SyncBlockSwitching( BLOCK_SWITCHING_CONTROL *blockSwitchingControlLeft, BLOCK_SWITCHING_CONTROL *blockSwitchingControlRight, const INT noOfChannels, const INT commonWindow); #endif /* #ifndef _BLOCK_SWITCH_H */ fdk-aac-0.1.3/libAACenc/src/channel_map.h0000644000175000017500000001374312372261464020370 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: A. Groeschel contents/description: channel mapping functionality ******************************************************************************/ #ifndef _CHANNEL_MAP_H #define _CHANNEL_MAP_H #include "aacenc.h" #include "psy_const.h" #include "qc_data.h" typedef struct { CHANNEL_MODE encMode; INT nChannels; INT nChannelsEff; INT nElements; } CHANNEL_MODE_CONFIG_TAB; /* Element mode */ typedef enum { EL_MODE_INVALID = 0, EL_MODE_MONO, EL_MODE_STEREO } ELEMENT_MODE; AAC_ENCODER_ERROR FDKaacEnc_DetermineEncoderMode(CHANNEL_MODE* mode, INT nChannels); AAC_ENCODER_ERROR FDKaacEnc_InitChannelMapping(CHANNEL_MODE mode, CHANNEL_ORDER co, CHANNEL_MAPPING* chMap); AAC_ENCODER_ERROR FDKaacEnc_InitElementBits(QC_STATE *hQC, CHANNEL_MAPPING *cm, INT bitrateTot, INT averageBitsTot, INT maxChannelBits); ELEMENT_MODE FDKaacEnc_GetMonoStereoMode(const CHANNEL_MODE mode); const CHANNEL_MODE_CONFIG_TAB* FDKaacEnc_GetChannelModeConfiguration(const CHANNEL_MODE mode); #endif /* CHANNEL_MAP_H */ fdk-aac-0.1.3/libAACenc/src/channel_map.cpp0000644000175000017500000006061312372261464020721 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: A. Groeschel contents/description: channel mapping functionality ******************************************************************************/ #include "channel_map.h" #include "bitenc.h" #include "psy_const.h" #include "qc_data.h" #include "aacEnc_ram.h" /* channel_assignment treats the relationship of Input file channels to the encoder channels. This is necessary because the usual order in RIFF files (.wav) is different from the elements order in the coder given by Table 8.1 (implicit speaker mapping) of the AAC standard. In mono and stereo case, this is trivial. In mc case, it looks like this: Channel Input file coder chan 5ch: front center 2 0 (SCE channel) left center 0 1 (1st of 1st CPE) right center 1 2 (2nd of 1st CPE) left surround 3 3 (1st of 2nd CPE) right surround 4 4 (2nd of 2nd CPE) 5.1ch: front center 2 0 (SCE channel) left center 0 1 (1st of 1st CPE) right center 1 2 (2nd of 1st CPE) left surround 4 3 (1st of 2nd CPE) right surround 5 4 (2nd of 2nd CPE) LFE 3 5 (LFE) */ typedef struct { CHANNEL_MODE encoderMode; INT channel_assignment[/*(8)*/12]; } CHANNEL_ASSIGNMENT_INFO_TAB; static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabMpeg[] = { { MODE_INVALID, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* invalid */ { MODE_1, { 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* mono */ { MODE_2, { 0, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* stereo */ { MODE_1_2, { 0, 1, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 3ch */ { MODE_1_2_1, { 0, 1, 2, 3,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 4ch */ { MODE_1_2_2, { 0, 1, 2, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */ { MODE_1_2_2_1, { 0, 1, 2, 3, 4, 5,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */ { MODE_1_2_2_2_1, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} }, /* 7.1ch */ { MODE_7_1_REAR_SURROUND, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} }, /* 7.1ch */ { MODE_7_1_FRONT_CENTER, { 0, 1, 2, 3, 4, 5, 6, 7,-1,-1,-1,-1} } /* 7.1ch */ }; static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWav[] = { { MODE_INVALID, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* invalid */ { MODE_1, { 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* mono */ { MODE_2, { 0, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* stereo */ { MODE_1_2, { 2, 0, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 3ch */ { MODE_1_2_1, { 2, 0, 1, 3,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 4ch */ { MODE_1_2_2, { 2, 0, 1, 3, 4,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */ { MODE_1_2_2_1, { 2, 0, 1, 4, 5, 3,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */ { MODE_1_2_2_2_1, { 2, 6, 7, 0, 1, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */ { MODE_7_1_REAR_SURROUND, { 2, 0, 1, 6, 7, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */ { MODE_7_1_FRONT_CENTER, { 2, 6, 7, 0, 1, 4, 5, 3,-1,-1,-1,-1} }, /* 7.1ch */ }; static const CHANNEL_ASSIGNMENT_INFO_TAB assignmentInfoTabWg4[] = { { MODE_INVALID, {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* invalid */ { MODE_1, { 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* mono */ { MODE_2, { 0, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* stereo */ { MODE_1_2, { 2, 0, 1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 3ch */ { MODE_1_2_1, { 3, 0, 1, 2,-1,-1,-1,-1,-1,-1,-1,-1} }, /* 4ch */ { MODE_1_2_2, { 4, 0, 1, 2, 3,-1,-1,-1,-1,-1,-1,-1} }, /* 5ch */ { MODE_1_2_2_1, { 4, 0, 1, 2, 3, 5,-1,-1,-1,-1,-1,-1} }, /* 5.1ch */ { MODE_1_2_2_2_1, { 6, 0, 1, 2, 3, 4, 5, 7,-1,-1,-1,-1} }, /* 7.1ch */ }; /* Channel mode configuration tab provides, corresponding number of channels and elements */ static const CHANNEL_MODE_CONFIG_TAB channelModeConfig[] = { { MODE_1, 1, 1, 1 }, /* SCE */ { MODE_2, 2, 2, 1 }, /* CPE */ { MODE_1_2, 3, 3, 2 }, /* SCE,CPE */ { MODE_1_2_1, 4, 4, 3 }, /* SCE,CPE,SCE */ { MODE_1_2_2, 5, 5, 3 }, /* SCE,CPE,CPE */ { MODE_1_2_2_1, 6, 5, 4 }, /* SCE,CPE,CPE,LFE */ { MODE_1_2_2_2_1, 8, 7, 5 }, /* SCE,CPE,CPE,CPE,LFE */ { MODE_7_1_REAR_SURROUND, 8, 7, 5 }, { MODE_7_1_FRONT_CENTER, 8, 7, 5 }, }; #define MAX_MODES (sizeof(assignmentInfoTabWav)/sizeof(CHANNEL_ASSIGNMENT_INFO_TAB)) const INT* FDKaacEnc_getChannelAssignment(CHANNEL_MODE encMode, CHANNEL_ORDER co) { const CHANNEL_ASSIGNMENT_INFO_TAB *pTab; int i; if (co == CH_ORDER_MPEG) pTab = assignmentInfoTabMpeg; else if (co == CH_ORDER_WAV) pTab = assignmentInfoTabWav; else pTab = assignmentInfoTabWg4; for(i=MAX_MODES-1; i>0; i--) { if (encMode== pTab[i].encoderMode) { break; } } return (pTab[i].channel_assignment); } AAC_ENCODER_ERROR FDKaacEnc_DetermineEncoderMode(CHANNEL_MODE* mode, INT nChannels) { INT i; CHANNEL_MODE encMode = MODE_INVALID; if (*mode==MODE_UNKNOWN) { for (i=0; i<(INT)sizeof(channelModeConfig)/(INT)sizeof(CHANNEL_MODE_CONFIG_TAB); i++) { if (channelModeConfig[i].nChannels==nChannels) { encMode = channelModeConfig[i].encMode; break; } } *mode = encMode; } else { /* check if valid channel configuration */ if (FDKaacEnc_GetChannelModeConfiguration(*mode)->nChannels==nChannels) { encMode = *mode; } } if (encMode==MODE_INVALID) { return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; } return AAC_ENC_OK; } static INT FDKaacEnc_initElement (ELEMENT_INFO* elInfo, MP4_ELEMENT_ID elType, INT* cnt, CHANNEL_MODE mode, CHANNEL_ORDER co, INT* it_cnt, const FIXP_DBL relBits) { INT error=0; INT counter =*cnt; const INT *assign = FDKaacEnc_getChannelAssignment(mode, co); elInfo->elType=elType; elInfo->relativeBits = relBits; switch(elInfo->elType) { case ID_SCE: case ID_LFE: case ID_CCE: elInfo->nChannelsInEl=1; elInfo->ChannelIndex[0]=assign[counter++]; elInfo->instanceTag=it_cnt[elType]++; break; case ID_CPE: elInfo->nChannelsInEl=2; elInfo->ChannelIndex[0]=assign[counter++]; elInfo->ChannelIndex[1]=assign[counter++]; elInfo->instanceTag=it_cnt[elType]++; break; case ID_DSE: elInfo->nChannelsInEl=0; elInfo->ChannelIndex[0]=0; elInfo->ChannelIndex[1]=0; elInfo->instanceTag=it_cnt[elType]++; break; default: error=1; }; *cnt = counter; return error; } AAC_ENCODER_ERROR FDKaacEnc_InitChannelMapping(CHANNEL_MODE mode, CHANNEL_ORDER co, CHANNEL_MAPPING* cm) { INT count=0; /* count through coder channels */ INT it_cnt[ID_END+1]; INT i; for (i=0; iencMode = channelModeConfig[i].encMode; cm->nChannels = channelModeConfig[i].nChannels; cm->nChannelsEff = channelModeConfig[i].nChannelsEff; cm->nElements = channelModeConfig[i].nElements; break; } } /* init element info struct */ switch(mode) { case MODE_1: /* (mono) sce */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, (FIXP_DBL)MAXVAL_DBL); break; case MODE_2: /* (stereo) cpe */ FDKaacEnc_initElement(&cm->elInfo[0], ID_CPE, &count, mode, co, it_cnt, (FIXP_DBL)MAXVAL_DBL); break; case MODE_1_2: /* sce + cpe */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.4f)); FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.6f)); break; case MODE_1_2_1: /* sce + cpe + sce */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.3f)); FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.4f)); FDKaacEnc_initElement(&cm->elInfo[2], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.3f)); break; case MODE_1_2_2: /* sce + cpe + cpe */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.37f)); FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.37f)); break; case MODE_1_2_2_1: /* (5.1) sce + cpe + cpe + lfe */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.24f)); FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.35f)); FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.35f)); FDKaacEnc_initElement(&cm->elInfo[3], ID_LFE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.06f)); break; case MODE_1_2_2_2_1: case MODE_7_1_REAR_SURROUND: case MODE_7_1_FRONT_CENTER: /* (7.1) sce + cpe + cpe + cpe + lfe */ FDKaacEnc_initElement(&cm->elInfo[0], ID_SCE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.18f)); FDKaacEnc_initElement(&cm->elInfo[1], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); FDKaacEnc_initElement(&cm->elInfo[2], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); FDKaacEnc_initElement(&cm->elInfo[3], ID_CPE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.26f)); FDKaacEnc_initElement(&cm->elInfo[4], ID_LFE, &count, mode, co, it_cnt, FL2FXCONST_DBL(0.04f)); break; default: //*chMap=0; return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; }; FDK_ASSERT(cm->nElements<=(8)); return AAC_ENC_OK; } AAC_ENCODER_ERROR FDKaacEnc_InitElementBits(QC_STATE *hQC, CHANNEL_MAPPING *cm, INT bitrateTot, INT averageBitsTot, INT maxChannelBits) { int sc_brTot = CountLeadingBits(bitrateTot); switch(cm->encMode) { case MODE_1: hQC->elementBits[0]->chBitrateEl = bitrateTot; hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; break; case MODE_2: hQC->elementBits[0]->chBitrateEl = bitrateTot>>1; hQC->elementBits[0]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; break; case MODE_1_2: { hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; FIXP_DBL sceRate = cm->elInfo[0].relativeBits; FIXP_DBL cpeRate = cm->elInfo[1].relativeBits; hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[1]->chBitrateEl = fMult(cpeRate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; break; } case MODE_1_2_1: { /* sce + cpe + sce */ hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; FIXP_DBL sce1Rate = cm->elInfo[0].relativeBits; FIXP_DBL cpeRate = cm->elInfo[1].relativeBits; FIXP_DBL sce2Rate = cm->elInfo[2].relativeBits; hQC->elementBits[0]->chBitrateEl = fMult(sce1Rate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[1]->chBitrateEl = fMult(cpeRate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[2]->chBitrateEl = fMult(sce2Rate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[2]->maxBitsEl = maxChannelBits; break; } case MODE_1_2_2: { /* sce + cpe + cpe */ hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; FIXP_DBL sceRate = cm->elInfo[0].relativeBits; FIXP_DBL cpe1Rate = cm->elInfo[1].relativeBits; FIXP_DBL cpe2Rate = cm->elInfo[2].relativeBits; hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[1]->chBitrateEl = fMult(cpe1Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[2]->chBitrateEl = fMult(cpe2Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[2]->maxBitsEl = 2*maxChannelBits; break; } case MODE_1_2_2_1: { /* (5.1) sce + cpe + cpe + lfe */ hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; hQC->elementBits[3]->relativeBitsEl = cm->elInfo[3].relativeBits; FIXP_DBL sceRate = cm->elInfo[0].relativeBits; FIXP_DBL cpe1Rate = cm->elInfo[1].relativeBits; FIXP_DBL cpe2Rate = cm->elInfo[2].relativeBits; FIXP_DBL lfeRate = cm->elInfo[3].relativeBits; int maxBitsTot = maxChannelBits * 5; /* LFE does not add to bit reservoir */ int sc = CountLeadingBits(fixMax(maxChannelBits,averageBitsTot)); int maxLfeBits = (int) FDKmax ( (INT)((fMult(lfeRate,(FIXP_DBL)(maxChannelBits<>sc)<<1), (INT)((fMult(FL2FXCONST_DBL(1.1f/2.f),fMult(lfeRate,(FIXP_DBL)(averageBitsTot<>sc) ); maxChannelBits = (maxBitsTot - maxLfeBits); sc = CountLeadingBits(maxChannelBits); maxChannelBits = fMult((FIXP_DBL)maxChannelBits<>sc; hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[1]->chBitrateEl = fMult(cpe1Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[2]->chBitrateEl = fMult(cpe2Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[3]->chBitrateEl = fMult(lfeRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[2]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[3]->maxBitsEl = maxLfeBits; break; } case MODE_7_1_REAR_SURROUND: case MODE_7_1_FRONT_CENTER: case MODE_1_2_2_2_1: { int cpe3Idx = 3; int lfeIdx = 4; /* (7.1) sce + cpe + cpe + cpe + lfe */ FIXP_DBL sceRate = hQC->elementBits[0]->relativeBitsEl = cm->elInfo[0].relativeBits; FIXP_DBL cpe1Rate = hQC->elementBits[1]->relativeBitsEl = cm->elInfo[1].relativeBits; FIXP_DBL cpe2Rate = hQC->elementBits[2]->relativeBitsEl = cm->elInfo[2].relativeBits; FIXP_DBL cpe3Rate = hQC->elementBits[cpe3Idx]->relativeBitsEl = cm->elInfo[cpe3Idx].relativeBits; FIXP_DBL lfeRate = hQC->elementBits[lfeIdx]->relativeBitsEl = cm->elInfo[lfeIdx].relativeBits; int maxBitsTot = maxChannelBits * 7; /* LFE does not add to bit reservoir */ int sc = CountLeadingBits(fixMax(maxChannelBits,averageBitsTot)); int maxLfeBits = (int) FDKmax ( (INT)((fMult(lfeRate,(FIXP_DBL)(maxChannelBits<>sc)<<1), (INT)((fMult(FL2FXCONST_DBL(1.1f/2.f),fMult(lfeRate,(FIXP_DBL)(averageBitsTot<>sc) ); maxChannelBits = (maxBitsTot - maxLfeBits) / 7; hQC->elementBits[0]->chBitrateEl = fMult(sceRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[1]->chBitrateEl = fMult(cpe1Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[2]->chBitrateEl = fMult(cpe2Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[cpe3Idx]->chBitrateEl = fMult(cpe3Rate, (FIXP_DBL)(bitrateTot<>(sc_brTot+1); hQC->elementBits[lfeIdx]->chBitrateEl = fMult(lfeRate, (FIXP_DBL)(bitrateTot<>sc_brTot; hQC->elementBits[0]->maxBitsEl = maxChannelBits; hQC->elementBits[1]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[2]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[cpe3Idx]->maxBitsEl = 2*maxChannelBits; hQC->elementBits[lfeIdx]->maxBitsEl = maxLfeBits; break; } default: return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; } return AAC_ENC_OK; } /********************************************************************************/ /* */ /* function: GetMonoStereoMODE(const CHANNEL_MODE mode) */ /* */ /* description: Determines encoder setting from channel mode. */ /* Multichannel modes are mapped to mono or stereo modes */ /* returns MODE_MONO in case of mono, */ /* MODE_STEREO in case of stereo */ /* MODE_INVALID in case of error */ /* */ /* input: CHANNEL_MODE mode: Encoder mode (see qc_data.h). */ /* output: return: CM_STEREO_MODE monoStereoSetting */ /* (MODE_INVALID: error, */ /* MODE_MONO: mono */ /* MODE_STEREO: stereo). */ /* */ /* misc: No memory is allocated. */ /* */ /********************************************************************************/ ELEMENT_MODE FDKaacEnc_GetMonoStereoMode(const CHANNEL_MODE mode){ ELEMENT_MODE monoStereoSetting = EL_MODE_INVALID; switch(mode){ case MODE_1: /* mono setups */ monoStereoSetting = EL_MODE_MONO; break; case MODE_2: /* stereo setups */ case MODE_1_2: case MODE_1_2_1: case MODE_1_2_2: case MODE_1_2_2_1: case MODE_1_2_2_2_1: case MODE_7_1_REAR_SURROUND: case MODE_7_1_FRONT_CENTER: monoStereoSetting = EL_MODE_STEREO; break; default: /* error */ monoStereoSetting = EL_MODE_INVALID; break; } return monoStereoSetting; } const CHANNEL_MODE_CONFIG_TAB* FDKaacEnc_GetChannelModeConfiguration(const CHANNEL_MODE mode) { INT i; const CHANNEL_MODE_CONFIG_TAB *cm_config = NULL; /* get channel mode config */ for (i=0; i<(INT)sizeof(channelModeConfig)/(INT)sizeof(CHANNEL_MODE_CONFIG_TAB); i++) { if (channelModeConfig[i].encMode==mode) { cm_config = &channelModeConfig[i]; break; } } return cm_config; } fdk-aac-0.1.3/libAACenc/src/sf_estim.h0000644000175000017500000001252612372261464017732 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Scale factor estimation ******************************************************************************/ #ifndef _SF_ESTIM_H #define _SF_ESTIM_H #include "common_fix.h" #include "psy_const.h" #include "qc_data.h" #include "interface.h" #define FORM_FAC_SHIFT 6 void FDKaacEnc_CalcFormFactor(QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_CHANNEL *psyOutChannel[(2)], const INT nChannels); void FDKaacEnc_EstimateScaleFactors(PSY_OUT_CHANNEL *psyOutChannel[], QC_OUT_CHANNEL* qcOutChannel[], const int invQuant, const int nChannels); #endif fdk-aac-0.1.3/libAACenc/src/band_nrg.h0000644000175000017500000001503412372261464017670 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Author(s): M. Werner Description: Band/Line energy calculation ******************************************************************************/ #ifndef _BAND_NRG_H #define _BAND_NRG_H #include "common_fix.h" void FDKaacEnc_CalcSfbMaxScaleSpec( const FIXP_DBL *mdctSpectrum, const INT *bandOffset, INT *sfbMaxScaleSpec, const INT numBands ); FIXP_DBL FDKaacEnc_CheckBandEnergyOptim( const FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, const INT *bandOffset, const INT numBands, FIXP_DBL *bandEnergy, FIXP_DBL *bandEnergyLdData, INT minSpecShift ); INT FDKaacEnc_CalcBandEnergyOptimLong( const FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, const INT *bandOffset, const INT numBands, FIXP_DBL *bandEnergy, FIXP_DBL *bandEnergyLdData ); void FDKaacEnc_CalcBandEnergyOptimShort( const FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, const INT *bandOffset, const INT numBands, FIXP_DBL *bandEnergy ); void FDKaacEnc_CalcBandNrgMSOpt( const FIXP_DBL *RESTRICT mdctSpectrumLeft, const FIXP_DBL *RESTRICT mdctSpectrumRight, INT *RESTRICT sfbMaxScaleSpecLeft, INT *RESTRICT sfbMaxScaleSpecRight, const INT *RESTRICT bandOffset, const INT numBands, FIXP_DBL *RESTRICT bandEnergyMid, FIXP_DBL *RESTRICT bandEnergySide, INT calcLdData, FIXP_DBL *RESTRICT bandEnergyMidLdData, FIXP_DBL *RESTRICT bandEnergySideLdData); #endif fdk-aac-0.1.3/libAACenc/src/pre_echo_control.h0000644000175000017500000001300612372261464021437 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Pre echo control ******************************************************************************/ #ifndef __PRE_ECHO_CONTROL_H #define __PRE_ECHO_CONTROL_H #include "common_fix.h" void FDKaacEnc_InitPreEchoControl(FIXP_DBL *pbThresholdnm1, INT *calcPreEcho, INT numPb, FIXP_DBL *sfbPcmQuantThreshold, INT *mdctScalenm1); void FDKaacEnc_PreEchoControl(FIXP_DBL *pbThresholdNm1, INT calcPreEcho, INT numPb, INT maxAllowedIncreaseFactor, FIXP_SGL minRemainingThresholdFactor, FIXP_DBL *pbThreshold, INT mdctScale, INT *mdctScalenm1); #endif fdk-aac-0.1.3/libAACenc/src/line_pe.cpp0000644000175000017500000002353412372261464020070 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Perceptual entropie module ******************************************************************************/ #include "line_pe.h" #include "sf_estim.h" #include "bit_cnt.h" #include "genericStds.h" static const FIXP_DBL C1LdData = FL2FXCONST_DBL(3.0/LD_DATA_SCALING); /* C1 = 3.0 = log(8.0)/log(2) */ static const FIXP_DBL C2LdData = FL2FXCONST_DBL(1.3219281/LD_DATA_SCALING); /* C2 = 1.3219281 = log(2.5)/log(2) */ static const FIXP_DBL C3LdData = FL2FXCONST_DBL(0.5593573); /* 1-C2/C1 */ /* constants that do not change during successive pe calculations */ void FDKaacEnc_prepareSfbPe(PE_CHANNEL_DATA *peChanData, const FIXP_DBL *sfbEnergyLdData, const FIXP_DBL *sfbThresholdLdData, const FIXP_DBL *sfbFormFactorLdData, const INT *sfbOffset, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup) { INT sfbGrp,sfb; INT sfbWidth; FIXP_DBL avgFormFactorLdData; const FIXP_DBL formFacScaling = FL2FXCONST_DBL((float)FORM_FAC_SHIFT/LD_DATA_SCALING); for (sfbGrp = 0;sfbGrp < sfbCnt;sfbGrp+=sfbPerGroup) { for (sfb=0; sfb (FIXP_DBL)sfbThresholdLdData[sfbGrp+sfb]) { sfbWidth = sfbOffset[sfbGrp+sfb+1] - sfbOffset[sfbGrp+sfb]; /* estimate number of active lines */ avgFormFactorLdData = ((-sfbEnergyLdData[sfbGrp+sfb]>>1) + (CalcLdInt(sfbWidth)>>1))>>1; peChanData->sfbNLines[sfbGrp+sfb] = (INT)CalcInvLdData( (sfbFormFactorLdData[sfbGrp+sfb] + formFacScaling) + avgFormFactorLdData); /* Make sure sfbNLines is never greater than sfbWidth due to unaccuracies (e.g. sfbEnergyLdData[sfbGrp+sfb] = 0x80000000) */ peChanData->sfbNLines[sfbGrp+sfb] = fMin(sfbWidth, peChanData->sfbNLines[sfbGrp+sfb]); } else { peChanData->sfbNLines[sfbGrp+sfb] = 0; } } } } /* formula for one sfb: pe = n * ld(en/thr), if ld(en/thr) >= C1 pe = n * (C2 + C3 * ld(en/thr)), if ld(en/thr) < C1 n: estimated number of lines in sfb, ld(x) = log(x)/log(2) constPart is sfbPe without the threshold part n*ld(thr) or n*C3*ld(thr) */ void FDKaacEnc_calcSfbPe(PE_CHANNEL_DATA *RESTRICT peChanData, const FIXP_DBL *RESTRICT sfbEnergyLdData, const FIXP_DBL *RESTRICT sfbThresholdLdData, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *isBook, const INT *isScale) { INT sfbGrp,sfb; INT nLines; FIXP_DBL logDataRatio; INT lastValIs = 0; peChanData->pe = 0; peChanData->constPart = 0; peChanData->nActiveLines = 0; for(sfbGrp = 0;sfbGrp < sfbCnt;sfbGrp+=sfbPerGroup){ for (sfb=0; sfb (FIXP_DBL)sfbThresholdLdData[sfbGrp+sfb]) { logDataRatio = (FIXP_DBL)(sfbEnergyLdData[sfbGrp+sfb] - sfbThresholdLdData[sfbGrp+sfb]); nLines = peChanData->sfbNLines[sfbGrp+sfb]; if (logDataRatio >= C1LdData) { /* scale sfbPe and sfbConstPart with PE_CONSTPART_SHIFT */ peChanData->sfbPe[sfbGrp+sfb] = fMultDiv2(logDataRatio, (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))); peChanData->sfbConstPart[sfbGrp+sfb] = fMultDiv2(sfbEnergyLdData[sfbGrp+sfb], (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))); ; } else { /* scale sfbPe and sfbConstPart with PE_CONSTPART_SHIFT */ peChanData->sfbPe[sfbGrp+sfb] = fMultDiv2(((FIXP_DBL)C2LdData + fMult(C3LdData,logDataRatio)), (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))); peChanData->sfbConstPart[sfbGrp+sfb] = fMultDiv2(((FIXP_DBL)C2LdData + fMult(C3LdData,sfbEnergyLdData[sfbGrp+sfb])), (FIXP_DBL)(nLines<<(LD_DATA_SHIFT+PE_CONSTPART_SHIFT+1))) ; nLines = fMultI(C3LdData, nLines); } peChanData->sfbNActiveLines[sfbGrp+sfb] = nLines; } else if( isBook[sfbGrp+sfb] ) { /* provide for cost of scale factor for Intensity */ INT delta = isScale[sfbGrp+sfb] - lastValIs; lastValIs = isScale[sfbGrp+sfb]; peChanData->sfbPe[sfbGrp+sfb] = FDKaacEnc_bitCountScalefactorDelta(delta)<sfbConstPart[sfbGrp+sfb] = 0; peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; } else { peChanData->sfbPe[sfbGrp+sfb] = 0; peChanData->sfbConstPart[sfbGrp+sfb] = 0; peChanData->sfbNActiveLines[sfbGrp+sfb] = 0; } /* sum up peChanData values */ peChanData->pe += peChanData->sfbPe[sfbGrp+sfb]; peChanData->constPart += peChanData->sfbConstPart[sfbGrp+sfb]; peChanData->nActiveLines += peChanData->sfbNActiveLines[sfbGrp+sfb]; } } /* correct scaled pe and constPart values */ peChanData->pe>>=PE_CONSTPART_SHIFT; peChanData->constPart>>=PE_CONSTPART_SHIFT; } fdk-aac-0.1.3/libAACenc/src/aacenc_tns.cpp0000644000175000017500000013335312372261464020554 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Groeschel, Tobias Chalupka contents/description: Temporal noise shaping ******************************************************************************/ #include "aacenc_tns.h" #include "psy_const.h" #include "psy_configuration.h" #include "tns_func.h" #include "aacEnc_rom.h" #include "aacenc_tns.h" enum { HIFILT = 0, /* index of higher filter */ LOFILT = 1 /* index of lower filter */ }; #define FILTER_DIRECTION 0 static const FIXP_DBL acfWindowLong[12+3+1] = { 0x7fffffff,0x7fb80000,0x7ee00000,0x7d780000,0x7b800000,0x78f80000,0x75e00000,0x72380000, 0x6e000000,0x69380000,0x63e00000,0x5df80000,0x57800000,0x50780000,0x48e00000,0x40b80000 }; static const FIXP_DBL acfWindowShort[4+3+1] = { 0x7fffffff,0x7e000000,0x78000000,0x6e000000,0x60000000,0x4e000000,0x38000000,0x1e000000 }; typedef struct { INT filterEnabled[MAX_NUM_OF_FILTERS]; INT threshOn[MAX_NUM_OF_FILTERS]; /* min. prediction gain for using tns TABUL*/ INT filterStartFreq[MAX_NUM_OF_FILTERS]; /* lowest freq for lpc TABUL*/ INT tnsLimitOrder[MAX_NUM_OF_FILTERS]; /* Limit for TNS order TABUL*/ INT tnsFilterDirection[MAX_NUM_OF_FILTERS]; /* Filtering direction, 0=up, 1=down TABUL */ INT acfSplit[MAX_NUM_OF_FILTERS]; FIXP_DBL tnsTimeResolution[MAX_NUM_OF_FILTERS]; /* TNS max. time resolution TABUL. Should be fract but MSVC won't compile then */ INT seperateFiltersAllowed; } TNS_PARAMETER_TABULATED; typedef struct{ INT bitRateFrom[2]; /* noneSbr=0, useSbr=1 */ INT bitRateTo[2]; /* noneSbr=0, useSbr=1 */ TNS_PARAMETER_TABULATED paramTab[2]; /* mono=0, stereo=1 */ } TNS_INFO_TAB; #define TNS_TIMERES_SCALE (1) #define FL2_TIMERES_FIX(a) ( FL2FXCONST_DBL(a/(float)(1<= tnsInfoTab[i].bitRateFrom[sbrLd?1:0]) && bitRate <= tnsInfoTab[i].bitRateTo[sbrLd?1:0]) { tnsConfigTab = &tnsInfoTab[i].paramTab[(channels==1)?0:1]; } } return tnsConfigTab; } static INT getTnsMaxBands( const INT sampleRate, const INT granuleLength, const INT isShortBlock ) { int i; INT numBands = -1; const TNS_MAX_TAB_ENTRY *pMaxBandsTab = NULL; int maxBandsTabSize = 0; switch (granuleLength) { case 1024: pMaxBandsTab = tnsMaxBandsTab1024; maxBandsTabSize = sizeof(tnsMaxBandsTab1024)/sizeof(TNS_MAX_TAB_ENTRY); break; case 480: pMaxBandsTab = tnsMaxBandsTab480; maxBandsTabSize = sizeof(tnsMaxBandsTab480)/sizeof(TNS_MAX_TAB_ENTRY); break; case 512: pMaxBandsTab = tnsMaxBandsTab512; maxBandsTabSize = sizeof(tnsMaxBandsTab512)/sizeof(TNS_MAX_TAB_ENTRY); break; default: numBands = -1; } if (pMaxBandsTab!=NULL) { for (i=0; i= pMaxBandsTab[i].samplingRate) { break; } } } return numBands; } /***************************************************************************/ /*! \brief FDKaacEnc_FreqToBandWithRounding Returns index of nearest band border \param frequency \param sampling frequency \param total number of bands \param pointer to table of band borders \return band border ****************************************************************************/ INT FDKaacEnc_FreqToBandWithRounding( const INT freq, const INT fs, const INT numOfBands, const INT *bandStartOffset ) { INT lineNumber, band; /* assert(freq >= 0); */ lineNumber = (freq*bandStartOffset[numOfBands]*4/fs+1)/2; /* freq > fs/2 */ if (lineNumber >= bandStartOffset[numOfBands]) return numOfBands; /* find band the line number lies in */ for (band=0; bandlineNumber) break; } /* round to nearest band border */ if (lineNumber - bandStartOffset[band] > bandStartOffset[band+1] - lineNumber ) { band++; } return(band); } /***************************************************************************** functionname: FDKaacEnc_InitTnsConfiguration description: fill TNS_CONFIG structure with sensible content returns: input: bitrate, samplerate, number of channels, blocktype (long or short), TNS Config struct (modified), psy config struct, tns active flag output: *****************************************************************************/ AAC_ENCODER_ERROR FDKaacEnc_InitTnsConfiguration(INT bitRate, INT sampleRate, INT channels, INT blockType, INT granuleLength, INT ldSbrPresent, TNS_CONFIG *tC, PSY_CONFIGURATION *pC, INT active, INT useTnsPeak) { int i; //float acfTimeRes = (blockType == SHORT_WINDOW) ? 0.125f : 0.046875f; if (channels <= 0) return (AAC_ENCODER_ERROR)1; /* initialize TNS filter flag, order, and coefficient resolution (in bits per coeff) */ tC->tnsActive = (active) ? TRUE : FALSE; tC->maxOrder = (blockType == SHORT_WINDOW) ? 5 : 12; /* maximum: 7, 20 */ if (bitRate < 16000) tC->maxOrder -= 2; tC->coefRes = (blockType == SHORT_WINDOW) ? 3 : 4; /* LPC stop line: highest MDCT line to be coded, but do not go beyond TNS_MAX_BANDS! */ tC->lpcStopBand = getTnsMaxBands(sampleRate, granuleLength, (blockType == SHORT_WINDOW) ? 1 : 0); if (tC->lpcStopBand < 0) { return (AAC_ENCODER_ERROR)1; } tC->lpcStopBand = FDKmin(tC->lpcStopBand, pC->sfbActive); tC->lpcStopLine = pC->sfbOffset[tC->lpcStopBand]; switch (granuleLength) { case 1024: /* TNS start line: skip lower MDCT lines to prevent artifacts due to filter mismatch */ tC->lpcStartBand[LOFILT] = (blockType == SHORT_WINDOW) ? 0 : ((sampleRate < 18783) ? 4 : 8); tC->lpcStartLine[LOFILT] = pC->sfbOffset[tC->lpcStartBand[LOFILT]]; i = tC->lpcStopBand; while (pC->sfbOffset[i] > (tC->lpcStartLine[LOFILT] + (tC->lpcStopLine - tC->lpcStartLine[LOFILT]) / 4)) i--; tC->lpcStartBand[HIFILT] = i; tC->lpcStartLine[HIFILT] = pC->sfbOffset[i]; tC->confTab.threshOn[HIFILT] = 1437; tC->confTab.threshOn[LOFILT] = 1500; tC->confTab.tnsLimitOrder[HIFILT] = tC->maxOrder; tC->confTab.tnsLimitOrder[LOFILT] = tC->maxOrder - 7; tC->confTab.tnsFilterDirection[HIFILT] = FILTER_DIRECTION; tC->confTab.tnsFilterDirection[LOFILT] = FILTER_DIRECTION; tC->confTab.acfSplit[HIFILT] = -1; /* signal Merged4to2QuartersAutoCorrelation in FDKaacEnc_MergedAutoCorrelation*/ tC->confTab.acfSplit[LOFILT] = -1; /* signal Merged4to2QuartersAutoCorrelation in FDKaacEnc_MergedAutoCorrelation */ tC->confTab.filterEnabled[HIFILT] = 1; tC->confTab.filterEnabled[LOFILT] = 1; tC->confTab.seperateFiltersAllowed = 1; /* compute autocorrelation window based on maximum filter order for given block type */ /* for (i = 0; i <= tC->maxOrder + 3; i++) { float acfWinTemp = acfTimeRes * i; acfWindow[i] = FL2FXCONST_DBL(1.0f - acfWinTemp * acfWinTemp); } */ if (blockType == SHORT_WINDOW) { FDKmemcpy(tC->acfWindow[HIFILT], acfWindowShort, FDKmin(sizeof(acfWindowShort), sizeof(tC->acfWindow[HIFILT]))); FDKmemcpy(tC->acfWindow[LOFILT], acfWindowShort, FDKmin(sizeof(acfWindowShort), sizeof(tC->acfWindow[HIFILT]))); } else { FDKmemcpy(tC->acfWindow[HIFILT], acfWindowLong, FDKmin(sizeof(acfWindowLong), sizeof(tC->acfWindow[HIFILT]))); FDKmemcpy(tC->acfWindow[LOFILT], acfWindowLong, FDKmin(sizeof(acfWindowLong), sizeof(tC->acfWindow[HIFILT]))); } break; case 480: case 512: { const TNS_PARAMETER_TABULATED* pCfg = FDKaacEnc_GetTnsParam(bitRate, channels, ldSbrPresent); if ( pCfg != NULL ) { tC->lpcStartBand[HIFILT] = FDKaacEnc_FreqToBandWithRounding(pCfg->filterStartFreq[HIFILT], sampleRate, pC->sfbCnt, pC->sfbOffset); tC->lpcStartLine[HIFILT] = pC->sfbOffset[tC->lpcStartBand[HIFILT]]; tC->lpcStartBand[LOFILT] = FDKaacEnc_FreqToBandWithRounding(pCfg->filterStartFreq[LOFILT], sampleRate, pC->sfbCnt, pC->sfbOffset); tC->lpcStartLine[LOFILT] = pC->sfbOffset[tC->lpcStartBand[LOFILT]]; tC->confTab.threshOn[HIFILT] = pCfg->threshOn[HIFILT]; tC->confTab.threshOn[LOFILT] = pCfg->threshOn[LOFILT]; tC->confTab.tnsLimitOrder[HIFILT] = pCfg->tnsLimitOrder[HIFILT]; tC->confTab.tnsLimitOrder[LOFILT] = pCfg->tnsLimitOrder[LOFILT]; tC->confTab.tnsFilterDirection[HIFILT] = pCfg->tnsFilterDirection[HIFILT]; tC->confTab.tnsFilterDirection[LOFILT] = pCfg->tnsFilterDirection[LOFILT]; tC->confTab.acfSplit[HIFILT] = pCfg->acfSplit[HIFILT]; tC->confTab.acfSplit[LOFILT] = pCfg->acfSplit[LOFILT]; tC->confTab.filterEnabled[HIFILT] = pCfg->filterEnabled[HIFILT]; tC->confTab.filterEnabled[LOFILT] = pCfg->filterEnabled[LOFILT]; tC->confTab.seperateFiltersAllowed = pCfg->seperateFiltersAllowed; FDKaacEnc_CalcGaussWindow(tC->acfWindow[HIFILT], tC->maxOrder+1, sampleRate, granuleLength, pCfg->tnsTimeResolution[HIFILT], TNS_TIMERES_SCALE); FDKaacEnc_CalcGaussWindow(tC->acfWindow[LOFILT], tC->maxOrder+1, sampleRate, granuleLength, pCfg->tnsTimeResolution[LOFILT], TNS_TIMERES_SCALE); } else { tC->tnsActive = FALSE; /* no configuration available, disable tns tool */ } } break; default: tC->tnsActive = FALSE; /* no configuration available, disable tns tool */ } return AAC_ENC_OK; } /***************************************************************************/ /*! \brief FDKaacEnc_ScaleUpSpectrum Scales up spectrum lines in a given frequency section \param scaled spectrum \param original spectrum \param frequency line to start scaling \param frequency line to enc scaling \return scale factor ****************************************************************************/ static inline INT FDKaacEnc_ScaleUpSpectrum( FIXP_DBL *dest, const FIXP_DBL *src, const INT startLine, const INT stopLine ) { INT i, scale; FIXP_DBL maxVal = FL2FXCONST_DBL(0.f); /* Get highest value in given spectrum */ for (i=startLine; i>scale); } } else { for (i=startLine; i<(stopLine-lag); i++) { result += (fMult(spectrum[i], spectrum[i+lag])>>scale); } } return result; } /***************************************************************************/ /*! \brief FDKaacEnc_AutoCorrNormFac Autocorrelation function for 1st and 2nd half of the spectrum \param pointer to spectrum \param pointer to autocorrelation window \param filter start line ****************************************************************************/ static inline FIXP_DBL FDKaacEnc_AutoCorrNormFac( const FIXP_DBL value, const INT scale, INT *sc ) { #define HLM_MIN_NRG 0.0000000037252902984619140625f /* 2^-28 */ #define MAX_INV_NRGFAC (1.f/HLM_MIN_NRG) FIXP_DBL retValue; FIXP_DBL A, B; if (scale>=0) { A = value; B = FL2FXCONST_DBL(HLM_MIN_NRG)>>fixMin(DFRACT_BITS-1,scale); } else { A = value>>fixMin(DFRACT_BITS-1,(-scale)); B = FL2FXCONST_DBL(HLM_MIN_NRG); } if (A > B) { int shift = 0; FIXP_DBL tmp = invSqrtNorm2(value,&shift); retValue = fMult(tmp,tmp); *sc += (2*shift); } else { /* MAX_INV_NRGFAC*FDKpow(2,-28) = 1/2^-28 * 2^-28 = 1.0 */ retValue = /*FL2FXCONST_DBL(MAX_INV_NRGFAC*FDKpow(2,-28))*/ (FIXP_DBL)MAXVAL_DBL; *sc += scale+28; } return retValue; } static void FDKaacEnc_MergedAutoCorrelation( const FIXP_DBL *spectrum, const FIXP_DBL acfWindow[MAX_NUM_OF_FILTERS][TNS_MAX_ORDER+3+1], const INT lpcStartLine[MAX_NUM_OF_FILTERS], const INT lpcStopLine, const INT maxOrder, const INT acfSplit[MAX_NUM_OF_FILTERS], FIXP_DBL *_rxx1, FIXP_DBL *_rxx2 ) { int i, idx0, idx1, idx2, idx3, idx4, lag; FIXP_DBL rxx1_0, rxx2_0, rxx3_0, rxx4_0; /* buffer for temporal spectrum */ C_ALLOC_SCRATCH_START(pSpectrum, FIXP_DBL, (1024)); /* pre-initialization output */ FDKmemclear(&_rxx1[0], sizeof(FIXP_DBL)*(maxOrder+1)); FDKmemclear(&_rxx2[0], sizeof(FIXP_DBL)*(maxOrder+1)); /* MDCT line indices separating the 1st, 2nd, 3rd, and 4th analysis quarters */ if ( (acfSplit[LOFILT]==-1) || (acfSplit[HIFILT]==-1) ) { /* autocorrelation function for 1st, 2nd, 3rd, and 4th quarter of the spectrum */ idx0 = lpcStartLine[LOFILT]; i = lpcStopLine - lpcStartLine[LOFILT]; idx1 = idx0 + i / 4; idx2 = idx0 + i / 2; idx3 = idx0 + i * 3 / 4; idx4 = lpcStopLine; } else { FDK_ASSERT(acfSplit[LOFILT]==1); FDK_ASSERT(acfSplit[HIFILT]==3); i = (lpcStopLine - lpcStartLine[HIFILT]) / 3; idx0 = lpcStartLine[LOFILT]; idx1 = lpcStartLine[HIFILT]; idx2 = idx1 + i; idx3 = idx2 + i; idx4 = lpcStopLine; } /* copy spectrum to temporal buffer and scale up as much as possible */ INT sc1 = FDKaacEnc_ScaleUpSpectrum(pSpectrum, spectrum, idx0, idx1); INT sc2 = FDKaacEnc_ScaleUpSpectrum(pSpectrum, spectrum, idx1, idx2); INT sc3 = FDKaacEnc_ScaleUpSpectrum(pSpectrum, spectrum, idx2, idx3); INT sc4 = FDKaacEnc_ScaleUpSpectrum(pSpectrum, spectrum, idx3, idx4); /* get scaling values for summation */ INT nsc1, nsc2, nsc3, nsc4; for (nsc1=1; (1<dataRaw.Short.subBlockInfo[subBlockNumber] : &tnsData->dataRaw.Long.subBlockInfo; tnsData->filtersMerged = FALSE; tsbi->tnsActive = FALSE; tsbi->predictionGain = 1000; tnsInfo->numOfFilters[subBlockNumber] = 0; tnsInfo->coefRes[subBlockNumber] = tC->coefRes; for (i = 0; i < tC->maxOrder; i++) { tnsInfo->coef[subBlockNumber][HIFILT][i] = tnsInfo->coef[subBlockNumber][LOFILT][i] = 0; } tnsInfo->length[subBlockNumber][HIFILT] = tnsInfo->length[subBlockNumber][LOFILT] = 0; tnsInfo->order [subBlockNumber][HIFILT] = tnsInfo->order [subBlockNumber][LOFILT] = 0; if ( (tC->tnsActive) && (tC->maxOrder>0) ) { int sumSqrCoef; FDKaacEnc_MergedAutoCorrelation( spectrum, tC->acfWindow, tC->lpcStartLine, tC->lpcStopLine, tC->maxOrder, tC->confTab.acfSplit, rxx1, rxx2); /* compute higher TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ tsbi->predictionGain = FDKaacEnc_AutoToParcor(rxx2, parcor_tmp, tC->confTab.tnsLimitOrder[HIFILT]); /* non-linear quantization of TNS lattice coefficients with given resolution */ FDKaacEnc_Parcor2Index( parcor_tmp, tnsInfo->coef[subBlockNumber][HIFILT], tC->confTab.tnsLimitOrder[HIFILT], tC->coefRes); /* reduce filter order by truncating trailing zeros, compute sum(abs(coefs)) */ for (i = tC->confTab.tnsLimitOrder[HIFILT] - 1; i >= 0; i--) { if (tnsInfo->coef[subBlockNumber][HIFILT][i] != 0) { break; } } tnsInfo->order[subBlockNumber][HIFILT] = i + 1; sumSqrCoef = 0; for (; i >= 0; i--) { sumSqrCoef += tnsInfo->coef[subBlockNumber][HIFILT][i] * tnsInfo->coef[subBlockNumber][HIFILT][i]; } tnsInfo->direction[subBlockNumber][HIFILT] = tC->confTab.tnsFilterDirection[HIFILT]; tnsInfo->length[subBlockNumber][HIFILT] = sfbCnt - tC->lpcStartBand[HIFILT]; /* disable TNS if predictionGain is less than 3dB or sumSqrCoef is too small */ if ((tsbi->predictionGain > tC->confTab.threshOn[HIFILT]) || (sumSqrCoef > (tC->confTab.tnsLimitOrder[HIFILT]/2 + 2))) { tsbi->tnsActive = TRUE; tnsInfo->numOfFilters[subBlockNumber]++; /* compute second filter for lower quarter; only allowed for long windows! */ if ( (blockType != SHORT_WINDOW) && (tC->confTab.filterEnabled[LOFILT]) && (tC->confTab.seperateFiltersAllowed) ) { /* compute second filter for lower frequencies */ /* compute TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ INT predGain = FDKaacEnc_AutoToParcor(rxx1, parcor_tmp, tC->confTab.tnsLimitOrder[LOFILT]); /* non-linear quantization of TNS lattice coefficients with given resolution */ FDKaacEnc_Parcor2Index( parcor_tmp, tnsInfo->coef[subBlockNumber][LOFILT], tC->confTab.tnsLimitOrder[LOFILT], tC->coefRes); /* reduce filter order by truncating trailing zeros, compute sum(abs(coefs)) */ for (i = tC->confTab.tnsLimitOrder[LOFILT] - 1; i >= 0; i--) { if (tnsInfo->coef[subBlockNumber][LOFILT][i] != 0) { break; } } tnsInfo->order[subBlockNumber][LOFILT] = i + 1; sumSqrCoef = 0; for (; i >= 0; i--) { sumSqrCoef += tnsInfo->coef[subBlockNumber][LOFILT][i] * tnsInfo->coef[subBlockNumber][LOFILT][i]; } tnsInfo->direction[subBlockNumber][LOFILT] = tC->confTab.tnsFilterDirection[LOFILT]; tnsInfo->length[subBlockNumber][LOFILT] = tC->lpcStartBand[HIFILT] - tC->lpcStartBand[LOFILT]; /* filter lower quarter if gain is high enough, but not if it's too high */ if ( ( (predGain > tC->confTab.threshOn[LOFILT]) && (predGain < (16000 * tC->confTab.tnsLimitOrder[LOFILT])) ) || ( (sumSqrCoef > 9) && (sumSqrCoef < 22 * tC->confTab.tnsLimitOrder[LOFILT]) ) ) { /* compare lower to upper filter; if they are very similar, merge them */ sumSqrCoef = 0; for (i = 0; i < tC->confTab.tnsLimitOrder[LOFILT]; i++) { sumSqrCoef += FDKabs(tnsInfo->coef[subBlockNumber][HIFILT][i] - tnsInfo->coef[subBlockNumber][LOFILT][i]); } if ( (sumSqrCoef < 2) && (tnsInfo->direction[subBlockNumber][LOFILT] == tnsInfo->direction[subBlockNumber][HIFILT]) ) { tnsData->filtersMerged = TRUE; tnsInfo->length[subBlockNumber][HIFILT] = sfbCnt - tC->lpcStartBand[LOFILT]; for (; i < tnsInfo->order[subBlockNumber][HIFILT]; i++) { if (FDKabs(tnsInfo->coef[subBlockNumber][HIFILT][i]) > 1) { break; } } for (i--; i >= 0; i--) { if (tnsInfo->coef[subBlockNumber][HIFILT][i] != 0) { break; } } if (i < tnsInfo->order[subBlockNumber][HIFILT]) { tnsInfo->order[subBlockNumber][HIFILT] = i + 1; } } else { tnsInfo->numOfFilters[subBlockNumber]++; } } /* filter lower part */ } /* second filter allowed */ } /* if predictionGain > 1437 ... */ } /* maxOrder > 0 && tnsActive */ return 0; } /***************************************************************************/ /*! \brief FDKaacLdEnc_TnsSync synchronize TNS parameters when TNS gain difference small (relative) \param pointer to TNS data structure (destination) \param pointer to TNS data structure (source) \param pointer to TNS config structure \param number of sub-block \param block type \return void ****************************************************************************/ void FDKaacEnc_TnsSync( TNS_DATA *tnsDataDest, const TNS_DATA *tnsDataSrc, TNS_INFO *tnsInfoDest, TNS_INFO *tnsInfoSrc, const INT blockTypeDest, const INT blockTypeSrc, const TNS_CONFIG *tC ) { int i, w, absDiff, nWindows; TNS_SUBBLOCK_INFO *sbInfoDest; const TNS_SUBBLOCK_INFO *sbInfoSrc; /* if one channel contains short blocks and the other not, do not synchronize */ if ( (blockTypeSrc == SHORT_WINDOW && blockTypeDest != SHORT_WINDOW) || (blockTypeDest == SHORT_WINDOW && blockTypeSrc != SHORT_WINDOW) ) { return; } if (blockTypeDest != SHORT_WINDOW) { sbInfoDest = &tnsDataDest->dataRaw.Long.subBlockInfo; sbInfoSrc = &tnsDataSrc->dataRaw.Long.subBlockInfo; nWindows = 1; } else { sbInfoDest = &tnsDataDest->dataRaw.Short.subBlockInfo[0]; sbInfoSrc = &tnsDataSrc->dataRaw.Short.subBlockInfo[0]; nWindows = 8; } for (w=0; wtnsActive || pSbInfoSrcW->tnsActive) { for (i = 0; i < tC->maxOrder; i++) { absDiff = FDKabs(tnsInfoDest->coef[w][HIFILT][i] - tnsInfoSrc->coef[w][HIFILT][i]); absDiffSum += absDiff; /* if coefficients diverge too much between channels, do not synchronize */ if ((absDiff > 1) || (absDiffSum > 2)) { doSync = 0; break; } } if (doSync) { /* if no significant difference was detected, synchronize coefficient sets */ if (pSbInfoSrcW->tnsActive) { /* no dest filter, or more dest than source filters: use one dest filter */ if ((!pSbInfoDestW->tnsActive) || ((pSbInfoDestW->tnsActive) && (tnsInfoDest->numOfFilters[w] > tnsInfoSrc->numOfFilters[w]))) { pSbInfoDestW->tnsActive = tnsInfoDest->numOfFilters[w] = 1; } tnsDataDest->filtersMerged = tnsDataSrc->filtersMerged; tnsInfoDest->order [w][HIFILT] = tnsInfoSrc->order [w][HIFILT]; tnsInfoDest->length [w][HIFILT] = tnsInfoSrc->length [w][HIFILT]; tnsInfoDest->direction [w][HIFILT] = tnsInfoSrc->direction [w][HIFILT]; tnsInfoDest->coefCompress[w][HIFILT] = tnsInfoSrc->coefCompress[w][HIFILT]; for (i = 0; i < tC->maxOrder; i++) { tnsInfoDest->coef[w][HIFILT][i] = tnsInfoSrc->coef[w][HIFILT][i]; } } else pSbInfoDestW->tnsActive = tnsInfoDest->numOfFilters[w] = 0; } } } } /***************************************************************************/ /*! \brief FDKaacEnc_TnsEncode perform TNS encoding \param pointer to TNS info structure \param pointer to TNS data structure \param number of sfbs \param pointer to TNS config structure \param low-pass line \param pointer to spectrum \param number of sub-block \param block type \return ERROR STATUS ****************************************************************************/ INT FDKaacEnc_TnsEncode( TNS_INFO* tnsInfo, TNS_DATA* tnsData, const INT numOfSfb, const TNS_CONFIG *tC, const INT lowPassLine, FIXP_DBL* spectrum, const INT subBlockNumber, const INT blockType ) { INT i, startLine, stopLine; if ( ( (blockType == SHORT_WINDOW) && (!tnsData->dataRaw.Short.subBlockInfo[subBlockNumber].tnsActive) ) || ( (blockType != SHORT_WINDOW) && (!tnsData->dataRaw.Long.subBlockInfo.tnsActive) ) ) { return 1; } startLine = (tnsData->filtersMerged) ? tC->lpcStartLine[LOFILT] : tC->lpcStartLine[HIFILT]; stopLine = tC->lpcStopLine; for (i=0; inumOfFilters[subBlockNumber]; i++) { INT lpcGainFactor; FIXP_DBL LpcCoeff[TNS_MAX_ORDER]; FIXP_DBL workBuffer[TNS_MAX_ORDER]; FIXP_DBL parcor_tmp[TNS_MAX_ORDER]; FDKaacEnc_Index2Parcor( tnsInfo->coef[subBlockNumber][i], parcor_tmp, tnsInfo->order[subBlockNumber][i], tC->coefRes); lpcGainFactor = FDKaacEnc_ParcorToLpc( parcor_tmp, LpcCoeff, tnsInfo->order[subBlockNumber][i], workBuffer); FDKaacEnc_AnalysisFilter( &spectrum[startLine], stopLine - startLine, LpcCoeff, tnsInfo->order[subBlockNumber][i], lpcGainFactor); /* update for second filter */ startLine = tC->lpcStartLine[LOFILT]; stopLine = tC->lpcStartLine[HIFILT]; } return(0); } static void FDKaacEnc_CalcGaussWindow( FIXP_DBL *win, const int winSize, const INT samplingRate, const INT transformResolution, const FIXP_DBL timeResolution, const INT timeResolution_e ) { #define PI_E (2) #define PI_M FL2FXCONST_DBL(3.1416f/(float)(1<> (DFRACT_BITS-1)); tmp = (FIXP_DBL)((LONG)workBuffer[0]^sign); if(input[0]=0; j--) { FIXP_DBL accu1 = fMult(tmp, input[j]); FIXP_DBL accu2 = fMult(tmp, workBuffer[j]); workBuffer[j] += accu1; input[j] += accu2; } workBuffer++; } tmp = fMult((FIXP_DBL)((LONG)TNS_PREDGAIN_SCALE<<21), fDivNorm(fAbs(autoCorr_0), fAbs(input[0]), &scale)); if ( fMultDiv2(autoCorr_0, input[0]) FDKaacEnc_tnsCoeff3Borders[i]) index=i; } return(index-4); } static INT FDKaacEnc_Search4(FIXP_DBL parcor) { INT i, index=0; for(i=0;i<16;i++){ if(parcor > FDKaacEnc_tnsCoeff4Borders[i]) index=i; } return(index-8); } /***************************************************************************** functionname: FDKaacEnc_Parcor2Index *****************************************************************************/ static void FDKaacEnc_Parcor2Index( const FIXP_DBL *parcor, INT *RESTRICT index, const INT order, const INT bitsPerCoeff ) { INT i; for(i=0; i, ptr. to work buffer (required size: order) output: LPC coefficients *****************************************************************************/ static INT FDKaacEnc_ParcorToLpc( const FIXP_DBL *reflCoeff, FIXP_DBL *RESTRICT LpcCoeff, const INT numOfCoeff, FIXP_DBL *RESTRICT workBuffer ) { INT i, j; INT shiftval, par2LpcShiftVal = 6; /* 6 should be enough, bec. max(numOfCoeff) = 20 */ FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); LpcCoeff[0] = reflCoeff[0] >> par2LpcShiftVal; for(i=1; i> par2LpcShiftVal; } /* normalize LpcCoeff and calc shiftfactor */ for(i=0; i=par2LpcShiftVal) ? par2LpcShiftVal : shiftval; for(i=0; i0) { INT idx = 0; /* keep filter coefficients twice and save memory copy operation in modulo state buffer */ #if defined(ARCH_PREFER_MULT_32x16) FIXP_SGL coeff[2*TNS_MAX_ORDER]; const FIXP_SGL *pCoeff; for(i=0;i=0); signal[j] = (tmp< 7/2 = 4 (spc*spc) */ FIXP_DBL chaosMeasureSfb = FL2FXCONST_DBL(0.0); /* calc chaosMeasurePerSfb */ for (j=(sfbOffset[i+1]-sfbOffset[i])-1; j>=0; j--) { FIXP_DBL tmp = (*spectrum++)< FL2FXCONST_DBL(-0.0519051) ) /* > ld(0.05)+ld(2) */ { if (chaosMeasureSfbLD64 <= FL2FXCONST_DBL(0.0) ) sfbTonality[i] = FX_DBL2FX_SGL(fMultDiv2( chaosMeasureSfbLD64 , normlog ) << 7); else sfbTonality[i] = FL2FXCONST_SGL(0.0); } else sfbTonality[i] = (FIXP_SGL)MAXVAL_SGL; } else sfbTonality[i] = (FIXP_SGL)MAXVAL_SGL; } } fdk-aac-0.1.3/libAACenc/src/aacEnc_ram.cpp0000644000175000017500000001773312372261464020472 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /****************************************************************************** Initial authors: M. Lohwasser, M. Gayer Contents/description: ******************************************************************************/ /*! \file \brief Memory layout \author Markus Lohwasser */ #include "aacEnc_ram.h" C_AALLOC_MEM (AACdynamic_RAM, FIXP_DBL, AAC_ENC_DYN_RAM_SIZE/sizeof(FIXP_DBL)) /* Static memory areas, must not be overwritten in other sections of the decoder ! */ /* The structure AacEncoder contains all Encoder structures. */ C_ALLOC_MEM (Ram_aacEnc_AacEncoder, AAC_ENC, 1) /* The structure PSY_INTERNAl contains all psych configuration and data pointer. * PsyStatic holds last and current Psych data. * PsyInputBuffer contains time input. Signal is needed at the beginning of Psych. Memory can be reused after signal is in time domain. * PsyData contains spectral, nrg and threshold information. Necessary data are copied into PsyOut, so memory is available after leaving psych. * TnsData, ChaosMeasure, PnsData are temporarily necessary, e.g. use memory from PsyInputBuffer. */ C_ALLOC_MEM2 (Ram_aacEnc_PsyElement, PSY_ELEMENT, 1, (8)) C_ALLOC_MEM (Ram_aacEnc_PsyInternal, PSY_INTERNAL, 1) C_ALLOC_MEM2 (Ram_aacEnc_PsyStatic, PSY_STATIC, 1, (8)) C_ALLOC_MEM2 (Ram_aacEnc_PsyInputBuffer, INT_PCM, MAX_INPUT_BUFFER_SIZE, (8)) PSY_DYNAMIC *GetRam_aacEnc_PsyDynamic (int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((PSY_DYNAMIC*) (dynamic_RAM + P_BUF_1 + n*sizeof(PSY_DYNAMIC))); } C_ALLOC_MEM (Ram_bsOutbuffer, UCHAR, OUTPUTBUFFER_SIZE) /* The structure PSY_OUT holds all psychoaccoustic data needed in quantization module */ C_ALLOC_MEM2 (Ram_aacEnc_PsyOut, PSY_OUT, 1, (1)) C_ALLOC_MEM2 (Ram_aacEnc_PsyOutElements, PSY_OUT_ELEMENT, 1, (1)*(8)) C_ALLOC_MEM2 (Ram_aacEnc_PsyOutChannel, PSY_OUT_CHANNEL, 1, (1)*(8)) /* The structure QC_STATE contains preinitialized settings and quantizer structures. * AdjustThreshold structure contains element-wise settings. * ElementBits contains elemnt-wise bit consumption settings. * When CRC is active, lookup table is necessary for fast crc calculation. * Bitcounter contains buffer to find optimal codebooks and minimal bit consumption. Values are temporarily, so dynamic memory can be used. */ C_ALLOC_MEM (Ram_aacEnc_QCstate, QC_STATE, 1) C_ALLOC_MEM (Ram_aacEnc_AdjustThreshold, ADJ_THR_STATE, 1) C_ALLOC_MEM2 (Ram_aacEnc_AdjThrStateElement, ATS_ELEMENT, 1, (8)) C_ALLOC_MEM2 (Ram_aacEnc_ElementBits, ELEMENT_BITS, 1, (8)) C_ALLOC_MEM (Ram_aacEnc_BitCntrState, BITCNTR_STATE, 1) INT *GetRam_aacEnc_BitLookUp(int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((INT*) (dynamic_RAM + P_BUF_1)); } INT *GetRam_aacEnc_MergeGainLookUp(int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((INT*) (dynamic_RAM + P_BUF_1 + sizeof(INT)*(MAX_SFB_LONG*(CODE_BOOK_ESC_NDX+1)))); } /* The structure QC_OUT contains settings and structures holding all necessary information needed in bitstreamwriter. */ C_ALLOC_MEM2 (Ram_aacEnc_QCout, QC_OUT, 1, (1)) C_ALLOC_MEM2 (Ram_aacEnc_QCelement, QC_OUT_ELEMENT, (1), (8)) QC_OUT_CHANNEL *GetRam_aacEnc_QCchannel (int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((QC_OUT_CHANNEL*) (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL))); } fdk-aac-0.1.3/libAACenc/src/grp_data.h0000644000175000017500000001326712372261464017705 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Short block grouping ******************************************************************************/ #ifndef __GRP_DATA_H__ #define __GRP_DATA_H__ #include "common_fix.h" #include "psy_data.h" void FDKaacEnc_groupShortData(FIXP_DBL *mdctSpectrum, /* in-out */ SFB_THRESHOLD *sfbThreshold, /* in-out */ SFB_ENERGY *sfbEnergy, /* in-out */ SFB_ENERGY *sfbEnergyMS, /* in-out */ SFB_ENERGY *sfbSpreadEnergy, const INT sfbCnt, const INT sfbActive, const INT *sfbOffset, const FIXP_DBL *sfbMinSnrLdData, INT *groupedSfbOffset, /* out */ INT *maxSfbPerGroup, FIXP_DBL *groupedSfbMinSnrLdData, const INT noOfGroups, const INT *groupLen, const INT granuleLength); #endif /* _INTERFACE_H */ fdk-aac-0.1.3/libAACenc/src/bitenc.h0000644000175000017500000002176612372261464017373 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Bitstream encoder ******************************************************************************/ #ifndef _BITENC_H #define _BITENC_H #include "qc_data.h" #include "aacenc_tns.h" #include "channel_map.h" #include "interface.h" /* obsolete, when PSY_OUT is thrown out of the WritBS-call! */ #include "FDK_audio.h" #include "aacenc.h" #include "tpenc_lib.h" typedef enum{ MAX_ENCODER_CHANNELS = 9, MAX_BLOCK_TYPES = 4, MAX_AAC_LAYERS = 9, MAX_LAYERS = MAX_AAC_LAYERS , /* only one core layer if present */ FIRST_LAY = 1 /* default layer number for AAC nonscalable */ } _MAX_CONST; #define BUFFER_MX_HUFFCB_SIZE (32*sizeof(INT)) /* our FDK_bitbuffer needs size of power 2 */ #define EL_ID_BITS ( 3 ) /** * \brief Arbitrary order bitstream writer. This function can either assemble a bit stream * and write into the bit buffer of hTpEnc or calculate the number of static bits (signal independent) * TpEnc handle must be NULL in this case. Or also Calculate the minimum possible number of * static bits which by disabling all tools e.g. MS, TNS and sbfCnt=0. The minCnt parameter * has to be 1 in this latter case. * \param hTpEnc Transport encoder handle. If NULL, the number of static bits will be returned into * *pBitDemand. * \param pElInfo * \param qcOutChannel * \param hReorderInfo * \param psyOutElement * \param psyOutChannel * \param syntaxFlags Bit stream syntax flags as defined in FDK_audio.h (Audio Codec flags). * \param aot * \param epConfig * \param pBitDemand Pointer to an int where the amount of bits is returned into. The returned value * depends on if hTpEnc is NULL and minCnt. * \param minCnt If non-zero the value returned into *pBitDemand is the absolute minimum required amount of * static bits in order to write a valid bit stream. * \return AAC_ENCODER_ERROR error code */ AAC_ENCODER_ERROR FDKaacEnc_ChannelElementWrite( HANDLE_TRANSPORTENC hTpEnc, ELEMENT_INFO *pElInfo, QC_OUT_CHANNEL *qcOutChannel[(2)], PSY_OUT_ELEMENT *psyOutElement, PSY_OUT_CHANNEL *psyOutChannel[(2)], UINT syntaxFlags, AUDIO_OBJECT_TYPE aot, SCHAR epConfig, INT *pBitDemand, UCHAR minCnt ); /** * \brief Write bit stream or account static bits * \param hTpEnc transport encoder handle. If NULL, the function will * not write any bit stream data but only count the amount * of static (signal independent) bits * \param channelMapping Channel mapping info * \param qcOut * \param psyOut * \param qcKernel * \param hBSE * \param aot Audio Object Type being encoded * \param syntaxFlags Flags indicating format specific detail * \param epConfig Error protection config */ AAC_ENCODER_ERROR FDKaacEnc_WriteBitstream (HANDLE_TRANSPORTENC hTpEnc, CHANNEL_MAPPING *channelMapping, QC_OUT* qcOut, PSY_OUT* psyOut, QC_STATE* qcKernel, AUDIO_OBJECT_TYPE aot, UINT syntaxFlags, SCHAR epConfig ); INT FDKaacEnc_writeExtensionData( HANDLE_TRANSPORTENC hTpEnc, QC_OUT_EXTENSION *pExtension, INT elInstanceTag, UINT alignAnchor, UINT syntaxFlags, AUDIO_OBJECT_TYPE aot, SCHAR epConfig ); #endif /* _BITENC_H */ fdk-aac-0.1.3/libAACenc/src/line_pe.h0000644000175000017500000001512112372261464017526 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Werner contents/description: Perceptual entropie module ******************************************************************************/ #ifndef __LINE_PE_H #define __LINE_PE_H #include "common_fix.h" #include "psy_const.h" #define PE_CONSTPART_SHIFT FRACT_BITS typedef struct { /* calculated by FDKaacEnc_prepareSfbPe */ INT sfbNLines[MAX_GROUPED_SFB]; /* number of relevant lines in sfb */ /* the rest is calculated by FDKaacEnc_calcSfbPe */ INT sfbPe[MAX_GROUPED_SFB]; /* pe for each sfb */ INT sfbConstPart[MAX_GROUPED_SFB]; /* constant part for each sfb */ INT sfbNActiveLines[MAX_GROUPED_SFB]; /* number of active lines in sfb */ INT pe; /* sum of sfbPe */ INT constPart; /* sum of sfbConstPart */ INT nActiveLines; /* sum of sfbNActiveLines */ } PE_CHANNEL_DATA; typedef struct { PE_CHANNEL_DATA peChannelData[(2)]; INT pe; INT constPart; INT nActiveLines; INT offset; } PE_DATA; void FDKaacEnc_prepareSfbPe(PE_CHANNEL_DATA *peChanData, const FIXP_DBL *sfbEnergyLdData, const FIXP_DBL *sfbThresholdLdData, const FIXP_DBL *sfbFormFactorLdData, const INT *sfbOffset, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup); void FDKaacEnc_calcSfbPe(PE_CHANNEL_DATA *RESTRICT peChanData, const FIXP_DBL *RESTRICT sfbEnergyLdData, const FIXP_DBL *RESTRICT sfbThresholdLdData, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *isBook, const INT *isScale); #endif fdk-aac-0.1.3/libAACenc/src/adj_thr_data.h0000644000175000017500000001413612372261464020524 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: M. Schug / A. Groeschel contents/description: threshold calculations ******************************************************************************/ #ifndef __ADJ_THR_DATA_H #define __ADJ_THR_DATA_H #include "psy_const.h" typedef struct { FIXP_DBL clipSaveLow, clipSaveHigh; FIXP_DBL minBitSave, maxBitSave; FIXP_DBL clipSpendLow, clipSpendHigh; FIXP_DBL minBitSpend, maxBitSpend; } BRES_PARAM; typedef struct { INT modifyMinSnr; INT startSfbL, startSfbS; } AH_PARAM; typedef struct { FIXP_DBL maxRed; FIXP_DBL startRatio; FIXP_DBL maxRatio; FIXP_DBL redRatioFac; FIXP_DBL redOffs; } MINSNR_ADAPT_PARAM; typedef struct { /* parameters for bitreservoir control */ INT peMin, peMax; /* constant offset to pe */ INT peOffset; /* constant PeFactor */ FIXP_DBL bits2PeFactor_m; INT bits2PeFactor_e; /* avoid hole parameters */ AH_PARAM ahParam; /* values for correction of pe */ /* paramters for adaptation of minSnr */ MINSNR_ADAPT_PARAM minSnrAdaptParam; INT peLast; INT dynBitsLast; FIXP_DBL peCorrectionFactor_m; INT peCorrectionFactor_e; /* vbr encoding */ FIXP_DBL vbrQualFactor; FIXP_DBL chaosMeasureOld; /* threshold weighting */ FIXP_DBL chaosMeasureEnFac[(2)]; INT lastEnFacPatch[(2)]; } ATS_ELEMENT; typedef struct { BRES_PARAM bresParamLong, bresParamShort; ATS_ELEMENT* adjThrStateElem[(8)]; } ADJ_THR_STATE; #endif fdk-aac-0.1.3/libAACenc/src/pre_echo_control.cpp0000644000175000017500000001733112372261464021777 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Pre echo control ******************************************************************************/ #include "pre_echo_control.h" #include "psy_configuration.h" void FDKaacEnc_InitPreEchoControl(FIXP_DBL *RESTRICT pbThresholdNm1, INT *calcPreEcho, INT numPb, FIXP_DBL *RESTRICT sfbPcmQuantThreshold, INT *mdctScalenm1) { *mdctScalenm1 = PCM_QUANT_THR_SCALE>>1; FDKmemcpy(pbThresholdNm1, sfbPcmQuantThreshold, numPb*sizeof(FIXP_DBL)); *calcPreEcho = 1; } void FDKaacEnc_PreEchoControl(FIXP_DBL *RESTRICT pbThresholdNm1, INT calcPreEcho, INT numPb, INT maxAllowedIncreaseFactor, FIXP_SGL minRemainingThresholdFactor, FIXP_DBL *RESTRICT pbThreshold, INT mdctScale, INT *mdctScalenm1) { int i; FIXP_DBL tmpThreshold1, tmpThreshold2; int scaling; /* If lastWindowSequence in previous frame was start- or stop-window, skip preechocontrol calculation */ if (calcPreEcho==0) { /* copy thresholds to internal memory */ FDKmemcpy(pbThresholdNm1, pbThreshold, numPb*sizeof(FIXP_DBL)); *mdctScalenm1 = mdctScale; return; } if ( mdctScale > *mdctScalenm1 ) { /* if current thresholds are downscaled more than the ones from the last block */ scaling = 2*(mdctScale-*mdctScalenm1); for(i = 0; i < numPb; i++) { /* multiplication with return data type fract ist equivalent to int multiplication */ FDK_ASSERT(scaling>=0); tmpThreshold1 = maxAllowedIncreaseFactor * (pbThresholdNm1[i]>>scaling); tmpThreshold2 = fMult(minRemainingThresholdFactor, pbThreshold[i]); FIXP_DBL tmp = pbThreshold[i]; /* copy thresholds to internal memory */ pbThresholdNm1[i] = tmp; tmp = fixMin(tmp, tmpThreshold1); pbThreshold[i] = fixMax(tmp, tmpThreshold2); } } else { /* if thresholds of last block are more downscaled than the current ones */ scaling = 2*(*mdctScalenm1-mdctScale); for(i = 0; i < numPb; i++) { /* multiplication with return data type fract ist equivalent to int multiplication */ tmpThreshold1 = (maxAllowedIncreaseFactor>>1) * pbThresholdNm1[i]; tmpThreshold2 = fMult(minRemainingThresholdFactor, pbThreshold[i]); /* copy thresholds to internal memory */ pbThresholdNm1[i] = pbThreshold[i]; FDK_ASSERT(scaling>=0); if((pbThreshold[i]>>(scaling+1)) > tmpThreshold1) { pbThreshold[i] = tmpThreshold1<<(scaling+1); } pbThreshold[i] = fixMax(pbThreshold[i], tmpThreshold2); } } *mdctScalenm1 = mdctScale; } fdk-aac-0.1.3/libAACenc/src/bandwidth.cpp0000644000175000017500000003111212372261464020410 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************* Fast MPEG AAC Audio Encoder ********************** Initial author: M. Schug / A. Groeschel contents/description: bandwidth expert ******************************************************************************/ #include "channel_map.h" #include "bandwidth.h" #include "aacEnc_ram.h" typedef struct{ INT chanBitRate; INT bandWidthMono; INT bandWidth2AndMoreChan; } BANDWIDTH_TAB; static const BANDWIDTH_TAB bandWidthTable[] = { {0, 3700, 5000}, {12000, 5000, 6400}, {20000, 6900, 9640}, {28000, 9600, 13050}, {40000, 12060, 14260}, {56000, 13950, 15500}, {72000, 14200, 16120}, {96000, 17000, 17000}, {576001,17000, 17000} }; static const BANDWIDTH_TAB bandWidthTable_LD_22050[] = { { 8000, 2000, 2400}, {12000, 2500, 2700}, {16000, 3300, 3100}, {24000, 6250, 7200}, {32000, 9200, 10500}, {40000, 16000, 16000}, {48000, 16000, 16000}, {360001, 16000, 16000} }; static const BANDWIDTH_TAB bandWidthTable_LD_24000[] = { { 8000, 2000, 2000}, {12000, 2000, 2300}, {16000, 2200, 2500}, {24000, 5650, 6400}, {32000, 11600, 12000}, {40000, 12000, 16000}, {48000, 16000, 16000}, {64000, 16000, 16000}, {360001, 16000, 16000} }; static const BANDWIDTH_TAB bandWidthTable_LD_32000[] = { { 8000, 2000, 2000}, {12000, 2000, 2000}, {24000, 4250, 5200}, {32000, 8400, 9000}, {40000, 9400, 11300}, {48000, 11900, 13700}, {64000, 14800, 16000}, {76000, 16000, 16000}, {360001, 16000, 16000} }; static const BANDWIDTH_TAB bandWidthTable_LD_44100[] = { { 8000, 2000, 2000}, {24000, 2000, 2000}, {32000, 4400, 5700}, {40000, 7400, 8800}, {48000, 9000, 10700}, {56000, 11000, 12900}, {64000, 14400, 15500}, {80000, 16000, 16200}, {96000, 16500, 16000}, {128000, 16000, 16000}, {360001, 16000, 16000} }; static const BANDWIDTH_TAB bandWidthTable_LD_48000[] = { { 8000, 2000, 2000}, {24000, 2000, 2000}, {32000, 4400, 5700}, {40000, 7400, 8800}, {48000, 9000, 10700}, {56000, 11000, 12800}, {64000, 14300, 15400}, {80000, 16000, 16200}, {96000, 16500, 16000}, {128000, 16000, 16000}, {360001, 16000, 16000} }; typedef struct{ AACENC_BITRATE_MODE bitrateMode; int bandWidthMono; int bandWidth2AndMoreChan; } BANDWIDTH_TAB_VBR; static const BANDWIDTH_TAB_VBR bandWidthTableVBR[]= { {AACENC_BR_MODE_CBR, 0, 0}, {AACENC_BR_MODE_VBR_1, 13050, 13050}, {AACENC_BR_MODE_VBR_2, 13050, 13050}, {AACENC_BR_MODE_VBR_3, 14260, 14260}, {AACENC_BR_MODE_VBR_4, 15500, 15500}, {AACENC_BR_MODE_VBR_5, 48000, 48000}, {AACENC_BR_MODE_SFR, 0, 0}, {AACENC_BR_MODE_FF, 0, 0} }; static INT GetBandwidthEntry( const INT frameLength, const INT sampleRate, const INT chanBitRate, const INT entryNo) { INT bandwidth = -1; const BANDWIDTH_TAB *pBwTab = NULL; INT bwTabSize = 0; switch (frameLength) { case 1024: pBwTab = bandWidthTable; bwTabSize = sizeof(bandWidthTable)/sizeof(BANDWIDTH_TAB); break; case 480: case 512: switch (sampleRate) { case 8000: case 11025: case 12000: case 16000: case 22050: pBwTab = bandWidthTable_LD_22050; bwTabSize = sizeof(bandWidthTable_LD_22050)/sizeof(BANDWIDTH_TAB); break; case 24000: pBwTab = bandWidthTable_LD_24000; bwTabSize = sizeof(bandWidthTable_LD_24000)/sizeof(BANDWIDTH_TAB); break; case 32000: pBwTab = bandWidthTable_LD_32000; bwTabSize = sizeof(bandWidthTable_LD_32000)/sizeof(BANDWIDTH_TAB); break; case (44100): pBwTab = bandWidthTable_LD_44100; bwTabSize = sizeof(bandWidthTable_LD_44100)/sizeof(BANDWIDTH_TAB); break; case 48000: case 64000: case 88200: case 96000: pBwTab = bandWidthTable_LD_48000; bwTabSize = sizeof(bandWidthTable_LD_48000)/sizeof(BANDWIDTH_TAB); break; } break; default: pBwTab = NULL; bwTabSize = 0; } if (pBwTab!=NULL) { int i; for (i=0; i= pBwTab[i].chanBitRate && chanBitRate < pBwTab[i+1].chanBitRate) { switch (frameLength) { case 1024: bandwidth = (entryNo==0) ? pBwTab[i].bandWidthMono : pBwTab[i].bandWidth2AndMoreChan; break; case 480: case 512: { INT q_res = 0; INT startBw = (entryNo==0) ? pBwTab[i ].bandWidthMono : pBwTab[i ].bandWidth2AndMoreChan; INT endBw = (entryNo==0) ? pBwTab[i+1].bandWidthMono : pBwTab[i+1].bandWidth2AndMoreChan; INT startBr = pBwTab[i].chanBitRate; INT endBr = pBwTab[i+1].chanBitRate; FIXP_DBL bwFac_fix = fDivNorm(chanBitRate-startBr, endBr-startBr, &q_res); bandwidth = (INT)scaleValue(fMult(bwFac_fix, (FIXP_DBL)(endBw-startBw)),q_res) + startBw; } break; default: bandwidth = -1; } break; } /* within bitrate range */ } } /* pBwTab!=NULL */ return bandwidth; } AAC_ENCODER_ERROR FDKaacEnc_DetermineBandWidth(INT* bandWidth, INT proposedBandWidth, INT bitrate, AACENC_BITRATE_MODE bitrateMode, INT sampleRate, INT frameLength, CHANNEL_MAPPING* cm, CHANNEL_MODE encoderMode) { AAC_ENCODER_ERROR ErrorStatus = AAC_ENC_OK; INT chanBitRate = bitrate/cm->nChannels; /* vbr */ switch(bitrateMode){ case AACENC_BR_MODE_VBR_1: case AACENC_BR_MODE_VBR_2: case AACENC_BR_MODE_VBR_3: case AACENC_BR_MODE_VBR_4: case AACENC_BR_MODE_VBR_5: if (proposedBandWidth != 0){ /* use given bw */ *bandWidth = proposedBandWidth; } else { /* take bw from table */ switch(encoderMode){ case MODE_1: *bandWidth = bandWidthTableVBR[bitrateMode].bandWidthMono; break; case MODE_2: case MODE_1_2: case MODE_1_2_1: case MODE_1_2_2: case MODE_1_2_2_1: case MODE_1_2_2_2_1: case MODE_7_1_REAR_SURROUND: case MODE_7_1_FRONT_CENTER: *bandWidth = bandWidthTableVBR[bitrateMode].bandWidth2AndMoreChan; break; default: return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; } } break; case AACENC_BR_MODE_CBR: case AACENC_BR_MODE_SFR: case AACENC_BR_MODE_FF: /* bandwidth limiting */ if (proposedBandWidth != 0) { *bandWidth = FDKmin(proposedBandWidth, FDKmin(20000, sampleRate>>1)); } else { /* search reasonable bandwidth */ int entryNo = 0; switch(encoderMode){ case MODE_1: /* mono */ entryNo = 0; /* use mono bandwith settings */ break; case MODE_2: /* stereo */ case MODE_1_2: /* sce + cpe */ case MODE_1_2_1: /* sce + cpe + sce */ case MODE_1_2_2: /* sce + cpe + cpe */ case MODE_1_2_2_1: /* (5.1) sce + cpe + cpe + lfe */ case MODE_1_2_2_2_1: /* (7.1) sce + cpe + cpe + cpe + lfe */ case MODE_7_1_REAR_SURROUND: case MODE_7_1_FRONT_CENTER: entryNo = 1; /* use stereo bandwith settings */ break; default: return AAC_ENC_UNSUPPORTED_CHANNELCONFIG; } *bandWidth = GetBandwidthEntry( frameLength, sampleRate, chanBitRate, entryNo); if (*bandWidth==-1) { ErrorStatus = AAC_ENC_INVALID_CHANNEL_BITRATE; } } break; default: *bandWidth = 0; return AAC_ENC_UNSUPPORTED_BITRATE_MODE; } *bandWidth = FDKmin(*bandWidth, sampleRate/2); return ErrorStatus;; } fdk-aac-0.1.3/libAACenc/src/noisedet.cpp0000644000175000017500000002364712372261464020274 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Lohwasser contents/description: noisedet.c Routines for Noise Detection ******************************************************************************/ #include "noisedet.h" #include "aacenc_pns.h" #include "pnsparam.h" /***************************************************************************** functionname: FDKaacEnc_fuzzyIsSmaller description: Fuzzy value calculation for "testVal is smaller than refVal" returns: fuzzy value input: test and ref Value, low and high Lim output: return fuzzy value *****************************************************************************/ static FIXP_SGL FDKaacEnc_fuzzyIsSmaller( FIXP_DBL testVal, FIXP_DBL refVal, FIXP_DBL loLim, FIXP_DBL hiLim ) { if (refVal <= FL2FXCONST_DBL(0.0)) return( FL2FXCONST_SGL(0.0f) ); else if (testVal >= fMult((hiLim>>1)+(loLim>>1), refVal)) return( FL2FXCONST_SGL(0.0f) ); else return( (FIXP_SGL)MAXVAL_SGL ); } /***************************************************************************** functionname: FDKaacEnc_noiseDetect description: detect tonal sfb's; two tests Powerdistribution: sfb splittet in four regions, compare the energy in all sections PsychTonality: compare tonality from chaosmeasure with reftonality returns: input: spectrum of one large mdct number of sfb's pointer to offset of sfb's pointer to noiseFuzzyMeasure (modified) noiseparams struct pointer to sfb energies pointer to tonality calculated in chaosmeasure output: noiseFuzzy Measure *****************************************************************************/ void FDKaacEnc_noiseDetect(FIXP_DBL *RESTRICT mdctSpectrum, INT *RESTRICT sfbMaxScaleSpec, INT sfbActive, const INT *RESTRICT sfbOffset, FIXP_SGL *RESTRICT noiseFuzzyMeasure, NOISEPARAMS *np, FIXP_SGL *RESTRICT sfbtonality ) { int i, k, sfb, sfbWidth; FIXP_SGL fuzzy, fuzzyTotal; FIXP_DBL refVal, testVal; /***** Start detection phase *****/ /* Start noise detection for each band based on a number of checks */ for (sfb=0; sfbstartSfb || sfbWidth < np->minSfbWidth) { noiseFuzzyMeasure[sfb] = FL2FXCONST_SGL(0.0f); continue; } if ( (np->detectionAlgorithmFlags & USE_POWER_DISTRIBUTION) && (fuzzyTotal > FL2FXCONST_SGL(0.5f)) ) { FIXP_DBL fhelp1, fhelp2, fhelp3, fhelp4, maxVal, minVal; INT leadingBits = fixMax(0,(sfbMaxScaleSpec[sfb] - 3)); /* max sfbWidth = 96/4 ; 2^5=32 => 5/2 = 3 (spc*spc) */ /* check power distribution in four regions */ fhelp1 = fhelp2 = fhelp3 = fhelp4 = FL2FXCONST_DBL(0.0f); k = sfbWidth >>2; /* Width of a quarter band */ for (i=sfbOffset[sfb]; ipowDistPSDcurve[sfb]); fuzzy = FDKaacEnc_fuzzyIsSmaller(testVal, /* 1/2 * maxValue * PSDcurve */ refVal, /* 1 * minValue */ FL2FXCONST_DBL(0.495), /* 1/2 * loLim (0.99f/2) */ FL2FXCONST_DBL(0.505)); /* 1/2 * hiLim (1.01f/2) */ fuzzyTotal = fixMin(fuzzyTotal, fuzzy); } if ( (np->detectionAlgorithmFlags & USE_PSYCH_TONALITY) && (fuzzyTotal > FL2FXCONST_SGL(0.5f)) ) { /* Detection with tonality-value of psych. acoustic (here: 1 is tonal!)*/ testVal = FX_SGL2FX_DBL(sfbtonality[sfb])>>1; /* 1/2 * sfbTonality */ refVal = np->refTonality; fuzzy = FDKaacEnc_fuzzyIsSmaller(testVal, refVal, FL2FXCONST_DBL(0.45f), /* 1/2 * loLim (0.9f/2) */ FL2FXCONST_DBL(0.55f)); /* 1/2 * hiLim (1.1f/2) */ fuzzyTotal = fixMin(fuzzyTotal, fuzzy); } /* Output of final result */ noiseFuzzyMeasure[sfb] = fuzzyTotal; } } fdk-aac-0.1.3/libAACenc/src/aacEnc_rom.cpp0000644000175000017500000034737312372261464020516 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /****************************************************************************** Initial authors: M. Lohwasser, M. Gayer Contents/description: ******************************************************************************/ #include "aacEnc_rom.h" /* Huffman Tables */ const INT FDKaacEnc_huff_ltab1_2[3][3][3][3]= { { { {0x000b0009,0x00090007,0x000b0009}, {0x000a0008,0x00070006,0x000a0008}, {0x000b0009,0x00090008,0x000b0009} }, { {0x000a0008,0x00070006,0x000a0007}, {0x00070006,0x00050005,0x00070006}, {0x00090007,0x00070006,0x000a0008} }, { {0x000b0009,0x00090007,0x000b0008}, {0x00090008,0x00070006,0x00090008}, {0x000b0009,0x00090007,0x000b0009} } }, { { {0x00090008,0x00070006,0x00090007}, {0x00070006,0x00050005,0x00070006}, {0x00090007,0x00070006,0x00090008} }, { {0x00070006,0x00050005,0x00070006}, {0x00050005,0x00010003,0x00050005}, {0x00070006,0x00050005,0x00070006} }, { {0x00090008,0x00070006,0x00090007}, {0x00070006,0x00050005,0x00070006}, {0x00090008,0x00070006,0x00090008} } }, { { {0x000b0009,0x00090007,0x000b0009}, {0x00090008,0x00070006,0x00090008}, {0x000b0008,0x00090007,0x000b0009} }, { {0x000a0008,0x00070006,0x00090007}, {0x00070006,0x00050004,0x00070006}, {0x00090008,0x00070006,0x000a0007} }, { {0x000b0009,0x00090007,0x000b0009}, {0x000a0007,0x00070006,0x00090008}, {0x000b0009,0x00090007,0x000b0009} } } }; const INT FDKaacEnc_huff_ltab3_4[3][3][3][3]= { { { {0x00010004,0x00040005,0x00080008}, {0x00040005,0x00050004,0x00080008}, {0x00090009,0x00090008,0x000a000b} }, { {0x00040005,0x00060005,0x00090008}, {0x00060005,0x00060004,0x00090008}, {0x00090008,0x00090007,0x000a000a} }, { {0x00090009,0x000a0008,0x000d000b}, {0x00090008,0x00090008,0x000b000a}, {0x000b000b,0x000a000a,0x000c000b} } }, { { {0x00040004,0x00060005,0x000a0008}, {0x00060004,0x00070004,0x000a0008}, {0x000a0008,0x000a0008,0x000c000a} }, { {0x00050004,0x00070004,0x000b0008}, {0x00060004,0x00070004,0x000a0007}, {0x00090008,0x00090007,0x000b0009} }, { {0x00090008,0x000a0008,0x000d000a}, {0x00080007,0x00090007,0x000c0009}, {0x000a000a,0x000b0009,0x000c000a} } }, { { {0x00080008,0x000a0008,0x000f000b}, {0x00090008,0x000b0007,0x000f000a}, {0x000d000b,0x000e000a,0x0010000c} }, { {0x00080008,0x000a0007,0x000e000a}, {0x00090007,0x000a0007,0x000e0009}, {0x000c000a,0x000c0009,0x000f000b} }, { {0x000b000b,0x000c000a,0x0010000c}, {0x000a000a,0x000b0009,0x000f000b}, {0x000c000b,0x000c000a,0x000f000b} } } }; const INT FDKaacEnc_huff_ltab5_6[9][9]= { {0x000d000b, 0x000c000a, 0x000b0009, 0x000b0009, 0x000a0009, 0x000b0009, 0x000b0009, 0x000c000a, 0x000d000b}, {0x000c000a, 0x000b0009, 0x000a0008, 0x00090007, 0x00080007, 0x00090007, 0x000a0008, 0x000b0009, 0x000c000a}, {0x000c0009, 0x000a0008, 0x00090006, 0x00080006, 0x00070006, 0x00080006, 0x00090006, 0x000a0008, 0x000b0009}, {0x000b0009, 0x00090007, 0x00080006, 0x00050004, 0x00040004, 0x00050004, 0x00080006, 0x00090007, 0x000b0009}, {0x000a0009, 0x00080007, 0x00070006, 0x00040004, 0x00010004, 0x00040004, 0x00070006, 0x00080007, 0x000b0009}, {0x000b0009, 0x00090007, 0x00080006, 0x00050004, 0x00040004, 0x00050004, 0x00080006, 0x00090007, 0x000b0009}, {0x000b0009, 0x000a0008, 0x00090006, 0x00080006, 0x00070006, 0x00080006, 0x00090006, 0x000a0008, 0x000b0009}, {0x000c000a, 0x000b0009, 0x000a0008, 0x00090007, 0x00080007, 0x00090007, 0x000a0007, 0x000b0008, 0x000c000a}, {0x000d000b, 0x000c000a, 0x000c0009, 0x000b0009, 0x000a0009, 0x000a0009, 0x000b0009, 0x000c000a, 0x000d000b} }; const INT FDKaacEnc_huff_ltab7_8[8][8]= { {0x00010005, 0x00030004, 0x00060005, 0x00070006, 0x00080007, 0x00090008, 0x000a0009, 0x000b000a}, {0x00030004, 0x00040003, 0x00060004, 0x00070005, 0x00080006, 0x00080007, 0x00090007, 0x00090008}, {0x00060005, 0x00060004, 0x00070004, 0x00080005, 0x00080006, 0x00090007, 0x00090007, 0x000a0008}, {0x00070006, 0x00070005, 0x00080005, 0x00080006, 0x00090006, 0x00090007, 0x000a0008, 0x000a0008}, {0x00080007, 0x00080006, 0x00090006, 0x00090006, 0x000a0007, 0x000a0007, 0x000a0008, 0x000b0009}, {0x00090008, 0x00080007, 0x00090006, 0x00090007, 0x000a0007, 0x000a0008, 0x000b0008, 0x000b000a}, {0x000a0009, 0x00090007, 0x00090007, 0x000a0008, 0x000a0008, 0x000b0008, 0x000c0009, 0x000c0009}, {0x000b000a, 0x000a0008, 0x000a0008, 0x000a0008, 0x000b0009, 0x000b0009, 0x000c0009, 0x000c000a} }; const INT FDKaacEnc_huff_ltab9_10[13][13]= { {0x00010006, 0x00030005, 0x00060006, 0x00080006, 0x00090007, 0x000a0008, 0x000a0009, 0x000b000a, 0x000b000a, 0x000c000a, 0x000c000b, 0x000d000b, 0x000d000c}, {0x00030005, 0x00040004, 0x00060004, 0x00070005, 0x00080006, 0x00080007, 0x00090007, 0x000a0008, 0x000a0008, 0x000a0009, 0x000b000a, 0x000c000a, 0x000c000b}, {0x00060006, 0x00060004, 0x00070005, 0x00080005, 0x00080006, 0x00090006, 0x000a0007, 0x000a0008, 0x000a0008, 0x000b0009, 0x000c0009, 0x000c000a, 0x000c000a}, {0x00080006, 0x00070005, 0x00080005, 0x00090005, 0x00090006, 0x000a0007, 0x000a0007, 0x000b0008, 0x000b0008, 0x000b0009, 0x000c0009, 0x000c000a, 0x000d000a}, {0x00090007, 0x00080006, 0x00090006, 0x00090006, 0x000a0006, 0x000a0007, 0x000b0007, 0x000b0008, 0x000b0008, 0x000c0009, 0x000c0009, 0x000c000a, 0x000d000a}, {0x000a0008, 0x00090007, 0x00090006, 0x000a0007, 0x000b0007, 0x000b0007, 0x000b0008, 0x000c0008, 0x000b0008, 0x000c0009, 0x000c000a, 0x000d000a, 0x000d000b}, {0x000b0009, 0x00090007, 0x000a0007, 0x000b0007, 0x000b0007, 0x000b0008, 0x000c0008, 0x000c0009, 0x000c0009, 0x000c0009, 0x000d000a, 0x000d000a, 0x000d000b}, {0x000b0009, 0x000a0008, 0x000a0008, 0x000b0008, 0x000b0008, 0x000c0008, 0x000c0009, 0x000d0009, 0x000d0009, 0x000d000a, 0x000d000a, 0x000d000b, 0x000d000b}, {0x000b0009, 0x000a0008, 0x000a0008, 0x000b0008, 0x000b0008, 0x000b0008, 0x000c0009, 0x000c0009, 0x000d000a, 0x000d000a, 0x000e000a, 0x000d000b, 0x000e000b}, {0x000b000a, 0x000a0009, 0x000b0009, 0x000b0009, 0x000c0009, 0x000c0009, 0x000c0009, 0x000c000a, 0x000d000a, 0x000d000a, 0x000e000b, 0x000e000b, 0x000e000c}, {0x000c000a, 0x000b0009, 0x000b0009, 0x000c0009, 0x000c0009, 0x000c000a, 0x000d000a, 0x000d000a, 0x000d000a, 0x000e000b, 0x000e000b, 0x000e000b, 0x000f000c}, {0x000c000b, 0x000b000a, 0x000c0009, 0x000c000a, 0x000c000a, 0x000d000a, 0x000d000a, 0x000d000a, 0x000d000b, 0x000e000b, 0x000e000b, 0x000f000b, 0x000f000c}, {0x000d000b, 0x000c000a, 0x000c000a, 0x000c000a, 0x000d000a, 0x000d000a, 0x000d000a, 0x000d000b, 0x000e000b, 0x000e000c, 0x000e000c, 0x000e000c, 0x000f000c} }; const UCHAR FDKaacEnc_huff_ltab11[17][17]= { {0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0b, 0x0c, 0x0c, 0x0a}, {0x05, 0x04, 0x05, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x08}, {0x06, 0x05, 0x05, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x08, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x08, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08}, {0x0a, 0x09, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x08}, {0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x08}, {0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0b, 0x0b, 0x08}, {0x0b, 0x0a, 0x09, 0x09, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x08}, {0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09}, {0x0b, 0x0a, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09}, {0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09}, {0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x09}, {0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x05} }; const UCHAR FDKaacEnc_huff_ltabscf[121]= { 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x13, 0x12, 0x11, 0x11, 0x10, 0x11, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04, 0x03, 0x01, 0x04, 0x04, 0x05, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x10, 0x0f, 0x10, 0x0f, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13 }; const USHORT FDKaacEnc_huff_ctab1[3][3][3][3]= { { { {0x07f8,0x01f1,0x07fd}, {0x03f5,0x0068,0x03f0}, {0x07f7,0x01ec,0x07f5} }, { {0x03f1,0x0072,0x03f4}, {0x0074,0x0011,0x0076}, {0x01eb,0x006c,0x03f6} }, { {0x07fc,0x01e1,0x07f1}, {0x01f0,0x0061,0x01f6}, {0x07f2,0x01ea,0x07fb} } }, { { {0x01f2,0x0069,0x01ed}, {0x0077,0x0017,0x006f}, {0x01e6,0x0064,0x01e5} }, { {0x0067,0x0015,0x0062}, {0x0012,0x0000,0x0014}, {0x0065,0x0016,0x006d} }, { {0x01e9,0x0063,0x01e4}, {0x006b,0x0013,0x0071}, {0x01e3,0x0070,0x01f3} } }, { { {0x07fe,0x01e7,0x07f3}, {0x01ef,0x0060,0x01ee}, {0x07f0,0x01e2,0x07fa} }, { {0x03f3,0x006a,0x01e8}, {0x0075,0x0010,0x0073}, {0x01f4,0x006e,0x03f7} }, { {0x07f6,0x01e0,0x07f9}, {0x03f2,0x0066,0x01f5}, {0x07ff,0x01f7,0x07f4} } } }; const USHORT FDKaacEnc_huff_ctab2[3][3][3][3]= { { { {0x01f3,0x006f,0x01fd}, {0x00eb,0x0023,0x00ea}, {0x01f7,0x00e8,0x01fa} }, { {0x00f2,0x002d,0x0070}, {0x0020,0x0006,0x002b}, {0x006e,0x0028,0x00e9} }, { {0x01f9,0x0066,0x00f8}, {0x00e7,0x001b,0x00f1}, {0x01f4,0x006b,0x01f5} } }, { { {0x00ec,0x002a,0x006c}, {0x002c,0x000a,0x0027}, {0x0067,0x001a,0x00f5} }, { {0x0024,0x0008,0x001f}, {0x0009,0x0000,0x0007}, {0x001d,0x000b,0x0030} }, { {0x00ef,0x001c,0x0064}, {0x001e,0x000c,0x0029}, {0x00f3,0x002f,0x00f0} } }, { { {0x01fc,0x0071,0x01f2}, {0x00f4,0x0021,0x00e6}, {0x00f7,0x0068,0x01f8} }, { {0x00ee,0x0022,0x0065}, {0x0031,0x0002,0x0026}, {0x00ed,0x0025,0x006a} }, { {0x01fb,0x0072,0x01fe}, {0x0069,0x002e,0x00f6}, {0x01ff,0x006d,0x01f6} } } }; const USHORT FDKaacEnc_huff_ctab3[3][3][3][3]= { { { {0x0000,0x0009,0x00ef}, {0x000b,0x0019,0x00f0}, {0x01eb,0x01e6,0x03f2} }, { {0x000a,0x0035,0x01ef}, {0x0034,0x0037,0x01e9}, {0x01ed,0x01e7,0x03f3} }, { {0x01ee,0x03ed,0x1ffa}, {0x01ec,0x01f2,0x07f9}, {0x07f8,0x03f8,0x0ff8} } }, { { {0x0008,0x0038,0x03f6}, {0x0036,0x0075,0x03f1}, {0x03eb,0x03ec,0x0ff4} }, { {0x0018,0x0076,0x07f4}, {0x0039,0x0074,0x03ef}, {0x01f3,0x01f4,0x07f6} }, { {0x01e8,0x03ea,0x1ffc}, {0x00f2,0x01f1,0x0ffb}, {0x03f5,0x07f3,0x0ffc} } }, { { {0x00ee,0x03f7,0x7ffe}, {0x01f0,0x07f5,0x7ffd}, {0x1ffb,0x3ffa,0xffff} }, { {0x00f1,0x03f0,0x3ffc}, {0x01ea,0x03ee,0x3ffb}, {0x0ff6,0x0ffa,0x7ffc} }, { {0x07f2,0x0ff5,0xfffe}, {0x03f4,0x07f7,0x7ffb}, {0x0ff7,0x0ff9,0x7ffa} } } }; const USHORT FDKaacEnc_huff_ctab4[3][3][3][3]= { { { {0x0007,0x0016,0x00f6}, {0x0018,0x0008,0x00ef}, {0x01ef,0x00f3,0x07f8} }, { {0x0019,0x0017,0x00ed}, {0x0015,0x0001,0x00e2}, {0x00f0,0x0070,0x03f0} }, { {0x01ee,0x00f1,0x07fa}, {0x00ee,0x00e4,0x03f2}, {0x07f6,0x03ef,0x07fd} } }, { { {0x0005,0x0014,0x00f2}, {0x0009,0x0004,0x00e5}, {0x00f4,0x00e8,0x03f4} }, { {0x0006,0x0002,0x00e7}, {0x0003,0x0000,0x006b}, {0x00e3,0x0069,0x01f3} }, { {0x00eb,0x00e6,0x03f6}, {0x006e,0x006a,0x01f4}, {0x03ec,0x01f0,0x03f9} } }, { { {0x00f5,0x00ec,0x07fb}, {0x00ea,0x006f,0x03f7}, {0x07f9,0x03f3,0x0fff} }, { {0x00e9,0x006d,0x03f8}, {0x006c,0x0068,0x01f5}, {0x03ee,0x01f2,0x07f4} }, { {0x07f7,0x03f1,0x0ffe}, {0x03ed,0x01f1,0x07f5}, {0x07fe,0x03f5,0x07fc} } } }; const USHORT FDKaacEnc_huff_ctab5[9][9]= { {0x1fff, 0x0ff7, 0x07f4, 0x07e8, 0x03f1, 0x07ee, 0x07f9, 0x0ff8, 0x1ffd}, {0x0ffd, 0x07f1, 0x03e8, 0x01e8, 0x00f0, 0x01ec, 0x03ee, 0x07f2, 0x0ffa}, {0x0ff4, 0x03ef, 0x01f2, 0x00e8, 0x0070, 0x00ec, 0x01f0, 0x03ea, 0x07f3}, {0x07eb, 0x01eb, 0x00ea, 0x001a, 0x0008, 0x0019, 0x00ee, 0x01ef, 0x07ed}, {0x03f0, 0x00f2, 0x0073, 0x000b, 0x0000, 0x000a, 0x0071, 0x00f3, 0x07e9}, {0x07ef, 0x01ee, 0x00ef, 0x0018, 0x0009, 0x001b, 0x00eb, 0x01e9, 0x07ec}, {0x07f6, 0x03eb, 0x01f3, 0x00ed, 0x0072, 0x00e9, 0x01f1, 0x03ed, 0x07f7}, {0x0ff6, 0x07f0, 0x03e9, 0x01ed, 0x00f1, 0x01ea, 0x03ec, 0x07f8, 0x0ff9}, {0x1ffc, 0x0ffc, 0x0ff5, 0x07ea, 0x03f3, 0x03f2, 0x07f5, 0x0ffb, 0x1ffe} }; const USHORT FDKaacEnc_huff_ctab6[9][9]= { {0x07fe, 0x03fd, 0x01f1, 0x01eb, 0x01f4, 0x01ea, 0x01f0, 0x03fc, 0x07fd}, {0x03f6, 0x01e5, 0x00ea, 0x006c, 0x0071, 0x0068, 0x00f0, 0x01e6, 0x03f7}, {0x01f3, 0x00ef, 0x0032, 0x0027, 0x0028, 0x0026, 0x0031, 0x00eb, 0x01f7}, {0x01e8, 0x006f, 0x002e, 0x0008, 0x0004, 0x0006, 0x0029, 0x006b, 0x01ee}, {0x01ef, 0x0072, 0x002d, 0x0002, 0x0000, 0x0003, 0x002f, 0x0073, 0x01fa}, {0x01e7, 0x006e, 0x002b, 0x0007, 0x0001, 0x0005, 0x002c, 0x006d, 0x01ec}, {0x01f9, 0x00ee, 0x0030, 0x0024, 0x002a, 0x0025, 0x0033, 0x00ec, 0x01f2}, {0x03f8, 0x01e4, 0x00ed, 0x006a, 0x0070, 0x0069, 0x0074, 0x00f1, 0x03fa}, {0x07ff, 0x03f9, 0x01f6, 0x01ed, 0x01f8, 0x01e9, 0x01f5, 0x03fb, 0x07fc} }; const USHORT FDKaacEnc_huff_ctab7[8][8]= { {0x0000, 0x0005, 0x0037, 0x0074, 0x00f2, 0x01eb, 0x03ed, 0x07f7}, {0x0004, 0x000c, 0x0035, 0x0071, 0x00ec, 0x00ee, 0x01ee, 0x01f5}, {0x0036, 0x0034, 0x0072, 0x00ea, 0x00f1, 0x01e9, 0x01f3, 0x03f5}, {0x0073, 0x0070, 0x00eb, 0x00f0, 0x01f1, 0x01f0, 0x03ec, 0x03fa}, {0x00f3, 0x00ed, 0x01e8, 0x01ef, 0x03ef, 0x03f1, 0x03f9, 0x07fb}, {0x01ed, 0x00ef, 0x01ea, 0x01f2, 0x03f3, 0x03f8, 0x07f9, 0x07fc}, {0x03ee, 0x01ec, 0x01f4, 0x03f4, 0x03f7, 0x07f8, 0x0ffd, 0x0ffe}, {0x07f6, 0x03f0, 0x03f2, 0x03f6, 0x07fa, 0x07fd, 0x0ffc, 0x0fff} }; const USHORT FDKaacEnc_huff_ctab8[8][8]= { {0x000e, 0x0005, 0x0010, 0x0030, 0x006f, 0x00f1, 0x01fa, 0x03fe}, {0x0003, 0x0000, 0x0004, 0x0012, 0x002c, 0x006a, 0x0075, 0x00f8}, {0x000f, 0x0002, 0x0006, 0x0014, 0x002e, 0x0069, 0x0072, 0x00f5}, {0x002f, 0x0011, 0x0013, 0x002a, 0x0032, 0x006c, 0x00ec, 0x00fa}, {0x0071, 0x002b, 0x002d, 0x0031, 0x006d, 0x0070, 0x00f2, 0x01f9}, {0x00ef, 0x0068, 0x0033, 0x006b, 0x006e, 0x00ee, 0x00f9, 0x03fc}, {0x01f8, 0x0074, 0x0073, 0x00ed, 0x00f0, 0x00f6, 0x01f6, 0x01fd}, {0x03fd, 0x00f3, 0x00f4, 0x00f7, 0x01f7, 0x01fb, 0x01fc, 0x03ff} }; const USHORT FDKaacEnc_huff_ctab9[13][13]= { {0x0000, 0x0005, 0x0037, 0x00e7, 0x01de, 0x03ce, 0x03d9, 0x07c8, 0x07cd, 0x0fc8, 0x0fdd, 0x1fe4, 0x1fec}, {0x0004, 0x000c, 0x0035, 0x0072, 0x00ea, 0x00ed, 0x01e2, 0x03d1, 0x03d3, 0x03e0, 0x07d8, 0x0fcf, 0x0fd5}, {0x0036, 0x0034, 0x0071, 0x00e8, 0x00ec, 0x01e1, 0x03cf, 0x03dd, 0x03db, 0x07d0, 0x0fc7, 0x0fd4, 0x0fe4}, {0x00e6, 0x0070, 0x00e9, 0x01dd, 0x01e3, 0x03d2, 0x03dc, 0x07cc, 0x07ca, 0x07de, 0x0fd8, 0x0fea, 0x1fdb}, {0x01df, 0x00eb, 0x01dc, 0x01e6, 0x03d5, 0x03de, 0x07cb, 0x07dd, 0x07dc, 0x0fcd, 0x0fe2, 0x0fe7, 0x1fe1}, {0x03d0, 0x01e0, 0x01e4, 0x03d6, 0x07c5, 0x07d1, 0x07db, 0x0fd2, 0x07e0, 0x0fd9, 0x0feb, 0x1fe3, 0x1fe9}, {0x07c4, 0x01e5, 0x03d7, 0x07c6, 0x07cf, 0x07da, 0x0fcb, 0x0fda, 0x0fe3, 0x0fe9, 0x1fe6, 0x1ff3, 0x1ff7}, {0x07d3, 0x03d8, 0x03e1, 0x07d4, 0x07d9, 0x0fd3, 0x0fde, 0x1fdd, 0x1fd9, 0x1fe2, 0x1fea, 0x1ff1, 0x1ff6}, {0x07d2, 0x03d4, 0x03da, 0x07c7, 0x07d7, 0x07e2, 0x0fce, 0x0fdb, 0x1fd8, 0x1fee, 0x3ff0, 0x1ff4, 0x3ff2}, {0x07e1, 0x03df, 0x07c9, 0x07d6, 0x0fca, 0x0fd0, 0x0fe5, 0x0fe6, 0x1feb, 0x1fef, 0x3ff3, 0x3ff4, 0x3ff5}, {0x0fe0, 0x07ce, 0x07d5, 0x0fc6, 0x0fd1, 0x0fe1, 0x1fe0, 0x1fe8, 0x1ff0, 0x3ff1, 0x3ff8, 0x3ff6, 0x7ffc}, {0x0fe8, 0x07df, 0x0fc9, 0x0fd7, 0x0fdc, 0x1fdc, 0x1fdf, 0x1fed, 0x1ff5, 0x3ff9, 0x3ffb, 0x7ffd, 0x7ffe}, {0x1fe7, 0x0fcc, 0x0fd6, 0x0fdf, 0x1fde, 0x1fda, 0x1fe5, 0x1ff2, 0x3ffa, 0x3ff7, 0x3ffc, 0x3ffd, 0x7fff} }; const USHORT FDKaacEnc_huff_ctab10[13][13]= { {0x0022, 0x0008, 0x001d, 0x0026, 0x005f, 0x00d3, 0x01cf, 0x03d0, 0x03d7, 0x03ed, 0x07f0, 0x07f6, 0x0ffd}, {0x0007, 0x0000, 0x0001, 0x0009, 0x0020, 0x0054, 0x0060, 0x00d5, 0x00dc, 0x01d4, 0x03cd, 0x03de, 0x07e7}, {0x001c, 0x0002, 0x0006, 0x000c, 0x001e, 0x0028, 0x005b, 0x00cd, 0x00d9, 0x01ce, 0x01dc, 0x03d9, 0x03f1}, {0x0025, 0x000b, 0x000a, 0x000d, 0x0024, 0x0057, 0x0061, 0x00cc, 0x00dd, 0x01cc, 0x01de, 0x03d3, 0x03e7}, {0x005d, 0x0021, 0x001f, 0x0023, 0x0027, 0x0059, 0x0064, 0x00d8, 0x00df, 0x01d2, 0x01e2, 0x03dd, 0x03ee}, {0x00d1, 0x0055, 0x0029, 0x0056, 0x0058, 0x0062, 0x00ce, 0x00e0, 0x00e2, 0x01da, 0x03d4, 0x03e3, 0x07eb}, {0x01c9, 0x005e, 0x005a, 0x005c, 0x0063, 0x00ca, 0x00da, 0x01c7, 0x01ca, 0x01e0, 0x03db, 0x03e8, 0x07ec}, {0x01e3, 0x00d2, 0x00cb, 0x00d0, 0x00d7, 0x00db, 0x01c6, 0x01d5, 0x01d8, 0x03ca, 0x03da, 0x07ea, 0x07f1}, {0x01e1, 0x00d4, 0x00cf, 0x00d6, 0x00de, 0x00e1, 0x01d0, 0x01d6, 0x03d1, 0x03d5, 0x03f2, 0x07ee, 0x07fb}, {0x03e9, 0x01cd, 0x01c8, 0x01cb, 0x01d1, 0x01d7, 0x01df, 0x03cf, 0x03e0, 0x03ef, 0x07e6, 0x07f8, 0x0ffa}, {0x03eb, 0x01dd, 0x01d3, 0x01d9, 0x01db, 0x03d2, 0x03cc, 0x03dc, 0x03ea, 0x07ed, 0x07f3, 0x07f9, 0x0ff9}, {0x07f2, 0x03ce, 0x01e4, 0x03cb, 0x03d8, 0x03d6, 0x03e2, 0x03e5, 0x07e8, 0x07f4, 0x07f5, 0x07f7, 0x0ffb}, {0x07fa, 0x03ec, 0x03df, 0x03e1, 0x03e4, 0x03e6, 0x03f0, 0x07e9, 0x07ef, 0x0ff8, 0x0ffe, 0x0ffc, 0x0fff} }; const USHORT FDKaacEnc_huff_ctab11[21][17]= { {0x0000, 0x0006, 0x0019, 0x003d, 0x009c, 0x00c6, 0x01a7, 0x0390, 0x03c2, 0x03df, 0x07e6, 0x07f3, 0x0ffb, 0x07ec, 0x0ffa, 0x0ffe, 0x038e}, {0x0005, 0x0001, 0x0008, 0x0014, 0x0037, 0x0042, 0x0092, 0x00af, 0x0191, 0x01a5, 0x01b5, 0x039e, 0x03c0, 0x03a2, 0x03cd, 0x07d6, 0x00ae}, {0x0017, 0x0007, 0x0009, 0x0018, 0x0039, 0x0040, 0x008e, 0x00a3, 0x00b8, 0x0199, 0x01ac, 0x01c1, 0x03b1, 0x0396, 0x03be, 0x03ca, 0x009d}, {0x003c, 0x0015, 0x0016, 0x001a, 0x003b, 0x0044, 0x0091, 0x00a5, 0x00be, 0x0196, 0x01ae, 0x01b9, 0x03a1, 0x0391, 0x03a5, 0x03d5, 0x0094}, {0x009a, 0x0036, 0x0038, 0x003a, 0x0041, 0x008c, 0x009b, 0x00b0, 0x00c3, 0x019e, 0x01ab, 0x01bc, 0x039f, 0x038f, 0x03a9, 0x03cf, 0x0093}, {0x00bf, 0x003e, 0x003f, 0x0043, 0x0045, 0x009e, 0x00a7, 0x00b9, 0x0194, 0x01a2, 0x01ba, 0x01c3, 0x03a6, 0x03a7, 0x03bb, 0x03d4, 0x009f}, {0x01a0, 0x008f, 0x008d, 0x0090, 0x0098, 0x00a6, 0x00b6, 0x00c4, 0x019f, 0x01af, 0x01bf, 0x0399, 0x03bf, 0x03b4, 0x03c9, 0x03e7, 0x00a8}, {0x01b6, 0x00ab, 0x00a4, 0x00aa, 0x00b2, 0x00c2, 0x00c5, 0x0198, 0x01a4, 0x01b8, 0x038c, 0x03a4, 0x03c4, 0x03c6, 0x03dd, 0x03e8, 0x00ad}, {0x03af, 0x0192, 0x00bd, 0x00bc, 0x018e, 0x0197, 0x019a, 0x01a3, 0x01b1, 0x038d, 0x0398, 0x03b7, 0x03d3, 0x03d1, 0x03db, 0x07dd, 0x00b4}, {0x03de, 0x01a9, 0x019b, 0x019c, 0x01a1, 0x01aa, 0x01ad, 0x01b3, 0x038b, 0x03b2, 0x03b8, 0x03ce, 0x03e1, 0x03e0, 0x07d2, 0x07e5, 0x00b7}, {0x07e3, 0x01bb, 0x01a8, 0x01a6, 0x01b0, 0x01b2, 0x01b7, 0x039b, 0x039a, 0x03ba, 0x03b5, 0x03d6, 0x07d7, 0x03e4, 0x07d8, 0x07ea, 0x00ba}, {0x07e8, 0x03a0, 0x01bd, 0x01b4, 0x038a, 0x01c4, 0x0392, 0x03aa, 0x03b0, 0x03bc, 0x03d7, 0x07d4, 0x07dc, 0x07db, 0x07d5, 0x07f0, 0x00c1}, {0x07fb, 0x03c8, 0x03a3, 0x0395, 0x039d, 0x03ac, 0x03ae, 0x03c5, 0x03d8, 0x03e2, 0x03e6, 0x07e4, 0x07e7, 0x07e0, 0x07e9, 0x07f7, 0x0190}, {0x07f2, 0x0393, 0x01be, 0x01c0, 0x0394, 0x0397, 0x03ad, 0x03c3, 0x03c1, 0x03d2, 0x07da, 0x07d9, 0x07df, 0x07eb, 0x07f4, 0x07fa, 0x0195}, {0x07f8, 0x03bd, 0x039c, 0x03ab, 0x03a8, 0x03b3, 0x03b9, 0x03d0, 0x03e3, 0x03e5, 0x07e2, 0x07de, 0x07ed, 0x07f1, 0x07f9, 0x07fc, 0x0193}, {0x0ffd, 0x03dc, 0x03b6, 0x03c7, 0x03cc, 0x03cb, 0x03d9, 0x03da, 0x07d3, 0x07e1, 0x07ee, 0x07ef, 0x07f5, 0x07f6, 0x0ffc, 0x0fff, 0x019d}, {0x01c2, 0x00b5, 0x00a1, 0x0096, 0x0097, 0x0095, 0x0099, 0x00a0, 0x00a2, 0x00ac, 0x00a9, 0x00b1, 0x00b3, 0x00bb, 0x00c0, 0x018f, 0x0004}, {0x0018, 0x002e, 0x0000, 0x005a, 0x00a5, 0x00f8, 0x00b7, 0x0094, 0x00f9, 0x004d, 0x0021, 0x002b, 0x004f, 0x007b, 0x00bc, 0x0046, 0x0015}, {0x0042, 0x0037, 0x0078, 0x000d, 0x0068, 0x005f, 0x000d, 0x005e, 0x005a, 0x00be, 0x0063, 0x007e, 0x001f, 0x0092, 0x001a, 0x00ab, 0x0032}, {0x00e6, 0x0037, 0x0000, 0x0058, 0x000b, 0x005a, 0x00e1, 0x005d, 0x0029, 0x0017, 0x007e, 0x0069, 0x00aa, 0x0054, 0x0029, 0x0032, 0x0041}, {0x0046, 0x00ea, 0x0034, 0x00ea, 0x0011, 0x001b, 0x00a9, 0x0094, 0x00e2, 0x0031, 0x00d0, 0x00e5, 0x0007, 0x0070, 0x0069, 0x003e, 0x0021} }; const INT FDKaacEnc_huff_ctabscf[121]= { 0x0003ffe8, 0x0003ffe6, 0x0003ffe7, 0x0003ffe5, 0x0007fff5, 0x0007fff1, 0x0007ffed, 0x0007fff6, 0x0007ffee, 0x0007ffef, 0x0007fff0, 0x0007fffc, 0x0007fffd, 0x0007ffff, 0x0007fffe, 0x0007fff7, 0x0007fff8, 0x0007fffb, 0x0007fff9, 0x0003ffe4, 0x0007fffa, 0x0003ffe3, 0x0001ffef, 0x0001fff0, 0x0000fff5, 0x0001ffee, 0x0000fff2, 0x0000fff3, 0x0000fff4, 0x0000fff1, 0x00007ff6, 0x00007ff7, 0x00003ff9, 0x00003ff5, 0x00003ff7, 0x00003ff3, 0x00003ff6, 0x00003ff2, 0x00001ff7, 0x00001ff5, 0x00000ff9, 0x00000ff7, 0x00000ff6, 0x000007f9, 0x00000ff4, 0x000007f8, 0x000003f9, 0x000003f7, 0x000003f5, 0x000001f8, 0x000001f7, 0x000000fa, 0x000000f8, 0x000000f6, 0x00000079, 0x0000003a, 0x00000038, 0x0000001a, 0x0000000b, 0x00000004, 0x00000000, 0x0000000a, 0x0000000c, 0x0000001b, 0x00000039, 0x0000003b, 0x00000078, 0x0000007a, 0x000000f7, 0x000000f9, 0x000001f6, 0x000001f9, 0x000003f4, 0x000003f6, 0x000003f8, 0x000007f5, 0x000007f4, 0x000007f6, 0x000007f7, 0x00000ff5, 0x00000ff8, 0x00001ff4, 0x00001ff6, 0x00001ff8, 0x00003ff8, 0x00003ff4, 0x0000fff0, 0x00007ff4, 0x0000fff6, 0x00007ff5, 0x0003ffe2, 0x0007ffd9, 0x0007ffda, 0x0007ffdb, 0x0007ffdc, 0x0007ffdd, 0x0007ffde, 0x0007ffd8, 0x0007ffd2, 0x0007ffd3, 0x0007ffd4, 0x0007ffd5, 0x0007ffd6, 0x0007fff2, 0x0007ffdf, 0x0007ffe7, 0x0007ffe8, 0x0007ffe9, 0x0007ffea, 0x0007ffeb, 0x0007ffe6, 0x0007ffe0, 0x0007ffe1, 0x0007ffe2, 0x0007ffe3, 0x0007ffe4, 0x0007ffe5, 0x0007ffd7, 0x0007ffec, 0x0007fff4, 0x0007fff3 }; /* table of (0.50000...1.00000) ^0.75 */ const FIXP_QTD FDKaacEnc_mTab_3_4[MANT_SIZE] = { QTC(0x4c1bf829), QTC(0x4c3880de), QTC(0x4c550603), QTC(0x4c71879c), QTC(0x4c8e05aa), QTC(0x4caa8030), QTC(0x4cc6f72f), QTC(0x4ce36aab), QTC(0x4cffdaa4), QTC(0x4d1c471d), QTC(0x4d38b019), QTC(0x4d55159a), QTC(0x4d7177a1), QTC(0x4d8dd631), QTC(0x4daa314b), QTC(0x4dc688f3), QTC(0x4de2dd2a), QTC(0x4dff2df2), QTC(0x4e1b7b4d), QTC(0x4e37c53d), QTC(0x4e540bc5), QTC(0x4e704ee6), QTC(0x4e8c8ea3), QTC(0x4ea8cafd), QTC(0x4ec503f7), QTC(0x4ee13992), QTC(0x4efd6bd0), QTC(0x4f199ab4), QTC(0x4f35c640), QTC(0x4f51ee75), QTC(0x4f6e1356), QTC(0x4f8a34e4), QTC(0x4fa65321), QTC(0x4fc26e10), QTC(0x4fde85b2), QTC(0x4ffa9a0a), QTC(0x5016ab18), QTC(0x5032b8e0), QTC(0x504ec362), QTC(0x506acaa1), QTC(0x5086cea0), QTC(0x50a2cf5e), QTC(0x50becce0), QTC(0x50dac725), QTC(0x50f6be31), QTC(0x5112b205), QTC(0x512ea2a3), QTC(0x514a900d), QTC(0x51667a45), QTC(0x5182614c), QTC(0x519e4524), QTC(0x51ba25cf), QTC(0x51d60350), QTC(0x51f1dda7), QTC(0x520db4d6), QTC(0x522988e0), QTC(0x524559c6), QTC(0x52612789), QTC(0x527cf22d), QTC(0x5298b9b1), QTC(0x52b47e19), QTC(0x52d03f65), QTC(0x52ebfd98), QTC(0x5307b8b4), QTC(0x532370b9), QTC(0x533f25aa), QTC(0x535ad789), QTC(0x53768656), QTC(0x53923215), QTC(0x53addac6), QTC(0x53c9806b), QTC(0x53e52306), QTC(0x5400c298), QTC(0x541c5f24), QTC(0x5437f8ab), QTC(0x54538f2e), QTC(0x546f22af), QTC(0x548ab330), QTC(0x54a640b3), QTC(0x54c1cb38), QTC(0x54dd52c2), QTC(0x54f8d753), QTC(0x551458eb), QTC(0x552fd78d), QTC(0x554b5339), QTC(0x5566cbf3), QTC(0x558241bb), QTC(0x559db492), QTC(0x55b9247b), QTC(0x55d49177), QTC(0x55effb87), QTC(0x560b62ad), QTC(0x5626c6eb), QTC(0x56422842), QTC(0x565d86b4), QTC(0x5678e242), QTC(0x56943aee), QTC(0x56af90b9), QTC(0x56cae3a4), QTC(0x56e633b2), QTC(0x570180e4), QTC(0x571ccb3b), QTC(0x573812b8), QTC(0x5753575e), QTC(0x576e992e), QTC(0x5789d829), QTC(0x57a51450), QTC(0x57c04da6), QTC(0x57db842b), QTC(0x57f6b7e1), QTC(0x5811e8c9), QTC(0x582d16e6), QTC(0x58484238), QTC(0x58636ac0), QTC(0x587e9081), QTC(0x5899b37c), QTC(0x58b4d3b1), QTC(0x58cff123), QTC(0x58eb0bd3), QTC(0x590623c2), QTC(0x592138f2), QTC(0x593c4b63), QTC(0x59575b19), QTC(0x59726812), QTC(0x598d7253), QTC(0x59a879da), QTC(0x59c37eab), QTC(0x59de80c6), QTC(0x59f9802d), QTC(0x5a147ce0), QTC(0x5a2f76e2), QTC(0x5a4a6e34), QTC(0x5a6562d6), QTC(0x5a8054cb), QTC(0x5a9b4414), QTC(0x5ab630b2), QTC(0x5ad11aa6), QTC(0x5aec01f1), QTC(0x5b06e696), QTC(0x5b21c895), QTC(0x5b3ca7ef), QTC(0x5b5784a6), QTC(0x5b725ebc), QTC(0x5b8d3631), QTC(0x5ba80b06), QTC(0x5bc2dd3e), QTC(0x5bddacd9), QTC(0x5bf879d8), QTC(0x5c13443d), QTC(0x5c2e0c09), QTC(0x5c48d13e), QTC(0x5c6393dc), QTC(0x5c7e53e5), QTC(0x5c99115a), QTC(0x5cb3cc3c), QTC(0x5cce848d), QTC(0x5ce93a4e), QTC(0x5d03ed80), QTC(0x5d1e9e24), QTC(0x5d394c3b), QTC(0x5d53f7c7), QTC(0x5d6ea0c9), QTC(0x5d894742), QTC(0x5da3eb33), QTC(0x5dbe8c9e), QTC(0x5dd92b84), QTC(0x5df3c7e5), QTC(0x5e0e61c3), QTC(0x5e28f920), QTC(0x5e438dfc), QTC(0x5e5e2059), QTC(0x5e78b037), QTC(0x5e933d99), QTC(0x5eadc87e), QTC(0x5ec850e9), QTC(0x5ee2d6da), QTC(0x5efd5a53), QTC(0x5f17db54), QTC(0x5f3259e0), QTC(0x5f4cd5f6), QTC(0x5f674f99), QTC(0x5f81c6c8), QTC(0x5f9c3b87), QTC(0x5fb6add4), QTC(0x5fd11db3), QTC(0x5feb8b23), QTC(0x6005f626), QTC(0x60205ebd), QTC(0x603ac4e9), QTC(0x605528ac), QTC(0x606f8a05), QTC(0x6089e8f7), QTC(0x60a44583), QTC(0x60be9fa9), QTC(0x60d8f76b), QTC(0x60f34cca), QTC(0x610d9fc7), QTC(0x6127f062), QTC(0x61423e9e), QTC(0x615c8a7a), QTC(0x6176d3f9), QTC(0x61911b1b), QTC(0x61ab5fe1), QTC(0x61c5a24d), QTC(0x61dfe25f), QTC(0x61fa2018), QTC(0x62145b7a), QTC(0x622e9485), QTC(0x6248cb3b), QTC(0x6262ff9d), QTC(0x627d31ab), QTC(0x62976167), QTC(0x62b18ed1), QTC(0x62cbb9eb), QTC(0x62e5e2b6), QTC(0x63000933), QTC(0x631a2d62), QTC(0x63344f45), QTC(0x634e6edd), QTC(0x63688c2b), QTC(0x6382a730), QTC(0x639cbfec), QTC(0x63b6d661), QTC(0x63d0ea90), QTC(0x63eafc7a), QTC(0x64050c1f), QTC(0x641f1982), QTC(0x643924a2), QTC(0x64532d80), QTC(0x646d341f), QTC(0x6487387e), QTC(0x64a13a9e), QTC(0x64bb3a81), QTC(0x64d53828), QTC(0x64ef3393), QTC(0x65092cc4), QTC(0x652323bb), QTC(0x653d1879), QTC(0x65570b00), QTC(0x6570fb50), QTC(0x658ae96b), QTC(0x65a4d550), QTC(0x65bebf01), QTC(0x65d8a680), QTC(0x65f28bcc), QTC(0x660c6ee8), QTC(0x66264fd3), QTC(0x66402e8f), QTC(0x665a0b1c), QTC(0x6673e57d), QTC(0x668dbdb0), QTC(0x66a793b8), QTC(0x66c16795), QTC(0x66db3949), QTC(0x66f508d4), QTC(0x670ed636), QTC(0x6728a172), QTC(0x67426a87), QTC(0x675c3177), QTC(0x6775f643), QTC(0x678fb8eb), QTC(0x67a97971), QTC(0x67c337d5), QTC(0x67dcf418), QTC(0x67f6ae3b), QTC(0x6810663f), QTC(0x682a1c25), QTC(0x6843cfed), QTC(0x685d8199), QTC(0x68773129), QTC(0x6890de9f), QTC(0x68aa89fa), QTC(0x68c4333d), QTC(0x68ddda67), QTC(0x68f77f7a), QTC(0x69112277), QTC(0x692ac35e), QTC(0x69446230), QTC(0x695dfeee), QTC(0x6977999a), QTC(0x69913232), QTC(0x69aac8ba), QTC(0x69c45d31), QTC(0x69ddef98), QTC(0x69f77ff0), QTC(0x6a110e3a), QTC(0x6a2a9a77), QTC(0x6a4424a8), QTC(0x6a5daccc), QTC(0x6a7732e6), QTC(0x6a90b6f6), QTC(0x6aaa38fd), QTC(0x6ac3b8fb), QTC(0x6add36f2), QTC(0x6af6b2e2), QTC(0x6b102ccd), QTC(0x6b29a4b2), QTC(0x6b431a92), QTC(0x6b5c8e6f), QTC(0x6b76004a), QTC(0x6b8f7022), QTC(0x6ba8ddf9), QTC(0x6bc249d0), QTC(0x6bdbb3a7), QTC(0x6bf51b80), QTC(0x6c0e815a), QTC(0x6c27e537), QTC(0x6c414718), QTC(0x6c5aa6fd), QTC(0x6c7404e7), QTC(0x6c8d60d7), QTC(0x6ca6bace), QTC(0x6cc012cc), QTC(0x6cd968d2), QTC(0x6cf2bce1), QTC(0x6d0c0ef9), QTC(0x6d255f1d), QTC(0x6d3ead4b), QTC(0x6d57f985), QTC(0x6d7143cc), QTC(0x6d8a8c21), QTC(0x6da3d283), QTC(0x6dbd16f5), QTC(0x6dd65976), QTC(0x6def9a08), QTC(0x6e08d8ab), QTC(0x6e221560), QTC(0x6e3b5027), QTC(0x6e548902), QTC(0x6e6dbff1), QTC(0x6e86f4f5), QTC(0x6ea0280e), QTC(0x6eb9593e), QTC(0x6ed28885), QTC(0x6eebb5e3), QTC(0x6f04e15a), QTC(0x6f1e0aea), QTC(0x6f373294), QTC(0x6f505859), QTC(0x6f697c39), QTC(0x6f829e35), QTC(0x6f9bbe4e), QTC(0x6fb4dc85), QTC(0x6fcdf8d9), QTC(0x6fe7134d), QTC(0x70002be0), QTC(0x70194293), QTC(0x70325767), QTC(0x704b6a5d), QTC(0x70647b76), QTC(0x707d8ab1), QTC(0x70969811), QTC(0x70afa394), QTC(0x70c8ad3d), QTC(0x70e1b50c), QTC(0x70fabb01), QTC(0x7113bf1d), QTC(0x712cc161), QTC(0x7145c1ce), QTC(0x715ec064), QTC(0x7177bd24), QTC(0x7190b80f), QTC(0x71a9b124), QTC(0x71c2a866), QTC(0x71db9dd4), QTC(0x71f49170), QTC(0x720d8339), QTC(0x72267331), QTC(0x723f6159), QTC(0x72584db0), QTC(0x72713838), QTC(0x728a20f1), QTC(0x72a307db), QTC(0x72bbecf9), QTC(0x72d4d049), QTC(0x72edb1ce), QTC(0x73069187), QTC(0x731f6f75), QTC(0x73384b98), QTC(0x735125f3), QTC(0x7369fe84), QTC(0x7382d54d), QTC(0x739baa4e), QTC(0x73b47d89), QTC(0x73cd4efd), QTC(0x73e61eab), QTC(0x73feec94), QTC(0x7417b8b8), QTC(0x74308319), QTC(0x74494bb6), QTC(0x74621291), QTC(0x747ad7aa), QTC(0x74939b02), QTC(0x74ac5c98), QTC(0x74c51c6f), QTC(0x74ddda86), QTC(0x74f696de), QTC(0x750f5178), QTC(0x75280a54), QTC(0x7540c174), QTC(0x755976d7), QTC(0x75722a7e), QTC(0x758adc69), QTC(0x75a38c9b), QTC(0x75bc3b12), QTC(0x75d4e7cf), QTC(0x75ed92d4), QTC(0x76063c21), QTC(0x761ee3b6), QTC(0x76378994), QTC(0x76502dbc), QTC(0x7668d02e), QTC(0x768170eb), QTC(0x769a0ff3), QTC(0x76b2ad47), QTC(0x76cb48e7), QTC(0x76e3e2d5), QTC(0x76fc7b10), QTC(0x7715119a), QTC(0x772da673), QTC(0x7746399b), QTC(0x775ecb13), QTC(0x77775adc), QTC(0x778fe8f6), QTC(0x77a87561), QTC(0x77c1001f), QTC(0x77d98930), QTC(0x77f21095), QTC(0x780a964d), QTC(0x78231a5b), QTC(0x783b9cbd), QTC(0x78541d75), QTC(0x786c9c84), QTC(0x788519e9), QTC(0x789d95a6), QTC(0x78b60fbb), QTC(0x78ce8828), QTC(0x78e6feef), QTC(0x78ff740f), QTC(0x7917e78a), QTC(0x7930595f), QTC(0x7948c990), QTC(0x7961381d), QTC(0x7979a506), QTC(0x7992104c), QTC(0x79aa79f0), QTC(0x79c2e1f1), QTC(0x79db4852), QTC(0x79f3ad11), QTC(0x7a0c1031), QTC(0x7a2471b0), QTC(0x7a3cd191), QTC(0x7a552fd3), QTC(0x7a6d8c76), QTC(0x7a85e77d), QTC(0x7a9e40e6), QTC(0x7ab698b2), QTC(0x7aceeee3), QTC(0x7ae74378), QTC(0x7aff9673), QTC(0x7b17e7d2), QTC(0x7b303799), QTC(0x7b4885c5), QTC(0x7b60d259), QTC(0x7b791d55), QTC(0x7b9166b9), QTC(0x7ba9ae86), QTC(0x7bc1f4bc), QTC(0x7bda395c), QTC(0x7bf27c66), QTC(0x7c0abddb), QTC(0x7c22fdbb), QTC(0x7c3b3c07), QTC(0x7c5378c0), QTC(0x7c6bb3e5), QTC(0x7c83ed78), QTC(0x7c9c2579), QTC(0x7cb45be9), QTC(0x7ccc90c7), QTC(0x7ce4c414), QTC(0x7cfcf5d2), QTC(0x7d152600), QTC(0x7d2d549f), QTC(0x7d4581b0), QTC(0x7d5dad32), QTC(0x7d75d727), QTC(0x7d8dff8f), QTC(0x7da6266a), QTC(0x7dbe4bba), QTC(0x7dd66f7d), QTC(0x7dee91b6), QTC(0x7e06b264), QTC(0x7e1ed188), QTC(0x7e36ef22), QTC(0x7e4f0b34), QTC(0x7e6725bd), QTC(0x7e7f3ebd), QTC(0x7e975636), QTC(0x7eaf6c28), QTC(0x7ec78093), QTC(0x7edf9378), QTC(0x7ef7a4d7), QTC(0x7f0fb4b1), QTC(0x7f27c307), QTC(0x7f3fcfd8), QTC(0x7f57db25), QTC(0x7f6fe4ef), QTC(0x7f87ed36), QTC(0x7f9ff3fb), QTC(0x7fb7f93e), QTC(0x7fcffcff), QTC(0x7fe7ff40) }; /* table of pow(2.0,0.25*q)/2.0, q[0..4) */ const FIXP_QTD FDKaacEnc_quantTableQ[4] = { QTC(0x40000000), QTC(0x4c1bf7ff), QTC(0x5a82797f), QTC(0x6ba27e7f) }; /* table of pow(2.0,0.75*e)/8.0, e[0..4) */ const FIXP_QTD FDKaacEnc_quantTableE[4] = { QTC(0x10000000), QTC(0x1ae89f99), QTC(0x2d413ccd), QTC(0x4c1bf828) }; /* table to count used number of bits */ const SHORT FDKaacEnc_sideInfoTabLong[MAX_SFB_LONG + 1] = { 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e }; const SHORT FDKaacEnc_sideInfoTabShort[MAX_SFB_SHORT + 1] = { 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000d, 0x000d }; /* Psy Configuration constants */ const SFB_PARAM_LONG p_FDKaacEnc_8000_long_1024 = { 40, { 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 16, 16, 16, 20, 20, 20, 20, 24, 24, 24, 28, 28, 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 } }; const SFB_PARAM_SHORT p_FDKaacEnc_8000_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 16, 20, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_11025_long_1024 = { 43, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_11025_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_12000_long_1024 = { 43, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_12000_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_16000_long_1024 = { 43, { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 12, 16, 16, 16, 16, 20, 20, 20, 24, 24, 28, 28, 32, 36, 40, 40, 44, 48, 52, 56, 60, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_16000_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 12, 12, 16, 20, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_22050_long_1024 = { 47, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_22050_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_24000_long_1024 = { 47, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 16, 20, 20, 24, 24, 28, 28, 32, 36, 36, 40, 44, 48, 52, 52, 64, 64, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_24000_short_128 = { 15, { 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 16, 16, 20 } }; const SFB_PARAM_LONG p_FDKaacEnc_32000_long_1024 = { 51, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 } }; const SFB_PARAM_SHORT p_FDKaacEnc_32000_short_128 = { 14, { 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 } }; const SFB_PARAM_LONG p_FDKaacEnc_44100_long_1024 = { 49, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96 } }; const SFB_PARAM_SHORT p_FDKaacEnc_44100_short_128 = { 14, { 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 } }; const SFB_PARAM_LONG p_FDKaacEnc_48000_long_1024 = { 49, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 20, 20, 24, 24, 28, 28, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96 } }; const SFB_PARAM_SHORT p_FDKaacEnc_48000_short_128 = { 14, { 4, 4, 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16 } }; const SFB_PARAM_LONG p_FDKaacEnc_64000_long_1024 = { 47, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 24, 24, 28, 36, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40 } }; const SFB_PARAM_SHORT p_FDKaacEnc_64000_short_128 = { 12, { 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 } }; const SFB_PARAM_LONG p_FDKaacEnc_88200_long_1024 = { 41, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_88200_short_128 = { 12, { 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 } }; const SFB_PARAM_LONG p_FDKaacEnc_96000_long_1024 = { 41, { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8, 12, 12, 12, 12, 12, 16, 16, 24, 28, 36, 44, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 } }; const SFB_PARAM_SHORT p_FDKaacEnc_96000_short_128 = { 12, { 4, 4, 4, 4, 4, 4, 8, 8, 8, 16, 28, 36 } }; /* TNS filter coefficients */ /* 3 bit resolution */ const FIXP_DBL FDKaacEnc_tnsEncCoeff3[8]= { 0x81f1d201, 0x91261481, 0xadb92301, 0xd438af00, 0x00000000, 0x37898080, 0x64130dff, 0x7cca6fff }; const FIXP_DBL FDKaacEnc_tnsCoeff3Borders[8]={ 0x80000001 /*-4*/, 0x87b826df /*-3*/, 0x9df24154 /*-2*/, 0xbfffffe5 /*-1*/, 0xe9c5e578 /* 0*/, 0x1c7b90f0 /* 1*/, 0x4fce83a9 /* 2*/, 0x7352f2c3 /* 3*/ }; /* 4 bit resolution */ const FIXP_DBL FDKaacEnc_tnsEncCoeff4[16]= { 0x808bc881, 0x84e2e581, 0x8d6b4a01, 0x99da9201, 0xa9c45701, 0xbc9dde81, 0xd1c2d500, 0xe87ae540, 0x00000000, 0x1a9cd9c0, 0x340ff240, 0x4b3c8bff, 0x5f1f5e7f, 0x6ed9eb7f, 0x79bc387f, 0x7f4c7e7f }; const FIXP_DBL FDKaacEnc_tnsCoeff4Borders[16]= { 0x80000001 /*-8*/, 0x822deff0 /*-7*/, 0x88a4bfe6 /*-6*/, 0x932c159d /*-5*/, 0xa16827c2 /*-4*/, 0xb2dcde27 /*-3*/, 0xc6f20b91 /*-2*/, 0xdcf89c64 /*-1*/, 0xf4308ce1 /* 0*/, 0x0d613054 /* 1*/, 0x278dde80 /* 2*/, 0x4000001b /* 3*/, 0x55a6127b /* 4*/, 0x678dde8f /* 5*/, 0x74ef0ed7 /* 6*/, 0x7d33f0da /* 7*/ }; const FIXP_DBL FDKaacEnc_mTab_4_3Elc[512]={ FL2FXCONST_DBL(0.3968502629920499),FL2FXCONST_DBL(0.3978840634868335),FL2FXCONST_DBL(0.3989185359354711),FL2FXCONST_DBL(0.3999536794661432), FL2FXCONST_DBL(0.4009894932098531),FL2FXCONST_DBL(0.4020259763004115),FL2FXCONST_DBL(0.4030631278744227),FL2FXCONST_DBL(0.4041009470712695), FL2FXCONST_DBL(0.4051394330330996),FL2FXCONST_DBL(0.4061785849048110),FL2FXCONST_DBL(0.4072184018340380),FL2FXCONST_DBL(0.4082588829711372), FL2FXCONST_DBL(0.4093000274691739),FL2FXCONST_DBL(0.4103418344839078),FL2FXCONST_DBL(0.4113843031737798),FL2FXCONST_DBL(0.4124274326998980), FL2FXCONST_DBL(0.4134712222260245),FL2FXCONST_DBL(0.4145156709185620),FL2FXCONST_DBL(0.4155607779465400),FL2FXCONST_DBL(0.4166065424816022), FL2FXCONST_DBL(0.4176529636979932),FL2FXCONST_DBL(0.4187000407725452),FL2FXCONST_DBL(0.4197477728846652),FL2FXCONST_DBL(0.4207961592163222), FL2FXCONST_DBL(0.4218451989520345),FL2FXCONST_DBL(0.4228948912788567),FL2FXCONST_DBL(0.4239452353863673),FL2FXCONST_DBL(0.4249962304666564), FL2FXCONST_DBL(0.4260478757143130),FL2FXCONST_DBL(0.4271001703264124),FL2FXCONST_DBL(0.4281531135025046),FL2FXCONST_DBL(0.4292067044446017), FL2FXCONST_DBL(0.4302609423571658),FL2FXCONST_DBL(0.4313158264470970),FL2FXCONST_DBL(0.4323713559237216),FL2FXCONST_DBL(0.4334275299987803), FL2FXCONST_DBL(0.4344843478864161),FL2FXCONST_DBL(0.4355418088031630),FL2FXCONST_DBL(0.4365999119679339),FL2FXCONST_DBL(0.4376586566020096), FL2FXCONST_DBL(0.4387180419290272),FL2FXCONST_DBL(0.4397780671749683),FL2FXCONST_DBL(0.4408387315681480),FL2FXCONST_DBL(0.4419000343392039), FL2FXCONST_DBL(0.4429619747210847),FL2FXCONST_DBL(0.4440245519490388),FL2FXCONST_DBL(0.4450877652606038),FL2FXCONST_DBL(0.4461516138955953), FL2FXCONST_DBL(0.4472160970960963),FL2FXCONST_DBL(0.4482812141064458),FL2FXCONST_DBL(0.4493469641732286),FL2FXCONST_DBL(0.4504133465452648), FL2FXCONST_DBL(0.4514803604735984),FL2FXCONST_DBL(0.4525480052114875),FL2FXCONST_DBL(0.4536162800143939),FL2FXCONST_DBL(0.4546851841399719), FL2FXCONST_DBL(0.4557547168480591),FL2FXCONST_DBL(0.4568248774006652),FL2FXCONST_DBL(0.4578956650619623),FL2FXCONST_DBL(0.4589670790982746), FL2FXCONST_DBL(0.4600391187780688),FL2FXCONST_DBL(0.4611117833719430),FL2FXCONST_DBL(0.4621850721526184),FL2FXCONST_DBL(0.4632589843949278), FL2FXCONST_DBL(0.4643335193758069),FL2FXCONST_DBL(0.4654086763742842),FL2FXCONST_DBL(0.4664844546714713),FL2FXCONST_DBL(0.4675608535505532), FL2FXCONST_DBL(0.4686378722967790),FL2FXCONST_DBL(0.4697155101974522),FL2FXCONST_DBL(0.4707937665419216),FL2FXCONST_DBL(0.4718726406215713), FL2FXCONST_DBL(0.4729521317298118),FL2FXCONST_DBL(0.4740322391620711),FL2FXCONST_DBL(0.4751129622157845),FL2FXCONST_DBL(0.4761943001903867), FL2FXCONST_DBL(0.4772762523873015),FL2FXCONST_DBL(0.4783588181099338),FL2FXCONST_DBL(0.4794419966636599),FL2FXCONST_DBL(0.4805257873558190), FL2FXCONST_DBL(0.4816101894957042),FL2FXCONST_DBL(0.4826952023945537),FL2FXCONST_DBL(0.4837808253655421),FL2FXCONST_DBL(0.4848670577237714), FL2FXCONST_DBL(0.4859538987862632),FL2FXCONST_DBL(0.4870413478719488),FL2FXCONST_DBL(0.4881294043016621),FL2FXCONST_DBL(0.4892180673981298), FL2FXCONST_DBL(0.4903073364859640),FL2FXCONST_DBL(0.4913972108916533),FL2FXCONST_DBL(0.4924876899435545),FL2FXCONST_DBL(0.4935787729718844), FL2FXCONST_DBL(0.4946704593087116),FL2FXCONST_DBL(0.4957627482879484),FL2FXCONST_DBL(0.4968556392453423),FL2FXCONST_DBL(0.4979491315184684), FL2FXCONST_DBL(0.4990432244467211),FL2FXCONST_DBL(0.5001379173713062),FL2FXCONST_DBL(0.5012332096352328),FL2FXCONST_DBL(0.5023291005833056), FL2FXCONST_DBL(0.5034255895621171),FL2FXCONST_DBL(0.5045226759200399),FL2FXCONST_DBL(0.5056203590072181),FL2FXCONST_DBL(0.5067186381755611), FL2FXCONST_DBL(0.5078175127787346),FL2FXCONST_DBL(0.5089169821721536),FL2FXCONST_DBL(0.5100170457129749),FL2FXCONST_DBL(0.5111177027600893), FL2FXCONST_DBL(0.5122189526741143),FL2FXCONST_DBL(0.5133207948173868),FL2FXCONST_DBL(0.5144232285539552),FL2FXCONST_DBL(0.5155262532495726), FL2FXCONST_DBL(0.5166298682716894),FL2FXCONST_DBL(0.5177340729894460),FL2FXCONST_DBL(0.5188388667736652),FL2FXCONST_DBL(0.5199442489968457), FL2FXCONST_DBL(0.5210502190331544),FL2FXCONST_DBL(0.5221567762584198),FL2FXCONST_DBL(0.5232639200501247),FL2FXCONST_DBL(0.5243716497873989), FL2FXCONST_DBL(0.5254799648510130),FL2FXCONST_DBL(0.5265888646233705),FL2FXCONST_DBL(0.5276983484885021),FL2FXCONST_DBL(0.5288084158320574), FL2FXCONST_DBL(0.5299190660412995),FL2FXCONST_DBL(0.5310302985050975),FL2FXCONST_DBL(0.5321421126139198),FL2FXCONST_DBL(0.5332545077598274), FL2FXCONST_DBL(0.5343674833364678),FL2FXCONST_DBL(0.5354810387390675),FL2FXCONST_DBL(0.5365951733644262),FL2FXCONST_DBL(0.5377098866109097), FL2FXCONST_DBL(0.5388251778784438),FL2FXCONST_DBL(0.5399410465685075),FL2FXCONST_DBL(0.5410574920841272),FL2FXCONST_DBL(0.5421745138298695), FL2FXCONST_DBL(0.5432921112118353),FL2FXCONST_DBL(0.5444102836376534),FL2FXCONST_DBL(0.5455290305164744),FL2FXCONST_DBL(0.5466483512589642), FL2FXCONST_DBL(0.5477682452772976),FL2FXCONST_DBL(0.5488887119851529),FL2FXCONST_DBL(0.5500097507977050),FL2FXCONST_DBL(0.5511313611316194), FL2FXCONST_DBL(0.5522535424050467),FL2FXCONST_DBL(0.5533762940376158),FL2FXCONST_DBL(0.5544996154504284),FL2FXCONST_DBL(0.5556235060660528), FL2FXCONST_DBL(0.5567479653085183),FL2FXCONST_DBL(0.5578729926033087),FL2FXCONST_DBL(0.5589985873773569),FL2FXCONST_DBL(0.5601247490590389), FL2FXCONST_DBL(0.5612514770781683),FL2FXCONST_DBL(0.5623787708659898),FL2FXCONST_DBL(0.5635066298551742),FL2FXCONST_DBL(0.5646350534798125), FL2FXCONST_DBL(0.5657640411754097),FL2FXCONST_DBL(0.5668935923788799),FL2FXCONST_DBL(0.5680237065285404),FL2FXCONST_DBL(0.5691543830641059), FL2FXCONST_DBL(0.5702856214266832),FL2FXCONST_DBL(0.5714174210587655),FL2FXCONST_DBL(0.5725497814042271),FL2FXCONST_DBL(0.5736827019083177), FL2FXCONST_DBL(0.5748161820176573),FL2FXCONST_DBL(0.5759502211802304),FL2FXCONST_DBL(0.5770848188453810),FL2FXCONST_DBL(0.5782199744638067), FL2FXCONST_DBL(0.5793556874875542),FL2FXCONST_DBL(0.5804919573700131),FL2FXCONST_DBL(0.5816287835659116),FL2FXCONST_DBL(0.5827661655313104), FL2FXCONST_DBL(0.5839041027235979),FL2FXCONST_DBL(0.5850425946014850),FL2FXCONST_DBL(0.5861816406250000),FL2FXCONST_DBL(0.5873212402554834), FL2FXCONST_DBL(0.5884613929555826),FL2FXCONST_DBL(0.5896020981892474),FL2FXCONST_DBL(0.5907433554217242),FL2FXCONST_DBL(0.5918851641195517), FL2FXCONST_DBL(0.5930275237505556),FL2FXCONST_DBL(0.5941704337838434),FL2FXCONST_DBL(0.5953138936897999),FL2FXCONST_DBL(0.5964579029400819), FL2FXCONST_DBL(0.5976024610076139),FL2FXCONST_DBL(0.5987475673665825),FL2FXCONST_DBL(0.5998932214924321),FL2FXCONST_DBL(0.6010394228618597), FL2FXCONST_DBL(0.6021861709528106),FL2FXCONST_DBL(0.6033334652444733),FL2FXCONST_DBL(0.6044813052172748),FL2FXCONST_DBL(0.6056296903528761), FL2FXCONST_DBL(0.6067786201341671),FL2FXCONST_DBL(0.6079280940452625),FL2FXCONST_DBL(0.6090781115714966),FL2FXCONST_DBL(0.6102286721994192), FL2FXCONST_DBL(0.6113797754167908),FL2FXCONST_DBL(0.6125314207125777),FL2FXCONST_DBL(0.6136836075769482),FL2FXCONST_DBL(0.6148363355012674), FL2FXCONST_DBL(0.6159896039780929),FL2FXCONST_DBL(0.6171434125011708),FL2FXCONST_DBL(0.6182977605654305),FL2FXCONST_DBL(0.6194526476669808), FL2FXCONST_DBL(0.6206080733031054),FL2FXCONST_DBL(0.6217640369722584),FL2FXCONST_DBL(0.6229205381740598),FL2FXCONST_DBL(0.6240775764092919), FL2FXCONST_DBL(0.6252351511798939),FL2FXCONST_DBL(0.6263932619889586),FL2FXCONST_DBL(0.6275519083407275),FL2FXCONST_DBL(0.6287110897405869), FL2FXCONST_DBL(0.6298708056950635),FL2FXCONST_DBL(0.6310310557118203),FL2FXCONST_DBL(0.6321918392996523),FL2FXCONST_DBL(0.6333531559684823), FL2FXCONST_DBL(0.6345150052293571),FL2FXCONST_DBL(0.6356773865944432),FL2FXCONST_DBL(0.6368402995770224),FL2FXCONST_DBL(0.6380037436914881), FL2FXCONST_DBL(0.6391677184533411),FL2FXCONST_DBL(0.6403322233791856),FL2FXCONST_DBL(0.6414972579867254),FL2FXCONST_DBL(0.6426628217947594), FL2FXCONST_DBL(0.6438289143231779),FL2FXCONST_DBL(0.6449955350929588),FL2FXCONST_DBL(0.6461626836261636),FL2FXCONST_DBL(0.6473303594459330), FL2FXCONST_DBL(0.6484985620764839),FL2FXCONST_DBL(0.6496672910431047),FL2FXCONST_DBL(0.6508365458721518),FL2FXCONST_DBL(0.6520063260910459), FL2FXCONST_DBL(0.6531766312282679),FL2FXCONST_DBL(0.6543474608133552),FL2FXCONST_DBL(0.6555188143768979),FL2FXCONST_DBL(0.6566906914505349), FL2FXCONST_DBL(0.6578630915669509),FL2FXCONST_DBL(0.6590360142598715),FL2FXCONST_DBL(0.6602094590640603),FL2FXCONST_DBL(0.6613834255153149), FL2FXCONST_DBL(0.6625579131504635),FL2FXCONST_DBL(0.6637329215073610),FL2FXCONST_DBL(0.6649084501248851),FL2FXCONST_DBL(0.6660844985429335), FL2FXCONST_DBL(0.6672610663024197),FL2FXCONST_DBL(0.6684381529452691),FL2FXCONST_DBL(0.6696157580144163),FL2FXCONST_DBL(0.6707938810538011), FL2FXCONST_DBL(0.6719725216083646),FL2FXCONST_DBL(0.6731516792240465),FL2FXCONST_DBL(0.6743313534477807),FL2FXCONST_DBL(0.6755115438274927), FL2FXCONST_DBL(0.6766922499120955),FL2FXCONST_DBL(0.6778734712514865),FL2FXCONST_DBL(0.6790552073965435),FL2FXCONST_DBL(0.6802374578991223), FL2FXCONST_DBL(0.6814202223120524),FL2FXCONST_DBL(0.6826035001891340),FL2FXCONST_DBL(0.6837872910851345),FL2FXCONST_DBL(0.6849715945557853), FL2FXCONST_DBL(0.6861564101577784),FL2FXCONST_DBL(0.6873417374487629),FL2FXCONST_DBL(0.6885275759873420),FL2FXCONST_DBL(0.6897139253330697), FL2FXCONST_DBL(0.6909007850464473),FL2FXCONST_DBL(0.6920881546889198),FL2FXCONST_DBL(0.6932760338228737),FL2FXCONST_DBL(0.6944644220116332), FL2FXCONST_DBL(0.6956533188194565),FL2FXCONST_DBL(0.6968427238115332),FL2FXCONST_DBL(0.6980326365539813),FL2FXCONST_DBL(0.6992230566138435), FL2FXCONST_DBL(0.7004139835590845),FL2FXCONST_DBL(0.7016054169585869),FL2FXCONST_DBL(0.7027973563821499),FL2FXCONST_DBL(0.7039898014004843), FL2FXCONST_DBL(0.7051827515852106),FL2FXCONST_DBL(0.7063762065088554),FL2FXCONST_DBL(0.7075701657448483),FL2FXCONST_DBL(0.7087646288675196), FL2FXCONST_DBL(0.7099595954520960),FL2FXCONST_DBL(0.7111550650746988),FL2FXCONST_DBL(0.7123510373123402),FL2FXCONST_DBL(0.7135475117429202), FL2FXCONST_DBL(0.7147444879452244),FL2FXCONST_DBL(0.7159419654989200),FL2FXCONST_DBL(0.7171399439845538),FL2FXCONST_DBL(0.7183384229835486), FL2FXCONST_DBL(0.7195374020782005),FL2FXCONST_DBL(0.7207368808516762),FL2FXCONST_DBL(0.7219368588880097),FL2FXCONST_DBL(0.7231373357720997), FL2FXCONST_DBL(0.7243383110897066),FL2FXCONST_DBL(0.7255397844274496),FL2FXCONST_DBL(0.7267417553728043),FL2FXCONST_DBL(0.7279442235140992), FL2FXCONST_DBL(0.7291471884405130),FL2FXCONST_DBL(0.7303506497420724),FL2FXCONST_DBL(0.7315546070096487),FL2FXCONST_DBL(0.7327590598349553), FL2FXCONST_DBL(0.7339640078105445),FL2FXCONST_DBL(0.7351694505298055),FL2FXCONST_DBL(0.7363753875869610),FL2FXCONST_DBL(0.7375818185770647), FL2FXCONST_DBL(0.7387887430959987),FL2FXCONST_DBL(0.7399961607404706),FL2FXCONST_DBL(0.7412040711080108),FL2FXCONST_DBL(0.7424124737969701), FL2FXCONST_DBL(0.7436213684065166),FL2FXCONST_DBL(0.7448307545366334),FL2FXCONST_DBL(0.7460406317881158),FL2FXCONST_DBL(0.7472509997625686), FL2FXCONST_DBL(0.7484618580624036),FL2FXCONST_DBL(0.7496732062908372),FL2FXCONST_DBL(0.7508850440518872),FL2FXCONST_DBL(0.7520973709503704), FL2FXCONST_DBL(0.7533101865919009),FL2FXCONST_DBL(0.7545234905828862),FL2FXCONST_DBL(0.7557372825305252),FL2FXCONST_DBL(0.7569515620428062), FL2FXCONST_DBL(0.7581663287285035),FL2FXCONST_DBL(0.7593815821971756),FL2FXCONST_DBL(0.7605973220591619),FL2FXCONST_DBL(0.7618135479255810), FL2FXCONST_DBL(0.7630302594083277),FL2FXCONST_DBL(0.7642474561200708),FL2FXCONST_DBL(0.7654651376742505),FL2FXCONST_DBL(0.7666833036850760), FL2FXCONST_DBL(0.7679019537675227),FL2FXCONST_DBL(0.7691210875373307),FL2FXCONST_DBL(0.7703407046110011),FL2FXCONST_DBL(0.7715608046057948), FL2FXCONST_DBL(0.7727813871397293),FL2FXCONST_DBL(0.7740024518315765),FL2FXCONST_DBL(0.7752239983008605),FL2FXCONST_DBL(0.7764460261678551), FL2FXCONST_DBL(0.7776685350535814),FL2FXCONST_DBL(0.7788915245798054),FL2FXCONST_DBL(0.7801149943690360),FL2FXCONST_DBL(0.7813389440445223), FL2FXCONST_DBL(0.7825633732302513),FL2FXCONST_DBL(0.7837882815509458),FL2FXCONST_DBL(0.7850136686320621),FL2FXCONST_DBL(0.7862395340997874), FL2FXCONST_DBL(0.7874658775810378),FL2FXCONST_DBL(0.7886926987034559),FL2FXCONST_DBL(0.7899199970954088),FL2FXCONST_DBL(0.7911477723859853), FL2FXCONST_DBL(0.7923760242049944),FL2FXCONST_DBL(0.7936047521829623),FL2FXCONST_DBL(0.7948339559511308),FL2FXCONST_DBL(0.7960636351414546), FL2FXCONST_DBL(0.7972937893865995),FL2FXCONST_DBL(0.7985244183199399),FL2FXCONST_DBL(0.7997555215755570),FL2FXCONST_DBL(0.8009870987882359), FL2FXCONST_DBL(0.8022191495934644),FL2FXCONST_DBL(0.8034516736274301),FL2FXCONST_DBL(0.8046846705270185),FL2FXCONST_DBL(0.8059181399298110), FL2FXCONST_DBL(0.8071520814740822),FL2FXCONST_DBL(0.8083864947987989),FL2FXCONST_DBL(0.8096213795436166),FL2FXCONST_DBL(0.8108567353488784), FL2FXCONST_DBL(0.8120925618556127),FL2FXCONST_DBL(0.8133288587055308),FL2FXCONST_DBL(0.8145656255410253),FL2FXCONST_DBL(0.8158028620051674), FL2FXCONST_DBL(0.8170405677417053),FL2FXCONST_DBL(0.8182787423950622),FL2FXCONST_DBL(0.8195173856103341),FL2FXCONST_DBL(0.8207564970332875), FL2FXCONST_DBL(0.8219960763103580),FL2FXCONST_DBL(0.8232361230886477),FL2FXCONST_DBL(0.8244766370159234),FL2FXCONST_DBL(0.8257176177406150), FL2FXCONST_DBL(0.8269590649118125),FL2FXCONST_DBL(0.8282009781792650),FL2FXCONST_DBL(0.8294433571933784),FL2FXCONST_DBL(0.8306862016052132), FL2FXCONST_DBL(0.8319295110664831),FL2FXCONST_DBL(0.8331732852295520),FL2FXCONST_DBL(0.8344175237474336),FL2FXCONST_DBL(0.8356622262737878), FL2FXCONST_DBL(0.8369073924629202),FL2FXCONST_DBL(0.8381530219697793),FL2FXCONST_DBL(0.8393991144499545),FL2FXCONST_DBL(0.8406456695596752), FL2FXCONST_DBL(0.8418926869558079),FL2FXCONST_DBL(0.8431401662958544),FL2FXCONST_DBL(0.8443881072379507),FL2FXCONST_DBL(0.8456365094408642), FL2FXCONST_DBL(0.8468853725639923),FL2FXCONST_DBL(0.8481346962673606),FL2FXCONST_DBL(0.8493844802116208),FL2FXCONST_DBL(0.8506347240580492), FL2FXCONST_DBL(0.8518854274685442),FL2FXCONST_DBL(0.8531365901056253),FL2FXCONST_DBL(0.8543882116324307),FL2FXCONST_DBL(0.8556402917127157), FL2FXCONST_DBL(0.8568928300108512),FL2FXCONST_DBL(0.8581458261918209),FL2FXCONST_DBL(0.8593992799212207),FL2FXCONST_DBL(0.8606531908652563), FL2FXCONST_DBL(0.8619075586907414),FL2FXCONST_DBL(0.8631623830650962),FL2FXCONST_DBL(0.8644176636563452),FL2FXCONST_DBL(0.8656734001331161), FL2FXCONST_DBL(0.8669295921646375),FL2FXCONST_DBL(0.8681862394207371),FL2FXCONST_DBL(0.8694433415718407),FL2FXCONST_DBL(0.8707008982889695), FL2FXCONST_DBL(0.8719589092437391),FL2FXCONST_DBL(0.8732173741083574),FL2FXCONST_DBL(0.8744762925556232),FL2FXCONST_DBL(0.8757356642589241), FL2FXCONST_DBL(0.8769954888922352),FL2FXCONST_DBL(0.8782557661301171),FL2FXCONST_DBL(0.8795164956477146),FL2FXCONST_DBL(0.8807776771207545), FL2FXCONST_DBL(0.8820393102255443),FL2FXCONST_DBL(0.8833013946389704),FL2FXCONST_DBL(0.8845639300384969),FL2FXCONST_DBL(0.8858269161021629), FL2FXCONST_DBL(0.8870903525085819),FL2FXCONST_DBL(0.8883542389369399),FL2FXCONST_DBL(0.8896185750669933),FL2FXCONST_DBL(0.8908833605790678), FL2FXCONST_DBL(0.8921485951540565),FL2FXCONST_DBL(0.8934142784734187),FL2FXCONST_DBL(0.8946804102191776),FL2FXCONST_DBL(0.8959469900739191), FL2FXCONST_DBL(0.8972140177207906),FL2FXCONST_DBL(0.8984814928434985),FL2FXCONST_DBL(0.8997494151263077),FL2FXCONST_DBL(0.9010177842540390), FL2FXCONST_DBL(0.9022865999120682),FL2FXCONST_DBL(0.9035558617863242),FL2FXCONST_DBL(0.9048255695632878),FL2FXCONST_DBL(0.9060957229299895), FL2FXCONST_DBL(0.9073663215740092),FL2FXCONST_DBL(0.9086373651834729),FL2FXCONST_DBL(0.9099088534470528),FL2FXCONST_DBL(0.9111807860539647), FL2FXCONST_DBL(0.9124531626939672),FL2FXCONST_DBL(0.9137259830573594),FL2FXCONST_DBL(0.9149992468349805),FL2FXCONST_DBL(0.9162729537182071), FL2FXCONST_DBL(0.9175471033989524),FL2FXCONST_DBL(0.9188216955696648),FL2FXCONST_DBL(0.9200967299233258),FL2FXCONST_DBL(0.9213722061534494), FL2FXCONST_DBL(0.9226481239540795),FL2FXCONST_DBL(0.9239244830197896),FL2FXCONST_DBL(0.9252012830456805),FL2FXCONST_DBL(0.9264785237273793), FL2FXCONST_DBL(0.9277562047610376),FL2FXCONST_DBL(0.9290343258433305),FL2FXCONST_DBL(0.9303128866714547),FL2FXCONST_DBL(0.9315918869431275), FL2FXCONST_DBL(0.9328713263565848),FL2FXCONST_DBL(0.9341512046105802),FL2FXCONST_DBL(0.9354315214043836),FL2FXCONST_DBL(0.9367122764377792), FL2FXCONST_DBL(0.9379934694110648),FL2FXCONST_DBL(0.9392751000250497),FL2FXCONST_DBL(0.9405571679810542),FL2FXCONST_DBL(0.9418396729809072), FL2FXCONST_DBL(0.9431226147269456),FL2FXCONST_DBL(0.9444059929220124),FL2FXCONST_DBL(0.9456898072694558),FL2FXCONST_DBL(0.9469740574731275), FL2FXCONST_DBL(0.9482587432373810),FL2FXCONST_DBL(0.9495438642670713),FL2FXCONST_DBL(0.9508294202675522),FL2FXCONST_DBL(0.9521154109446763), FL2FXCONST_DBL(0.9534018360047926),FL2FXCONST_DBL(0.9546886951547455),FL2FXCONST_DBL(0.9559759881018738),FL2FXCONST_DBL(0.9572637145540087), FL2FXCONST_DBL(0.9585518742194732),FL2FXCONST_DBL(0.9598404668070802),FL2FXCONST_DBL(0.9611294920261317),FL2FXCONST_DBL(0.9624189495864168), FL2FXCONST_DBL(0.9637088391982110),FL2FXCONST_DBL(0.9649991605722750),FL2FXCONST_DBL(0.9662899134198524),FL2FXCONST_DBL(0.9675810974526697), FL2FXCONST_DBL(0.9688727123829343),FL2FXCONST_DBL(0.9701647579233330),FL2FXCONST_DBL(0.9714572337870316),FL2FXCONST_DBL(0.9727501396876727), FL2FXCONST_DBL(0.9740434753393749),FL2FXCONST_DBL(0.9753372404567313),FL2FXCONST_DBL(0.9766314347548087),FL2FXCONST_DBL(0.9779260579491460), FL2FXCONST_DBL(0.9792211097557527),FL2FXCONST_DBL(0.9805165898911081),FL2FXCONST_DBL(0.9818124980721600),FL2FXCONST_DBL(0.9831088340163232), FL2FXCONST_DBL(0.9844055974414786),FL2FXCONST_DBL(0.9857027880659716),FL2FXCONST_DBL(0.9870004056086111),FL2FXCONST_DBL(0.9882984497886684), FL2FXCONST_DBL(0.9895969203258759),FL2FXCONST_DBL(0.9908958169404255),FL2FXCONST_DBL(0.9921951393529680),FL2FXCONST_DBL(0.9934948872846116), FL2FXCONST_DBL(0.9947950604569206),FL2FXCONST_DBL(0.9960956585919144),FL2FXCONST_DBL(0.9973966814120665),FL2FXCONST_DBL(0.9986981286403025) }; const FIXP_DBL FDKaacEnc_specExpMantTableCombElc[4][14] = { {FL2FXCONST_DBL(0.5000000000000000), FL2FXCONST_DBL(0.6299605249474366), FL2FXCONST_DBL(0.7937005259840998), FL2FXCONST_DBL(0.5000000000000000), FL2FXCONST_DBL(0.6299605249474366), FL2FXCONST_DBL(0.7937005259840998), FL2FXCONST_DBL(0.5000000000000000), FL2FXCONST_DBL(0.6299605249474366), FL2FXCONST_DBL(0.7937005259840998), FL2FXCONST_DBL(0.5000000000000000), FL2FXCONST_DBL(0.6299605249474366), FL2FXCONST_DBL(0.7937005259840998), FL2FXCONST_DBL(0.5000000000000000), FL2FXCONST_DBL(0.6299605249474366)}, {FL2FXCONST_DBL(0.5946035575013605), FL2FXCONST_DBL(0.7491535384383408), FL2FXCONST_DBL(0.9438743126816935), FL2FXCONST_DBL(0.5946035575013605), FL2FXCONST_DBL(0.7491535384383408), FL2FXCONST_DBL(0.9438743126816935), FL2FXCONST_DBL(0.5946035575013605), FL2FXCONST_DBL(0.7491535384383408), FL2FXCONST_DBL(0.9438743126816935), FL2FXCONST_DBL(0.5946035575013605), FL2FXCONST_DBL(0.7491535384383408), FL2FXCONST_DBL(0.9438743126816935), FL2FXCONST_DBL(0.5946035575013605), FL2FXCONST_DBL(0.7491535384383408)}, {FL2FXCONST_DBL(0.7071067811865476), FL2FXCONST_DBL(0.8908987181403393), FL2FXCONST_DBL(0.5612310241546865), FL2FXCONST_DBL(0.7071067811865476), FL2FXCONST_DBL(0.8908987181403393), FL2FXCONST_DBL(0.5612310241546865), FL2FXCONST_DBL(0.7071067811865476), FL2FXCONST_DBL(0.8908987181403393), FL2FXCONST_DBL(0.5612310241546865), FL2FXCONST_DBL(0.7071067811865476), FL2FXCONST_DBL(0.8908987181403393), FL2FXCONST_DBL(0.5612310241546865), FL2FXCONST_DBL(0.7071067811865476), FL2FXCONST_DBL(0.8908987181403393)}, {FL2FXCONST_DBL(0.8408964152537145), FL2FXCONST_DBL(0.5297315471796477), FL2FXCONST_DBL(0.6674199270850172), FL2FXCONST_DBL(0.8408964152537145), FL2FXCONST_DBL(0.5297315471796477), FL2FXCONST_DBL(0.6674199270850172), FL2FXCONST_DBL(0.8408964152537145), FL2FXCONST_DBL(0.5297315471796477), FL2FXCONST_DBL(0.6674199270850172), FL2FXCONST_DBL(0.8408964152537145), FL2FXCONST_DBL(0.5297315471796477), FL2FXCONST_DBL(0.6674199270850172), FL2FXCONST_DBL(0.8408964152537145), FL2FXCONST_DBL(0.5297315471796477)} }; const UCHAR FDKaacEnc_specExpTableComb[4][14] = { {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18}, {1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18}, {1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14, 16, 17, 18}, {1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19} }; #define WTS0 1 #define WTS1 0 #define WTS2 -2 const FIXP_WTB ELDAnalysis512[1536] = { /* part 0 */ WTC0(0xfac5a770), WTC0(0xfaafbab8), WTC0(0xfa996a40), WTC0(0xfa82bbd0), WTC0(0xfa6bb538), WTC0(0xfa545c38), WTC0(0xfa3cb698), WTC0(0xfa24ca28), WTC0(0xfa0c9ca8), WTC0(0xf9f433e8), WTC0(0xf9db9580), WTC0(0xf9c2c298), WTC0(0xf9a9b800), WTC0(0xf9907250), WTC0(0xf976ee38), WTC0(0xf95d2b88), WTC0(0xf9432d10), WTC0(0xf928f5c0), WTC0(0xf90e8868), WTC0(0xf8f3e400), WTC0(0xf8d903a0), WTC0(0xf8bde238), WTC0(0xf8a27af0), WTC0(0xf886cde8), WTC0(0xf86ae020), WTC0(0xf84eb6c0), WTC0(0xf83256f8), WTC0(0xf815c4b8), WTC0(0xf7f902c0), WTC0(0xf7dc13b0), WTC0(0xf7befa60), WTC0(0xf7a1ba40), WTC0(0xf78457c0), WTC0(0xf766d780), WTC0(0xf7493d90), WTC0(0xf72b8990), WTC0(0xf70db5f0), WTC0(0xf6efbd30), WTC0(0xf6d19a20), WTC0(0xf6b352e0), WTC0(0xf694f8c0), WTC0(0xf6769da0), WTC0(0xf6585310), WTC0(0xf63a28d0), WTC0(0xf61c2c60), WTC0(0xf5fe6b10), WTC0(0xf5e0f250), WTC0(0xf5c3ceb0), WTC0(0xf5a70be0), WTC0(0xf58ab5a0), WTC0(0xf56ed7b0), WTC0(0xf5537e40), WTC0(0xf538b610), WTC0(0xf51e8bf0), WTC0(0xf5050c90), WTC0(0xf4ec4330), WTC0(0xf4d439b0), WTC0(0xf4bcf9b0), WTC0(0xf4a68ce0), WTC0(0xf490fa80), WTC0(0xf47c4760), WTC0(0xf4687830), WTC0(0xf4558f00), WTC0(0xf4434fc0), WTC0(0xf4314070), WTC0(0xf41ee450), WTC0(0xf40bc130), WTC0(0xf3f799c0), WTC0(0xf3e26d30), WTC0(0xf3cc3d70), WTC0(0xf3b50c80), WTC0(0xf39cdd60), WTC0(0xf383b440), WTC0(0xf3699550), WTC0(0xf34e84c0), WTC0(0xf33286b0), WTC0(0xf3159f10), WTC0(0xf2f7d1b0), WTC0(0xf2d92290), WTC0(0xf2b994d0), WTC0(0xf2992ad0), WTC0(0xf277e6d0), WTC0(0xf255cb60), WTC0(0xf232dd00), WTC0(0xf20f2240), WTC0(0xf1eaa1d0), WTC0(0xf1c56240), WTC0(0xf19f63d0), WTC0(0xf178a0f0), WTC0(0xf15113a0), WTC0(0xf128b5c0), WTC0(0xf0ff7fd0), WTC0(0xf0d56860), WTC0(0xf0aa6610), WTC0(0xf07e6fd0), WTC0(0xf0518190), WTC0(0xf0239cd0), WTC0(0xeff4c320), WTC0(0xefc4f720), WTC0(0xef945080), WTC0(0xef62fce0), WTC0(0xef312a40), WTC0(0xeeff05c0), WTC0(0xeecca2c0), WTC0(0xee99faa0), WTC0(0xee6705a0), WTC0(0xee33bb60), WTC0(0xee000060), WTC0(0xedcba660), WTC0(0xed967e80), WTC0(0xed605b80), WTC0(0xed293b40), WTC0(0xecf146a0), WTC0(0xecb8a8a0), WTC0(0xec7f8bc0), WTC0(0xec461260), WTC0(0xec0c5720), WTC0(0xebd27440), WTC0(0xeb988220), WTC0(0xeb5e7040), WTC0(0xeb2404c0), WTC0(0xeae90440), WTC0(0xeaad33c0), WTC0(0xea7066c0), WTC0(0xea327f60), WTC0(0xe9f36000), WTC0(0xe9b2ed60), WTC0(0xe9713920), WTC0(0xe92e81e0), WTC0(0xe8eb08c0), WTC0(0xe8a70e60), WTC0(0xe862d8e0), WTC0(0xe81eb340), WTC0(0xe7dae8a0), WTC0(0xe797c1a0), WTC0(0xe7554ca0), WTC0(0xe7135dc0), WTC0(0xe6d1c6a0), WTC0(0xe6905720), WTC0(0xe64eb9c0), WTC0(0xe60c7300), WTC0(0xe5c90600), WTC0(0xe583f920), WTC0(0xe53d1ce0), WTC0(0xe4f48c80), WTC0(0xe4aa6640), WTC0(0xe45ecaa0), WTC0(0xe4120be0), WTC0(0xe3c4ae60), WTC0(0xe3773860), WTC0(0xe32a2ea0), WTC0(0xe2ddeea0), WTC0(0xe292af00), WTC0(0xe248a4a0), WTC0(0xe2000140), WTC0(0xe1b8b640), WTC0(0xe1727440), WTC0(0xe12ce900), WTC0(0xe0e7c280), WTC0(0xe0a2b420), WTC0(0xe05d76c0), WTC0(0xe017c360), WTC0(0xdfd15440), WTC0(0xdf8a0540), WTC0(0xdf41d300), WTC0(0xdef8bb40), WTC0(0xdeaebd40), WTC0(0xde63e7c0), WTC0(0xde185940), WTC0(0xddcc3180), WTC0(0xdd7f9000), WTC0(0xdd329e80), WTC0(0xdce58e80), WTC0(0xdc989300), WTC0(0xdc4bde40), WTC0(0xdbff96c0), WTC0(0xdbb3d780), WTC0(0xdb68bb80), WTC0(0xdb1e5c80), WTC0(0xdad4c380), WTC0(0xda8be840), WTC0(0xda43c1c0), WTC0(0xd9fc4740), WTC0(0xd9b56640), WTC0(0xd96f0440), WTC0(0xd9290600), WTC0(0xd8e35080), WTC0(0xd89dcd40), WTC0(0xd8586b40), WTC0(0xd8131940), WTC0(0xd7cdc640), WTC0(0xd7886180), WTC0(0xd742dc80), WTC0(0xd6fd2780), WTC0(0xd6b73400), WTC0(0xd670fd80), WTC0(0xd62a8a40), WTC0(0xd5e3e080), WTC0(0xd59d0840), WTC0(0xd5562b80), WTC0(0xd50f9540), WTC0(0xd4c992c0), WTC0(0xd4846f80), WTC0(0xd4405a80), WTC0(0xd3fd6580), WTC0(0xd3bba140), WTC0(0xd37b1c80), WTC0(0xd33bb780), WTC0(0xd2fd2400), WTC0(0xd2bf1240), WTC0(0xd2813300), WTC0(0xd2435ac0), WTC0(0xd2057fc0), WTC0(0xd1c79a00), WTC0(0xd189a240), WTC0(0xd14b9dc0), WTC0(0xd10d9e00), WTC0(0xd0cfb580), WTC0(0xd091f6c0), WTC0(0xd0548100), WTC0(0xd0177f40), WTC0(0xcfdb1cc0), WTC0(0xcf9f84c0), WTC0(0xcf64d780), WTC0(0xcf2b2b00), WTC0(0xcef29440), WTC0(0xcebb2640), WTC0(0xce84c000), WTC0(0xce4f0bc0), WTC0(0xce19b200), WTC0(0xcde45d40), WTC0(0xcdaeedc0), WTC0(0xcd7979c0), WTC0(0xcd4419c0), WTC0(0xcd0ee6c0), WTC0(0xccda0540), WTC0(0xcca5a500), WTC0(0xcc71f640), WTC0(0xcc3f2800), WTC0(0xcc0d4300), WTC0(0xcbdc2a00), WTC0(0xcbabbe80), WTC0(0xcb7be200), WTC0(0xcb4c8200), WTC0(0xcb1d9800), WTC0(0xcaef1d40), WTC0(0xcac10bc0), WTC0(0xca936440), WTC0(0xca662d00), WTC0(0xca396d40), WTC0(0xca0d2b80), WTC0(0xc9e16f80), WTC0(0xc9b63f80), WTC0(0xc98ba2c0), WTC0(0xc961a000), WTC0(0xc9383ec0), WTC0(0xc90a0440), WTC0(0xc8e0d280), WTC0(0xc8b73b80), WTC0(0xc88d4900), WTC0(0xc86304c0), WTC0(0xc83878c0), WTC0(0xc80dae80), WTC0(0xc7e2afc0), WTC0(0xc7b78640), WTC0(0xc78c3c40), WTC0(0xc760da80), WTC0(0xc7356640), WTC0(0xc709de40), WTC0(0xc6de41c0), WTC0(0xc6b28fc0), WTC0(0xc686bd40), WTC0(0xc65ab600), WTC0(0xc62e6580), WTC0(0xc601b880), WTC0(0xc5d4bac0), WTC0(0xc5a79640), WTC0(0xc57a76c0), WTC0(0xc54d8780), WTC0(0xc520e840), WTC0(0xc4f4acc0), WTC0(0xc4c8e880), WTC0(0xc49dad80), WTC0(0xc472e640), WTC0(0xc44856c0), WTC0(0xc41dc140), WTC0(0xc3f2e940), WTC0(0xc3c7bc00), WTC0(0xc39c4f00), WTC0(0xc370b9c0), WTC0(0xc34513c0), WTC0(0xc3197940), WTC0(0xc2ee0a00), WTC0(0xc2c2e640), WTC0(0xc2982d80), WTC0(0xc26df5c0), WTC0(0xc2444b00), WTC0(0xc21b3940), WTC0(0xc1f2cbc0), WTC0(0xc1cb05c0), WTC0(0xc1a3e340), WTC0(0xc17d5f00), WTC0(0xc15773c0), WTC0(0xc1320940), WTC0(0xc10cf480), WTC0(0xc0e80a00), WTC0(0xc0c31f00), WTC0(0xc09e2640), WTC0(0xc0792ec0), WTC0(0xc0544940), WTC0(0xc02f86c0), WTC0(0xc00b04c0), WTC0(0xbfe6ed01), WTC0(0xbfc36a01), WTC0(0xbfa0a581), WTC0(0xbf7eb581), WTC0(0xbf5d9a81), WTC0(0xbf3d5501), WTC0(0xbf1de601), WTC0(0xbeff4801), WTC0(0xbee17201), WTC0(0xbec45881), WTC0(0xbea7f301), WTC0(0xbe8c3781), WTC0(0xbe712001), WTC0(0xbe56a381), WTC0(0xbe3cbc01), WTC0(0xbe236001), WTC0(0xbe0a8581), WTC0(0xbdf22181), WTC0(0xbdda2a01), WTC0(0xbdc29a81), WTC0(0xbdab7181), WTC0(0xbd94b001), WTC0(0xbd7e5581), WTC0(0xbd686681), WTC0(0xbd52eb01), WTC0(0xbd3deb81), WTC0(0xbd297181), WTC0(0xbd158801), WTC0(0xbd023f01), WTC0(0xbcefa601), WTC0(0xbcddcc81), WTC0(0xbcccbd01), WTC0(0xbcbc7e01), WTC0(0xbcad1501), WTC0(0xbc9e8801), WTC0(0xbc90d481), WTC0(0xbc83f201), WTC0(0xbc77d601), WTC0(0xbc6c7781), WTC0(0xbc61c401), WTC0(0xbc57a301), WTC0(0xbc4dfb81), WTC0(0xbc44b481), WTC0(0xbc3bbc01), WTC0(0xbc330781), WTC0(0xbc2a8c81), WTC0(0xbc224181), WTC0(0xbc1a2401), WTC0(0xbc123b81), WTC0(0xbc0a8f01), WTC0(0xbc032601), WTC0(0xbbfc0f81), WTC0(0xbbf56181), WTC0(0xbbef3301), WTC0(0xbbe99981), WTC0(0xbbe49d01), WTC0(0xbbe03801), WTC0(0xbbdc6481), WTC0(0xbbd91b81), WTC0(0xbbd64d01), WTC0(0xbbd3e101), WTC0(0xbbd1bd81), WTC0(0xbbcfca81), WTC0(0xbbce0601), WTC0(0xbbcc8201), WTC0(0xbbcb5301), WTC0(0xbbca8d01), WTC0(0xbbca5081), WTC0(0xbbcaca01), WTC0(0xbbcc2681), WTC0(0xbbce9181), WTC0(0xbbd21281), WTC0(0xbbd68c81), WTC0(0xbbdbe201), WTC0(0xbbe1f401), WTC0(0xbbe89901), WTC0(0xbbef9b81), WTC0(0xbbf6c601), WTC0(0xbbfde481), WTC0(0xbc04e381), WTC0(0xbc0bcf81), WTC0(0xbc12b801), WTC0(0xbc19ab01), WTC0(0xbc20ae01), WTC0(0xbc27bd81), WTC0(0xbc2ed681), WTC0(0xbc35f501), WTC0(0xbc3d1801), WTC0(0xbc444081), WTC0(0xbc4b6e81), WTC0(0xbc52a381), WTC0(0xbc59df81), WTC0(0xbc612301), WTC0(0xbc686e01), WTC0(0xbc6fc101), WTC0(0xbc771c01), WTC0(0xbc7e7e01), WTC0(0xbc85e801), WTC0(0xbc8d5901), WTC0(0xbc94d201), WTC0(0xbc9c5281), WTC0(0xbca3db01), WTC0(0xbcab6c01), WTC0(0xbcb30601), WTC0(0xbcbaa801), WTC0(0xbcc25181), WTC0(0xbcca0301), WTC0(0xbcd1bb81), WTC0(0xbcd97c81), WTC0(0xbce14601), WTC0(0xbce91801), WTC0(0xbcf0f381), WTC0(0xbcf8d781), WTC0(0xbd00c381), WTC0(0xbd08b781), WTC0(0xbd10b381), WTC0(0xbd18b781), WTC0(0xbd20c401), WTC0(0xbd28d981), WTC0(0xbd30f881), WTC0(0xbd391f81), WTC0(0xbd414f01), WTC0(0xbd498601), WTC0(0xbd51c481), WTC0(0xbd5a0b01), WTC0(0xbd625981), WTC0(0xbd6ab101), WTC0(0xbd731081), WTC0(0xbd7b7781), WTC0(0xbd83e681), WTC0(0xbd8c5c01), WTC0(0xbd94d801), WTC0(0xbd9d5b81), WTC0(0xbda5e601), WTC0(0xbdae7881), WTC0(0xbdb71201), WTC0(0xbdbfb281), WTC0(0xbdc85981), WTC0(0xbdd10681), WTC0(0xbdd9b981), WTC0(0xbde27201), WTC0(0xbdeb3101), WTC0(0xbdf3f701), WTC0(0xbdfcc301), WTC0(0xbe059481), WTC0(0xbe0e6c01), WTC0(0xbe174781), WTC0(0xbe202801), WTC0(0xbe290d01), WTC0(0xbe31f701), WTC0(0xbe3ae601), WTC0(0xbe43da81), WTC0(0xbe4cd381), WTC0(0xbe55d001), WTC0(0xbe5ed081), WTC0(0xbe67d381), WTC0(0xbe70da01), WTC0(0xbe79e481), WTC0(0xbe82f301), WTC0(0xbe8c0501), WTC0(0xbe951a81), WTC0(0xbe9e3281), WTC0(0xbea74c81), WTC0(0xbeb06881), WTC0(0xbeb98681), WTC0(0xbec2a781), WTC0(0xbecbca81), WTC0(0xbed4f081), WTC0(0xbede1901), WTC0(0xbee74281), WTC0(0xbef06d01), WTC0(0xbef99901), WTC0(0xbf02c581), WTC0(0xbf0bf381), WTC0(0xbf152381), WTC0(0xbf1e5501), WTC0(0xbf278801), WTC0(0xbf30bb01), WTC0(0xbf39ee81), WTC0(0xbf432281), WTC0(0xbf4c5681), WTC0(0xbf558b01), WTC0(0xbf5ec101), WTC0(0xbf67f801), WTC0(0xbf712f01), WTC0(0xbf7a6681), WTC0(0xbf839d81), WTC0(0xbf8cd481), WTC0(0xbf960b01), WTC0(0xbf9f4181), WTC0(0xbfa87901), WTC0(0xbfb1b101), WTC0(0xbfbae981), WTC0(0xbfc42201), WTC0(0xbfcd5a01), WTC0(0xbfd69101), WTC0(0xbfdfc781), WTC0(0xbfe8fc01), WTC0(0xbff22f81), WTC0(0xbffb6081), /* part 1 */ WTC1(0x80093e01), WTC1(0x801b9b01), WTC1(0x802df701), WTC1(0x80405101), WTC1(0x8052a881), WTC1(0x8064fc81), WTC1(0x80774c81), WTC1(0x80899881), WTC1(0x809bdf01), WTC1(0x80ae1f81), WTC1(0x80c05a01), WTC1(0x80d28d81), WTC1(0x80e4bb81), WTC1(0x80f6e481), WTC1(0x81090981), WTC1(0x811b2981), WTC1(0x812d4481), WTC1(0x813f5981), WTC1(0x81516701), WTC1(0x81636d81), WTC1(0x81756d81), WTC1(0x81876781), WTC1(0x81995c01), WTC1(0x81ab4b01), WTC1(0x81bd3401), WTC1(0x81cf1581), WTC1(0x81e0ee81), WTC1(0x81f2bf81), WTC1(0x82048881), WTC1(0x82164a81), WTC1(0x82280581), WTC1(0x8239b981), WTC1(0x824b6601), WTC1(0x825d0901), WTC1(0x826ea201), WTC1(0x82803101), WTC1(0x8291b601), WTC1(0x82a33281), WTC1(0x82b4a601), WTC1(0x82c61101), WTC1(0x82d77201), WTC1(0x82e8c801), WTC1(0x82fa1181), WTC1(0x830b4f81), WTC1(0x831c8101), WTC1(0x832da781), WTC1(0x833ec381), WTC1(0x834fd481), WTC1(0x8360d901), WTC1(0x8371d081), WTC1(0x8382ba01), WTC1(0x83939501), WTC1(0x83a46181), WTC1(0x83b52101), WTC1(0x83c5d381), WTC1(0x83d67881), WTC1(0x83e70f01), WTC1(0x83f79681), WTC1(0x84080d81), WTC1(0x84187401), WTC1(0x8428ca01), WTC1(0x84391081), WTC1(0x84494881), WTC1(0x84597081), WTC1(0x84698881), WTC1(0x84798f81), WTC1(0x84898481), WTC1(0x84996701), WTC1(0x84a93801), WTC1(0x84b8f801), WTC1(0x84c8a701), WTC1(0x84d84601), WTC1(0x84e7d381), WTC1(0x84f74e01), WTC1(0x8506b581), WTC1(0x85160981), WTC1(0x85254a81), WTC1(0x85347901), WTC1(0x85439601), WTC1(0x8552a181), WTC1(0x85619a01), WTC1(0x85707f81), WTC1(0x857f5101), WTC1(0x858e0e01), WTC1(0x859cb781), WTC1(0x85ab4f01), WTC1(0x85b9d481), WTC1(0x85c84801), WTC1(0x85d6a981), WTC1(0x85e4f801), WTC1(0x85f33281), WTC1(0x86015981), WTC1(0x860f6e01), WTC1(0x861d7081), WTC1(0x862b6201), WTC1(0x86394301), WTC1(0x86471281), WTC1(0x8654d001), WTC1(0x86627b01), WTC1(0x86701381), WTC1(0x867d9a81), WTC1(0x868b1001), WTC1(0x86987581), WTC1(0x86a5ca81), WTC1(0x86b30f01), WTC1(0x86c04381), WTC1(0x86cd6681), WTC1(0x86da7901), WTC1(0x86e77b81), WTC1(0x86f46d81), WTC1(0x87014f81), WTC1(0x870e2301), WTC1(0x871ae981), WTC1(0x8727a381), WTC1(0x87345381), WTC1(0x8740f681), WTC1(0x874d8681), WTC1(0x8759fd01), WTC1(0x87665481), WTC1(0x87729701), WTC1(0x877ede01), WTC1(0x878b4301), WTC1(0x8797dd81), WTC1(0x87a48b01), WTC1(0x87b0ef01), WTC1(0x87bcab81), WTC1(0x87c76201), WTC1(0x87d0ca81), WTC1(0x87fdd781), WTC1(0x881dd301), WTC1(0x88423301), WTC1(0x886a8a81), WTC1(0x88962981), WTC1(0x88c45e81), WTC1(0x88f47901), WTC1(0x8925f101), WTC1(0x89586901), WTC1(0x898b8301), WTC1(0x89bee581), WTC1(0x89f26101), WTC1(0x8a25f301), WTC1(0x8a599a81), WTC1(0x8a8d5801), WTC1(0x8ac13381), WTC1(0x8af53e81), WTC1(0x8b298b81), WTC1(0x8b5e2c81), WTC1(0x8b933001), WTC1(0x8bc8a401), WTC1(0x8bfe9401), WTC1(0x8c350d01), WTC1(0x8c6c1b01), WTC1(0x8ca3cb01), WTC1(0x8cdc2901), WTC1(0x8d154081), WTC1(0x8d4f1b01), WTC1(0x8d89be81), WTC1(0x8dc53001), WTC1(0x8e017581), WTC1(0x8e3e9481), WTC1(0x8e7c9301), WTC1(0x8ebb7581), WTC1(0x8efb4181), WTC1(0x8f3bfb01), WTC1(0x8f7da401), WTC1(0x8fc03f01), WTC1(0x9003ce81), WTC1(0x90485401), WTC1(0x908dd101), WTC1(0x90d44781), WTC1(0x911bb981), WTC1(0x91642781), WTC1(0x91ad9281), WTC1(0x91f7f981), WTC1(0x92435d01), WTC1(0x928fbe01), WTC1(0x92dd1b01), WTC1(0x932b7501), WTC1(0x937acb01), WTC1(0x93cb1c81), WTC1(0x941c6901), WTC1(0x946eaf81), WTC1(0x94c1ee01), WTC1(0x95162381), WTC1(0x956b4f81), WTC1(0x95c17081), WTC1(0x96188501), WTC1(0x96708b81), WTC1(0x96c98381), WTC1(0x97236b01), WTC1(0x977e4181), WTC1(0x97da0481), WTC1(0x9836b201), WTC1(0x98944901), WTC1(0x98f2c601), WTC1(0x99522801), WTC1(0x99b26c81), WTC1(0x9a139101), WTC1(0x9a759301), WTC1(0x9ad87081), WTC1(0x9b3c2801), WTC1(0x9ba0b701), WTC1(0x9c061b81), WTC1(0x9c6c5481), WTC1(0x9cd35f81), WTC1(0x9d3b3b81), WTC1(0x9da3e601), WTC1(0x9e0d5e01), WTC1(0x9e779f81), WTC1(0x9ee2a901), WTC1(0x9f4e7801), WTC1(0x9fbb0981), WTC1(0xa0285d81), WTC1(0xa0967201), WTC1(0xa1054701), WTC1(0xa174da81), WTC1(0xa1e52a81), WTC1(0xa2563501), WTC1(0xa2c7f801), WTC1(0xa33a7201), WTC1(0xa3ada281), WTC1(0xa4218801), WTC1(0xa4962181), WTC1(0xa50b6e81), WTC1(0xa5816e81), WTC1(0xa5f81f81), WTC1(0xa66f8201), WTC1(0xa6e79401), WTC1(0xa7605601), WTC1(0xa7d9c681), WTC1(0xa853e501), WTC1(0xa8ceb201), WTC1(0xa94a2c01), WTC1(0xa9c65401), WTC1(0xaa432981), WTC1(0xaac0ad01), WTC1(0xab3edf01), WTC1(0xabbdc001), WTC1(0xac3d5001), WTC1(0xacbd9081), WTC1(0xad3e8101), WTC1(0xadc02281), WTC1(0xae427481), WTC1(0xaec57801), WTC1(0xaf492f01), WTC1(0xafcd9a81), WTC1(0xb052bc01), WTC1(0xb0d89401), WTC1(0xb15f2381), WTC1(0xb1e66a01), WTC1(0xb26e6881), WTC1(0xb2f71f01), WTC1(0xb3808d81), WTC1(0xb40ab501), WTC1(0xb4959501), WTC1(0xb5212e81), WTC1(0x4a6cf67f), WTC1(0x49dffeff), WTC1(0x495265ff), WTC1(0x48c4277f), WTC1(0x4835407f), WTC1(0x47a5aeff), WTC1(0x471570ff), WTC1(0x468484ff), WTC1(0x45f2eaff), WTC1(0x4560a2ff), WTC1(0x44cdad7f), WTC1(0x443a0c7f), WTC1(0x43a5c07f), WTC1(0x4310caff), WTC1(0x427b2bff), WTC1(0x41e4e3ff), WTC1(0x414df2ff), WTC1(0x40b6557f), WTC1(0x401e06ff), WTC1(0x3f8503c0), WTC1(0x3eeb4e00), WTC1(0x3e50ebc0), WTC1(0x3db5e680), WTC1(0x3d1a4680), WTC1(0x3c7e10c0), WTC1(0x3be14cc0), WTC1(0x3b4402c0), WTC1(0x3aa63800), WTC1(0x3a07e840), WTC1(0x39690880), WTC1(0x38c98700), WTC1(0x38295b40), WTC1(0x37888a80), WTC1(0x36e71d40), WTC1(0x36451d80), WTC1(0x35a29400), WTC1(0x34ff8800), WTC1(0x345c04c0), WTC1(0x33b81940), WTC1(0x3313d200), WTC1(0x326f3800), WTC1(0x31ca5600), WTC1(0x31253840), WTC1(0x307fe8c0), WTC1(0x2fda6e40), WTC1(0x2f34ce40), WTC1(0x2e8f0e40), WTC1(0x2de92ec0), WTC1(0x2d432780), WTC1(0x2c9cea40), WTC1(0x2bf66300), WTC1(0x2b4f88c0), WTC1(0x2aa864c0), WTC1(0x2a010240), WTC1(0x29596e40), WTC1(0x28b1ba80), WTC1(0x2809ff40), WTC1(0x27625b80), WTC1(0x26baf580), WTC1(0x2613e7c0), WTC1(0x256d3dc0), WTC1(0x24c70300), WTC1(0x24214380), WTC1(0x237c0800), WTC1(0x22d75400), WTC1(0x22332a80), WTC1(0x218f8cc0), WTC1(0x20ec7e40), WTC1(0x204a04c0), WTC1(0x1fa82540), WTC1(0x1f06e300), WTC1(0x1e664000), WTC1(0x1dc63bc0), WTC1(0x1d26d3c0), WTC1(0x1c8803a0), WTC1(0x1be9cc40), WTC1(0x1b4c34c0), WTC1(0x1aaf4480), WTC1(0x1a130260), WTC1(0x197774a0), WTC1(0x18dca260), WTC1(0x184294e0), WTC1(0x17a95840), WTC1(0x1710fd80), WTC1(0x16799ce0), WTC1(0x15e35340), WTC1(0x154e41a0), WTC1(0x14ba8360), WTC1(0x14282be0), WTC1(0x13975100), WTC1(0x13080aa0), WTC1(0x127a6240), WTC1(0x11ee50a0), WTC1(0x1163cc80), WTC1(0x10dacb20), WTC1(0x105333a0), WTC1(0x0fccdb30), WTC1(0x0f478f40), WTC1(0x0ec31700), WTC1(0x0e3f4e80), WTC1(0x0dbc27f0), WTC1(0x0d399000), WTC1(0x0cb76d00), WTC1(0x0c359d50), WTC1(0x0bb3fd50), WTC1(0x0b326bd0), WTC1(0x0ab0ca80), WTC1(0x0a2f0dc0), WTC1(0x09ad40c0), WTC1(0x092b7a90), WTC1(0x08a9db80), WTC1(0x08285c80), WTC1(0x07a6c7b8), WTC1(0x0724e4e0), WTC1(0x06a27b80), WTC1(0x061f52f8), WTC1(0x059b2ad0), WTC1(0x0515b568), WTC1(0x048ea058), WTC1(0x04066408), WTC1(0x037e52d8), WTC1(0x02f7d3c8), WTC1(0x0274614c), WTC1(0x01f63008), WTC1(0x0180403a), WTC1(0x0115c442), WTC1(0x00ba09e2), WTC1(0x006f077c), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), /* part 2 */ WTC2(0xfff36be1), WTC2(0xffdafbc1), WTC2(0xffc28035), WTC2(0xffa9fe8a), WTC2(0xff917c08), WTC2(0xff78fdfc), WTC2(0xff6089af), WTC2(0xff48246c), WTC2(0xff2fd37f), WTC2(0xff179c31), WTC2(0xfeff83b6), WTC2(0xfee78d18), WTC2(0xfecfb93e), WTC2(0xfeb808f2), WTC2(0xfea07d06), WTC2(0xfe8916b4), WTC2(0xfe71d7a0), WTC2(0xfe5ac174), WTC2(0xfe43d5d6), WTC2(0xfe2d167e), WTC2(0xfe16852e), WTC2(0xfe0023a6), WTC2(0xfde9f3f8), WTC2(0xfdd3ff7c), WTC2(0xfdbe56c0), WTC2(0xfda90aa8), WTC2(0xfd942b78), WTC2(0xfd7fbb20), WTC2(0xfd6bad50), WTC2(0xfd57f510), WTC2(0xfd44857c), WTC2(0xfd3153fc), WTC2(0xfd1e5840), WTC2(0xfd0b8a0c), WTC2(0xfcf8e180), WTC2(0xfce65eec), WTC2(0xfcd40ad0), WTC2(0xfcc1ee0c), WTC2(0xfcb011e8), WTC2(0xfc9e896c), WTC2(0xfc8d716c), WTC2(0xfc7ce720), WTC2(0xfc6d072c), WTC2(0xfc5de09c), WTC2(0xfc4f74e8), WTC2(0xfc41c4e8), WTC2(0xfc34d0dc), WTC2(0xfc288a68), WTC2(0xfc1cd49c), WTC2(0xfc1191e0), WTC2(0xfc06a4d0), WTC2(0xfbfbf3e8), WTC2(0xfbf16990), WTC2(0xfbe6f068), WTC2(0xfbdc7428), WTC2(0xfbd1fc68), WTC2(0xfbc7ac50), WTC2(0xfbbda868), WTC2(0xfbb41500), WTC2(0xfbab1438), WTC2(0xfba2c5f8), WTC2(0xfb9b4a00), WTC2(0xfb94bfa8), WTC2(0xfb8f3b48), WTC2(0xfb8ac638), WTC2(0xfb876970), WTC2(0xfb852d20), WTC2(0xfb840ae0), WTC2(0xfb83ed60), WTC2(0xfb84bec0), WTC2(0xfb866918), WTC2(0xfb88d4a8), WTC2(0xfb8be810), WTC2(0xfb8f89d0), WTC2(0xfb93a080), WTC2(0xfb981418), WTC2(0xfb9ccdf0), WTC2(0xfba1b770), WTC2(0xfba6bae0), WTC2(0xfbabd5c0), WTC2(0xfbb118d8), WTC2(0xfbb695c0), WTC2(0xfbbc5e90), WTC2(0xfbc29030), WTC2(0xfbc95268), WTC2(0xfbd0cd78), WTC2(0xfbd929c8), WTC2(0xfbe294d0), WTC2(0xfbed4108), WTC2(0xfbf96118), WTC2(0xfc0726c8), WTC2(0xfc16b064), WTC2(0xfc280890), WTC2(0xfc3b3920), WTC2(0xfc504a98), WTC2(0xfc67271c), WTC2(0xfc7f9a74), WTC2(0xfc996f18), WTC2(0xfcb46eb8), WTC2(0xfcd050b0), WTC2(0xfcecba24), WTC2(0xfd094f64), WTC2(0xfd25b720), WTC2(0xfd41ce40), WTC2(0xfd5da7f8), WTC2(0xfd7959d8), WTC2(0xfd94fb74), WTC2(0xfdb0d3fc), WTC2(0xfdcd5a34), WTC2(0xfdeb06e4), WTC2(0xfe0a5184), WTC2(0xfe2b92c4), WTC2(0xfe4f0486), WTC2(0xfe74df54), WTC2(0xfe9d5886), WTC2(0xfec85b92), WTC2(0xfef58a16), WTC2(0xff248275), WTC2(0xff54e401), WTC2(0xff866330), WTC2(0xffb8c99b), WTC2(0xffebe1c9), WTC2(0x001f786a), WTC2(0x00538bf9), WTC2(0x00884cbc), WTC2(0x00bded23), WTC2(0x00f49f54), WTC2(0x012c8ee4), WTC2(0x0165e0d2), WTC2(0x01a0b9d6), WTC2(0x01dd3d80), WTC2(0x021b74d4), WTC2(0x025b4e48), WTC2(0x029cb730), WTC2(0x02df9d0c), WTC2(0x0323f1a4), WTC2(0x0369ab00), WTC2(0x03b0bf5c), WTC2(0x03f925a0), WTC2(0x0442e3d8), WTC2(0x048e0f40), WTC2(0x04dabdb0), WTC2(0x05290430), WTC2(0x0578e428), WTC2(0x05ca4b60), WTC2(0x061d26c0), WTC2(0x067163d8), WTC2(0x06c6ff10), WTC2(0x071e03b0), WTC2(0x07767da0), WTC2(0x07d07918), WTC2(0x082c08e0), WTC2(0x08894660), WTC2(0x08e84b70), WTC2(0x094930b0), WTC2(0x09abf8d0), WTC2(0x0a109020), WTC2(0x0a76e210), WTC2(0x0adeda50), WTC2(0x0b486b80), WTC2(0x0bb38f00), WTC2(0x0c203e80), WTC2(0x0c8e73e0), WTC2(0x0cfe2c30), WTC2(0x0d6f6820), WTC2(0x0de22850), WTC2(0x0e566d90), WTC2(0x0ecc3dd0), WTC2(0x0f43a3a0), WTC2(0x0fbca9f0), WTC2(0x10375b80), WTC2(0x10b3be20), WTC2(0x1131d280), WTC2(0x11b19960), WTC2(0x123313a0), WTC2(0x12b64380), WTC2(0x133b2d00), WTC2(0x13c1d440), WTC2(0x144a3d60), WTC2(0x14d46900), WTC2(0x15605480), WTC2(0x15edfd20), WTC2(0x167d6040), WTC2(0x170e7e80), WTC2(0x17a15b80), WTC2(0x1835fb00), WTC2(0x18cc60a0), WTC2(0x19648dc0), WTC2(0x19fe80e0), WTC2(0x1a9a38a0), WTC2(0x1b37b3e0), WTC2(0x1bd6f400), WTC2(0x1c77fd20), WTC2(0x1d1ad400), WTC2(0x1dbf7c80), WTC2(0x1e65f820), WTC2(0x1f0e4540), WTC2(0x1fb861e0), WTC2(0x20644cc0), WTC2(0x21120640), WTC2(0x21c19240), WTC2(0x2272f480), WTC2(0x23263000), WTC2(0x23db4580), WTC2(0x24923340), WTC2(0x254af700), WTC2(0x26058e80), WTC2(0x26c1fa00), WTC2(0x27803d00), WTC2(0x28405a40), WTC2(0x29025500), WTC2(0x29c62d40), WTC2(0x2a8be0c0), WTC2(0x2b536cc0), WTC2(0x2c1ccf80), WTC2(0x2ce80840), WTC2(0x2db519c0), WTC2(0x2e840600), WTC2(0x2f54cf80), WTC2(0x302775c0), WTC2(0x30fbf640), WTC2(0x31d24e00), WTC2(0x32aa7a00), WTC2(0x338479c0), WTC2(0x34604e40), WTC2(0x353df900), WTC2(0x361d7ac0), WTC2(0x36fed200), WTC2(0x37e1fb40), WTC2(0x38c6f240), WTC2(0x39adb2c0), WTC2(0x3a963a00), WTC2(0x3b808740), WTC2(0x3c6c9880), WTC2(0x3d5a6cc0), WTC2(0x3e4a0040), WTC2(0x3f3b4bc0), WTC2(0x402e48ff), WTC2(0x4122f17f), WTC2(0x42193f7f), WTC2(0x43112eff), WTC2(0x440abbff), WTC2(0x4505e2ff), WTC2(0x46029e7f), WTC2(0x4700e9ff), WTC2(0x4800bfff), WTC2(0x49021bff), WTC2(0x4a050eff), WTC2(0x4b09bc7f), WTC2(0x4c104aff), WTC2(0x4d18df7f), WTC2(0x4e23a07f), WTC2(0x4f30b2ff), WTC2(0x50403c7f), WTC2(0x515262ff), WTC2(0x52674b7f), WTC2(0x001678b2), WTC2(0x00061a3b), WTC2(0xfffb4622), WTC2(0xfff5ea94), WTC2(0xfff5f5b9), WTC2(0xfffb55bd), WTC2(0x0005f8cb), WTC2(0x0015cd0c), WTC2(0x002ac0ac), WTC2(0x0044c1d5), WTC2(0x0063beb2), WTC2(0x0087a56d), WTC2(0x00b06431), WTC2(0x00dde929), WTC2(0x01102280), WTC2(0x0146fe5e), WTC2(0x01826af2), WTC2(0x01c25662), WTC2(0x0206aedc), WTC2(0x024f6288), WTC2(0x029c5f94), WTC2(0x02ed9424), WTC2(0x0342ee6c), WTC2(0x039c5c90), WTC2(0x03f9ccbc), WTC2(0x045b2d18), WTC2(0x04c06bd8), WTC2(0x05297718), WTC2(0x05963d10), WTC2(0x0606abe8), WTC2(0x067ab1c0), WTC2(0x06f23cd0), WTC2(0x076d3b40), WTC2(0x07eb9b38), WTC2(0x086d4ae0), WTC2(0x08f23860), WTC2(0x097a51f0), WTC2(0x0a0585b0), WTC2(0x0a93c1d0), WTC2(0x0b24f470), WTC2(0x0bb90bc0), WTC2(0x0c4ff5f0), WTC2(0x0ce9a130), WTC2(0x0d85fb90), WTC2(0x0e24f360), WTC2(0x0ec676b0), WTC2(0x0f6a73b0), WTC2(0x1010d880), WTC2(0x10b99360), WTC2(0x11649280), WTC2(0x1211c400), WTC2(0x12c115e0), WTC2(0x137276a0), WTC2(0x1425d420), WTC2(0x14db1ca0), WTC2(0x15923e60), WTC2(0x164b2780), WTC2(0x1705c620), WTC2(0x17c20860), WTC2(0x187fdca0), WTC2(0x193f30e0), WTC2(0x19fff340), WTC2(0x1ac21200), WTC2(0x1b857b40), WTC2(0x1c4a1d40), WTC2(0x1d0fe600), WTC2(0x1dd6c3e0), WTC2(0x1e9ea4e0), WTC2(0x1f677740), WTC2(0x20312940), WTC2(0x20fba8c0), WTC2(0x21c6e440), WTC2(0x2292c9c0), WTC2(0x235f4780), WTC2(0x242c4b80), WTC2(0x24f9c400), WTC2(0x25c79f40), WTC2(0x2695cb40), WTC2(0x27643680), WTC2(0x2832cec0), WTC2(0x29018240), WTC2(0x29d03f80), WTC2(0x2a9ef480), WTC2(0x2b6d8f00), WTC2(0x2c3bfdc0), WTC2(0x2d0a2ec0), WTC2(0x2dd81000), WTC2(0x2ea58fc0), WTC2(0x2f729c40), WTC2(0x303f2380), WTC2(0x310b1400), WTC2(0x31d65b80), WTC2(0x32a0e840), WTC2(0x336aa8c0), WTC2(0x34338ac0), WTC2(0x34fb7cc0), WTC2(0x35c26cc0), WTC2(0x36884900), WTC2(0x374cff80), WTC2(0x38107e80), WTC2(0x38d2b440), WTC2(0x39938ec0), WTC2(0x3a52fc40), WTC2(0x3b10eb00), WTC2(0x3bcd4900), WTC2(0x3c880480), WTC2(0x3d410bc0), WTC2(0x3df84d00), WTC2(0x3eadb600), WTC2(0x3f613540), WTC2(0x4012b8ff), WTC2(0x40c22eff), WTC2(0x416f85ff), WTC2(0x421aab7f), WTC2(0x42c38e7f), WTC2(0x436a1c7f), WTC2(0x440e437f), WTC2(0x44aff27f), WTC2(0x454f167f), WTC2(0x45eb9eff), WTC2(0x468578ff), WTC2(0x471c937f), WTC2(0x47b0dc7f), WTC2(0x484241ff), WTC2(0x48d0b1ff), WTC2(0x495c1a7f), WTC2(0x49e46a7f), WTC2(0x4a698f7f), WTC2(0x4aeb77ff), WTC2(0x4b6a11ff), WTC2(0x4be54b7f), WTC2(0x4c5d12ff), WTC2(0x4cd155ff), WTC2(0x4d4203ff), WTC2(0x4daf09ff), WTC2(0x4e18567f), WTC2(0x4e7dd77f), WTC2(0x4edf7b7f), WTC2(0x4f3d307f), WTC2(0x4f96e47f), WTC2(0x4fec85ff), WTC2(0x503e02ff), WTC2(0x508b497f), WTC2(0x50d447ff), WTC2(0x5118ec7f), WTC2(0x515924ff), WTC2(0x5194dfff), WTC2(0x51cc0b7f), WTC2(0x51fe95ff), WTC2(0x522c6cff), WTC2(0x52557eff), WTC2(0x5279b9ff), WTC2(0x52990c7f), WTC2(0x52b364ff), WTC2(0x52c8b07f), WTC2(0x52d8ddff), WTC2(0x52e3db7f), WTC2(0x52e996ff), WTC2(0x52e9ff7f), WTC2(0x52e501ff), WTC2(0x52da8cff), WTC2(0x52ca8f7f), WTC2(0x52b4f67f), WTC2(0x5299b07f), WTC2(0x5278ac7f), WTC2(0x5251d77f), WTC2(0x52251fff), WTC2(0x51f274ff), WTC2(0x51b9c37f), WTC2(0x517af9ff), WTC2(0x5136077f), WTC2(0x50ead8ff), WTC2(0x50995cff), WTC2(0x504181ff), WTC2(0x4fe335ff), WTC2(0x4f7e677f), WTC2(0x4f1303ff), WTC2(0x4ea0f9ff), WTC2(0x4e2837ff), WTC2(0x4da8ab7f), WTC2(0x4d2242ff), WTC2(0x4c94ecff), WTC2(0x4c0096ff), WTC2(0x4b652f7f), WTC2(0x4ac2a4ff), WTC2(0x4a18e4ff), WTC2(0x4967ddff), WTC2(0x48af7e7f), WTC2(0x47efb3ff), WTC2(0x47286cff), WTC2(0x4659ad7f), WTC2(0x45856f7f), WTC2(0x44afa3ff), WTC2(0x43dc507f), WTC2(0x430f657f), WTC2(0x424ad47f), WTC2(0x418e927f), WTC2(0x40da7bff), WTC2(0x402e6f7f), WTC2(0x3f8a3100), WTC2(0x3eed6f40), WTC2(0x3e57d700), WTC2(0x3dc914c0), WTC2(0x3d40cc40), WTC2(0x3cbe98c0), WTC2(0x3c421540), WTC2(0x3bcadbc0), WTC2(0x3b588880), WTC2(0x3aeab780), WTC2(0x3a810540), WTC2(0x3a1b0e00), WTC2(0x39b86d00), WTC2(0x3958bcc0), WTC2(0x38fb9700), WTC2(0x38a095c0), WTC2(0x38473d80), WTC2(0x37eeff40), WTC2(0x37974b40), WTC2(0x373f9500), WTC2(0x36e7ae00), WTC2(0x368fc4c0), WTC2(0x36380b80), WTC2(0x35e0b300), WTC2(0x3589c140), WTC2(0x35331180), WTC2(0x34dc7c80), WTC2(0x3485dc80), WTC2(0x342f1600), WTC2(0x33d81780), WTC2(0x3380d0c0), WTC2(0x33293100), WTC2(0x32d11800), WTC2(0x32785780), WTC2(0x321ec0c0), WTC2(0x31c42680), WTC2(0x316885c0), WTC2(0x310c0580), WTC2(0x30aecec0), WTC2(0x30510940), WTC2(0x2ff2b8c0), WTC2(0x2f93bf40), WTC2(0x2f33fc00), WTC2(0x2ed350c0), WTC2(0x2e71ba80), WTC2(0x2e0f5340), WTC2(0x2dac35c0), WTC2(0x2d487c80), WTC2(0x2ce431c0), WTC2(0x2c7f4fc0), WTC2(0x2c19d080), WTC2(0x2bb3ad80), WTC2(0x2b4ce080), WTC2(0x2ae56340), WTC2(0x2a7d2f80), WTC2(0x2a143f00), WTC2(0x29aa8b40) }; const FIXP_WTB ELDAnalysis480[1440] = { WTC0(0xfacfbef0), WTC0(0xfab88c18), WTC0(0xfaa0e520), WTC0(0xfa88d110), WTC0(0xfa7056e8), WTC0(0xfa577db0), WTC0(0xfa3e4c70), WTC0(0xfa24ca28), WTC0(0xfa0afde0), WTC0(0xf9f0eea0), WTC0(0xf9d6a2c8), WTC0(0xf9bc1ab8), WTC0(0xf9a15230), WTC0(0xf9864510), WTC0(0xf96af058), WTC0(0xf94f55c0), WTC0(0xf93378e0), WTC0(0xf9175d80), WTC0(0xf8fb0468), WTC0(0xf8de68b8), WTC0(0xf8c18438), WTC0(0xf8a450d8), WTC0(0xf886cde8), WTC0(0xf8690148), WTC0(0xf84af148), WTC0(0xf82ca410), WTC0(0xf80e1e18), WTC0(0xf7ef62a0), WTC0(0xf7d074e0), WTC0(0xf7b15870), WTC0(0xf7921240), WTC0(0xf772a7a0), WTC0(0xf7531e50), WTC0(0xf7337820), WTC0(0xf713afd0), WTC0(0xf6f3bea0), WTC0(0xf6d39dc0), WTC0(0xf6b352e0), WTC0(0xf692f280), WTC0(0xf6729250), WTC0(0xf65247a0), WTC0(0xf63224c0), WTC0(0xf6123a00), WTC0(0xf5f297c0), WTC0(0xf5d34dd0), WTC0(0xf5b46b10), WTC0(0xf595fd90), WTC0(0xf5781390), WTC0(0xf55abba0), WTC0(0xf53e0510), WTC0(0xf521ff70), WTC0(0xf506ba30), WTC0(0xf4ec4330), WTC0(0xf4d2a680), WTC0(0xf4b9efe0), WTC0(0xf4a22ac0), WTC0(0xf48b5f70), WTC0(0xf4759310), WTC0(0xf460cde0), WTC0(0xf44cfcc0), WTC0(0xf439aff0), WTC0(0xf4264e00), WTC0(0xf4123d90), WTC0(0xf3fd1370), WTC0(0xf3e6be00), WTC0(0xf3cf41a0), WTC0(0xf3b6a030), WTC0(0xf39cdd60), WTC0(0xf381fe00), WTC0(0xf3660760), WTC0(0xf348fe70), WTC0(0xf32ae820), WTC0(0xf30bc940), WTC0(0xf2eba690), WTC0(0xf2ca8480), WTC0(0xf2a86670), WTC0(0xf2854f40), WTC0(0xf2614190), WTC0(0xf23c41e0), WTC0(0xf21657a0), WTC0(0xf1ef8ae0), WTC0(0xf1c7e3e0), WTC0(0xf19f63d0), WTC0(0xf1760450), WTC0(0xf14bbdf0), WTC0(0xf1208960), WTC0(0xf0f45cd0), WTC0(0xf0c72ce0), WTC0(0xf098ee00), WTC0(0xf06996f0), WTC0(0xf0392620), WTC0(0xf0079e10), WTC0(0xefd4ffc0), WTC0(0xefa15ca0), WTC0(0xef6ce600), WTC0(0xef37d460), WTC0(0xef025f80), WTC0(0xeecca2c0), WTC0(0xee969760), WTC0(0xee603440), WTC0(0xee296d20), WTC0(0xedf21c00), WTC0(0xedba07e0), WTC0(0xed80f640), WTC0(0xed46bf40), WTC0(0xed0b7b00), WTC0(0xeccf5fc0), WTC0(0xec92a120), WTC0(0xec556d60), WTC0(0xec17e700), WTC0(0xebda2d40), WTC0(0xeb9c5fa0), WTC0(0xeb5e7040), WTC0(0xeb201b20), WTC0(0xeae117c0), WTC0(0xeaa12000), WTC0(0xea600180), WTC0(0xea1d9940), WTC0(0xe9d9c160), WTC0(0xe99468a0), WTC0(0xe94dc040), WTC0(0xe9061940), WTC0(0xe8bdc140), WTC0(0xe8750ae0), WTC0(0xe82c4fa0), WTC0(0xe7e3ea40), WTC0(0xe79c35e0), WTC0(0xe7554ca0), WTC0(0xe70efc00), WTC0(0xe6c90c20), WTC0(0xe6833f00), WTC0(0xe63d2300), WTC0(0xe5f620a0), WTC0(0xe5ad9dc0), WTC0(0xe5632080), WTC0(0xe5169da0), WTC0(0xe4c83e60), WTC0(0xe4782400), WTC0(0xe4269840), WTC0(0xe3d42dc0), WTC0(0xe38188c0), WTC0(0xe32f4be0), WTC0(0xe2ddeea0), WTC0(0xe28db520), WTC0(0xe23ee000), WTC0(0xe1f1a580), WTC0(0xe1a5e3a0), WTC0(0xe15b35a0), WTC0(0xe1113860), WTC0(0xe0c78a00), WTC0(0xe07dd0e0), WTC0(0xe033b7c0), WTC0(0xdfe8e680), WTC0(0xdf9d1fc0), WTC0(0xdf5055c0), WTC0(0xdf0287c0), WTC0(0xdeb3b340), WTC0(0xde63e7c0), WTC0(0xde134a00), WTC0(0xddc20000), WTC0(0xdd703180), WTC0(0xdd1e1280), WTC0(0xdccbe080), WTC0(0xdc79d980), WTC0(0xdc283600), WTC0(0xdbd71e00), WTC0(0xdb86b140), WTC0(0xdb3710c0), WTC0(0xdae850c0), WTC0(0xda9a6bc0), WTC0(0xda4d5640), WTC0(0xda010640), WTC0(0xd9b56640), WTC0(0xd96a5700), WTC0(0xd91fb700), WTC0(0xd8d56600), WTC0(0xd88b4a40), WTC0(0xd8414f00), WTC0(0xd7f75f80), WTC0(0xd7ad6740), WTC0(0xd76352c0), WTC0(0xd7191040), WTC0(0xd6ce8c80), WTC0(0xd683bd00), WTC0(0xd638a5c0), WTC0(0xd5ed4f80), WTC0(0xd5a1c240), WTC0(0xd5562b80), WTC0(0xd50ae500), WTC0(0xd4c04c80), WTC0(0xd476bb40), WTC0(0xd42e62c0), WTC0(0xd3e75680), WTC0(0xd3a1ad00), WTC0(0xd35d6780), WTC0(0xd31a4300), WTC0(0xd2d7dc00), WTC0(0xd295d080), WTC0(0xd253d8c0), WTC0(0xd211df40), WTC0(0xd1cfdbc0), WTC0(0xd18dc480), WTC0(0xd14b9dc0), WTC0(0xd1097c80), WTC0(0xd0c77700), WTC0(0xd085a500), WTC0(0xd0442f40), WTC0(0xd0034a80), WTC0(0xcfc32c00), WTC0(0xcf840400), WTC0(0xcf45f400), WTC0(0xcf0913c0), WTC0(0xcecd8000), WTC0(0xce932c80), WTC0(0xce59bf40), WTC0(0xce20cd40), WTC0(0xcde7ec40), WTC0(0xcdaeedc0), WTC0(0xcd75ea00), WTC0(0xcd3cfec0), WTC0(0xcd044b40), WTC0(0xcccbff00), WTC0(0xcc945480), WTC0(0xcc5d8780), WTC0(0xcc27c3c0), WTC0(0xcbf2fc40), WTC0(0xcbbf0a00), WTC0(0xcb8bc7c0), WTC0(0xcb591880), WTC0(0xcb26f0c0), WTC0(0xcaf54980), WTC0(0xcac41ac0), WTC0(0xca936440), WTC0(0xca632d80), WTC0(0xca337f00), WTC0(0xca046180), WTC0(0xc9d5dd40), WTC0(0xc9a7fa80), WTC0(0xc97ac200), WTC0(0xc94e3c00), WTC0(0xc91d1840), WTC0(0xc8f15980), WTC0(0xc8c52340), WTC0(0xc8988100), WTC0(0xc86b7f00), WTC0(0xc83e28c0), WTC0(0xc8108a80), WTC0(0xc7e2afc0), WTC0(0xc7b4a480), WTC0(0xc7867480), WTC0(0xc7582b40), WTC0(0xc729cc80), WTC0(0xc6fb5700), WTC0(0xc6ccca40), WTC0(0xc69e2180), WTC0(0xc66f49c0), WTC0(0xc64029c0), WTC0(0xc610a740), WTC0(0xc5e0bfc0), WTC0(0xc5b09e80), WTC0(0xc5807900), WTC0(0xc5508440), WTC0(0xc520e840), WTC0(0xc4f1bdc0), WTC0(0xc4c31d00), WTC0(0xc4951780), WTC0(0xc4678a00), WTC0(0xc43a28c0), WTC0(0xc40ca800), WTC0(0xc3deccc0), WTC0(0xc3b09940), WTC0(0xc3822c00), WTC0(0xc353a0c0), WTC0(0xc3251740), WTC0(0xc2f6b500), WTC0(0xc2c8a140), WTC0(0xc29b02c0), WTC0(0xc26df5c0), WTC0(0xc2418940), WTC0(0xc215cbc0), WTC0(0xc1eaca00), WTC0(0xc1c08680), WTC0(0xc196fb00), WTC0(0xc16e22c0), WTC0(0xc145f040), WTC0(0xc11e3a80), WTC0(0xc0f6cc00), WTC0(0xc0cf6ec0), WTC0(0xc0a802c0), WTC0(0xc0809280), WTC0(0xc0593340), WTC0(0xc031f880), WTC0(0xc00b04c0), WTC0(0xbfe48981), WTC0(0xbfbebb81), WTC0(0xbf99cb01), WTC0(0xbf75cc81), WTC0(0xbf52c101), WTC0(0xbf30a901), WTC0(0xbf0f8301), WTC0(0xbeef4601), WTC0(0xbecfe601), WTC0(0xbeb15701), WTC0(0xbe938c81), WTC0(0xbe767e81), WTC0(0xbe5a2301), WTC0(0xbe3e7201), WTC0(0xbe236001), WTC0(0xbe08e181), WTC0(0xbdeee981), WTC0(0xbdd56b81), WTC0(0xbdbc6381), WTC0(0xbda3d081), WTC0(0xbd8bb281), WTC0(0xbd740b81), WTC0(0xbd5ce281), WTC0(0xbd464281), WTC0(0xbd303581), WTC0(0xbd1ac801), WTC0(0xbd060c81), WTC0(0xbcf21601), WTC0(0xbcdef701), WTC0(0xbcccbd01), WTC0(0xbcbb7001), WTC0(0xbcab1781), WTC0(0xbc9bb901), WTC0(0xbc8d5101), WTC0(0xbc7fd301), WTC0(0xbc733401), WTC0(0xbc676501), WTC0(0xbc5c4c81), WTC0(0xbc51cb01), WTC0(0xbc47c281), WTC0(0xbc3e1981), WTC0(0xbc34c081), WTC0(0xbc2bab01), WTC0(0xbc22cd81), WTC0(0xbc1a2401), WTC0(0xbc11b681), WTC0(0xbc098d81), WTC0(0xbc01b381), WTC0(0xbbfa3c01), WTC0(0xbbf34281), WTC0(0xbbece281), WTC0(0xbbe73201), WTC0(0xbbe23281), WTC0(0xbbdddb01), WTC0(0xbbda2501), WTC0(0xbbd70201), WTC0(0xbbd45601), WTC0(0xbbd20301), WTC0(0xbbcfea81), WTC0(0xbbce0601), WTC0(0xbbcc6b01), WTC0(0xbbcb3201), WTC0(0xbbca7481), WTC0(0xbbca5d01), WTC0(0xbbcb2281), WTC0(0xbbccfc81), WTC0(0xbbd01301), WTC0(0xbbd45881), WTC0(0xbbd9a781), WTC0(0xbbdfdb81), WTC0(0xbbe6c801), WTC0(0xbbee2f81), WTC0(0xbbf5d181), WTC0(0xbbfd6c01), WTC0(0xbc04e381), WTC0(0xbc0c4581), WTC0(0xbc13a481), WTC0(0xbc1b1081), WTC0(0xbc228f01), WTC0(0xbc2a1a81), WTC0(0xbc31af01), WTC0(0xbc394901), WTC0(0xbc40e881), WTC0(0xbc488e81), WTC0(0xbc503b81), WTC0(0xbc57f101), WTC0(0xbc5fae81), WTC0(0xbc677501), WTC0(0xbc6f4401), WTC0(0xbc771c01), WTC0(0xbc7efc81), WTC0(0xbc86e581), WTC0(0xbc8ed701), WTC0(0xbc96d101), WTC0(0xbc9ed481), WTC0(0xbca6e101), WTC0(0xbcaef701), WTC0(0xbcb71701), WTC0(0xbcbf4001), WTC0(0xbcc77181), WTC0(0xbccfac01), WTC0(0xbcd7ef01), WTC0(0xbce03b81), WTC0(0xbce89281), WTC0(0xbcf0f381), WTC0(0xbcf95e81), WTC0(0xbd01d281), WTC0(0xbd0a4f81), WTC0(0xbd12d581), WTC0(0xbd1b6501), WTC0(0xbd23ff01), WTC0(0xbd2ca281), WTC0(0xbd355081), WTC0(0xbd3e0801), WTC0(0xbd46c801), WTC0(0xbd4f9101), WTC0(0xbd586281), WTC0(0xbd613d81), WTC0(0xbd6a2201), WTC0(0xbd731081), WTC0(0xbd7c0781), WTC0(0xbd850701), WTC0(0xbd8e0e01), WTC0(0xbd971c81), WTC0(0xbda03381), WTC0(0xbda95301), WTC0(0xbdb27b01), WTC0(0xbdbbab01), WTC0(0xbdc4e301), WTC0(0xbdce2181), WTC0(0xbdd76701), WTC0(0xbde0b301), WTC0(0xbdea0681), WTC0(0xbdf36101), WTC0(0xbdfcc301), WTC0(0xbe062b81), WTC0(0xbe0f9a01), WTC0(0xbe190d81), WTC0(0xbe228681), WTC0(0xbe2c0501), WTC0(0xbe358901), WTC0(0xbe3f1381), WTC0(0xbe48a301), WTC0(0xbe523781), WTC0(0xbe5bd001), WTC0(0xbe656c01), WTC0(0xbe6f0c01), WTC0(0xbe78b001), WTC0(0xbe825801), WTC0(0xbe8c0501), WTC0(0xbe95b581), WTC0(0xbe9f6901), WTC0(0xbea91f01), WTC0(0xbeb2d681), WTC0(0xbebc9181), WTC0(0xbec64e81), WTC0(0xbed00f81), WTC0(0xbed9d281), WTC0(0xbee39801), WTC0(0xbeed5f01), WTC0(0xbef72681), WTC0(0xbf00ef81), WTC0(0xbf0aba01), WTC0(0xbf148681), WTC0(0xbf1e5501), WTC0(0xbf282501), WTC0(0xbf31f501), WTC0(0xbf3bc601), WTC0(0xbf459681), WTC0(0xbf4f6801), WTC0(0xbf593a01), WTC0(0xbf630d81), WTC0(0xbf6ce201), WTC0(0xbf76b701), WTC0(0xbf808b81), WTC0(0xbf8a5f81), WTC0(0xbf943301), WTC0(0xbf9e0701), WTC0(0xbfa7dc01), WTC0(0xbfb1b101), WTC0(0xbfbb8701), WTC0(0xbfc55c81), WTC0(0xbfcf3181), WTC0(0xbfd90601), WTC0(0xbfe2d901), WTC0(0xbfecaa81), WTC0(0xbff67a01), /* part 1 */ WTC1(0x80130981), WTC1(0x80269f81), WTC1(0x803a3381), WTC1(0x804dc481), WTC1(0x80615281), WTC1(0x8074dc01), WTC1(0x80886081), WTC1(0x809bdf01), WTC1(0x80af5701), WTC1(0x80c2c781), WTC1(0x80d63101), WTC1(0x80e99401), WTC1(0x80fcf181), WTC1(0x81104a01), WTC1(0x81239d81), WTC1(0x8136ea01), WTC1(0x814a2f81), WTC1(0x815d6c01), WTC1(0x8170a181), WTC1(0x8183cf81), WTC1(0x8196f781), WTC1(0x81aa1981), WTC1(0x81bd3401), WTC1(0x81d04681), WTC1(0x81e34f81), WTC1(0x81f64f01), WTC1(0x82094581), WTC1(0x821c3401), WTC1(0x822f1b01), WTC1(0x8241fa01), WTC1(0x8254cf01), WTC1(0x82679901), WTC1(0x827a5801), WTC1(0x828d0b01), WTC1(0x829fb401), WTC1(0x82b25301), WTC1(0x82c4e801), WTC1(0x82d77201), WTC1(0x82e9ef01), WTC1(0x82fc5f01), WTC1(0x830ec081), WTC1(0x83211501), WTC1(0x83335c81), WTC1(0x83459881), WTC1(0x8357c701), WTC1(0x8369e781), WTC1(0x837bf801), WTC1(0x838df801), WTC1(0x839fe801), WTC1(0x83b1c881), WTC1(0x83c39a81), WTC1(0x83d55d01), WTC1(0x83e70f01), WTC1(0x83f8b001), WTC1(0x840a3e81), WTC1(0x841bb981), WTC1(0x842d2281), WTC1(0x843e7a81), WTC1(0x844fc081), WTC1(0x8460f581), WTC1(0x84721701), WTC1(0x84832481), WTC1(0x84941d81), WTC1(0x84a50201), WTC1(0x84b5d301), WTC1(0x84c69101), WTC1(0x84d73c01), WTC1(0x84e7d381), WTC1(0x84f85581), WTC1(0x8508c181), WTC1(0x85191801), WTC1(0x85295881), WTC1(0x85398481), WTC1(0x85499d01), WTC1(0x8559a081), WTC1(0x85698e81), WTC1(0x85796601), WTC1(0x85892681), WTC1(0x8598d081), WTC1(0x85a86581), WTC1(0x85b7e601), WTC1(0x85c75201), WTC1(0x85d6a981), WTC1(0x85e5eb81), WTC1(0x85f51681), WTC1(0x86042c01), WTC1(0x86132c01), WTC1(0x86221801), WTC1(0x8630f181), WTC1(0x863fb701), WTC1(0x864e6901), WTC1(0x865d0581), WTC1(0x866b8d81), WTC1(0x867a0081), WTC1(0x86886001), WTC1(0x8696ad01), WTC1(0x86a4e781), WTC1(0x86b30f01), WTC1(0x86c12401), WTC1(0x86cf2601), WTC1(0x86dd1481), WTC1(0x86eaf081), WTC1(0x86f8ba81), WTC1(0x87067281), WTC1(0x87141b01), WTC1(0x8721b481), WTC1(0x872f4201), WTC1(0x873cc201), WTC1(0x874a2f01), WTC1(0x87578181), WTC1(0x8764b101), WTC1(0x8771c601), WTC1(0x877ede01), WTC1(0x878c1881), WTC1(0x87998f01), WTC1(0x87a70e81), WTC1(0x87b42481), WTC1(0x87c05e81), WTC1(0x87cb5101), WTC1(0x87d4ac81), WTC1(0x87e73d81), WTC1(0x88124281), WTC1(0x88353501), WTC1(0x885f8481), WTC1(0x888d3181), WTC1(0x88be1681), WTC1(0x88f13801), WTC1(0x8925f101), WTC1(0x895bcd01), WTC1(0x89925a81), WTC1(0x89c92f81), WTC1(0x8a001f01), WTC1(0x8a372881), WTC1(0x8a6e4a01), WTC1(0x8aa58681), WTC1(0x8adcee01), WTC1(0x8b149701), WTC1(0x8b4c9701), WTC1(0x8b850281), WTC1(0x8bbde981), WTC1(0x8bf75b01), WTC1(0x8c316681), WTC1(0x8c6c1b01), WTC1(0x8ca78781), WTC1(0x8ce3ba81), WTC1(0x8d20c301), WTC1(0x8d5eaa01), WTC1(0x8d9d7781), WTC1(0x8ddd3201), WTC1(0x8e1de001), WTC1(0x8e5f8881), WTC1(0x8ea23201), WTC1(0x8ee5e301), WTC1(0x8f2aa101), WTC1(0x8f706f01), WTC1(0x8fb74f81), WTC1(0x8fff4601), WTC1(0x90485401), WTC1(0x90927b81), WTC1(0x90ddc001), WTC1(0x912a2201), WTC1(0x9177a301), WTC1(0x91c64301), WTC1(0x92160301), WTC1(0x9266e281), WTC1(0x92b8e101), WTC1(0x930bff81), WTC1(0x93603d01), WTC1(0x93b59901), WTC1(0x940c1281), WTC1(0x9463a881), WTC1(0x94bc5981), WTC1(0x95162381), WTC1(0x95710601), WTC1(0x95ccff01), WTC1(0x962a0c81), WTC1(0x96882e01), WTC1(0x96e76101), WTC1(0x9747a481), WTC1(0x97a8f681), WTC1(0x980b5501), WTC1(0x986ebd81), WTC1(0x98d32d81), WTC1(0x9938a281), WTC1(0x999f1981), WTC1(0x9a069001), WTC1(0x9a6f0381), WTC1(0x9ad87081), WTC1(0x9b42d581), WTC1(0x9bae2f81), WTC1(0x9c1a7c81), WTC1(0x9c87ba81), WTC1(0x9cf5e701), WTC1(0x9d650081), WTC1(0x9dd50481), WTC1(0x9e45f081), WTC1(0x9eb7c101), WTC1(0x9f2a7281), WTC1(0x9f9e0301), WTC1(0xa0127081), WTC1(0xa087b981), WTC1(0xa0fddd81), WTC1(0xa174da81), WTC1(0xa1ecae01), WTC1(0xa2655581), WTC1(0xa2dece81), WTC1(0xa3591801), WTC1(0xa3d43001), WTC1(0xa4501601), WTC1(0xa4ccc901), WTC1(0xa54a4701), WTC1(0xa5c89001), WTC1(0xa647a301), WTC1(0xa6c77e01), WTC1(0xa7482101), WTC1(0xa7c98b01), WTC1(0xa84bbb81), WTC1(0xa8ceb201), WTC1(0xa9526d81), WTC1(0xa9d6ef01), WTC1(0xaa5c3601), WTC1(0xaae24301), WTC1(0xab691681), WTC1(0xabf0b181), WTC1(0xac791401), WTC1(0xad023f01), WTC1(0xad8c3301), WTC1(0xae16f001), WTC1(0xaea27681), WTC1(0xaf2ec901), WTC1(0xafbbe801), WTC1(0xb049d601), WTC1(0xb0d89401), WTC1(0xb1682281), WTC1(0xb1f88181), WTC1(0xb289b181), WTC1(0xb31bb301), WTC1(0xb3ae8601), WTC1(0xb4422b81), WTC1(0xb4d6a381), WTC1(0x4a5a327f), WTC1(0x49c4adff), WTC1(0x492e637f), WTC1(0x48974f7f), WTC1(0x47ff6d7f), WTC1(0x4766baff), WTC1(0x46cd35ff), WTC1(0x4632dd7f), WTC1(0x4597b0ff), WTC1(0x44fbb1ff), WTC1(0x445eeaff), WTC1(0x43c165ff), WTC1(0x4323227f), WTC1(0x4284277f), WTC1(0x41e48aff), WTC1(0x4144557f), WTC1(0x40a3867f), WTC1(0x4001f5ff), WTC1(0x3f5f5d80), WTC1(0x3ebbad00), WTC1(0x3e16ee40), WTC1(0x3d713d00), WTC1(0x3ccab700), WTC1(0x3c236500), WTC1(0x3b7b5800), WTC1(0x3ad2ecc0), WTC1(0x3a2a6540), WTC1(0x3981b7c0), WTC1(0x38d8ba00), WTC1(0x382f01c0), WTC1(0x37846240), WTC1(0x36d8eb00), WTC1(0x362c9ec0), WTC1(0x357f7a00), WTC1(0x34d18340), WTC1(0x3422c900), WTC1(0x33736c40), WTC1(0x32c39040), WTC1(0x32134280), WTC1(0x31629280), WTC1(0x30b1a000), WTC1(0x30008380), WTC1(0x2f4f4240), WTC1(0x2e9df180), WTC1(0x2decc780), WTC1(0x2d3bd640), WTC1(0x2c8b0cc0), WTC1(0x2bda3080), WTC1(0x2b28ec80), WTC1(0x2a773500), WTC1(0x29c51b40), WTC1(0x291293c0), WTC1(0x285f9280), WTC1(0x27ac35c0), WTC1(0x26f8ab40), WTC1(0x26454c00), WTC1(0x25925600), WTC1(0x24dfd580), WTC1(0x242ddd40), WTC1(0x237c87c0), WTC1(0x22cbe240), WTC1(0x221bef40), WTC1(0x216cb040), WTC1(0x20be2800), WTC1(0x20105c80), WTC1(0x1f6352a0), WTC1(0x1eb71240), WTC1(0x1e0ba140), WTC1(0x1d60fe40), WTC1(0x1cb723e0), WTC1(0x1c0e0300), WTC1(0x1b6596c0), WTC1(0x1abde8a0), WTC1(0x1a16fbe0), WTC1(0x1970c680), WTC1(0x18cb4840), WTC1(0x18268e20), WTC1(0x1782a0c0), WTC1(0x16df8960), WTC1(0x163d6300), WTC1(0x159c52c0), WTC1(0x14fc87e0), WTC1(0x145e2c80), WTC1(0x13c15b60), WTC1(0x13263240), WTC1(0x128cd9a0), WTC1(0x11f562a0), WTC1(0x115fc1c0), WTC1(0x10cbf160), WTC1(0x1039f200), WTC1(0x0fa9a080), WTC1(0x0f1abd90), WTC1(0x0e8d01d0), WTC1(0x0e003330), WTC1(0x0d743590), WTC1(0x0ce8ef40), WTC1(0x0c5e1900), WTC1(0x0bd35d70), WTC1(0x0b488eb0), WTC1(0x0abd8410), WTC1(0x0a320a00), WTC1(0x09a60e70), WTC1(0x0919ab00), WTC1(0x088d0de0), WTC1(0x080065e0), WTC1(0x07739710), WTC1(0x06e65808), WTC1(0x06588348), WTC1(0x05ca0ae0), WTC1(0x053aaaf8), WTC1(0x04a9faf0), WTC1(0x0417f698), WTC1(0x03859ff4), WTC1(0x02f49be4), WTC1(0x0266b668), WTC1(0x01de554e), WTC1(0x015f50ca), WTC1(0x00eb7e5d), WTC1(0x00904f24), WTC1(0x00212889), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), WTC1(0x00000000), /* part 2 */ WTC2(0xfffece02), WTC2(0xffe4c3df), WTC2(0xffcaaa55), WTC2(0xffb087d1), WTC2(0xff9662bf), WTC2(0xff7c418b), WTC2(0xff622aa0), WTC2(0xff48246c), WTC2(0xff2e355a), WTC2(0xff1463db), WTC2(0xfefab608), WTC2(0xfee12f0a), WTC2(0xfec7cfd2), WTC2(0xfeae995a), WTC2(0xfe958cc4), WTC2(0xfe7cabce), WTC2(0xfe63f882), WTC2(0xfe4b74e0), WTC2(0xfe3322f6), WTC2(0xfe1b04dc), WTC2(0xfe031ccc), WTC2(0xfdeb6cf0), WTC2(0xfdd3ff7c), WTC2(0xfdbce834), WTC2(0xfda63bb8), WTC2(0xfd900c68), WTC2(0xfd7a590c), WTC2(0xfd6511b4), WTC2(0xfd5026c0), WTC2(0xfd3b8954), WTC2(0xfd272df0), WTC2(0xfd130adc), WTC2(0xfcff15ac), WTC2(0xfceb4a68), WTC2(0xfcd7b110), WTC2(0xfcc454d0), WTC2(0xfcb14064), WTC2(0xfc9e896c), WTC2(0xfc8c5264), WTC2(0xfc7abef0), WTC2(0xfc69f078), WTC2(0xfc59f5e8), WTC2(0xfc4acfec), WTC2(0xfc3c8060), WTC2(0xfc2f0264), WTC2(0xfc223b7c), WTC2(0xfc160714), WTC2(0xfc0a4150), WTC2(0xfbfec920), WTC2(0xfbf38320), WTC2(0xfbe855d0), WTC2(0xfbdd2740), WTC2(0xfbd1fc68), WTC2(0xfbc6fea0), WTC2(0xfbbc5a48), WTC2(0xfbb23b48), WTC2(0xfba8ca78), WTC2(0xfba02e50), WTC2(0xfb988de0), WTC2(0xfb920b40), WTC2(0xfb8cb870), WTC2(0xfb889f68), WTC2(0xfb85cbe8), WTC2(0xfb843dd0), WTC2(0xfb83df78), WTC2(0xfb8495d0), WTC2(0xfb864660), WTC2(0xfb88d4a8), WTC2(0xfb8c21e8), WTC2(0xfb900f28), WTC2(0xfb947dc0), WTC2(0xfb9950c0), WTC2(0xfb9e6d08), WTC2(0xfba3b658), WTC2(0xfba91908), WTC2(0xfbae9e08), WTC2(0xfbb45bd0), WTC2(0xfbba66f8), WTC2(0xfbc0dcf0), WTC2(0xfbc7ead8), WTC2(0xfbcfc200), WTC2(0xfbd89330), WTC2(0xfbe294d0), WTC2(0xfbee03d0), WTC2(0xfbfb1de8), WTC2(0xfc0a1da4), WTC2(0xfc1b22e0), WTC2(0xfc2e38f0), WTC2(0xfc436d48), WTC2(0xfc5abf7c), WTC2(0xfc74024c), WTC2(0xfc8ef2e8), WTC2(0xfcab51ac), WTC2(0xfcc8d024), WTC2(0xfce704f0), WTC2(0xfd0580cc), WTC2(0xfd23d4d0), WTC2(0xfd41ce40), WTC2(0xfd5f81b0), WTC2(0xfd7d08f0), WTC2(0xfd9a8560), WTC2(0xfdb85938), WTC2(0xfdd71798), WTC2(0xfdf753b8), WTC2(0xfe1993ee), WTC2(0xfe3e30f8), WTC2(0xfe656cba), WTC2(0xfe8f8fdc), WTC2(0xfebca8a4), WTC2(0xfeec590e), WTC2(0xff1e285c), WTC2(0xff51a0b7), WTC2(0xff866330), WTC2(0xffbc2cbb), WTC2(0xfff2bbff), WTC2(0x0029d79d), WTC2(0x00618a22), WTC2(0x009a1185), WTC2(0x00d3aa8c), WTC2(0x010e8ff6), WTC2(0x014af29e), WTC2(0x0188fe56), WTC2(0x01c8e108), WTC2(0x020ab3c4), WTC2(0x024e68a8), WTC2(0x0293e824), WTC2(0x02db1bc8), WTC2(0x0323f1a4), WTC2(0x036e5d6c), WTC2(0x03ba5320), WTC2(0x0407c938), WTC2(0x0456cad0), WTC2(0x04a77288), WTC2(0x04f9db88), WTC2(0x054e1888), WTC2(0x05a41ef0), WTC2(0x05fbd6e0), WTC2(0x065528c0), WTC2(0x06b00838), WTC2(0x070c7ee0), WTC2(0x076a9bb0), WTC2(0x07ca6d10), WTC2(0x082c08e0), WTC2(0x088f8da0), WTC2(0x08f51ac0), WTC2(0x095ccc20), WTC2(0x09c69f70), WTC2(0x0a327b40), WTC2(0x0aa046d0), WTC2(0x0b0febb0), WTC2(0x0b815dd0), WTC2(0x0bf49600), WTC2(0x0c698c50), WTC2(0x0ce03ba0), WTC2(0x0d58a380), WTC2(0x0dd2c510), WTC2(0x0e4ea110), WTC2(0x0ecc3dd0), WTC2(0x0f4ba800), WTC2(0x0fcced10), WTC2(0x10501960), WTC2(0x10d532a0), WTC2(0x115c39c0), WTC2(0x11e52fa0), WTC2(0x12701560), WTC2(0x12fcef20), WTC2(0x138bc200), WTC2(0x141c9300), WTC2(0x14af64a0), WTC2(0x154434e0), WTC2(0x15db0020), WTC2(0x1673c360), WTC2(0x170e7e80), WTC2(0x17ab35e0), WTC2(0x1849ee40), WTC2(0x18eaaba0), WTC2(0x198d6f00), WTC2(0x1a3236a0), WTC2(0x1ad90080), WTC2(0x1b81cc60), WTC2(0x1c2c9da0), WTC2(0x1cd97980), WTC2(0x1d8865c0), WTC2(0x1e396540), WTC2(0x1eec7700), WTC2(0x1fa198c0), WTC2(0x2058c840), WTC2(0x21120640), WTC2(0x21cd5700), WTC2(0x228abec0), WTC2(0x234a4180), WTC2(0x240bdf80), WTC2(0x24cf95c0), WTC2(0x259561c0), WTC2(0x265d4200), WTC2(0x27273840), WTC2(0x27f348c0), WTC2(0x28c17700), WTC2(0x2991c500), WTC2(0x2a643080), WTC2(0x2b38b680), WTC2(0x2c0f53c0), WTC2(0x2ce80840), WTC2(0x2dc2d680), WTC2(0x2e9fc100), WTC2(0x2f7ecac0), WTC2(0x305ff280), WTC2(0x314334c0), WTC2(0x32288e00), WTC2(0x330ffb80), WTC2(0x33f97d80), WTC2(0x34e515c0), WTC2(0x35d2c5c0), WTC2(0x36c28d00), WTC2(0x37b467c0), WTC2(0x38a85080), WTC2(0x399e4240), WTC2(0x3a963a00), WTC2(0x3b903600), WTC2(0x3c8c3480), WTC2(0x3d8a3380), WTC2(0x3e8a2dc0), WTC2(0x3f8c1b40), WTC2(0x408ff2ff), WTC2(0x4195ae7f), WTC2(0x429d477f), WTC2(0x43a6b87f), WTC2(0x44b1fdff), WTC2(0x45bf11ff), WTC2(0x46cdee7f), WTC2(0x47de8cff), WTC2(0x48f0e77f), WTC2(0x4a050eff), WTC2(0x4b1b2dff), WTC2(0x4c3372ff), WTC2(0x4d4e0bff), WTC2(0x4e6b257f), WTC2(0x4f8aedff), WTC2(0x50ad92ff), WTC2(0x51d341ff), WTC2(0x002006a9), WTC2(0x000bfb36), WTC2(0xfffe45ac), WTC2(0xfff6d064), WTC2(0xfff585bc), WTC2(0xfffa500d), WTC2(0x000519b4), WTC2(0x0015cd0c), WTC2(0x002c5470), WTC2(0x00489a3b), WTC2(0x006a88c8), WTC2(0x00920a74), WTC2(0x00bf0999), WTC2(0x00f17092), WTC2(0x012929bc), WTC2(0x01661f70), WTC2(0x01a83c0c), WTC2(0x01ef69e8), WTC2(0x023b9364), WTC2(0x028ca2d4), WTC2(0x02e2829c), WTC2(0x033d1d10), WTC2(0x039c5c90), WTC2(0x04002b78), WTC2(0x04687418), WTC2(0x04d520e0), WTC2(0x05461c18), WTC2(0x05bb5020), WTC2(0x0634a758), WTC2(0x06b20c20), WTC2(0x073368c8), WTC2(0x07b8a7b0), WTC2(0x0841b340), WTC2(0x08ce75b0), WTC2(0x095ed980), WTC2(0x09f2c900), WTC2(0x0a8a2e80), WTC2(0x0b24f470), WTC2(0x0bc30510), WTC2(0x0c644ad0), WTC2(0x0d08b010), WTC2(0x0db01f10), WTC2(0x0e5a8250), WTC2(0x0f07c400), WTC2(0x0fb7cea0), WTC2(0x106a8c80), WTC2(0x111fe800), WTC2(0x11d7cb60), WTC2(0x12922120), WTC2(0x134ed3a0), WTC2(0x140dcd00), WTC2(0x14cef7e0), WTC2(0x15923e60), WTC2(0x16578b00), WTC2(0x171ec820), WTC2(0x17e7e020), WTC2(0x18b2bd20), WTC2(0x197f49c0), WTC2(0x1a4d7040), WTC2(0x1b1d1b00), WTC2(0x1bee3460), WTC2(0x1cc0a6a0), WTC2(0x1d945c40), WTC2(0x1e693f80), WTC2(0x1f3f3ac0), WTC2(0x20163880), WTC2(0x20ee22c0), WTC2(0x21c6e440), WTC2(0x22a06740), WTC2(0x237a9600), WTC2(0x24555ac0), WTC2(0x2530a040), WTC2(0x260c5080), WTC2(0x26e85600), WTC2(0x27c49b00), WTC2(0x28a10a00), WTC2(0x297d8d80), WTC2(0x2a5a0f80), WTC2(0x2b367a80), WTC2(0x2c12b8c0), WTC2(0x2ceeb500), WTC2(0x2dca5940), WTC2(0x2ea58fc0), WTC2(0x2f804340), WTC2(0x305a5dc0), WTC2(0x3133ca00), WTC2(0x320c7200), WTC2(0x32e44000), WTC2(0x33bb1ec0), WTC2(0x3490f880), WTC2(0x3565b7c0), WTC2(0x36394640), WTC2(0x370b8f00), WTC2(0x37dc7c00), WTC2(0x38abf7c0), WTC2(0x3979ecc0), WTC2(0x3a464500), WTC2(0x3b10eb00), WTC2(0x3bd9c940), WTC2(0x3ca0c9c0), WTC2(0x3d65d740), WTC2(0x3e28dc00), WTC2(0x3ee9c240), WTC2(0x3fa87480), WTC2(0x4064dcff), WTC2(0x411ee67f), WTC2(0x41d67a7f), WTC2(0x428b847f), WTC2(0x433ded7f), WTC2(0x43eda0ff), WTC2(0x449a887f), WTC2(0x45448f7f), WTC2(0x45eb9eff), WTC2(0x468fa1ff), WTC2(0x473082ff), WTC2(0x47ce2c7f), WTC2(0x4868887f), WTC2(0x48ff80ff), WTC2(0x499300ff), WTC2(0x4a22f2ff), WTC2(0x4aaf407f), WTC2(0x4b37d47f), WTC2(0x4bbc997f), WTC2(0x4c3d78ff), WTC2(0x4cba5e7f), WTC2(0x4d33337f), WTC2(0x4da7e27f), WTC2(0x4e18567f), WTC2(0x4e8478ff), WTC2(0x4eec347f), WTC2(0x4f4f737f), WTC2(0x4fae20ff), WTC2(0x500825ff), WTC2(0x505d6dff), WTC2(0x50ade37f), WTC2(0x50f96f7f), WTC2(0x513ffdff), WTC2(0x518177ff), WTC2(0x51bdc87f), WTC2(0x51f4d9ff), WTC2(0x5226967f), WTC2(0x5252e87f), WTC2(0x5279b9ff), WTC2(0x529af5ff), WTC2(0x52b6867f), WTC2(0x52cc55ff), WTC2(0x52dc4eff), WTC2(0x52e65aff), WTC2(0x52ea657f), WTC2(0x52e857ff), WTC2(0x52e01d7f), WTC2(0x52d19fff), WTC2(0x52bcc9ff), WTC2(0x52a1857f), WTC2(0x527fbd7f), WTC2(0x52575b7f), WTC2(0x52284a7f), WTC2(0x51f274ff), WTC2(0x51b5c47f), WTC2(0x5172247f), WTC2(0x51277dff), WTC2(0x50d5bc7f), WTC2(0x507cc9ff), WTC2(0x501c90ff), WTC2(0x4fb4fb7f), WTC2(0x4f45f3ff), WTC2(0x4ecf64ff), WTC2(0x4e5138ff), WTC2(0x4dcb597f), WTC2(0x4d3db1ff), WTC2(0x4ca82bff), WTC2(0x4c0ab27f), WTC2(0x4b652f7f), WTC2(0x4ab78d7f), WTC2(0x4a01b67f), WTC2(0x4943957f), WTC2(0x487d12ff), WTC2(0x47ae1f7f), WTC2(0x46d68f7f), WTC2(0x45f7187f), WTC2(0x4513597f), WTC2(0x4430467f), WTC2(0x4352d2ff), WTC2(0x427e6bff), WTC2(0x41b390ff), WTC2(0x40f2077f), WTC2(0x4039a87f), WTC2(0x3f8a3100), WTC2(0x3ee33e00), WTC2(0x3e446ac0), WTC2(0x3dad5180), WTC2(0x3d1d7fc0), WTC2(0x3c947b00), WTC2(0x3c11c7c0), WTC2(0x3b94ebc0), WTC2(0x3b1d6dc0), WTC2(0x3aaad480), WTC2(0x3a3ca740), WTC2(0x39d26c40), WTC2(0x396ba8c0), WTC2(0x3907e080), WTC2(0x38a69800), WTC2(0x38473d80), WTC2(0x37e923c0), WTC2(0x378b9b80), WTC2(0x372e0380), WTC2(0x36d03a80), WTC2(0x36727f00), WTC2(0x36150e40), WTC2(0x35b81540), WTC2(0x355b8000), WTC2(0x34ff1dc0), WTC2(0x34a2bfc0), WTC2(0x34463e80), WTC2(0x33e982c0), WTC2(0x338c7880), WTC2(0x332f0bc0), WTC2(0x32d11800), WTC2(0x327265c0), WTC2(0x3212bbc0), WTC2(0x31b1e740), WTC2(0x314fef00), WTC2(0x30ed0540), WTC2(0x30895c80), WTC2(0x30251880), WTC2(0x2fc02880), WTC2(0x2f5a6480), WTC2(0x2ef3a480), WTC2(0x2e8bd640), WTC2(0x2e231100), WTC2(0x2db97680), WTC2(0x2d4f2700), WTC2(0x2ce431c0), WTC2(0x2c789080), WTC2(0x2c0c3bc0), WTC2(0x2b9f2bc0), WTC2(0x2b315940), WTC2(0x2ac2bc00), WTC2(0x2a534cc0), WTC2(0x29e303c0) }; fdk-aac-0.1.3/libAACenc/src/dyn_bits.cpp0000644000175000017500000006506312372261464020273 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Noiseless coder module ******************************************************************************/ #include "dyn_bits.h" #include "bit_cnt.h" #include "psy_const.h" #include "aacenc_pns.h" #include "aacEnc_ram.h" #include "aacEnc_rom.h" typedef INT (*lookUpTable)[CODE_BOOK_ESC_NDX + 1]; static INT FDKaacEnc_getSideInfoBits( const SECTION_INFO* const huffsection, const SHORT* const sideInfoTab, const INT useHCR ) { INT sideInfoBits; if ( useHCR && ((huffsection->codeBook == 11) || (huffsection->codeBook >= 16)) ) { sideInfoBits = 5; } else { sideInfoBits = sideInfoTab[huffsection->sfbCnt]; } return (sideInfoBits); } /* count bits using all possible tables */ static void FDKaacEnc_buildBitLookUp( const SHORT* const quantSpectrum, const INT maxSfb, const INT* const sfbOffset, const UINT* const sfbMax, INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], SECTION_INFO* const huffsection ) { INT i, sfbWidth; for (i = 0; i < maxSfb; i++) { huffsection[i].sfbCnt = 1; huffsection[i].sfbStart = i; huffsection[i].sectionBits = INVALID_BITCOUNT; huffsection[i].codeBook = -1; sfbWidth = sfbOffset[i + 1] - sfbOffset[i]; FDKaacEnc_bitCount(quantSpectrum + sfbOffset[i], sfbWidth, sfbMax[i], bitLookUp[i]); } } /* essential helper functions */ static INT FDKaacEnc_findBestBook( const INT* const bc, INT* const book, const INT useVCB11 ) { INT minBits = INVALID_BITCOUNT, j; int end = CODE_BOOK_ESC_NDX; for (j = 0; j <= end; j++) { if (bc[j] < minBits) { minBits = bc[j]; *book = j; } } return (minBits); } static INT FDKaacEnc_findMinMergeBits( const INT* const bc1, const INT* const bc2, const INT useVCB11 ) { INT minBits = INVALID_BITCOUNT, j; int end = CODE_BOOK_ESC_NDX; for (j = 0; j <= end; j++) { if (bc1[j] + bc2[j] < minBits) { minBits = bc1[j] + bc2[j]; } } return (minBits); } static void FDKaacEnc_mergeBitLookUp( INT* const bc1, const INT* const bc2 ) { int j; for (j = 0; j <= CODE_BOOK_ESC_NDX; j++) { bc1[j] = fixMin(bc1[j] + bc2[j], INVALID_BITCOUNT); } } static INT FDKaacEnc_findMaxMerge( const INT* const mergeGainLookUp, const SECTION_INFO* const huffsection, const INT maxSfb, INT* const maxNdx ) { INT i, maxMergeGain = 0; for (i = 0; i + huffsection[i].sfbCnt < maxSfb; i += huffsection[i].sfbCnt) { if (mergeGainLookUp[i] > maxMergeGain) { maxMergeGain = mergeGainLookUp[i]; *maxNdx = i; } } return (maxMergeGain); } static INT FDKaacEnc_CalcMergeGain( const SECTION_INFO* const huffsection, const INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], const SHORT* const sideInfoTab, const INT ndx1, const INT ndx2, const INT useVCB11 ) { INT MergeGain, MergeBits, SplitBits; MergeBits = sideInfoTab[huffsection[ndx1].sfbCnt + huffsection[ndx2].sfbCnt] + FDKaacEnc_findMinMergeBits(bitLookUp[ndx1], bitLookUp[ndx2], useVCB11); SplitBits = huffsection[ndx1].sectionBits + huffsection[ndx2].sectionBits; /* Bit amount for splitted huffsections */ MergeGain = SplitBits - MergeBits; if ( (huffsection[ndx1].codeBook==CODE_BOOK_PNS_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_PNS_NO) || (huffsection[ndx1].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO) || (huffsection[ndx1].codeBook==CODE_BOOK_IS_IN_PHASE_NO)||(huffsection[ndx2].codeBook==CODE_BOOK_IS_IN_PHASE_NO) ) { MergeGain = -1; } return (MergeGain); } /* sectioning Stage 0:find minimum codbooks */ static void FDKaacEnc_gmStage0( SECTION_INFO* const RESTRICT huffsection, const INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], const INT maxSfb, const INT* const noiseNrg, const INT* const isBook ) { INT i; for (i = 0; i < maxSfb; i++) { /* Side-Info bits will be calculated in Stage 1! */ if (huffsection[i].sectionBits == INVALID_BITCOUNT) { /* intensity and pns codebooks are already allocated in bitcount.c */ if(noiseNrg[i] != NO_NOISE_PNS){ huffsection[i].codeBook=CODE_BOOK_PNS_NO; huffsection[i].sectionBits = 0; } else if( isBook[i] ) { huffsection[i].codeBook=isBook[i]; huffsection[i].sectionBits = 0; } else { huffsection[i].sectionBits = FDKaacEnc_findBestBook(bitLookUp[i], &(huffsection[i].codeBook), 0); /* useVCB11 must be 0!!! */ } } } } /* sectioning Stage 1:merge all connected regions with the same code book and calculate side info */ static void FDKaacEnc_gmStage1( SECTION_INFO* const RESTRICT huffsection, INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], const INT maxSfb, const SHORT* const sideInfoTab, const INT useVCB11 ) { INT mergeStart = 0, mergeEnd; do { for (mergeEnd = mergeStart + 1; mergeEnd < maxSfb; mergeEnd++) { if (huffsection[mergeStart].codeBook != huffsection[mergeEnd].codeBook) break; /* we can merge. update tables, side info bits will be updated outside of this loop */ huffsection[mergeStart].sfbCnt++; huffsection[mergeStart].sectionBits += huffsection[mergeEnd].sectionBits; /* update bit look up for all code books */ FDKaacEnc_mergeBitLookUp(bitLookUp[mergeStart], bitLookUp[mergeEnd]); } /* add side info info bits */ huffsection[mergeStart].sectionBits += FDKaacEnc_getSideInfoBits(&huffsection[mergeStart], sideInfoTab, useVCB11); huffsection[mergeEnd - 1].sfbStart = huffsection[mergeStart].sfbStart; /* speed up prev search */ mergeStart = mergeEnd; } while (mergeStart < maxSfb); } /* sectioning Stage 2:greedy merge algorithm, merge connected sections with maximum bit gain until no more gain is possible */ static void FDKaacEnc_gmStage2( SECTION_INFO* const RESTRICT huffsection, INT* const RESTRICT mergeGainLookUp, INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], const INT maxSfb, const SHORT* const sideInfoTab, const INT useVCB11 ) { INT i; for (i = 0; i + huffsection[i].sfbCnt < maxSfb; i += huffsection[i].sfbCnt) { mergeGainLookUp[i] = FDKaacEnc_CalcMergeGain(huffsection, bitLookUp, sideInfoTab, i, i + huffsection[i].sfbCnt, useVCB11); } while (TRUE) { INT maxMergeGain, maxNdx = 0, maxNdxNext, maxNdxLast; maxMergeGain = FDKaacEnc_findMaxMerge(mergeGainLookUp, huffsection, maxSfb, &maxNdx); /* exit while loop if no more gain is possible */ if (maxMergeGain <= 0) break; maxNdxNext = maxNdx + huffsection[maxNdx].sfbCnt; /* merge sections with maximum bit gain */ huffsection[maxNdx].sfbCnt += huffsection[maxNdxNext].sfbCnt; huffsection[maxNdx].sectionBits += huffsection[maxNdxNext].sectionBits - maxMergeGain; /* update bit look up table for merged huffsection */ FDKaacEnc_mergeBitLookUp(bitLookUp[maxNdx], bitLookUp[maxNdxNext]); /* update mergeLookUpTable */ if (maxNdx != 0) { maxNdxLast = huffsection[maxNdx - 1].sfbStart; mergeGainLookUp[maxNdxLast] = FDKaacEnc_CalcMergeGain(huffsection, bitLookUp, sideInfoTab, maxNdxLast, maxNdx, useVCB11); } maxNdxNext = maxNdx + huffsection[maxNdx].sfbCnt; huffsection[maxNdxNext - 1].sfbStart = huffsection[maxNdx].sfbStart; if (maxNdxNext < maxSfb) mergeGainLookUp[maxNdx] = FDKaacEnc_CalcMergeGain(huffsection, bitLookUp, sideInfoTab, maxNdx, maxNdxNext, useVCB11); } } /* count bits used by the noiseless coder */ static void FDKaacEnc_noiselessCounter( SECTION_DATA* const RESTRICT sectionData, INT mergeGainLookUp[MAX_SFB_LONG], INT bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1], const SHORT* const quantSpectrum, const UINT* const maxValueInSfb, const INT* const sfbOffset, const INT blockType, const INT* const noiseNrg, const INT* const isBook, const INT useVCB11 ) { INT grpNdx, i; const SHORT *sideInfoTab = NULL; SECTION_INFO *huffsection; /* use appropriate side info table */ switch (blockType) { case LONG_WINDOW: case START_WINDOW: case STOP_WINDOW: sideInfoTab = FDKaacEnc_sideInfoTabLong; break; case SHORT_WINDOW: sideInfoTab = FDKaacEnc_sideInfoTabShort; break; } sectionData->noOfSections = 0; sectionData->huffmanBits = 0; sectionData->sideInfoBits = 0; if (sectionData->maxSfbPerGroup == 0) return; /* loop trough groups */ for (grpNdx = 0; grpNdx < sectionData->sfbCnt; grpNdx += sectionData->sfbPerGroup) { huffsection = sectionData->huffsection + sectionData->noOfSections; /* count bits in this group */ FDKaacEnc_buildBitLookUp(quantSpectrum, sectionData->maxSfbPerGroup, sfbOffset + grpNdx, maxValueInSfb + grpNdx, bitLookUp, huffsection); /* 0.Stage :Find minimum Codebooks */ FDKaacEnc_gmStage0(huffsection, bitLookUp, sectionData->maxSfbPerGroup, noiseNrg+grpNdx, isBook+grpNdx); /* 1.Stage :Merge all connected regions with the same code book */ FDKaacEnc_gmStage1(huffsection, bitLookUp, sectionData->maxSfbPerGroup, sideInfoTab, useVCB11); /* 2.Stage greedy merge algorithm, merge connected huffsections with maximum bit gain until no more gain is possible */ FDKaacEnc_gmStage2(huffsection, mergeGainLookUp, bitLookUp, sectionData->maxSfbPerGroup, sideInfoTab, useVCB11); /* compress output, calculate total huff and side bits since we did not update the actual codebook in stage 2 to save time, we must set it here for later use in bitenc */ for (i = 0; i < sectionData->maxSfbPerGroup; i += huffsection[i].sfbCnt) { if ((huffsection[i].codeBook==CODE_BOOK_PNS_NO) || (huffsection[i].codeBook==CODE_BOOK_IS_OUT_OF_PHASE_NO) || (huffsection[i].codeBook==CODE_BOOK_IS_IN_PHASE_NO)) { huffsection[i].sectionBits=0; } else { /* the sections in the sectionData are now marked with the optimal code book */ FDKaacEnc_findBestBook(bitLookUp[i], &(huffsection[i].codeBook), useVCB11); sectionData->huffmanBits += huffsection[i].sectionBits - FDKaacEnc_getSideInfoBits(&huffsection[i], sideInfoTab, useVCB11); } huffsection[i].sfbStart += grpNdx; /* sum up side info bits (section data bits) */ sectionData->sideInfoBits += FDKaacEnc_getSideInfoBits(&huffsection[i], sideInfoTab, useVCB11); sectionData->huffsection[sectionData->noOfSections++] = huffsection[i]; } } } /******************************************************************************* functionname: FDKaacEnc_scfCount returns : --- description : count bits used by scalefactors. not in all cases if maxValueInSfb[] == 0 we set deltaScf to zero. only if the difference of the last and future scalefacGain is not greater then CODE_BOOK_SCF_LAV (60). example: ^ scalefacGain | | | last 75 | | | | | | | | current 50 | | | | | | | | | | | | | | | future 5 | | | | --- ... ---------------------------- ... ---------> sfb if maxValueInSfb[] of current is zero because of a notfallstrategie, we do not save bits and transmit a deltaScf of 25. otherwise the deltaScf between the last scalfacGain (75) and the future scalefacGain (5) is 70. ********************************************************************************/ static void FDKaacEnc_scfCount( const INT* const scalefacGain, const UINT* const maxValueInSfb, SECTION_DATA* const RESTRICT sectionData, const INT* const isScale ) { INT i, j, k, m, n; INT lastValScf = 0; INT deltaScf = 0; INT found = 0; INT scfSkipCounter = 0; INT lastValIs = 0; sectionData->scalefacBits = 0; if (scalefacGain == NULL) return; sectionData->firstScf = 0; for (i=0; inoOfSections; i++) { if (sectionData->huffsection[i].codeBook != CODE_BOOK_ZERO_NO) { sectionData->firstScf = sectionData->huffsection[i].sfbStart; lastValScf = scalefacGain[sectionData->firstScf]; break; } } for (i=0; inoOfSections; i++) { if ((sectionData->huffsection[i].codeBook == CODE_BOOK_IS_OUT_OF_PHASE_NO) || (sectionData->huffsection[i].codeBook == CODE_BOOK_IS_IN_PHASE_NO)) { for (j = sectionData->huffsection[i].sfbStart; j < sectionData->huffsection[i].sfbStart + sectionData->huffsection[i].sfbCnt; j++) { INT deltaIs = isScale[j]-lastValIs; lastValIs = isScale[j]; sectionData->scalefacBits+=FDKaacEnc_bitCountScalefactorDelta(deltaIs); } } /* Intensity */ else if ((sectionData->huffsection[i].codeBook != CODE_BOOK_ZERO_NO) && (sectionData->huffsection[i].codeBook != CODE_BOOK_PNS_NO)) { INT tmp = sectionData->huffsection[i].sfbStart + sectionData->huffsection[i].sfbCnt; for (j = sectionData->huffsection[i].sfbStart; jnoOfSections) && (found == 0); m++) { if ((sectionData->huffsection[m].codeBook != CODE_BOOK_ZERO_NO) && (sectionData->huffsection[m].codeBook != CODE_BOOK_PNS_NO)) { INT end = sectionData->huffsection[m].sfbStart + sectionData->huffsection[m].sfbCnt; for (n = sectionData->huffsection[m].sfbStart; nscalefacBits += FDKaacEnc_bitCountScalefactorDelta(deltaScf); } } } /* for (i=0; inoOfSections; i++) */ } #ifdef PNS_PRECOUNT_ENABLE /* preCount bits used pns */ /* estimate bits used by pns for correction of static bits */ /* no codebook switch estimation, see AAC LD FASTENC */ INT noisePreCount(const INT *noiseNrg, INT maxSfb) { INT noisePCMFlag = TRUE; INT lastValPns = 0, deltaPns; int i, bits=0; for (i = 0; i < maxSfb; i++) { if (noiseNrg[i] != NO_NOISE_PNS) { if (noisePCMFlag) { bits+=PNS_PCM_BITS; lastValPns = noiseNrg[i]; noisePCMFlag = FALSE; }else { deltaPns = noiseNrg[i]-lastValPns; lastValPns = noiseNrg[i]; bits+=FDKaacEnc_bitCountScalefactorDelta(deltaPns); } } } return ( bits ); } #endif /* PNS_PRECOUNT_ENABLE */ /* count bits used by pns */ static void FDKaacEnc_noiseCount( SECTION_DATA* const RESTRICT sectionData, const INT* const noiseNrg ) { INT noisePCMFlag = TRUE; INT lastValPns = 0, deltaPns; int i, j; sectionData->noiseNrgBits = 0; for (i = 0; i < sectionData->noOfSections; i++) { if (sectionData->huffsection[i].codeBook == CODE_BOOK_PNS_NO) { int sfbStart = sectionData->huffsection[i].sfbStart; int sfbEnd = sfbStart + sectionData->huffsection[i].sfbCnt; for (j=sfbStart; jnoiseNrgBits+=PNS_PCM_BITS; lastValPns = noiseNrg[j]; noisePCMFlag = FALSE; } else { deltaPns = noiseNrg[j]-lastValPns; lastValPns = noiseNrg[j]; sectionData->noiseNrgBits+=FDKaacEnc_bitCountScalefactorDelta(deltaPns); } } } } } INT FDKaacEnc_dynBitCount( BITCNTR_STATE* const hBC, const SHORT* const quantSpectrum, const UINT* const maxValueInSfb, const INT* const scalefac, const INT blockType, const INT sfbCnt, const INT maxSfbPerGroup, const INT sfbPerGroup, const INT* const sfbOffset, SECTION_DATA* const RESTRICT sectionData, const INT* const noiseNrg, const INT* const isBook, const INT* const isScale, const UINT syntaxFlags ) { sectionData->blockType = blockType; sectionData->sfbCnt = sfbCnt; sectionData->sfbPerGroup = sfbPerGroup; sectionData->noOfGroups = sfbCnt / sfbPerGroup; sectionData->maxSfbPerGroup = maxSfbPerGroup; FDKaacEnc_noiselessCounter( sectionData, hBC->mergeGainLookUp, (lookUpTable)hBC->bitLookUp, quantSpectrum, maxValueInSfb, sfbOffset, blockType, noiseNrg, isBook, (syntaxFlags & AC_ER_VCB11)?1:0); FDKaacEnc_scfCount( scalefac, maxValueInSfb, sectionData, isScale); FDKaacEnc_noiseCount(sectionData, noiseNrg); return (sectionData->huffmanBits + sectionData->sideInfoBits + sectionData->scalefacBits + sectionData->noiseNrgBits); } INT FDKaacEnc_BCNew(BITCNTR_STATE **phBC ,UCHAR* dynamic_RAM ) { BITCNTR_STATE *hBC = GetRam_aacEnc_BitCntrState(); if (hBC) { *phBC = hBC; hBC->bitLookUp = GetRam_aacEnc_BitLookUp(0,dynamic_RAM); hBC->mergeGainLookUp = GetRam_aacEnc_MergeGainLookUp(0,dynamic_RAM); if (hBC->bitLookUp == 0 || hBC->mergeGainLookUp == 0) { return 1; } } return (hBC == 0) ? 1 : 0; } void FDKaacEnc_BCClose(BITCNTR_STATE **phBC) { if (*phBC!=NULL) { FreeRam_aacEnc_BitCntrState(phBC); } } fdk-aac-0.1.3/libAACenc/src/intensity.h0000644000175000017500000001403612372261464020145 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: A. Horndasch (code originally from lwr and rtb) / Josef Höpfl (FDK) contents/description: intensity stereo prototype ******************************************************************************/ #ifndef _INTENSITY_H #define _INTENSITY_H #include "aacenc_pns.h" void FDKaacEnc_IntensityStereoProcessing( FIXP_DBL *sfbEnergyLeft, FIXP_DBL *sfbEnergyRight, FIXP_DBL *mdctSpectrumLeft, FIXP_DBL *mdctSpectrumRight, FIXP_DBL *sfbThresholdLeft, FIXP_DBL *sfbThresholdRight, FIXP_DBL *sfbThresholdLdDataRight, FIXP_DBL *sfbSpreadEnLeft, FIXP_DBL *sfbSpreadEnRight, FIXP_DBL *sfbEnergyLdDataLeft, FIXP_DBL *sfbEnergyLdDataRight, INT *msDigest, INT *msMask, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *sfbOffset, const INT allowIS, INT *isBook, INT *isScale, PNS_DATA *RESTRICT pnsData[2] ); #endif /* _INTENSITY_H */ fdk-aac-0.1.3/libAACenc/src/tonality.h0000644000175000017500000001250212372261464017756 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** author: M. Lohwasser contents/description: Calculate tonality index ******************************************************************************/ #ifndef __TONALITY_H #define __TONALITY_H #include "common_fix.h" #include "chaosmeasure.h" void FDKaacEnc_CalculateFullTonality( FIXP_DBL *RESTRICT spectrum, INT *RESTRICT sfbMaxScaleSpec, FIXP_DBL *RESTRICT sfbEnergyLD64, FIXP_SGL *RESTRICT sfbTonality, INT sfbCnt, const INT *sfbOffset, INT usePns); #endif fdk-aac-0.1.3/libAACenc/src/pns_func.h0000644000175000017500000001637612372261464017743 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Lohwasser contents/description: pns_func.h ******************************************************************************/ #ifndef _PNS_FUNC_H #define _PNS_FUNC_H #include "common_fix.h" #include "aacenc_pns.h" #include "psy_data.h" AAC_ENCODER_ERROR FDKaacEnc_InitPnsConfiguration(PNS_CONFIG *pnsConf, INT bitRate, INT sampleRate, INT usePns, INT sfbCnt, const INT *sfbOffset, const INT numChan, const INT isLC ); void FDKaacEnc_PnsDetect( PNS_CONFIG *pnsConf, PNS_DATA *pnsData, const INT lastWindowSequence, const INT sfbActive, const INT maxSfbPerGroup, FIXP_DBL *sfbThresholdLdData, const INT *sfbOffset, FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, FIXP_SGL *sfbtonality, int tnsOrder, INT tnsPredictionGain, INT tnsActive, FIXP_DBL *sfbEnergyLdData, INT *noiseNrg ); void FDKaacEnc_CodePnsChannel( const INT sfbActive, PNS_CONFIG *pnsConf, INT *pnsFlag, FIXP_DBL *sfbEnergy, INT *noiseNrg, FIXP_DBL *sfbThreshold ); void FDKaacEnc_PreProcessPnsChannelPair( const INT sfbActive, FIXP_DBL *sfbEnergyLeft, FIXP_DBL *sfbEnergyRight, FIXP_DBL *sfbEnergyLeftLD, FIXP_DBL *sfbEnergyRightLD, FIXP_DBL *sfbEnergyMid, PNS_CONFIG *pnsConfLeft, PNS_DATA *pnsDataLeft, PNS_DATA *pnsDataRight ); void FDKaacEnc_PostProcessPnsChannelPair( const INT sfbActive, PNS_CONFIG *pnsConf, PNS_DATA *pnsDataLeft, PNS_DATA *pnsDataRight, INT *msMask, INT *msDigest ); #endif /* _PNS_FUNC_H */ fdk-aac-0.1.3/libAACenc/src/aacEnc_rom.h0000644000175000017500000002075712372261464020155 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /****************************************************************************** Initial authors: M. Lohwasser, M. Gayer Contents/description: ******************************************************************************/ /*! \file \brief Memory layout \author Markus Lohwasser */ #ifndef AAC_ENC_ROM_H #define AAC_ENC_ROM_H #include "common_fix.h" #include "psy_const.h" #include "psy_configuration.h" #include "FDK_tools_rom.h" /* Huffman Tables */ extern const INT FDKaacEnc_huff_ltab1_2[3][3][3][3]; extern const INT FDKaacEnc_huff_ltab3_4[3][3][3][3]; extern const INT FDKaacEnc_huff_ltab5_6[9][9]; extern const INT FDKaacEnc_huff_ltab7_8[8][8]; extern const INT FDKaacEnc_huff_ltab9_10[13][13]; extern const UCHAR FDKaacEnc_huff_ltab11[17][17]; extern const UCHAR FDKaacEnc_huff_ltabscf[121]; extern const USHORT FDKaacEnc_huff_ctab1[3][3][3][3]; extern const USHORT FDKaacEnc_huff_ctab2[3][3][3][3]; extern const USHORT FDKaacEnc_huff_ctab3[3][3][3][3]; extern const USHORT FDKaacEnc_huff_ctab4[3][3][3][3]; extern const USHORT FDKaacEnc_huff_ctab5[9][9]; extern const USHORT FDKaacEnc_huff_ctab6[9][9]; extern const USHORT FDKaacEnc_huff_ctab7[8][8]; extern const USHORT FDKaacEnc_huff_ctab8[8][8]; extern const USHORT FDKaacEnc_huff_ctab9[13][13]; extern const USHORT FDKaacEnc_huff_ctab10[13][13]; extern const USHORT FDKaacEnc_huff_ctab11[21][17]; extern const INT FDKaacEnc_huff_ctabscf[121]; /* quantizer */ #define MANT_DIGITS 9 #define MANT_SIZE (1< 0 */ } } /***************************************************************************** functionname: FDKaacEnc_CheckBandEnergyOptim description: input: output: *****************************************************************************/ FIXP_DBL FDKaacEnc_CheckBandEnergyOptim(const FIXP_DBL *RESTRICT mdctSpectrum, INT *RESTRICT sfbMaxScaleSpec, const INT *RESTRICT bandOffset, const INT numBands, FIXP_DBL *RESTRICT bandEnergy, FIXP_DBL *RESTRICT bandEnergyLdData, INT minSpecShift) { INT i, j, scale, nr = 0; FIXP_DBL maxNrgLd = FL2FXCONST_DBL(-1.0f); FIXP_DBL maxNrg = 0; FIXP_DBL spec; for(i=0; i maxNrgLd) { maxNrgLd = bandEnergyLdData[i]; nr = i; } } /* return unscaled maxNrg*/ scale = fixMax(0,sfbMaxScaleSpec[nr]-4); scale = fixMax(2*(minSpecShift-scale),-(DFRACT_BITS-1)); maxNrg = scaleValue(bandEnergy[nr], scale); return maxNrg; } /***************************************************************************** functionname: FDKaacEnc_CalcBandEnergyOptimLong description: input: output: *****************************************************************************/ INT FDKaacEnc_CalcBandEnergyOptimLong(const FIXP_DBL *RESTRICT mdctSpectrum, INT *RESTRICT sfbMaxScaleSpec, const INT *RESTRICT bandOffset, const INT numBands, FIXP_DBL *RESTRICT bandEnergy, FIXP_DBL *RESTRICT bandEnergyLdData) { INT i, j, shiftBits = 0; FIXP_DBL maxNrgLd = FL2FXCONST_DBL(0.0f); FIXP_DBL spec; for(i=0; i 7/2 = 4 (spc*spc) */ FIXP_DBL tmp = FL2FXCONST_DBL(0.0); /* don't use scaleValue() here, it increases workload quite sufficiently... */ if (leadingBits>=0) { for (j=bandOffset[i];j>shift; tmp = fPow2AddDiv2(tmp, spec); } } bandEnergy[i] = tmp<<1; } /* calculate ld of bandNrg, subtract scaling */ LdDataVector(bandEnergy, bandEnergyLdData, numBands); for(i=numBands; i--!=0; ) { FIXP_DBL scaleDiff = (sfbMaxScaleSpec[i]-4)*FL2FXCONST_DBL(2.0/64); bandEnergyLdData[i] = (bandEnergyLdData[i] >= ((FL2FXCONST_DBL(-1.f)>>1) + (scaleDiff>>1))) ? bandEnergyLdData[i]-scaleDiff : FL2FXCONST_DBL(-1.f); /* find maxNrgLd */ maxNrgLd = fixMax(maxNrgLd, bandEnergyLdData[i]); } if (maxNrgLd<=(FIXP_DBL)0) { for(i=numBands; i--!=0; ) { INT scale = fixMin((sfbMaxScaleSpec[i]-4)<<1,(DFRACT_BITS-1)); bandEnergy[i] = scaleValue(bandEnergy[i], -scale); } return 0; } else { /* scale down NRGs */ while (maxNrgLd>FL2FXCONST_DBL(0.0f)) { maxNrgLd -= FL2FXCONST_DBL(2.0/64); shiftBits++; } for(i=numBands; i--!=0; ) { INT scale = fixMin( ((sfbMaxScaleSpec[i]-4)+shiftBits)<<1, (DFRACT_BITS-1)); bandEnergyLdData[i] -= shiftBits*FL2FXCONST_DBL(2.0/64); bandEnergy[i] = scaleValue(bandEnergy[i], -scale); } return shiftBits; } } /***************************************************************************** functionname: FDKaacEnc_CalcBandEnergyOptimShort description: input: output: *****************************************************************************/ void FDKaacEnc_CalcBandEnergyOptimShort(const FIXP_DBL *RESTRICT mdctSpectrum, INT *RESTRICT sfbMaxScaleSpec, const INT *RESTRICT bandOffset, const INT numBands, FIXP_DBL *RESTRICT bandEnergy) { INT i, j; for(i=0; i 6/2 = 3 (spc*spc) */ FIXP_DBL tmp = FL2FXCONST_DBL(0.0); for (j=bandOffset[i];j 6/2 = 3 (spc*spc) */ scale = fixMax(fixMin(scale,(DFRACT_BITS-1)),-(DFRACT_BITS-1)); bandEnergy[i] = scaleValueSaturate(bandEnergy[i], -scale); } } /***************************************************************************** functionname: FDKaacEnc_CalcBandNrgMSOpt description: input: output: *****************************************************************************/ void FDKaacEnc_CalcBandNrgMSOpt(const FIXP_DBL *RESTRICT mdctSpectrumLeft, const FIXP_DBL *RESTRICT mdctSpectrumRight, INT *RESTRICT sfbMaxScaleSpecLeft, INT *RESTRICT sfbMaxScaleSpecRight, const INT *RESTRICT bandOffset, const INT numBands, FIXP_DBL *RESTRICT bandEnergyMid, FIXP_DBL *RESTRICT bandEnergySide, INT calcLdData, FIXP_DBL *RESTRICT bandEnergyMidLdData, FIXP_DBL *RESTRICT bandEnergySideLdData) { INT i, j, minScale; FIXP_DBL NrgMid, NrgSide, specm, specs; for (i=0; i 0) { for (j=bandOffset[i];j>1; FIXP_DBL specR = mdctSpectrumRight[j]>>1; specm = specL + specR; specs = specL - specR; NrgMid = fPow2AddDiv2(NrgMid, specm); NrgSide = fPow2AddDiv2(NrgSide, specs); } } bandEnergyMid[i] = NrgMid<<1; bandEnergySide[i] = NrgSide<<1; } if(calcLdData) { LdDataVector(bandEnergyMid, bandEnergyMidLdData, numBands); LdDataVector(bandEnergySide, bandEnergySideLdData, numBands); } for (i=0; i>= scale; bandEnergySide[i] >>= scale; } } fdk-aac-0.1.3/libAACenc/src/ms_stereo.cpp0000644000175000017500000003206512372261464020454 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: MS stereo processing ******************************************************************************/ #include "ms_stereo.h" #include "psy_const.h" /* static const float scaleMinThres = 1.0f; */ /* 0.75f for 3db boost */ void FDKaacEnc_MsStereoProcessing(PSY_DATA *RESTRICT psyData[(2)], PSY_OUT_CHANNEL* psyOutChannel[2], const INT *isBook, INT *msDigest, /* output */ INT *msMask, /* output */ const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *sfbOffset) { FIXP_DBL *sfbEnergyLeft = psyData[0]->sfbEnergy.Long; /* modified where msMask==1 */ FIXP_DBL *sfbEnergyRight = psyData[1]->sfbEnergy.Long; /* modified where msMask==1 */ const FIXP_DBL *sfbEnergyMid = psyData[0]->sfbEnergyMS.Long; const FIXP_DBL *sfbEnergySide = psyData[1]->sfbEnergyMS.Long; FIXP_DBL *sfbThresholdLeft = psyData[0]->sfbThreshold.Long; /* modified where msMask==1 */ FIXP_DBL *sfbThresholdRight = psyData[1]->sfbThreshold.Long; /* modified where msMask==1 */ FIXP_DBL *sfbSpreadEnLeft = psyData[0]->sfbSpreadEnergy.Long; FIXP_DBL *sfbSpreadEnRight = psyData[1]->sfbSpreadEnergy.Long; FIXP_DBL *sfbEnergyLeftLdData = psyOutChannel[0]->sfbEnergyLdData; /* modified where msMask==1 */ FIXP_DBL *sfbEnergyRightLdData = psyOutChannel[1]->sfbEnergyLdData; /* modified where msMask==1 */ FIXP_DBL *sfbEnergyMidLdData = psyData[0]->sfbEnergyMSLdData; FIXP_DBL *sfbEnergySideLdData = psyData[1]->sfbEnergyMSLdData; FIXP_DBL *sfbThresholdLeftLdData = psyOutChannel[0]->sfbThresholdLdData; /* modified where msMask==1 */ FIXP_DBL *sfbThresholdRightLdData = psyOutChannel[1]->sfbThresholdLdData; /* modified where msMask==1 */ FIXP_DBL *mdctSpectrumLeft = psyData[0]->mdctSpectrum; /* modified where msMask==1 */ FIXP_DBL *mdctSpectrumRight = psyData[1]->mdctSpectrum; /* modified where msMask==1 */ INT sfb,sfboffs, j; /* loop counters */ FIXP_DBL pnlrLdData, pnmsLdData; FIXP_DBL minThresholdLdData; FIXP_DBL minThreshold; INT useMS; INT msMaskTrueSomewhere = 0; /* to determine msDigest */ INT numMsMaskFalse = 0; /* number of non-intensity bands where L/R coding is used */ for(sfb=0; sfb pnlr); */ /* we assume that scaleMinThres == 1.0f and we can drop it */ minThresholdLdData = fixMin(sfbThresholdLeftLdData[sfb+sfboffs], sfbThresholdRightLdData[sfb+sfboffs]); /* pnlrLdData = sfbThresholdLeftLdData[sfb+sfboffs] - max(sfbEnergyLeftLdData[sfb+sfboffs], sfbThresholdLeftLdData[sfb+sfboffs]) + sfbThresholdRightLdData[sfb+sfboffs] - max(sfbEnergyRightLdData[sfb+sfboffs], sfbThresholdRightLdData[sfb+sfboffs]); */ tmp = fixMax(sfbEnergyLeftLdData[sfb+sfboffs], sfbThresholdLeftLdData[sfb+sfboffs]); pnlrLdData = (sfbThresholdLeftLdData[sfb+sfboffs]>>1) - (tmp>>1); pnlrLdData = pnlrLdData + (sfbThresholdRightLdData[sfb+sfboffs]>>1); tmp = fixMax(sfbEnergyRightLdData[sfb+sfboffs], sfbThresholdRightLdData[sfb+sfboffs]); pnlrLdData = pnlrLdData - (tmp>>1); /* pnmsLdData = minThresholdLdData - max(sfbEnergyMidLdData[sfb+sfboffs], minThresholdLdData) + minThresholdLdData - max(sfbEnergySideLdData[sfb+sfboffs], minThresholdLdData); */ tmp = fixMax(sfbEnergyMidLdData[sfb+sfboffs], minThresholdLdData); pnmsLdData = minThresholdLdData - (tmp>>1); tmp = fixMax(sfbEnergySideLdData[sfb+sfboffs], minThresholdLdData); pnmsLdData = pnmsLdData - (tmp>>1); useMS = (pnmsLdData > (pnlrLdData)); if (useMS) { msMask[sfb+sfboffs] = 1; msMaskTrueSomewhere = 1; for(j=sfbOffset[sfb+sfboffs]; j>1; specR = mdctSpectrumRight[j]>>1; mdctSpectrumLeft[j] = specL + specR; mdctSpectrumRight[j] = specL - specR; } minThreshold = fixMin(sfbThresholdLeft[sfb+sfboffs], sfbThresholdRight[sfb+sfboffs]); sfbThresholdLeft[sfb+sfboffs] = sfbThresholdRight[sfb+sfboffs] = minThreshold; sfbThresholdLeftLdData[sfb+sfboffs] = sfbThresholdRightLdData[sfb+sfboffs] = minThresholdLdData; sfbEnergyLeft[sfb+sfboffs] = sfbEnergyMid[sfb+sfboffs]; sfbEnergyRight[sfb+sfboffs] = sfbEnergySide[sfb+sfboffs]; sfbEnergyLeftLdData[sfb+sfboffs] = sfbEnergyMidLdData[sfb+sfboffs]; sfbEnergyRightLdData[sfb+sfboffs] = sfbEnergySideLdData[sfb+sfboffs]; sfbSpreadEnLeft[sfb+sfboffs] = sfbSpreadEnRight[sfb+sfboffs] = fixMin( sfbSpreadEnLeft[sfb+sfboffs], sfbSpreadEnRight[sfb+sfboffs] ) >> 1; } else { msMask[sfb+sfboffs] = 0; numMsMaskFalse++; } /* useMS */ } /* isBook */ else { /* keep mDigest from IS module */ if (msMask[sfb+sfboffs]) { msMaskTrueSomewhere = 1; } /* prohibit MS_MASK_ALL in combination with IS */ numMsMaskFalse = 9; } /* isBook */ } /* sfboffs */ } /* sfb */ if(msMaskTrueSomewhere == 1) { if ((numMsMaskFalse == 0) || ((numMsMaskFalse < maxSfbPerGroup) && (numMsMaskFalse < 9))) { *msDigest = SI_MS_MASK_ALL; /* loop through M/S bands; if msMask==0, set it to 1 and apply M/S */ for (sfb = 0; sfb < sfbCnt; sfb += sfbPerGroup) { for (sfboffs = 0; sfboffs < maxSfbPerGroup; sfboffs++) { if (( (isBook == NULL) ? 1 : (isBook[sfb+sfboffs] == 0) ) && (msMask[sfb+sfboffs] == 0)) { msMask[sfb+sfboffs] = 1; /* apply M/S coding */ for(j=sfbOffset[sfb+sfboffs]; j>1; specR = mdctSpectrumRight[j]>>1; mdctSpectrumLeft[j] = specL + specR; mdctSpectrumRight[j] = specL - specR; } minThreshold = fixMin(sfbThresholdLeft[sfb+sfboffs], sfbThresholdRight[sfb+sfboffs]); sfbThresholdLeft[sfb+sfboffs] = sfbThresholdRight[sfb+sfboffs] = minThreshold; minThresholdLdData = fixMin(sfbThresholdLeftLdData[sfb+sfboffs], sfbThresholdRightLdData[sfb+sfboffs]); sfbThresholdLeftLdData[sfb+sfboffs] = sfbThresholdRightLdData[sfb+sfboffs] = minThresholdLdData; sfbEnergyLeft[sfb+sfboffs] = sfbEnergyMid[sfb+sfboffs]; sfbEnergyRight[sfb+sfboffs] = sfbEnergySide[sfb+sfboffs]; sfbEnergyLeftLdData[sfb+sfboffs] = sfbEnergyMidLdData[sfb+sfboffs]; sfbEnergyRightLdData[sfb+sfboffs] = sfbEnergySideLdData[sfb+sfboffs]; sfbSpreadEnLeft[sfb+sfboffs] = sfbSpreadEnRight[sfb+sfboffs] = fixMin( sfbSpreadEnLeft[sfb+sfboffs], sfbSpreadEnRight[sfb+sfboffs] ) >> 1; } } } } else { *msDigest = SI_MS_MASK_SOME; } } else { *msDigest = SI_MS_MASK_NONE; } } fdk-aac-0.1.3/libAACenc/src/intensity.cpp0000644000175000017500000007756012372262233020506 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2014 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: A. Horndasch (code originally from lwr) / Josef Hoepfl (FDK) contents/description: intensity stereo processing ******************************************************************************/ #include "intensity.h" #include "interface.h" #include "psy_configuration.h" #include "psy_const.h" #include "qc_main.h" #include "bit_cnt.h" /* only set an IS seed it left/right channel correlation is above IS_CORR_THRESH */ #define IS_CORR_THRESH FL2FXCONST_DBL(0.95f) /* when expanding the IS region to more SFBs only accept an error that is * not more than IS_TOTAL_ERROR_THRESH overall and * not more than IS_LOCAL_ERROR_THRESH for the current SFB */ #define IS_TOTAL_ERROR_THRESH FL2FXCONST_DBL(0.04f) #define IS_LOCAL_ERROR_THRESH FL2FXCONST_DBL(0.01f) /* the maximum allowed change of the intensity direction (unit: IS scale) - scaled with factor 0.25 - */ #define IS_DIRECTION_DEVIATION_THRESH_SF 2 #define IS_DIRECTION_DEVIATION_THRESH FL2FXCONST_DBL(2.0f/(1< no IS if the panning angle is not far from the middle, MS will do */ /* this is equivalent to a scale of +/-1.02914634566 */ #define IS_LEFT_RIGHT_RATIO_THRESH FL2FXCONST_DBL(0.7f) /* scalefactor of realScale */ #define REAL_SCALE_SF 1 /* scalefactor overallLoudness */ #define OVERALL_LOUDNESS_SF 6 /* scalefactor for sum over max samples per goup */ #define MAX_SFB_PER_GROUP_SF 6 /* scalefactor for sum of mdct spectrum */ #define MDCT_SPEC_SF 6 typedef struct { FIXP_DBL corr_thresh; /*!< Only set an IS seed it left/right channel correlation is above corr_thresh */ FIXP_DBL total_error_thresh; /*!< When expanding the IS region to more SFBs only accept an error that is not more than 'total_error_thresh' overall. */ FIXP_DBL local_error_thresh; /*!< When expanding the IS region to more SFBs only accept an error that is not more than 'local_error_thresh' for the current SFB. */ FIXP_DBL direction_deviation_thresh; /*!< The maximum allowed change of the intensity direction (unit: IS scale) */ FIXP_DBL is_region_min_loudness; /*!< IS regions need to have a minimal percentage of the overall loudness, e.g. 0.06 == 6% */ INT min_is_sfbs; /*!< Only perform IS if 'min_is_sfbs' neighboring SFBs can be processed */ FIXP_DBL left_right_ratio_threshold; /*!< No IS if the panning angle is not far from the middle, MS will do */ } INTENSITY_PARAMETERS; /***************************************************************************** functionname: calcSfbMaxScale description: Calc max value in scalefactor band input: *mdctSpectrum l1 l2 output: none returns: scalefactor *****************************************************************************/ static INT calcSfbMaxScale(const FIXP_DBL *mdctSpectrum, const INT l1, const INT l2) { INT i; INT sfbMaxScale; FIXP_DBL maxSpc; maxSpc = FL2FXCONST_DBL(0.0); for (i=l1; icorr_thresh = IS_CORR_THRESH; isParams->total_error_thresh = IS_TOTAL_ERROR_THRESH; isParams->local_error_thresh = IS_LOCAL_ERROR_THRESH; isParams->direction_deviation_thresh = IS_DIRECTION_DEVIATION_THRESH; isParams->is_region_min_loudness = IS_REGION_MIN_LOUDNESS; isParams->min_is_sfbs = IS_MIN_SFBS; isParams->left_right_ratio_threshold = IS_LEFT_RIGHT_RATIO_THRESH; } /***************************************************************************** functionname: FDKaacEnc_prepareIntensityDecision description: Prepares intensity decision input: sfbEnergyLeft sfbEnergyRight sfbEnergyLdDataLeft sfbEnergyLdDataRight mdctSpectrumLeft sfbEnergyLdDataRight isParams output: hrrErr scale: none isMask scale: none realScale scale: LD_DATA_SHIFT + REAL_SCALE_SF normSfbLoudness scale: none returns: none *****************************************************************************/ static void FDKaacEnc_prepareIntensityDecision(const FIXP_DBL *sfbEnergyLeft, const FIXP_DBL *sfbEnergyRight, const FIXP_DBL *sfbEnergyLdDataLeft, const FIXP_DBL *sfbEnergyLdDataRight, const FIXP_DBL *mdctSpectrumLeft, const FIXP_DBL *mdctSpectrumRight, const INTENSITY_PARAMETERS *isParams, FIXP_DBL *hrrErr, INT *isMask, FIXP_DBL *realScale, FIXP_DBL *normSfbLoudness, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *sfbOffset) { INT j,sfb,sfboffs; INT grpCounter; /* temporary variables to compute loudness */ FIXP_DBL overallLoudness[MAX_NO_OF_GROUPS]; /* temporary variables to compute correlation */ FIXP_DBL channelCorr[MAX_GROUPED_SFB]; FIXP_DBL ml, mr; FIXP_DBL prod_lr; FIXP_DBL square_l, square_r; FIXP_DBL tmp_l, tmp_r; FIXP_DBL inv_n; FDKmemclear(channelCorr, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); FDKmemclear(normSfbLoudness, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); FDKmemclear(overallLoudness, MAX_NO_OF_GROUPS*sizeof(FIXP_DBL)); FDKmemclear(realScale, MAX_GROUPED_SFB*sizeof(FIXP_DBL)); for (grpCounter = 0, sfboffs = 0; sfboffs < sfbCnt; sfboffs += sfbPerGroup, grpCounter++) { overallLoudness[grpCounter] = FL2FXCONST_DBL(0.0f); for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { INT sL,sR,s; FIXP_DBL isValue = sfbEnergyLdDataLeft[sfb+sfboffs]-sfbEnergyLdDataRight[sfb+sfboffs]; /* delimitate intensity scale value to representable range */ realScale[sfb + sfboffs] = fixMin(FL2FXCONST_DBL(60.f/(1<<(REAL_SCALE_SF+LD_DATA_SHIFT))), fixMax(FL2FXCONST_DBL(-60.f/(1<<(REAL_SCALE_SF+LD_DATA_SHIFT))), isValue)); sL = fixMax(0,(CntLeadingZeros(sfbEnergyLeft[sfb + sfboffs])-1)); sR = fixMax(0,(CntLeadingZeros(sfbEnergyRight[sfb + sfboffs])-1)); s = (fixMin(sL,sR)>>2)<<2; normSfbLoudness[sfb + sfboffs] = sqrtFixp(sqrtFixp(((sfbEnergyLeft[sfb + sfboffs]<> 1) + ((sfbEnergyRight[sfb + sfboffs]<> 1))) >> (s>>2); overallLoudness[grpCounter] += normSfbLoudness[sfb + sfboffs] >> OVERALL_LOUDNESS_SF; /* don't do intensity if * - panning angle is too close to the middle or * - one channel is non-existent or * - if it is dual mono */ if( (sfbEnergyLeft[sfb + sfboffs] >= fMult(isParams->left_right_ratio_threshold,sfbEnergyRight[sfb + sfboffs])) && (fMult(isParams->left_right_ratio_threshold,sfbEnergyLeft[sfb + sfboffs]) <= sfbEnergyRight[sfb + sfboffs]) ) { /* this will prevent post processing from considering this SFB for merging */ hrrErr[sfb + sfboffs] = FL2FXCONST_DBL(1.0/8.0); } } } for (grpCounter = 0, sfboffs = 0; sfboffs < sfbCnt; sfboffs += sfbPerGroup, grpCounter++) { INT invOverallLoudnessSF; FIXP_DBL invOverallLoudness; if (overallLoudness[grpCounter] == FL2FXCONST_DBL(0.0)) { invOverallLoudness = FL2FXCONST_DBL(0.0); invOverallLoudnessSF = 0; } else { invOverallLoudness = fDivNorm((FIXP_DBL)MAXVAL_DBL, overallLoudness[grpCounter],&invOverallLoudnessSF); invOverallLoudnessSF = invOverallLoudnessSF - OVERALL_LOUDNESS_SF + 1; /* +1: compensate fMultDiv2() in subsequent loop */ } invOverallLoudnessSF = fixMin(fixMax(invOverallLoudnessSF,-(DFRACT_BITS-1)),DFRACT_BITS-1); for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { FIXP_DBL tmp; tmp = fMultDiv2((normSfbLoudness[sfb + sfboffs]>>OVERALL_LOUDNESS_SF)<>1); if (inv_n > FL2FXCONST_DBL(0.0f)) { INT s,sL,sR; /* correlation := Pearson's product-moment coefficient */ /* compute correlation between channels and check if it is over threshold */ ml = FL2FXCONST_DBL(0.0f); mr = FL2FXCONST_DBL(0.0f); prod_lr = FL2FXCONST_DBL(0.0f); square_l = FL2FXCONST_DBL(0.0f); square_r = FL2FXCONST_DBL(0.0f); sL = calcSfbMaxScale(mdctSpectrumLeft,sfbOffset[sfb+sfboffs],sfbOffset[sfb+sfboffs+1]); sR = calcSfbMaxScale(mdctSpectrumRight,sfbOffset[sfb+sfboffs],sfbOffset[sfb+sfboffs+1]); s = fixMin(sL,sR); for (j = sfbOffset[sfb + sfboffs]; j < sfbOffset[sfb + sfboffs + 1]; j++) { ml += fMultDiv2((mdctSpectrumLeft[j] << s),inv_n); // scaled with mdctScale - s + inv_n mr += fMultDiv2((mdctSpectrumRight[j] << s),inv_n); // scaled with mdctScale - s + inv_n } ml = fMultDiv2(ml,inv_n); // scaled with mdctScale - s + inv_n mr = fMultDiv2(mr,inv_n); // scaled with mdctScale - s + inv_n for (j = sfbOffset[sfb + sfboffs]; j < sfbOffset[sfb + sfboffs + 1]; j++) { tmp_l = fMultDiv2((mdctSpectrumLeft[j] << s),inv_n) - ml; // scaled with mdctScale - s + inv_n tmp_r = fMultDiv2((mdctSpectrumRight[j] << s),inv_n) - mr; // scaled with mdctScale - s + inv_n prod_lr += fMultDiv2(tmp_l,tmp_r); // scaled with 2*(mdctScale - s + inv_n) + 1 square_l += fPow2Div2(tmp_l); // scaled with 2*(mdctScale - s + inv_n) + 1 square_r += fPow2Div2(tmp_r); // scaled with 2*(mdctScale - s + inv_n) + 1 } prod_lr = prod_lr << 1; // scaled with 2*(mdctScale - s + inv_n) square_l = square_l << 1; // scaled with 2*(mdctScale - s + inv_n) square_r = square_r << 1; // scaled with 2*(mdctScale - s + inv_n) if (square_l > FL2FXCONST_DBL(0.0f) && square_r > FL2FXCONST_DBL(0.0f)) { INT channelCorrSF = 0; /* local scaling of square_l and square_r is compensated after sqrt calculation */ sL = fixMax(0,(CntLeadingZeros(square_l)-1)); sR = fixMax(0,(CntLeadingZeros(square_r)-1)); s = ((sL + sR)>>1)<<1; sL = fixMin(sL,s); sR = s-sL; tmp = fMult(square_l< FL2FXCONST_DBL(0.0f)); /* numerator and denominator have the same scaling */ if (prod_lr < FL2FXCONST_DBL(0.0f) ) { channelCorr[sfb + sfboffs] = -(fDivNorm(-prod_lr,tmp,&channelCorrSF)); } else { channelCorr[sfb + sfboffs] = (fDivNorm( prod_lr,tmp,&channelCorrSF)); } channelCorrSF = fixMin(fixMax(( channelCorrSF + ((sL+sR)>>1)),-(DFRACT_BITS-1)),DFRACT_BITS-1); if (channelCorrSF < 0) { channelCorr[sfb + sfboffs] = channelCorr[sfb + sfboffs] >> (-channelCorrSF); } else { /* avoid overflows due to limited computational accuracy */ if ( fAbs(channelCorr[sfb + sfboffs]) > (((FIXP_DBL)MAXVAL_DBL)>>channelCorrSF) ) { if (channelCorr[sfb + sfboffs] < FL2FXCONST_DBL(0.0f)) channelCorr[sfb + sfboffs] = -(FIXP_DBL) MAXVAL_DBL; else channelCorr[sfb + sfboffs] = (FIXP_DBL) MAXVAL_DBL; } else { channelCorr[sfb + sfboffs] = channelCorr[sfb + sfboffs] << channelCorrSF; } } } } /* for post processing: hrrErr is the error in terms of (too little) correlation * weighted with the loudness of the SFB; SFBs with small hrrErr can be merged */ if (hrrErr[sfb + sfboffs] == FL2FXCONST_DBL(1.0/8.0)) { continue; } hrrErr[sfb + sfboffs] = fMultDiv2((FL2FXCONST_DBL(0.25f)-(channelCorr[sfb + sfboffs]>>2)),normSfbLoudness[sfb + sfboffs]); /* set IS mask/vector to 1, if correlation is high enough */ if (fAbs(channelCorr[sfb + sfboffs]) >= isParams->corr_thresh) { isMask[sfb + sfboffs] = 1; } } } } /***************************************************************************** functionname: FDKaacEnc_finalizeIntensityDecision description: Finalizes intensity decision input: isParams scale: none hrrErr scale: none realIsScale scale: LD_DATA_SHIFT + REAL_SCALE_SF normSfbLoudness scale: none output: isMask scale: none returns: none *****************************************************************************/ static void FDKaacEnc_finalizeIntensityDecision(const FIXP_DBL *hrrErr, INT *isMask, const FIXP_DBL *realIsScale, const FIXP_DBL *normSfbLoudness, const INTENSITY_PARAMETERS *isParams, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup) { INT sfb,sfboffs, j; FIXP_DBL isScaleLast = FL2FXCONST_DBL(0.0f); INT isStartValueFound = 0; for (sfboffs = 0; sfboffs < sfbCnt; sfboffs += sfbPerGroup) { INT startIsSfb = 0; INT inIsBlock = 0; INT currentIsSfbCount = 0; FIXP_DBL overallHrrError = FL2FXCONST_DBL(0.0f); FIXP_DBL isRegionLoudness = FL2FXCONST_DBL(0.0f); for (sfb = 0; sfb < maxSfbPerGroup; sfb++) { if (isMask[sfboffs + sfb] == 1) { if (currentIsSfbCount == 0) { startIsSfb = sfboffs + sfb; } if (isStartValueFound==0) { isScaleLast = realIsScale[sfboffs + sfb]; isStartValueFound = 1; } inIsBlock = 1; currentIsSfbCount++; overallHrrError += hrrErr[sfboffs + sfb] >> (MAX_SFB_PER_GROUP_SF-3); isRegionLoudness += normSfbLoudness[sfboffs + sfb] >> MAX_SFB_PER_GROUP_SF; } else { /* based on correlation, IS should not be used * -> use it anyway, if overall error is below threshold * and if local error does not exceed threshold * otherwise: check if there are enough IS SFBs */ if (inIsBlock) { overallHrrError += hrrErr[sfboffs + sfb] >> (MAX_SFB_PER_GROUP_SF-3); isRegionLoudness += normSfbLoudness[sfboffs + sfb] >> MAX_SFB_PER_GROUP_SF; if ( (hrrErr[sfboffs + sfb] < (isParams->local_error_thresh>>3)) && (overallHrrError < (isParams->total_error_thresh>>MAX_SFB_PER_GROUP_SF)) ) { currentIsSfbCount++; /* overwrite correlation based decision */ isMask[sfboffs + sfb] = 1; } else { inIsBlock = 0; } } } /* check for large direction deviation */ if (inIsBlock) { if( fAbs(isScaleLast-realIsScale[sfboffs + sfb]) < (isParams->direction_deviation_thresh>>(REAL_SCALE_SF+LD_DATA_SHIFT-IS_DIRECTION_DEVIATION_THRESH_SF)) ) { isScaleLast = realIsScale[sfboffs + sfb]; } else{ isMask[sfboffs + sfb] = 0; inIsBlock = 0; currentIsSfbCount--; } } if (currentIsSfbCount > 0 && (!inIsBlock || sfb == maxSfbPerGroup - 1)) { /* not enough SFBs -> do not use IS */ if (currentIsSfbCount < isParams->min_is_sfbs || (isRegionLoudness < isParams->is_region_min_loudness>>MAX_SFB_PER_GROUP_SF)) { for(j = startIsSfb; j <= sfboffs + sfb; j++) { isMask[j] = 0; } isScaleLast = FL2FXCONST_DBL(0.0f); isStartValueFound = 0; for (j=0; j < startIsSfb; j++) { if (isMask[j]!=0) { isScaleLast = realIsScale[j]; isStartValueFound = 1; } } } currentIsSfbCount = 0; overallHrrError = FL2FXCONST_DBL(0.0f); isRegionLoudness = FL2FXCONST_DBL(0.0f); } } } } /***************************************************************************** functionname: FDKaacEnc_IntensityStereoProcessing description: Intensity stereo processing tool input: sfbEnergyLeft sfbEnergyRight mdctSpectrumLeft mdctSpectrumRight sfbThresholdLeft sfbThresholdRight sfbSpreadEnLeft sfbSpreadEnRight sfbEnergyLdDataLeft sfbEnergyLdDataRight output: isBook isScale pnsData->pnsFlag msDigest zeroed from start to sfbCnt msMask zeroed from start to sfbCnt mdctSpectrumRight zeroed where isBook!=0 sfbEnergyRight zeroed where isBook!=0 sfbSpreadEnRight zeroed where isBook!=0 sfbThresholdRight zeroed where isBook!=0 sfbEnergyLdDataRight FL2FXCONST_DBL(-1.0) where isBook!=0 sfbThresholdLdDataRight FL2FXCONST_DBL(-0.515625f) where isBook!=0 returns: none *****************************************************************************/ void FDKaacEnc_IntensityStereoProcessing( FIXP_DBL *sfbEnergyLeft, FIXP_DBL *sfbEnergyRight, FIXP_DBL *mdctSpectrumLeft, FIXP_DBL *mdctSpectrumRight, FIXP_DBL *sfbThresholdLeft, FIXP_DBL *sfbThresholdRight, FIXP_DBL *sfbThresholdLdDataRight, FIXP_DBL *sfbSpreadEnLeft, FIXP_DBL *sfbSpreadEnRight, FIXP_DBL *sfbEnergyLdDataLeft, FIXP_DBL *sfbEnergyLdDataRight, INT *msDigest, INT *msMask, const INT sfbCnt, const INT sfbPerGroup, const INT maxSfbPerGroup, const INT *sfbOffset, const INT allowIS, INT *isBook, INT *isScale, PNS_DATA *RESTRICT pnsData[2] ) { INT sfb,sfboffs, j; FIXP_DBL scale; FIXP_DBL lr; FIXP_DBL hrrErr[MAX_GROUPED_SFB]; FIXP_DBL normSfbLoudness[MAX_GROUPED_SFB]; FIXP_DBL realIsScale[MAX_GROUPED_SFB]; INTENSITY_PARAMETERS isParams; INT isMask[MAX_GROUPED_SFB]; FDKmemclear((void*)isBook,sfbCnt*sizeof(INT)); FDKmemclear((void*)isMask,sfbCnt*sizeof(INT)); FDKmemclear((void*)realIsScale,sfbCnt*sizeof(FIXP_DBL)); FDKmemclear((void*)isScale,sfbCnt*sizeof(INT)); FDKmemclear((void*)hrrErr,sfbCnt*sizeof(FIXP_DBL)); if (!allowIS) return; FDKaacEnc_initIsParams(&isParams); /* compute / set the following values per SFB: * - left/right ratio between channels * - normalized loudness * + loudness == average of energy in channels to 0.25 * + normalization: division by sum of all SFB loudnesses * - isMask (is set to 0 if channels are the same or one is 0) */ FDKaacEnc_prepareIntensityDecision(sfbEnergyLeft, sfbEnergyRight, sfbEnergyLdDataLeft, sfbEnergyLdDataRight, mdctSpectrumLeft, mdctSpectrumRight, &isParams, hrrErr, isMask, realIsScale, normSfbLoudness, sfbCnt, sfbPerGroup, maxSfbPerGroup, sfbOffset); FDKaacEnc_finalizeIntensityDecision(hrrErr, isMask, realIsScale, normSfbLoudness, &isParams, sfbCnt, sfbPerGroup, maxSfbPerGroup); for (sfb=0; sfb sfbThresholdRight[sfb+sfboffs]) ) { continue; } /* NEW: if there is a big-enough IS region, switch off PNS */ if (pnsData[0]) { if(pnsData[0]->pnsFlag[sfb+sfboffs]) { pnsData[0]->pnsFlag[sfb+sfboffs] = 0; } if(pnsData[1]->pnsFlag[sfb+sfboffs]) { pnsData[1]->pnsFlag[sfb+sfboffs] = 0; } } inv_n = GetInvInt((sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs])>>1); // scaled with 2 to compensate fMultDiv2() in subsequent loop sL = calcSfbMaxScale(mdctSpectrumLeft,sfbOffset[sfb+sfboffs],sfbOffset[sfb+sfboffs+1]); sR = calcSfbMaxScale(mdctSpectrumRight,sfbOffset[sfb+sfboffs],sfbOffset[sfb+sfboffs+1]); lr = FL2FXCONST_DBL(0.0f); for (j=sfbOffset[sfb+sfboffs]; j>1) - ((mdctSpectrumRight[j]<>1); ed += fMultDiv2(d,d)>>(MDCT_SPEC_SF-1); } msMask[sfb+sfboffs] = 1; tmp = fDivNorm(sfbEnergyLeft[sfb+sfboffs],ed,&s1); s2 = (s1) + (2*s0) - 2 - MDCT_SPEC_SF; if (s2 & 1) { tmp = tmp>>1; s2 = s2+1; } s2 = (s2>>1) + 1; // +1 compensate fMultDiv2() in subsequent loop s2 = fixMin(fixMax(s2,-(DFRACT_BITS-1)),(DFRACT_BITS-1)); scale = sqrtFixp(tmp); if (s2 < 0) { s2 = -s2; for (j=sfbOffset[sfb+sfboffs]; j> s2; mdctSpectrumRight[j] = FL2FXCONST_DBL(0.0f); } } else { for (j=sfbOffset[sfb+sfboffs]; j>1) + ((mdctSpectrumRight[j]<>1); es += fMultDiv2(s,s)>>(MDCT_SPEC_SF-1); // scaled 2*(mdctScale - s0 + 1) + MDCT_SPEC_SF } msMask[sfb+sfboffs] = 0; tmp = fDivNorm(sfbEnergyLeft[sfb+sfboffs],es,&s1); s2 = (s1) + (2*s0) - 2 - MDCT_SPEC_SF; if (s2 & 1) { tmp = tmp>>1; s2 = s2 + 1; } s2 = (s2>>1) + 1; // +1 compensate fMultDiv2() in subsequent loop s2 = fixMin(fixMax(s2,-(DFRACT_BITS-1)),(DFRACT_BITS-1)); scale = sqrtFixp(tmp); if (s2 < 0) { s2 = -s2; for (j=sfbOffset[sfb+sfboffs]; j> s2; mdctSpectrumRight[j] = FL2FXCONST_DBL(0.0f); } } else { for (j=sfbOffset[sfb+sfboffs]; j>1)-FL2FXCONST_DBL(0.5f/(1<<(REAL_SCALE_SF+LD_DATA_SHIFT+1))))>>(DFRACT_BITS-1-REAL_SCALE_SF-LD_DATA_SHIFT-1)) + 1; } else { isScale[sfb+sfboffs] = (INT)(((realIsScale[sfb+sfboffs]>>1)+FL2FXCONST_DBL(0.5f/(1<<(REAL_SCALE_SF+LD_DATA_SHIFT+1))))>>(DFRACT_BITS-1-REAL_SCALE_SF-LD_DATA_SHIFT-1)); } sfbEnergyRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f); sfbEnergyLdDataRight[sfb+sfboffs] = FL2FXCONST_DBL(-1.0f); sfbThresholdRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f); sfbThresholdLdDataRight[sfb+sfboffs] = FL2FXCONST_DBL(-0.515625f); sfbSpreadEnRight[sfb+sfboffs] = FL2FXCONST_DBL(0.0f); *msDigest = MS_SOME; } } } fdk-aac-0.1.3/libAACenc/src/psy_configuration.h0000644000175000017500000001610012372261464021653 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M.Werner contents/description: Psychoaccoustic configuration ******************************************************************************/ #ifndef _PSY_CONFIGURATION_H #define _PSY_CONFIGURATION_H #include "aacenc.h" #include "common_fix.h" #include "psy_const.h" #include "aacenc_tns.h" #include "aacenc_pns.h" #define THR_SHIFTBITS 4 #define PCM_QUANT_THR_SCALE 16 #define C_RATIO (FIXP_DBL)0x02940a10 /* FL2FXCONST_DBL(0.001258925f) << THR_SHIFTBITS; */ /* pow(10.0f, -(29.0f/10.0f)) */ typedef struct{ INT sfbCnt; /* number of existing sf bands */ INT sfbActive; /* number of sf bands containing energy after lowpass */ INT sfbActiveLFE; INT sfbOffset[MAX_SFB+1]; INT filterbank; /* LC, LD or ELD */ FIXP_DBL sfbPcmQuantThreshold[MAX_SFB]; INT maxAllowedIncreaseFactor; /* preecho control */ FIXP_SGL minRemainingThresholdFactor; INT lowpassLine; INT lowpassLineLFE; FIXP_DBL clipEnergy; /* for level dependend tmn */ FIXP_DBL sfbMaskLowFactor[MAX_SFB]; FIXP_DBL sfbMaskHighFactor[MAX_SFB]; FIXP_DBL sfbMaskLowFactorSprEn[MAX_SFB]; FIXP_DBL sfbMaskHighFactorSprEn[MAX_SFB]; FIXP_DBL sfbMinSnrLdData[MAX_SFB]; /* minimum snr (formerly known as bmax) */ TNS_CONFIG tnsConf; PNS_CONFIG pnsConf; INT granuleLength; INT allowIS; }PSY_CONFIGURATION; typedef struct{ UCHAR sfbCnt; /* Number of scalefactor bands */ UCHAR sfbWidth[MAX_SFB_LONG]; /* Width of scalefactor bands for long blocks */ }SFB_PARAM_LONG; typedef struct{ UCHAR sfbCnt; /* Number of scalefactor bands */ UCHAR sfbWidth[MAX_SFB_SHORT]; /* Width of scalefactor bands for short blocks */ }SFB_PARAM_SHORT; AAC_ENCODER_ERROR FDKaacEnc_InitPsyConfiguration(INT bitrate, INT samplerate, INT bandwidth, INT blocktype, INT granuleLength, INT useIS, PSY_CONFIGURATION *psyConf, FB_TYPE filterbank); #endif /* _PSY_CONFIGURATION_H */ fdk-aac-0.1.3/libAACenc/src/noisedet.h0000644000175000017500000001234512372261464017732 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: M. Lohwasser contents/description: noisedet.h ******************************************************************************/ #ifndef __NOISEDET_H #define __NOISEDET_H #include "common_fix.h" #include "pnsparam.h" #include "psy_data.h" void FDKaacEnc_noiseDetect( FIXP_DBL *mdctSpectrum, INT *sfbMaxScaleSpec, INT sfbActive, const INT *sfbOffset, FIXP_SGL noiseFuzzyMeasure[], NOISEPARAMS *np, FIXP_SGL *sfbtonality ); #endif fdk-aac-0.1.3/wavreader.h0000644000175000017500000000216212144411136015532 0ustar00tootstoots00000000000000/* ------------------------------------------------------------------ * Copyright (C) 2009 Martin Storsjo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- */ #ifndef WAVREADER_H #define WAVREADER_H #ifdef __cplusplus extern "C" { #endif void* wav_read_open(const char *filename); void wav_read_close(void* obj); int wav_get_header(void* obj, int* format, int* channels, int* sample_rate, int* bits_per_sample, unsigned int* data_length); int wav_read_data(void* obj, unsigned char* data, unsigned int length); #ifdef __cplusplus } #endif #endif fdk-aac-0.1.3/install-sh0000755000175000017500000003325512372262356015427 0ustar00tootstoots00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fdk-aac-0.1.3/libMpegTPEnc/0000755000175000017500000000000012372262442015660 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPEnc/include/0000755000175000017500000000000012372262445017306 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPEnc/include/tp_data.h0000644000175000017500000003057312372261464021103 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander Description: MPEG Transport data tables ******************************************************************************/ #ifndef __TP_DATA_H__ #define __TP_DATA_H__ #include "machine_type.h" #include "FDK_audio.h" #include "FDK_bitstream.h" /* * Configuration */ #define TP_GA_ENABLE /* #define TP_CELP_ENABLE */ /* #define TP_HVXC_ENABLE */ /* #define TP_SLS_ENABLE */ #define TP_ELD_ENABLE /* #define TP_USAC_ENABLE */ /* #define TP_RSVD50_ENABLE */ #if defined(TP_GA_ENABLE) || defined(TP_SLS_ENABLE) #define TP_PCE_ENABLE /**< Enable full PCE support */ #endif /** * ProgramConfig struct. */ /* ISO/IEC 14496-3 4.4.1.1 Table 4.2 Program config element */ #define PC_FSB_CHANNELS_MAX 16 /* Front/Side/Back channels */ #define PC_LFE_CHANNELS_MAX 4 #define PC_ASSOCDATA_MAX 8 #define PC_CCEL_MAX 16 /* CC elements */ #define PC_COMMENTLENGTH 256 typedef struct { #ifdef TP_PCE_ENABLE /* PCE bitstream elements: */ UCHAR ElementInstanceTag; UCHAR Profile; UCHAR SamplingFrequencyIndex; UCHAR NumFrontChannelElements; UCHAR NumSideChannelElements; UCHAR NumBackChannelElements; UCHAR NumLfeChannelElements; UCHAR NumAssocDataElements; UCHAR NumValidCcElements; UCHAR MonoMixdownPresent; UCHAR MonoMixdownElementNumber; UCHAR StereoMixdownPresent; UCHAR StereoMixdownElementNumber; UCHAR MatrixMixdownIndexPresent; UCHAR MatrixMixdownIndex; UCHAR PseudoSurroundEnable; UCHAR FrontElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR FrontElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR SideElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR SideElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR BackElementIsCpe[PC_FSB_CHANNELS_MAX]; UCHAR BackElementTagSelect[PC_FSB_CHANNELS_MAX]; UCHAR LfeElementTagSelect[PC_LFE_CHANNELS_MAX]; UCHAR AssocDataElementTagSelect[PC_ASSOCDATA_MAX]; UCHAR CcElementIsIndSw[PC_CCEL_MAX]; UCHAR ValidCcElementTagSelect[PC_CCEL_MAX]; UCHAR CommentFieldBytes; UCHAR Comment[PC_COMMENTLENGTH]; #endif /* TP_PCE_ENABLE */ /* Helper variables for administration: */ UCHAR isValid; /*!< Flag showing if PCE has been read successfully. */ UCHAR NumChannels; /*!< Amount of audio channels summing all channel elements including LFEs */ UCHAR NumEffectiveChannels; /*!< Amount of audio channels summing only SCEs and CPEs */ UCHAR elCounter; } CProgramConfig; typedef enum { ASCEXT_UNKOWN = -1, ASCEXT_SBR = 0x2b7, ASCEXT_PS = 0x548, ASCEXT_MPS = 0x76a, ASCEXT_SAOC = 0x7cb, ASCEXT_LDMPS = 0x7cc } TP_ASC_EXTENSION_ID; #ifdef TP_GA_ENABLE /** * GaSpecificConfig struct */ typedef struct { UINT m_frameLengthFlag ; UINT m_dependsOnCoreCoder ; UINT m_coreCoderDelay ; UINT m_extensionFlag ; UINT m_extensionFlag3 ; UINT m_layer; UINT m_numOfSubFrame; UINT m_layerLength; } CSGaSpecificConfig; #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE typedef enum { ELDEXT_TERM = 0x0, /* Termination tag */ ELDEXT_SAOC = 0x1, /* SAOC config */ ELDEXT_LDSAC = 0x2 /* LD MPEG Surround config */ /* reserved */ } ASC_ELD_EXT_TYPE; typedef struct { UCHAR m_frameLengthFlag; UCHAR m_sbrPresentFlag; UCHAR m_useLdQmfTimeAlign; /* Use LD-MPS QMF in SBR to achive time alignment */ UCHAR m_sbrSamplingRate; UCHAR m_sbrCrcFlag; } CSEldSpecificConfig; #endif /* TP_ELD_ENABLE */ /** * Audio configuration struct, suitable for encoder and decoder configuration. */ typedef struct { /* XYZ Specific Data */ union { #ifdef TP_GA_ENABLE CSGaSpecificConfig m_gaSpecificConfig; /**< General audio specific configuration. */ #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE CSEldSpecificConfig m_eldSpecificConfig; /**< ELD specific configuration. */ #endif /* TP_ELD_ENABLE */ } m_sc; /* Common ASC parameters */ #ifdef TP_PCE_ENABLE CProgramConfig m_progrConfigElement; /**< Program configuration. */ #endif /* TP_PCE_ENABLE */ AUDIO_OBJECT_TYPE m_aot; /**< Audio Object Type. */ UINT m_samplingFrequency; /**< Samplerate. */ UINT m_samplesPerFrame; /**< Amount of samples per frame. */ UINT m_directMapping; /**< Document this please !! */ AUDIO_OBJECT_TYPE m_extensionAudioObjectType; /**< Audio object type */ UINT m_extensionSamplingFrequency; /**< Samplerate */ SCHAR m_channelConfiguration; /**< Channel configuration index */ SCHAR m_epConfig; /**< Error protection index */ SCHAR m_vcb11Flag; /**< aacSectionDataResilienceFlag */ SCHAR m_rvlcFlag; /**< aacScalefactorDataResilienceFlag */ SCHAR m_hcrFlag; /**< aacSpectralDataResilienceFlag */ SCHAR m_sbrPresentFlag; /**< Flag indicating the presence of SBR data in the bitstream */ SCHAR m_psPresentFlag; /**< Flag indicating the presence of parametric stereo data in the bitstream */ UCHAR m_samplingFrequencyIndex; /**< Samplerate index */ UCHAR m_extensionSamplingFrequencyIndex; /**< Samplerate index */ SCHAR m_extensionChannelConfiguration; /**< Channel configuration index */ } CSAudioSpecificConfig; typedef INT (*cbUpdateConfig_t)(void*, const CSAudioSpecificConfig*); typedef INT (*cbSsc_t)( void*, HANDLE_FDK_BITSTREAM, const AUDIO_OBJECT_TYPE coreCodec, const INT samplingFrequency, const INT muxMode, const INT configBytes ); typedef INT (*cbSbr_t)( void * self, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, const INT sampleRateOut, const INT samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const INT elementIndex ); typedef struct { cbUpdateConfig_t cbUpdateConfig; /*!< Function pointer for Config change notify callback. */ void *cbUpdateConfigData; /*!< User data pointer for Config change notify callback. */ cbSsc_t cbSsc; /*!< Function pointer for SSC parser callback. */ void *cbSscData; /*!< User data pointer for SSC parser callback. */ cbSbr_t cbSbr; /*!< Function pointer for SBR header parser callback. */ void *cbSbrData; /*!< User data pointer for SBR header parser callback. */ } CSTpCallBacks; static const UINT SamplingRateTable[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 }; static inline int getSamplingRateIndex( UINT samplingRate ) { UINT sf_index, tableSize=sizeof(SamplingRateTable)/sizeof(UINT); for (sf_index=0; sf_indextableSize-1) { return tableSize-1; } return sf_index; } /* * Get Channel count from channel configuration */ static inline int getNumberOfTotalChannels(int channelConfig) { if (channelConfig > 0 && channelConfig < 8) return (channelConfig == 7)?8:channelConfig; else return 0; } static inline int getNumberOfEffectiveChannels(const int channelConfig) { const int n[] = {0,1,2,3,4,5,5,7}; return n[channelConfig]; } #endif /* __TP_DATA_H__ */ fdk-aac-0.1.3/libMpegTPEnc/include/mpegFileWrite.h0000644000175000017500000001464112372261464022230 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Manuel Jander Description: Bitstream data provider for MP4 decoders ******************************************************************************/ #include "machine_type.h" #include "FDK_audio.h" /*!< If MPFWRITE_MP4FF_ENABLE is set, include support for MPEG ISO fileformat. If not set, no .mp4, .m4a and .3gp files can be used for input. */ /* #define MPFWRITE_MP4FF_ENABLE */ typedef struct STRUCT_FILEWRITE *HANDLE_FILEWRITE; #ifdef __cplusplus extern "C" { #endif /** * \brief Open an MPEG audio file. * \param mpegFileWrite_Filename String of the filename to be opened. * \param fileFmt Transport format to use. * \param conf * \param confSize * \return MPEG file write handle. */ HANDLE_FILEWRITE mpegFileWrite_Open( char *mpegFileWrite_Filename, FILE_FORMAT fileFmt, TRANSPORT_TYPE transportType, UCHAR *conf, UINT confSize ); /** * \brief Write to an MPEG audio file. * \param inBuffer Buffer to write. * \param bufferSize Size of buffer to write in bytes. * \return 0 on sucess, -1 on unsupported file format or write error. */ int mpegFileWrite_Write( HANDLE_FILEWRITE hFileWrite, UCHAR *inBuffer, int bufferSize ); /** * \brief Deallocate memory and close file. * \param hFileWrite MPEG file write handle. * \return 0 on sucess. */ int mpegFileWrite_Close( HANDLE_FILEWRITE *hFileWrite ); #ifdef __cplusplus } #endif fdk-aac-0.1.3/libMpegTPEnc/include/tpenc_lib.h0000644000175000017500000003337212372261464021426 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** MPEG-4 Transport Encoder ************************ Author(s): Manuel Jander Description: MPEG Transport encode ******************************************************************************/ #ifndef __TPENC_LIB_H__ #define __TPENC_LIB_H__ #include "tp_data.h" #include "FDK_bitstream.h" #define TRANSPORTENC_INBUF_SIZE 8192 typedef enum { TRANSPORTENC_OK = 0, /*!< All fine. */ TRANSPORTENC_NO_MEM, /*!< Out of memory. */ TRANSPORTENC_UNKOWN_ERROR = 1, /*!< Unknown error (embarrasing). */ TRANSPORTENC_INVALID_PARAMETER, /*!< An invalid parameter was passed to a function . */ TRANSPORTENC_PARSE_ERROR, /*!< Bitstream data contained inconsistencies (wrong syntax). */ TRANSPORTENC_UNSUPPORTED_FORMAT, /*!< Unsupported transport format. */ TRANSPORTENC_NOT_ENOUGH_BITS, /*!< Out of bits. Provide more bits and try again. */ TRANSPORTENC_INVALID_CONFIG, /*!< Error in configuration. */ TRANSPORTENC_LATM_INVALID_NR_OF_SUBFRAMES, /*!< LATM: number of subframes out of range. */ TRANSPORTENC_LOAS_NOT_AVAILABLE, /*!< LOAS format not supported. */ TRANSPORTENC_INVALID_LATM_ALIGNMENT, /*!< AudioMuxElement length not aligned to 1 byte. */ TRANSPORTENC_INVALID_TRANSMISSION_FRAME_LENGTH, /*!< Invalid transmission frame length (< 0). */ TRANSPORTENC_INVALID_CELP_FRAME_LENGTH, /*!< Invalid CELP frame length found (>= 62). */ TRANSPORTENC_INVALID_FRAME_BITS, /*!< Frame bits is not 40 and not 80. */ TRANSPORTENC_INVALID_AOT, /*!< Unknown AOT found. */ TRANSPORTENC_INVALID_AU_LENGTH /*!< Invalid Access Unit length (not byte-aligned). */ } TRANSPORTENC_ERROR; typedef struct TRANSPORTENC *HANDLE_TRANSPORTENC; /** * \brief Determine a reasonable channel configuration on the basis of channel_mode. * \param noChannels Number of audio channels. * \return CHANNEL_MODE value that matches the given amount of audio channels. */ CHANNEL_MODE transportEnc_GetChannelMode( int noChannels ); /** * \brief Register SBR heaqder writer callback. * \param hTp Handle of transport decoder. * \param cbUpdateConfig Pointer to a callback function to handle SBR header writing. * \param user_data void pointer for user data passed to the callback as first parameter. * \return 0 on success. */ int transportEnc_RegisterSbrCallback ( HANDLE_TRANSPORTENC hTpEnc, const cbSbr_t cbSbr, void* user_data ); /** * \brief Register SSC writer callback. * \param hTp Handle of transport decoder. * \param cbUpdateConfig Pointer to a callback function to handle SSC writing. * \param user_data void pointer for user data passed to the callback as first parameter. * \return 0 on success. */ int transportEnc_RegisterSscCallback ( HANDLE_TRANSPORTENC hTpEnc, const cbSsc_t cbSsc, void* user_data ); /** * \brief Write ASC from given parameters. * \param asc A HANDLE_FDK_BITSTREAM where the ASC is written to. * \param config Structure containing the codec configuration settings. * \param cb callback information structure. * \return 0 on success. */ int transportEnc_writeASC ( HANDLE_FDK_BITSTREAM asc, CODER_CONFIG *config, CSTpCallBacks *cb ); /* Defintion of flags that can be passed to transportEnc_Open() */ #define TP_FLAG_MPEG4 1 /** MPEG4 (instead of MPEG2) */ #define TP_FLAG_LATM_AMV 2 /** LATM AudioMuxVersion */ #define TP_FLAG_LATM_AMVA 4 /** LATM AudioMuxVersionA */ /** * \brief Allocate transport encoder. * \param phTpEnc Pointer to transport encoder handle. * \return Error code. */ TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc ); /** * \brief Init transport encoder. * \param bsBuffer Pointer to transport encoder. * \param bsBuffer Pointer to bitstream buffer. * \param bsBufferSize Size in bytes of bsBuffer. * \param transportFmt Format of the transport to be written. * \param config Pointer to a valid CODER_CONFIG struct. * \param flags Transport encoder flags. * \return Error code. */ TRANSPORTENC_ERROR transportEnc_Init( HANDLE_TRANSPORTENC hTpEnc, UCHAR *bsBuffer, INT bsBufferSize, TRANSPORT_TYPE transportFmt, CODER_CONFIG *config, UINT flags ); /** * \brief Get transport encoder bitstream. * \param hTp Pointer to a transport encoder handle. * \return The handle to the requested FDK bitstream. */ HANDLE_FDK_BITSTREAM transportEnc_GetBitstream( HANDLE_TRANSPORTENC hTp ); /** * \brief Get amount of bits required by the transport headers. * \param hTp Handle of transport encoder. * \param auBits Amount of payload bits required for the current subframe. * \return Error code. */ INT transportEnc_GetStaticBits( HANDLE_TRANSPORTENC hTp, int auBits ); /** * \brief Close transport encoder. This function assures that all allocated memory is freed. * \param phTp Pointer to a previously allocated transport encoder handle. */ void transportEnc_Close( HANDLE_TRANSPORTENC *phTp ); /** * \brief Write one access unit. * \param hTp Handle of transport encoder. * \param total_bits Amount of total access unit bits. * \param bufferFullness Value of current buffer fullness in bits. * \param noConsideredChannels Number of bitrate wise considered channels (all minus LFE channels). * \return Error code. */ TRANSPORTENC_ERROR transportEnc_WriteAccessUnit( HANDLE_TRANSPORTENC hTp, INT total_bits, int bufferFullness, int noConsideredChannels ); /** * \brief Inform the transportEnc layer that writing of access unit has finished. This function * is required to be called when the encoder has finished writing one Access * one Access Unit for bitstream housekeeping. * \param hTp Transport handle. * \param pBits Pointer to an int, where the current amount of frame bits is passed * and where the current amount of subframe bits is returned. * * OR: This integer is modified by the amount of extra bit alignment that may occurr. * * \return Error code. */ TRANSPORTENC_ERROR transportEnc_EndAccessUnit( HANDLE_TRANSPORTENC hTp, int *pBits); /* * \brief Get a payload frame. * \param hTpEnc Transport encoder handle. * \param nBytes Pointer to an int to hold the frame size in bytes. Returns zero * if currently there is no complete frame for output (number of sub frames > 1). * \return Error code. */ TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc, int *nbytes); /* ADTS CRC support */ /** * \brief Set current bitstream position as start of a new data region. * \param hTpEnc Transport encoder handle. * \param mBits Size in bits of the data region. Set to 0 if it should not be of a fixed size. * \return Data region ID, which should be used when calling transportEnc_CrcEndReg(). */ int transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits); /** * \brief Set end of data region. * \param hTpEnc Transport encoder handle. * \param reg Data region ID, opbtained from transportEnc_CrcStartReg(). * \return void */ void transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg); /** * \brief Get AudioSpecificConfig or StreamMuxConfig from transport encoder handle and write it to dataBuffer. * \param hTpEnc Transport encoder handle. * \param cc Pointer to the current and valid configuration contained in a CODER_CONFIG struct. * \param dataBuffer Bitbuffer holding binary configuration. * \param confType Pointer to an UINT where the configuration type is returned (0:ASC, 1:SMC). * \return Error code. */ TRANSPORTENC_ERROR transportEnc_GetConf( HANDLE_TRANSPORTENC hTpEnc, CODER_CONFIG *cc, FDK_BITSTREAM *dataBuffer, UINT *confType ); /** * \brief Get information (version among other things) of the transport encoder library. * \param info Pointer to an allocated LIB_INFO struct. * \return Error code. */ TRANSPORTENC_ERROR transportEnc_GetLibInfo( LIB_INFO *info ); #endif /* #ifndef __TPENC_LIB_H__ */ fdk-aac-0.1.3/libMpegTPEnc/src/0000755000175000017500000000000012372262445016452 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_adif.h0000644000175000017500000001346312372261464020726 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Goeschel contents/description: Transport Headers support ******************************************************************************/ #ifndef TPENC_ADIF_H #define TPENC_ADIF_H #include "machine_type.h" #include "FDK_bitstream.h" #include "tp_data.h" typedef struct { CHANNEL_MODE cm; INT samplingRate; INT bitRate; int profile; int bVariableRate; int instanceTag; int headerWritten; } ADIF_INFO; /** * \brief encodes ADIF Header * * \param adif pointer to ADIF_INFO structure * \param hBitStream handle of bitstream, where the ADIF header is written into * \param adif_buffer_fullness buffer fullness value for the ADIF header * * \return 0 on success */ int adifWrite_EncodeHeader( ADIF_INFO *adif, HANDLE_FDK_BITSTREAM hBitStream, INT adif_buffer_fullness ); /** * \brief Get bit demand of a ADIF header * * \param adif pointer to ADIF_INFO structure * * \return amount of bits required to write the ADIF header according to the data * contained in the adif parameter */ int adifWrite_GetHeaderBits( ADIF_INFO *adif ); #endif /* TPENC_ADIF_H */ fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_latm.h0000644000175000017500000002463412372261464020762 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): Description: ******************************************************************************/ #ifndef TPENC_LATM_H #define TPENC_LATM_H #include "tpenc_lib.h" #include "FDK_bitstream.h" #define DEFAULT_LATM_NR_OF_SUBFRAMES 1 #define DEFAULT_LATM_SMC_REPEAT 8 #define MAX_AAC_LAYERS 9 #define LATM_MAX_PROGRAMS 1 #define LATM_MAX_STREAM_ID 16 #define LATM_MAX_LAYERS 1 /*MAX_AAC_LAYERS*/ #define MAX_NR_OF_SUBFRAMES 2 /* set this carefully to avoid buffer overflows */ typedef enum { LATMVAR_SIMPLE_SEQUENCE } LATM_VAR_MODE; typedef struct { signed int frameLengthType; signed int frameLengthBits; signed int varFrameLengthTable[4]; signed int streamID; } LATM_LAYER_INFO; typedef struct { LATM_LAYER_INFO m_linfo[LATM_MAX_PROGRAMS][LATM_MAX_LAYERS]; CODER_CONFIG *config[LATM_MAX_PROGRAMS][LATM_MAX_LAYERS]; LATM_VAR_MODE varMode; TRANSPORT_TYPE tt; int audioMuxLengthBytes; int audioMuxLengthBytesPos; int taraBufferFullness; /* state of the bit reservoir */ int varStreamCnt; unsigned int otherDataLenBytes; UCHAR latmFrameCounter; /* Current frame number. Counts modulo muxConfigPeriod */ UCHAR muxConfigPeriod; /* Distance in frames between MuxConfig */ UCHAR audioMuxVersion; /* AMV1 supports transmission of taraBufferFullness and ASC lengths */ UCHAR audioMuxVersionA; /* for future extensions */ UCHAR noProgram; UCHAR noLayer[LATM_MAX_PROGRAMS]; UCHAR fractDelayPresent; UCHAR allStreamsSameTimeFraming; UCHAR subFrameCnt; /* Current Subframe frame */ UCHAR noSubframes; /* Number of subframes */ UINT latmSubframeStart; /* Position of current subframe start */ UCHAR noSubframes_next; UCHAR fillBits; /* AudioMuxElement fill bits */ UCHAR streamMuxConfigBits; } LATM_STREAM; typedef LATM_STREAM *HANDLE_LATM_STREAM; /** * \brief Initialize LATM_STREAM Handle. Creates automatically one program with one layer with * the given layerConfig. The layerConfig must be persisten because references to this pointer * are made at any time again. * Use transportEnc_Latm_AddLayer() to add more programs/layers. * * \param hLatmStreamInfo HANDLE_LATM_STREAM handle * \param hBs Bitstream handle * \param layerConfig a valid CODER_CONFIG struct containing the current audio configuration parameters * \param audioMuxVersion the LATM audioMuxVersion to be used * \param tt the specific TRANSPORT_TYPE to be used, either TT_MP4_LOAS, TT_MP4_LATM_MCP1 or TT_MP4_LATM_MCP0 LOAS * \param cb callback information structure. * * \return an TRANSPORTENC_ERROR error code */ TRANSPORTENC_ERROR transportEnc_Latm_Init( HANDLE_LATM_STREAM hLatmStreamInfo, HANDLE_FDK_BITSTREAM hBs, CODER_CONFIG *layerConfig, UINT audioMuxVersion, TRANSPORT_TYPE tt, CSTpCallBacks *cb ); /** * \brief Get bit demand of next LATM/LOAS header * * \param hAss HANDLE_LATM_STREAM handle * \param streamDataLength the length of the payload * * \return the number of bits required by the LATM/LOAS headers */ unsigned int transportEnc_LatmCountTotalBitDemandHeader ( HANDLE_LATM_STREAM hAss, unsigned int streamDataLength ); /** * \brief Write LATM/LOAS header into given bitstream handle * * \param hLatmStreamInfo HANDLE_LATM_STREAM handle * \param hBitstream Bitstream handle * \param auBits amount of current payload bits * \param bufferFullness LATM buffer fullness value * \param cb callback information structure. * * \return an TRANSPORTENC_ERROR error code */ TRANSPORTENC_ERROR transportEnc_LatmWrite ( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBitstream, int auBits, int bufferFullness, CSTpCallBacks *cb ); /** * \brief Adjust bit count relative to current subframe * * \param hAss HANDLE_LATM_STREAM handle * \param pBits pointer to an int, where the current frame bit count is contained, * and where the subframe relative bit count will be returned into * * \return void */ void transportEnc_LatmAdjustSubframeBits(HANDLE_LATM_STREAM hAss, int *pBits); /** * \brief Request an LATM frame, which may, or may not be available * * \param hAss HANDLE_LATM_STREAM handle * \param hBs Bitstream handle * \param pBytes pointer to an int, where the current frame byte count stored into. * A return value of zero means that currently no LATM/LOAS frame can be returned. * The latter is expected in case of multiple subframes being used. * * \return void */ void transportEnc_LatmGetFrame( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int *pBytes ); /** * \brief Write a StreamMuxConfig into the given bitstream handle * * \param hAss HANDLE_LATM_STREAM handle * \param hBs Bitstream handle * \param bufferFullness LATM buffer fullness value * \param cb callback information structure. * * \return void */ TRANSPORTENC_ERROR CreateStreamMuxConfig( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int bufferFullness, CSTpCallBacks *cb ); #endif /* TPENC_LATM_H */ fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_asc.cpp0000644000175000017500000005425212372261464021125 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): Description: ******************************************************************************/ #include "tp_data.h" #include "tpenc_lib.h" #include "tpenc_asc.h" #include "FDK_bitstream.h" #include "genericStds.h" #define PCE_MAX_ELEMENTS 8 /** * Describe a PCE based on placed channel elements and element type sequence. */ typedef struct { UCHAR num_front_channel_elements; /*!< Number of front channel elements. */ UCHAR num_side_channel_elements; /*!< Number of side channel elements. */ UCHAR num_back_channel_elements; /*!< Number of back channel elements. */ UCHAR num_lfe_channel_elements; /*!< Number of lfe channel elements. */ MP4_ELEMENT_ID el_list[PCE_MAX_ELEMENTS];/*!< List contains sequence describing the elements in present channel mode. (MPEG order) */ } PCE_CONFIGURATION; /** * Map an incoming channel mode to a existing PCE configuration entry. */ typedef struct { CHANNEL_MODE channel_mode; /*!< Present channel mode. */ PCE_CONFIGURATION pce_configuration; /*!< Program config element description. */ } CHANNEL_CONFIGURATION; /** * \brief Table contains all supported channel modes and according PCE configuration description. * * The number of channel element parameter describes the kind of consecutively elements. * E.g. MODE_1_2_2_2_1 means: * - First 3 elements (SCE,CPE,CPE) are front channel elements. * - Next element (CPE) is a back channel element. * - Last element (LFE) is a lfe channel element. */ static const CHANNEL_CONFIGURATION pceConfigTab[] = { { MODE_1, { 1, 0, 0, 0, { ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_2, { 1, 0, 0, 0, { ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2, { 2, 0, 0, 0, { ID_SCE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_1, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_2, { 2, 0, 1, 0, { ID_SCE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_2_1, { 2, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_2_2_2_1, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_1, { 2, 0, 0, 0, { ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_1_1_1, { 2, 2, 0, 0, { ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_1_1_1_1_1_1, { 2, 2, 2, 0, { ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_NONE, ID_NONE } } }, { MODE_1_1_1_1_1_1_1_1, { 3, 2, 3, 0, { ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE, ID_SCE } } }, { MODE_2_2, { 1, 0, 1, 0, { ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_2_2_2, { 1, 1, 1, 0, { ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_2_2_2_2, { 4, 0, 0, 0, { ID_CPE, ID_CPE, ID_CPE, ID_CPE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_2_1, { 1, 0, 1, 0, { ID_CPE, ID_SCE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_7_1_REAR_SURROUND, { 2, 0, 2, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, { MODE_7_1_FRONT_CENTER, { 3, 0, 1, 1, { ID_SCE, ID_CPE, ID_CPE, ID_CPE, ID_LFE, ID_NONE, ID_NONE, ID_NONE } } }, }; /** * \brief Get program config element description for existing channel mode. * * \param channel_mode Current channel mode. * * \return * - Pointer to PCE_CONFIGURATION entry, on success. * - NULL, on failure. */ static const PCE_CONFIGURATION* getPceEntry( const CHANNEL_MODE channel_mode ) { UINT i; const PCE_CONFIGURATION *pce_config = NULL; for (i=0; i < (sizeof(pceConfigTab)/sizeof(CHANNEL_CONFIGURATION)); i++) { if (pceConfigTab[i].channel_mode == channel_mode) { pce_config = &pceConfigTab[i].pce_configuration; } } return pce_config; } int getChannelConfig( CHANNEL_MODE channel_mode ) { INT chan_config = 0; switch(channel_mode) { case MODE_1: chan_config = 1; break; case MODE_2: chan_config = 2; break; case MODE_1_2: chan_config = 3; break; case MODE_1_2_1: chan_config = 4; break; case MODE_1_2_2: chan_config = 5; break; case MODE_1_2_2_1: chan_config = 6; break; case MODE_1_2_2_2_1: chan_config = 7; break; default: chan_config = 0; } return chan_config; } CHANNEL_MODE transportEnc_GetChannelMode( int noChannels ) { CHANNEL_MODE chMode; if (noChannels <= 8 && noChannels > 0) chMode = (CHANNEL_MODE)((noChannels == 8) ? 7 : noChannels); /* see : iso/mpeg4 v1 audio subpart1*/ else chMode = MODE_UNKNOWN; return chMode; } #ifdef TP_PCE_ENABLE int transportEnc_writePCE(HANDLE_FDK_BITSTREAM hBs, CHANNEL_MODE channelMode, INT sampleRate, int instanceTagPCE, int profile, int matrixMixdownA, int pseudoSurroundEnable, UINT alignAnchor) { int sampleRateIndex, i; const PCE_CONFIGURATION* config = NULL; const MP4_ELEMENT_ID* pEl_list = NULL; UCHAR cpeCnt=0, sceCnt=0, lfeCnt=0; sampleRateIndex = getSamplingRateIndex(sampleRate); if (sampleRateIndex == 15) { return -1; } if ((config=getPceEntry(channelMode))==NULL) { return -1; } /* Pointer to first element in element list. */ pEl_list = &config->el_list[0]; FDKwriteBits(hBs, instanceTagPCE, 4); /* Element instance tag */ FDKwriteBits(hBs, profile, 2); /* Object type */ FDKwriteBits(hBs, sampleRateIndex, 4); /* Sample rate index*/ FDKwriteBits(hBs, config->num_front_channel_elements, 4); /* Front channel Elements */ FDKwriteBits(hBs, config->num_side_channel_elements , 4); /* No Side Channel Elements */ FDKwriteBits(hBs, config->num_back_channel_elements , 4); /* No Back channel Elements */ FDKwriteBits(hBs, config->num_lfe_channel_elements , 2); /* No Lfe channel elements */ FDKwriteBits(hBs, 0, 3); /* No assoc data elements */ FDKwriteBits(hBs, 0, 4); /* No valid cc elements */ FDKwriteBits(hBs, 0, 1); /* Mono mixdown present */ FDKwriteBits(hBs, 0, 1); /* Stereo mixdown present */ if ( matrixMixdownA!=0 && ((channelMode==MODE_1_2_2)||(channelMode==MODE_1_2_2_1)) ) { FDKwriteBits(hBs, 1, 1); /* Matrix mixdown present */ FDKwriteBits(hBs, (matrixMixdownA-1)&0x3, 2); /* matrix_mixdown_idx */ FDKwriteBits(hBs, (pseudoSurroundEnable)?1:0, 1); /* pseudo_surround_enable */ } else { FDKwriteBits(hBs, 0, 1); /* Matrix mixdown not present */ } for(i=0; inum_front_channel_elements; i++) { UCHAR isCpe = (*pEl_list++==ID_CPE) ? 1 : 0; UCHAR tag = (isCpe) ? cpeCnt++ : sceCnt++; FDKwriteBits(hBs, isCpe, 1); /* Front channel Elements is CPE? */ FDKwriteBits(hBs, tag, 4); /* Front channel Instance Tag.*/ } for(i=0; inum_side_channel_elements; i++) { UCHAR isCpe = (*pEl_list++==ID_CPE) ? 1 : 0; UCHAR tag = (isCpe) ? cpeCnt++ : sceCnt++; FDKwriteBits(hBs, isCpe, 1); /* Front channel Elements is CPE? */ FDKwriteBits(hBs, tag, 4); /* Front channel Instance Tag.*/ } for(i=0; inum_back_channel_elements; i++) { UCHAR isCpe = (*pEl_list++==ID_CPE) ? 1 : 0; UCHAR tag = (isCpe) ? cpeCnt++ : sceCnt++; FDKwriteBits(hBs, isCpe, 1); /* Front channel Elements is CPE? */ FDKwriteBits(hBs, tag, 4); /* Front channel Instance Tag.*/ } for(i=0; inum_lfe_channel_elements; i++) { FDKwriteBits(hBs, lfeCnt++, 4); /* LFE channel Instance Tag. */ } /* - num_valid_cc_elements always 0. - num_assoc_data_elements always 0. */ /* Byte alignment: relative to alignAnchor ADTS: align with respect to the first bit of the raw_data_block() ADIF: align with respect to the first bit of the header LATM: align with respect to the first bit of the ASC */ FDKbyteAlign(hBs, alignAnchor); /* Alignment */ FDKwriteBits(hBs, 0 ,8); /* Do no write any comment. */ /* - comment_field_bytes always 0. */ return 0; } int transportEnc_GetPCEBits(CHANNEL_MODE channelMode, int matrixMixdownA, int bits) { const PCE_CONFIGURATION* config = NULL; if ((config=getPceEntry(channelMode))==NULL) { return -1; /* unsupported channelmapping */ } bits += 4 + 2 + 4; /* Element instance tag + Object type + Sample rate index */ bits += 4 + 4 + 4 + 2; /* No (front + side + back + lfe channel) elements */ bits += 3 + 4; /* No (assoc data + valid cc) elements */ bits += 1 + 1 + 1 ; /* Mono + Stereo + Matrix mixdown present */ if ( matrixMixdownA!=0 && ((channelMode==MODE_1_2_2)||(channelMode==MODE_1_2_2_1)) ) { bits +=3; /* matrix_mixdown_idx + pseudo_surround_enable */ } bits += (1+4) * (INT)config->num_front_channel_elements; bits += (1+4) * (INT)config->num_side_channel_elements; bits += (1+4) * (INT)config->num_back_channel_elements; bits += (4) * (INT)config->num_lfe_channel_elements; /* - num_valid_cc_elements always 0. - num_assoc_data_elements always 0. */ if ((bits%8) != 0) { bits += (8 - (bits%8)); /* Alignment */ } bits += 8; /* Comment field bytes */ /* - comment_field_bytes alwys 0. */ return bits; } #endif /* TP_PCE_ENABLE */ static void writeAot(HANDLE_FDK_BITSTREAM hBitstreamBuffer, AUDIO_OBJECT_TYPE aot) { int tmp = (int) aot; if (tmp > 31) { FDKwriteBits( hBitstreamBuffer, AOT_ESCAPE, 5 ); FDKwriteBits( hBitstreamBuffer, tmp-32, 6 ); /* AudioObjectType */ } else { FDKwriteBits( hBitstreamBuffer, tmp, 5 ); } } static void writeSampleRate(HANDLE_FDK_BITSTREAM hBitstreamBuffer, int sampleRate) { int sampleRateIndex = getSamplingRateIndex(sampleRate); FDKwriteBits( hBitstreamBuffer, sampleRateIndex, 4 ); if( sampleRateIndex == 15 ) { FDKwriteBits( hBitstreamBuffer, sampleRate, 24 ); } } #ifdef TP_GA_ENABLE static int transportEnc_writeGASpecificConfig( HANDLE_FDK_BITSTREAM asc, CODER_CONFIG *config, int extFlg, UINT alignAnchor ) { int aot = config->aot; int samplesPerFrame = config->samplesPerFrame; /* start of GASpecificConfig according to ISO/IEC 14496-3 Subpart 4, 4.4.1 */ FDKwriteBits( asc, ((samplesPerFrame==960 || samplesPerFrame==480)?1:0), 1); /* frameLengthFlag: 1 for a 960/480 (I)MDCT, 0 for a 1024/512 (I)MDCT*/ FDKwriteBits( asc, 0, 1); /* dependsOnCoreCoder: Sampling Rate Coder Specific, see in ISO/IEC 14496-3 Subpart 4, 4.4.1 */ FDKwriteBits( asc, extFlg, 1 ); /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23 */ /* Write PCE if channel config is not 1-7 */ if (getChannelConfig(config->channelMode) == 0) { transportEnc_writePCE(asc, config->channelMode, config->samplingRate, 0, 1, config->matrixMixdownA, (config->flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor); } if (extFlg) { if (aot == AOT_ER_BSAC) { FDKwriteBits( asc, config->BSACnumOfSubFrame, 5 ); /* numOfSubFrame */ FDKwriteBits( asc, config->BSAClayerLength, 11 ); /* layer_length */ } if ((aot == AOT_ER_AAC_LC) || (aot == AOT_ER_AAC_LTP) || (aot == AOT_ER_AAC_SCAL) || (aot == AOT_ER_AAC_LD)) { FDKwriteBits( asc, (config->flags & CC_VCB11) ? 1 : 0, 1 ); /* aacSectionDataResillienceFlag */ FDKwriteBits( asc, (config->flags & CC_RVLC) ? 1 : 0, 1 ); /* aacScaleFactorDataResillienceFlag */ FDKwriteBits( asc, (config->flags & CC_HCR) ? 1 : 0, 1 ); /* aacSpectralDataResillienceFlag */ } FDKwriteBits( asc, 0, 1 ); /* extensionFlag3: reserved. Shall be '0' */ } return 0; } #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE static int transportEnc_writeELDSpecificConfig( HANDLE_FDK_BITSTREAM hBs, CODER_CONFIG *config, int epConfig, CSTpCallBacks *cb ) { /* ELD specific config */ if (config->channelMode == MODE_1_1) { return -1; } FDKwriteBits(hBs, (config->samplesPerFrame == 480) ? 1 : 0, 1); FDKwriteBits(hBs, (config->flags & CC_VCB11 ) ? 1:0, 1); FDKwriteBits(hBs, (config->flags & CC_RVLC ) ? 1:0, 1); FDKwriteBits(hBs, (config->flags & CC_HCR ) ? 1:0, 1); FDKwriteBits(hBs, (config->flags & CC_SBR) ? 1:0, 1); /* SBR header flag */ if ( (config->flags & CC_SBR) ) { FDKwriteBits(hBs, (config->samplingRate == config->extSamplingRate) ? 0:1, 1); /* Samplerate Flag */ FDKwriteBits(hBs, (config->flags & CC_SBRCRC) ? 1:0, 1); /* SBR CRC flag*/ if (cb->cbSbr != NULL) { const PCE_CONFIGURATION *pPce; int e; pPce = getPceEntry(config->channelMode); for (e=0; eel_list[e] != ID_NONE; e++ ) { if ( (pPce->el_list[e] == ID_SCE) || (pPce->el_list[e] == ID_CPE) ) { cb->cbSbr(cb->cbSbrData, hBs, 0, 0, 0, config->aot, pPce->el_list[e], e); } } } } FDKwriteBits(hBs, 0, 4); /* ELDEXT_TERM */ return 0; } #endif /* TP_ELD_ENABLE */ int transportEnc_writeASC ( HANDLE_FDK_BITSTREAM asc, CODER_CONFIG *config, CSTpCallBacks *cb ) { UINT extFlag = 0; int err; int epConfig = 0; /* Required for the PCE. */ UINT alignAnchor = FDKgetValidBits(asc); /* Extension Flag: Shall be 1 for aot = 17,19,20,21,22,23,39 */ switch (config->aot) { case AOT_ER_AAC_LC: case AOT_ER_AAC_LTP: case AOT_ER_AAC_SCAL: case AOT_ER_TWIN_VQ: case AOT_ER_BSAC: case AOT_ER_AAC_LD: case AOT_ER_AAC_ELD: case AOT_USAC: extFlag = 1; break; default: break; } if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) writeAot(asc, config->extAOT); else writeAot(asc, config->aot); { writeSampleRate(asc, config->samplingRate); } /* Try to guess a reasonable channel mode if not given */ if (config->channelMode == MODE_INVALID) { config->channelMode = transportEnc_GetChannelMode(config->noChannels); if (config->channelMode == MODE_INVALID) return -1; } FDKwriteBits( asc, getChannelConfig(config->channelMode), 4 ); if (config->sbrSignaling==SIG_EXPLICIT_HIERARCHICAL && config->sbrPresent) { writeSampleRate(asc, config->extSamplingRate); writeAot(asc, config->aot); } switch (config->aot) { #ifdef TP_GA_ENABLE case AOT_AAC_MAIN: case AOT_AAC_LC: case AOT_AAC_SSR: case AOT_AAC_LTP: case AOT_AAC_SCAL: case AOT_TWIN_VQ: case AOT_ER_AAC_LC: case AOT_ER_AAC_LTP: case AOT_ER_AAC_SCAL: case AOT_ER_TWIN_VQ: case AOT_ER_BSAC: case AOT_ER_AAC_LD: err = transportEnc_writeGASpecificConfig(asc, config, extFlag, alignAnchor); if (err) return err; break; #endif /* TP_GA_ENABLE */ #ifdef TP_ELD_ENABLE case AOT_ER_AAC_ELD: err = transportEnc_writeELDSpecificConfig(asc, config, epConfig, cb); if (err) return err; break; #endif /* TP_ELD_ENABLE */ default: return -1; } switch (config->aot) { case AOT_ER_AAC_LC: case AOT_ER_AAC_LTP: case AOT_ER_AAC_SCAL: case AOT_ER_TWIN_VQ: case AOT_ER_BSAC: case AOT_ER_AAC_LD: case AOT_ER_CELP: case AOT_ER_HVXC: case AOT_ER_HILN: case AOT_ER_PARA: case AOT_ER_AAC_ELD: FDKwriteBits( asc, 0, 2 ); /* epconfig 0 */ break; default: break; } /* backward compatible explicit signaling of extension AOT */ if (config->sbrSignaling==SIG_EXPLICIT_BW_COMPATIBLE) { TP_ASC_EXTENSION_ID ascExtId = ASCEXT_UNKOWN; if (config->sbrPresent) { ascExtId=ASCEXT_SBR; FDKwriteBits( asc, ascExtId, 11 ); writeAot(asc, config->extAOT); FDKwriteBits( asc, 1, 1 ); /* sbrPresentFlag=1 */ writeSampleRate(asc, config->extSamplingRate); if (config->psPresent) { ascExtId=ASCEXT_PS; FDKwriteBits( asc, ascExtId, 11 ); FDKwriteBits( asc, 1, 1 ); /* psPresentFlag=1 */ } } } /* Make sure all bits are sync'ed */ FDKsyncCache( asc ); return 0; } fdk-aac-0.1.3/libMpegTPEnc/src/version0000644000175000017500000000027712372261464020070 0ustar00tootstoots00000000000000 /* library info */ #define TP_LIB_VL0 2 #define TP_LIB_VL1 3 #define TP_LIB_VL2 3 #define TP_LIB_TITLE "MPEG Transport" #define TP_LIB_BUILD_DATE __DATE__ #define TP_LIB_BUILD_TIME __TIME__ fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_adts.cpp0000644000175000017500000002712512372261464021311 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Groeschel contents/description: ADTS Transport Headers support ******************************************************************************/ #include "tpenc_adts.h" #include "tpenc_lib.h" #include "tpenc_asc.h" int adtsWrite_CrcStartReg( HANDLE_ADTS pAdts, /*!< pointer to adts stucture */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ int mBits /*!< number of bits in crc region */ ) { if (pAdts->protection_absent) { return 0; } return ( FDKcrcStartReg(&pAdts->crcInfo, hBs, mBits) ); } void adtsWrite_CrcEndReg( HANDLE_ADTS pAdts, /*!< pointer to adts crc info stucture */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to current bit buffer structure */ int reg /*!< crc region */ ) { if (pAdts->protection_absent == 0) { FDKcrcEndReg(&pAdts->crcInfo, hBs, reg); } } int adtsWrite_GetHeaderBits( HANDLE_ADTS hAdts ) { int bits = 0; if (hAdts->currentBlock == 0) { /* Static and variable header bits */ bits = 56; if (!hAdts->protection_absent) { /* Add header/ single raw data block CRC bits */ bits += 16; if (hAdts->num_raw_blocks>0) { /* Add bits of raw data block position markers */ bits += (hAdts->num_raw_blocks)*16; } } } if (!hAdts->protection_absent && hAdts->num_raw_blocks>0) { /* Add raw data block CRC bits. Not really part of the header, put they cause bit overhead to be accounted. */ bits += 16; } hAdts->headerBits = bits; return bits; } INT adtsWrite_Init(HANDLE_ADTS hAdts, CODER_CONFIG *config) { /* Sanity checks */ if ( config->nSubFrames < 1 || config->nSubFrames > 4 || (int)config->aot > 4 || (int)config->aot < 1 ) { return -1; } /* fixed header */ if (config->flags & CC_MPEG_ID) { hAdts->mpeg_id = 0; /* MPEG 4 */ } else { hAdts->mpeg_id = 1; /* MPEG 2 */ } hAdts->layer=0; hAdts->protection_absent = ! (config->flags & CC_PROTECTION); hAdts->profile = ((int)config->aot) - 1; hAdts->sample_freq_index = getSamplingRateIndex(config->samplingRate); hAdts->sample_freq = config->samplingRate; hAdts->private_bit=0; hAdts->channel_mode = config->channelMode; hAdts->original=0; hAdts->home=0; /* variable header */ hAdts->copyright_id=0; hAdts->copyright_start=0; hAdts->num_raw_blocks=config->nSubFrames-1; /* 0 means 1 raw data block */ FDKcrcInit(&hAdts->crcInfo, 0x8005, 0xFFFF, 16); hAdts->currentBlock = 0; return 0; } int adtsWrite_EncodeHeader(HANDLE_ADTS hAdts, HANDLE_FDK_BITSTREAM hBitStream, int buffer_fullness, int frame_length) { INT crcIndex = 0; hAdts->headerBits = adtsWrite_GetHeaderBits(hAdts); FDK_ASSERT(((frame_length+hAdts->headerBits)/8)<0x2000); /*13 bit*/ FDK_ASSERT(buffer_fullness<0x800); /* 11 bit */ if (!hAdts->protection_absent) { FDKcrcReset(&hAdts->crcInfo); } if (hAdts->currentBlock == 0) { FDKresetBitbuffer(hBitStream, BS_WRITER); } hAdts->subFrameStartBit = FDKgetValidBits(hBitStream); /* Skip new header if this is raw data block 1..n */ if (hAdts->currentBlock == 0) { FDKresetBitbuffer(hBitStream, BS_WRITER); if (hAdts->num_raw_blocks == 0) { crcIndex = adtsWrite_CrcStartReg(hAdts, hBitStream, 0); } /* fixed header */ FDKwriteBits(hBitStream, 0xFFF, 12); FDKwriteBits(hBitStream, hAdts->mpeg_id, 1); FDKwriteBits(hBitStream, hAdts->layer, 2); FDKwriteBits(hBitStream, hAdts->protection_absent, 1); FDKwriteBits(hBitStream, hAdts->profile, 2); FDKwriteBits(hBitStream, hAdts->sample_freq_index, 4); FDKwriteBits(hBitStream, hAdts->private_bit, 1); FDKwriteBits(hBitStream, getChannelConfig(hAdts->channel_mode), 3); FDKwriteBits(hBitStream, hAdts->original, 1); FDKwriteBits(hBitStream, hAdts->home, 1); /* variable header */ FDKwriteBits(hBitStream, hAdts->copyright_id, 1); FDKwriteBits(hBitStream, hAdts->copyright_start, 1); FDKwriteBits(hBitStream, (frame_length + hAdts->headerBits)>>3, 13); FDKwriteBits(hBitStream, buffer_fullness, 11); FDKwriteBits(hBitStream, hAdts->num_raw_blocks, 2); if (!hAdts->protection_absent) { int i; /* End header CRC portion for single raw data block and write dummy zero values for unknown fields. */ if (hAdts->num_raw_blocks == 0) { adtsWrite_CrcEndReg(hAdts, hBitStream, crcIndex); } else { for (i=0; inum_raw_blocks; i++) { FDKwriteBits(hBitStream, 0, 16); } } FDKwriteBits(hBitStream, 0, 16); } } /* End of ADTS header */ return 0; } void adtsWrite_EndRawDataBlock(HANDLE_ADTS hAdts, HANDLE_FDK_BITSTREAM hBs, int *pBits) { if (!hAdts->protection_absent) { FDK_BITSTREAM bsWriter; FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); FDKpushFor(&bsWriter, 56); if (hAdts->num_raw_blocks == 0) { FDKwriteBits(&bsWriter, FDKcrcGetCRC(&hAdts->crcInfo), 16); } else { int distance; /* Write CRC of current raw data block */ FDKwriteBits(hBs, FDKcrcGetCRC(&hAdts->crcInfo), 16); /* Write distance to current data block */ if (hAdts->currentBlock < hAdts->num_raw_blocks) { FDKpushFor(&bsWriter, hAdts->currentBlock*16); distance = FDKgetValidBits(hBs) - (56 + (hAdts->num_raw_blocks)*16 + 16); FDKwriteBits(&bsWriter, distance>>3, 16); } } FDKsyncCache(&bsWriter); } /* Write total frame lenth for multiple raw data blocks and header CRC */ if (hAdts->num_raw_blocks > 0 && hAdts->currentBlock == hAdts->num_raw_blocks) { FDK_BITSTREAM bsWriter; int crcIndex = 0; FDKinitBitStream(&bsWriter, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER); if (!hAdts->protection_absent) { FDKcrcReset(&hAdts->crcInfo); crcIndex = FDKcrcStartReg(&hAdts->crcInfo, &bsWriter, 0); } /* Write total frame length */ FDKpushFor(&bsWriter, 56-28+2); FDKwriteBits(&bsWriter, FDKgetValidBits(hBs)>>3, 13); /* Write header CRC */ if (!hAdts->protection_absent) { FDKpushFor(&bsWriter, 11+2 + (hAdts->num_raw_blocks)*16); FDKcrcEndReg(&hAdts->crcInfo, &bsWriter, crcIndex); FDKwriteBits(&bsWriter, FDKcrcGetCRC(&hAdts->crcInfo), 16); } FDKsyncCache(&bsWriter); } /* Correct *pBits to reflect the amount of bits of the current subframe */ *pBits -= hAdts->subFrameStartBit; if (!hAdts->protection_absent && hAdts->num_raw_blocks > 0) { /* Fixup CRC bits, since they come after each raw data block */ *pBits += 16; } hAdts->currentBlock++; } fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_adif.cpp0000644000175000017500000001536012372261464021257 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** contents/description: ADIF Transport Headers writing ******************************************************************************/ #include "tpenc_adif.h" #include "tpenc_lib.h" #include "tpenc_asc.h" int adifWrite_EncodeHeader(ADIF_INFO *adif, HANDLE_FDK_BITSTREAM hBs, INT adif_buffer_fullness) { /* ADIF/PCE/ADTS definitions */ const char adifId[5]="ADIF"; const int copyRightIdPresent=0; const int originalCopy=0; const int home=0; int i; INT sampleRate = adif->samplingRate; INT totalBitRate = adif->bitRate; if (adif->headerWritten) return 0; /* Align inside PCE with respect to the first bit of the header */ UINT alignAnchor = FDKgetValidBits(hBs); /* Signal variable bitrate if buffer fullnes exceeds 20 bit */ adif->bVariableRate = ( adif_buffer_fullness >= (INT)(0x1<<20) ) ? 1 : 0; FDKwriteBits(hBs, adifId[0],8); FDKwriteBits(hBs, adifId[1],8); FDKwriteBits(hBs, adifId[2],8); FDKwriteBits(hBs, adifId[3],8); FDKwriteBits(hBs, copyRightIdPresent ? 1:0,1); if(copyRightIdPresent) { for(i=0;i<72;i++) { FDKwriteBits(hBs,0,1); } } FDKwriteBits(hBs, originalCopy ? 1:0,1); FDKwriteBits(hBs, home ? 1:0,1); FDKwriteBits(hBs, adif->bVariableRate?1:0, 1); FDKwriteBits(hBs, totalBitRate,23); /* we write only one PCE at the moment */ FDKwriteBits(hBs, 0, 4); if(!adif->bVariableRate) { FDKwriteBits(hBs, adif_buffer_fullness, 20); } /* Write PCE */ transportEnc_writePCE(hBs, adif->cm, sampleRate, adif->instanceTag, adif->profile, 0, 0, alignAnchor); return 0; } int adifWrite_GetHeaderBits(ADIF_INFO *adif) { /* ADIF definitions */ const int copyRightIdPresent=0; if (adif->headerWritten) return 0; int bits = 0; bits += 8*4; /* ADIF ID */ bits += 1; /* Copyright present */ if (copyRightIdPresent) bits += 72; /* Copyright ID */ bits += 26; bits += 4; /* Number of PCE's */ if(!adif->bVariableRate) { bits += 20; } /* write PCE */ bits = transportEnc_GetPCEBits(adif->cm, 0, bits); return bits; } fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_asc.h0000644000175000017500000001445512372261464020573 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): Manuel Jander Description: Audio Specific Config writer ******************************************************************************/ #ifndef TPENC_ASC_H #define TPENC_ASC_H /** * \brief Get channel config from channel mode. * * \param channel_mode channel mode * * \return chanel config */ int getChannelConfig( CHANNEL_MODE channel_mode ); /** * \brief Write a Program Config Element. * * \param hBs bitstream handle into which the PCE is appended * \param channelMode the channel mode to be used * \param sampleRate the sample rate * \param instanceTagPCE the instance tag of the Program Config Element * \param profile the MPEG Audio profile to be used * \param matrix mixdown gain * \param pseudo surround indication * \param reference bitstream position for alignment * \return zero on success, non-zero on failure. */ int transportEnc_writePCE( HANDLE_FDK_BITSTREAM hBs, CHANNEL_MODE channelMode, INT sampleRate, int instanceTagPCE, int profile, int matrixMixdownA, int pseudoSurroundEnable, UINT alignAnchor ); /** * \brief Get the bit count required by a Program Config Element * * \param channelMode the channel mode to be used * \param matrix mixdown gain * \param bit offset at which the PCE would start * \return the amount of bits required for the PCE including the given bit offset. */ int transportEnc_GetPCEBits( CHANNEL_MODE channelMode, int matrixMixdownA, int bits ); #endif /* TPENC_ASC_H */ fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_latm.cpp0000644000175000017500000006540312372261464021314 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Encoder ************************** Author(s): Description: ******************************************************************************/ #include "tpenc_latm.h" #include "genericStds.h" static const short celpFrameLengthTable[64] = { 154, 170, 186, 147, 156, 165, 114, 120, 186, 126, 132, 138, 142, 146, 154, 166, 174, 182, 190, 198, 206, 210, 214, 110, 114, 118, 120, 122, 218, 230, 242, 254, 266, 278, 286, 294, 318, 342, 358, 374, 390, 406, 422, 136, 142, 148, 154, 160, 166, 170, 174, 186, 198, 206, 214, 222, 230, 238, 216, 160, 280, 338, 0, 0 }; /******* write value to transport stream first two bits define the size of the value itself then the value itself, with a size of 0-3 bytes *******/ static UINT transportEnc_LatmWriteValue(HANDLE_FDK_BITSTREAM hBs, int value) { UCHAR valueBytes = 4; unsigned int bitsWritten = 0; int i; if ( value < (1<<8) ) { valueBytes = 1; } else if ( value < (1<<16) ) { valueBytes = 2; } else if ( value < (1<<24) ) { valueBytes = 3; } else { valueBytes = 4; } FDKwriteBits(hBs, valueBytes-1, 2 ); /* size of value in Bytes */ for (i=0; i>((valueBytes-1-i)<<3)), 8); } bitsWritten = (valueBytes<<3)+2; return bitsWritten; } static UINT transportEnc_LatmCountFixBitDemandHeader ( HANDLE_LATM_STREAM hAss ) { int bitDemand = 0; int insertSetupData = 0 ; /* only if start of new latm frame */ if (hAss->subFrameCnt==0) { /* AudioSyncStream */ if (hAss->tt == TT_MP4_LOAS) { bitDemand += 11 ; /* syncword */ bitDemand += 13 ; /* audioMuxLengthBytes */ } /* AudioMuxElement*/ /* AudioMuxElement::Stream Mux Config */ if (hAss->muxConfigPeriod > 0) { insertSetupData = (hAss->latmFrameCounter == 0); } else { insertSetupData = 0; } if (hAss->tt != TT_MP4_LATM_MCP0) { /* AudioMuxElement::useSameStreamMux Flag */ bitDemand+=1; if( insertSetupData ) { bitDemand += hAss->streamMuxConfigBits; } } /* AudioMuxElement::otherDataBits */ bitDemand += 8*hAss->otherDataLenBytes; /* AudioMuxElement::ByteAlign */ if ( bitDemand % 8 ) { hAss->fillBits = 8 - (bitDemand % 8); bitDemand += hAss->fillBits ; } else { hAss->fillBits = 0; } } return bitDemand ; } static UINT transportEnc_LatmCountVarBitDemandHeader ( HANDLE_LATM_STREAM hAss , unsigned int streamDataLength ) { int bitDemand = 0; int prog, layer; /* Payload Length Info*/ if( hAss->allStreamsSameTimeFraming ) { for( prog=0; prognoProgram; prog++ ) { for( layer=0; layerm_linfo[prog][layer]); if( p_linfo->streamID >= 0 ) { switch( p_linfo->frameLengthType ) { case 0: if ( streamDataLength > 0 ) { streamDataLength -= bitDemand ; while( streamDataLength >= (255<<3) ) { bitDemand+=8; streamDataLength -= (255<<3); } bitDemand += 8; } break; case 1: case 4: case 6: bitDemand += 2; break; default: return 0; } } } } } else { /* there are many possibilities to use this mechanism. */ switch( hAss->varMode ) { case LATMVAR_SIMPLE_SEQUENCE: { /* Use the sequence generated by the encoder */ //int streamCntPosition = transportEnc_SetWritePointer( hAss->hAssemble, 0 ); //int streamCntPosition = FDKgetValidBits( hAss->hAssemble ); bitDemand+=4; hAss->varStreamCnt = 0; for( prog=0; prognoProgram; prog++ ) { for( layer=0; layerm_linfo[prog][layer]); if( p_linfo->streamID >= 0 ) { bitDemand+=4; /* streamID */ switch( p_linfo->frameLengthType ) { case 0: streamDataLength -= bitDemand ; while( streamDataLength >= (255<<3) ) { bitDemand+=8; streamDataLength -= (255<<3); } bitDemand += 8; break; /*bitDemand += 1; endFlag break;*/ case 1: case 4: case 6: break; default: return 0; } hAss->varStreamCnt++; } } } bitDemand+=4; //transportEnc_UpdateBitstreamField( hAss->hAssemble, streamCntPosition, hAss->varStreamCnt-1, 4 ); //UINT pos = streamCntPosition-FDKgetValidBits(hAss->hAssemble); //FDKpushBack( hAss->hAssemble, pos); //FDKwriteBits( hAss->hAssemble, hAss->varStreamCnt-1, 4); //FDKpushFor( hAss->hAssemble, pos-4); } break; default: return 0; } } return bitDemand ; } TRANSPORTENC_ERROR CreateStreamMuxConfig( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int bufferFullness, CSTpCallBacks *cb ) { INT streamIDcnt, tmp; int layer, prog; USHORT coreFrameOffset=0; hAss->audioMuxVersionA = 0; /* for future extensions */ hAss->streamMuxConfigBits = 0; FDKwriteBits( hBs, hAss->audioMuxVersion, 1 ); /* audioMuxVersion */ hAss->streamMuxConfigBits += 1; if ( hAss->audioMuxVersion == 1 ) { FDKwriteBits( hBs, hAss->audioMuxVersionA, 1 ); /* audioMuxVersionA */ hAss->streamMuxConfigBits+=1; } if ( hAss->audioMuxVersionA == 0 ) { if ( hAss->audioMuxVersion == 1 ) { hAss->streamMuxConfigBits+= transportEnc_LatmWriteValue( hBs, hAss->taraBufferFullness );/* taraBufferFullness */ } FDKwriteBits( hBs, hAss->allStreamsSameTimeFraming ? 1:0, 1 ); /* allStreamsSameTimeFraming */ FDKwriteBits( hBs, hAss->noSubframes-1, 6 ); /* Number of Subframes */ FDKwriteBits( hBs, hAss->noProgram-1, 4 ); /* Number of Programs */ hAss->streamMuxConfigBits+=11; streamIDcnt = 0; for( prog=0; prognoProgram; prog++ ) { int transLayer = 0; FDKwriteBits( hBs, hAss->noLayer[prog]-1, 3 ); hAss->streamMuxConfigBits+=3; for( layer=0; layerm_linfo[prog][layer]); CODER_CONFIG *p_lci = hAss->config[prog][layer]; p_linfo->streamID = -1; if( hAss->config[prog][layer] != NULL ) { int useSameConfig = 0; if( transLayer > 0 ) { FDKwriteBits( hBs, useSameConfig ? 1 : 0, 1 ); hAss->streamMuxConfigBits+=1; } if( (useSameConfig == 0) || (transLayer==0) ) { UINT bits; if ( hAss->audioMuxVersion == 1 ) { FDKpushFor(hBs, 2); /* align to ASC, even if we do not know the length of the "ascLen" field yet */ } bits = FDKgetValidBits( hBs ); transportEnc_writeASC( hBs, hAss->config[prog][layer], cb ); bits = FDKgetValidBits( hBs ) - bits; if ( hAss->audioMuxVersion == 1 ) { FDKpushBack(hBs, bits+2); hAss->streamMuxConfigBits += transportEnc_LatmWriteValue( hBs, bits ); transportEnc_writeASC( hBs, hAss->config[prog][layer], cb ); } hAss->streamMuxConfigBits += bits; /* add asc length to smc summary */ } transLayer++; if( !hAss->allStreamsSameTimeFraming ) { if( streamIDcnt >= LATM_MAX_STREAM_ID ) return TRANSPORTENC_INVALID_CONFIG; } p_linfo->streamID = streamIDcnt++; switch( p_lci->aot ) { case AOT_AAC_MAIN : case AOT_AAC_LC : case AOT_AAC_SSR : case AOT_AAC_LTP : case AOT_AAC_SCAL : case AOT_ER_AAC_LD : case AOT_ER_AAC_ELD : case AOT_USAC: case AOT_RSVD50: p_linfo->frameLengthType = 0; FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ FDKwriteBits( hBs, bufferFullness, 8 ); /* bufferFullness */ hAss->streamMuxConfigBits+=11; if ( !hAss->allStreamsSameTimeFraming ) { CODER_CONFIG *p_lci_prev = hAss->config[prog][layer-1]; if ( ((p_lci->aot == AOT_AAC_SCAL) || (p_lci->aot == AOT_ER_AAC_SCAL)) && ((p_lci_prev->aot == AOT_CELP) || (p_lci_prev->aot == AOT_ER_CELP)) ) { FDKwriteBits( hBs, coreFrameOffset, 6 ); /* coreFrameOffset */ hAss->streamMuxConfigBits+=6; } } break; case AOT_TWIN_VQ: p_linfo->frameLengthType = 1; tmp = ( (p_lci->bitsFrame+7) >> 3 ) - 20; /* transmission frame length in bytes */ if( (tmp < 0) ) { return TRANSPORTENC_INVALID_TRANSMISSION_FRAME_LENGTH; } FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ FDKwriteBits( hBs, tmp, 9 ); hAss->streamMuxConfigBits+=12; p_linfo->frameLengthBits = (tmp+20) << 3; break; case AOT_CELP: p_linfo->frameLengthType = 4; FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ hAss->streamMuxConfigBits+=3; { int i; for( i=0; i<62; i++ ) { if( celpFrameLengthTable[i] == p_lci->bitsFrame ) break; } if( i>=62 ) { return TRANSPORTENC_INVALID_CELP_FRAME_LENGTH; } FDKwriteBits( hBs, i, 6 ); /* CELPframeLengthTabelIndex */ hAss->streamMuxConfigBits+=6; } p_linfo->frameLengthBits = p_lci->bitsFrame; break; case AOT_HVXC: p_linfo->frameLengthType = 6; FDKwriteBits( hBs, p_linfo->frameLengthType, 3 ); /* frameLengthType */ hAss->streamMuxConfigBits+=3; { int i; if( p_lci->bitsFrame == 40 ) { i = 0; } else if( p_lci->bitsFrame == 80 ) { i = 1; } else { return TRANSPORTENC_INVALID_FRAME_BITS; } FDKwriteBits( hBs, i, 1 ); /* HVXCframeLengthTableIndex */ hAss->streamMuxConfigBits+=1; } p_linfo->frameLengthBits = p_lci->bitsFrame; break; case AOT_NULL_OBJECT: default: return TRANSPORTENC_INVALID_AOT; } } } } FDKwriteBits( hBs, (hAss->otherDataLenBytes>0) ? 1:0, 1 ); /* otherDataPresent */ hAss->streamMuxConfigBits+=1; if( hAss->otherDataLenBytes > 0 ) { INT otherDataLenTmp = hAss->otherDataLenBytes; INT escCnt = 0; INT otherDataLenEsc = 1; while(otherDataLenTmp) { otherDataLenTmp >>= 8; escCnt ++; } do { otherDataLenTmp = (hAss->otherDataLenBytes>>(escCnt*8)) & 0xFF; escCnt--; otherDataLenEsc = escCnt>0; FDKwriteBits( hBs, otherDataLenEsc, 1 ); FDKwriteBits( hBs, otherDataLenTmp, 8 ); hAss->streamMuxConfigBits+=9; } while(otherDataLenEsc); } { USHORT crcCheckPresent=0; USHORT crcCheckSum=0; FDKwriteBits( hBs, crcCheckPresent, 1 ); /* crcCheckPresent */ hAss->streamMuxConfigBits+=1; if ( crcCheckPresent ){ FDKwriteBits( hBs, crcCheckSum, 8 ); /* crcCheckSum */ hAss->streamMuxConfigBits+=8; } } } else { /* if ( audioMuxVersionA == 0 ) */ /* for future extensions */ } return TRANSPORTENC_OK; } static TRANSPORTENC_ERROR WriteAuPayloadLengthInfo( HANDLE_FDK_BITSTREAM hBitStream, int AuLengthBits ) { int restBytes; if( AuLengthBits % 8 ) return TRANSPORTENC_INVALID_AU_LENGTH; while( AuLengthBits >= 255*8 ) { FDKwriteBits( hBitStream, 255, 8 ); /* 255 shows incomplete AU */ AuLengthBits -= (255*8); } restBytes = (AuLengthBits) >> 3; FDKwriteBits( hBitStream, restBytes, 8 ); return TRANSPORTENC_OK; } static TRANSPORTENC_ERROR transportEnc_LatmSetNrOfSubframes( HANDLE_LATM_STREAM hAss, INT noSubframes_next) /* nr of access units / payloads within a latm frame */ { /* sanity chk */ if (noSubframes_next < 1 || noSubframes_next > MAX_NR_OF_SUBFRAMES) { return TRANSPORTENC_LATM_INVALID_NR_OF_SUBFRAMES; } hAss->noSubframes_next = noSubframes_next; /* if at start then we can take over the value immediately, otherwise we have to wait for the next SMC */ if ( (hAss->subFrameCnt == 0) && (hAss->latmFrameCounter == 0) ) { hAss->noSubframes = noSubframes_next; } return TRANSPORTENC_OK; } static int allStreamsSameTimeFraming( HANDLE_LATM_STREAM hAss, UCHAR noProgram, UCHAR noLayer[] /* return */ ) { int prog, layer; signed int lastNoSamples = -1; signed int minFrameSamples = FDK_INT_MAX; signed int maxFrameSamples = 0; signed int highestSamplingRate = -1; for( prog=0; progconfig[prog][layer] != NULL ) { INT hsfSamplesFrame; noLayer[prog]++; if( highestSamplingRate < 0 ) highestSamplingRate = hAss->config[prog][layer]->samplingRate; hsfSamplesFrame = hAss->config[prog][layer]->samplesPerFrame * highestSamplingRate / hAss->config[prog][layer]->samplingRate; if( hsfSamplesFrame <= minFrameSamples ) minFrameSamples = hsfSamplesFrame; if( hsfSamplesFrame >= maxFrameSamples ) maxFrameSamples = hsfSamplesFrame; if( lastNoSamples == -1 ) { lastNoSamples = hsfSamplesFrame; } else { if( hsfSamplesFrame != lastNoSamples ) { return 0; } } } } } return 1; } /** * Initialize LATM/LOAS Stream and add layer 0 at program 0. */ static TRANSPORTENC_ERROR transportEnc_InitLatmStream( HANDLE_LATM_STREAM hAss, int fractDelayPresent, signed int muxConfigPeriod, /* insert setup data every muxConfigPeriod frames */ UINT audioMuxVersion, TRANSPORT_TYPE tt ) { TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK; if (hAss == NULL) return TRANSPORTENC_INVALID_PARAMETER; hAss->tt = tt; hAss->noProgram = 1; hAss->audioMuxVersion = audioMuxVersion; /* Fill noLayer array using hAss->config */ hAss->allStreamsSameTimeFraming = allStreamsSameTimeFraming( hAss, hAss->noProgram, hAss->noLayer ); /* Only allStreamsSameTimeFraming==1 is supported */ FDK_ASSERT(hAss->allStreamsSameTimeFraming); hAss->fractDelayPresent = fractDelayPresent; hAss->otherDataLenBytes = 0; hAss->varMode = LATMVAR_SIMPLE_SEQUENCE; /* initialize counters */ hAss->subFrameCnt = 0; hAss->noSubframes = DEFAULT_LATM_NR_OF_SUBFRAMES; hAss->noSubframes_next = DEFAULT_LATM_NR_OF_SUBFRAMES; /* sync layer related */ hAss->audioMuxLengthBytes = 0; hAss->latmFrameCounter = 0; hAss->muxConfigPeriod = muxConfigPeriod; return ErrorStatus; } /** * */ UINT transportEnc_LatmCountTotalBitDemandHeader ( HANDLE_LATM_STREAM hAss , unsigned int streamDataLength ) { UINT bitDemand = 0; switch (hAss->tt) { case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: if (hAss->subFrameCnt == 0) { bitDemand = transportEnc_LatmCountFixBitDemandHeader ( hAss ); } bitDemand += transportEnc_LatmCountVarBitDemandHeader ( hAss , streamDataLength /*- bitDemand*/); break; default: break; } return bitDemand; } static TRANSPORTENC_ERROR AdvanceAudioMuxElement ( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int auBits, int bufferFullness, CSTpCallBacks *cb ) { TRANSPORTENC_ERROR ErrorStatus = TRANSPORTENC_OK; int insertMuxSetup; /* Insert setup data to assemble Buffer */ if (hAss->subFrameCnt == 0) { if (hAss->muxConfigPeriod > 0) { insertMuxSetup = (hAss->latmFrameCounter == 0); } else { insertMuxSetup = 0; } if (hAss->tt != TT_MP4_LATM_MCP0) { if( insertMuxSetup ) { FDKwriteBits( hBs, 0, 1 ); /* useSameStreamMux useNewStreamMux */ CreateStreamMuxConfig(hAss, hBs, bufferFullness, cb); if (ErrorStatus != TRANSPORTENC_OK) return ErrorStatus; } else { FDKwriteBits( hBs, 1, 1 ); /* useSameStreamMux */ } } } /* PayloadLengthInfo */ { int prog, layer; for (prog = 0; prog < hAss->noProgram; prog++) { for (layer = 0; layer < hAss->noLayer[prog]; layer++) { ErrorStatus = WriteAuPayloadLengthInfo( hBs, auBits ); if (ErrorStatus != TRANSPORTENC_OK) return ErrorStatus; } } } /* At this point comes the access unit. */ return TRANSPORTENC_OK; } TRANSPORTENC_ERROR transportEnc_LatmWrite ( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int auBits, int bufferFullness, CSTpCallBacks *cb ) { TRANSPORTENC_ERROR ErrorStatus; if (hAss->subFrameCnt == 0) { /* Start new frame */ FDKresetBitbuffer(hBs, BS_WRITER); } hAss->latmSubframeStart = FDKgetValidBits(hBs); /* Insert syncword and syncword distance - only if loas - we must update the syncword distance (=audiomuxlengthbytes) later */ if( hAss->tt == TT_MP4_LOAS && hAss->subFrameCnt == 0) { /* Start new LOAS frame */ FDKwriteBits( hBs, 0x2B7, 11 ); hAss->audioMuxLengthBytes = 0; hAss->audioMuxLengthBytesPos = FDKgetValidBits( hBs ); /* store read pointer position */ FDKwriteBits( hBs, hAss->audioMuxLengthBytes, 13 ); } ErrorStatus = AdvanceAudioMuxElement( hAss, hBs, auBits, bufferFullness, cb ); if (ErrorStatus != TRANSPORTENC_OK) return ErrorStatus; return ErrorStatus; } void transportEnc_LatmAdjustSubframeBits(HANDLE_LATM_STREAM hAss, int *bits) { /* Substract bits from possible previous subframe */ *bits -= hAss->latmSubframeStart; /* Add fill bits */ if (hAss->subFrameCnt == 0) *bits += hAss->fillBits; } void transportEnc_LatmGetFrame(HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, int *bytes) { hAss->subFrameCnt++; if (hAss->subFrameCnt >= hAss->noSubframes) { /* Add LOAS frame length if required. */ if (hAss->tt == TT_MP4_LOAS) { int latmBytes; latmBytes = (FDKgetValidBits(hBs)+7) >> 3; /* write length info into assembler buffer */ hAss->audioMuxLengthBytes = latmBytes - 3; /* 3=Syncword + length */ { FDK_BITSTREAM tmpBuf; FDKinitBitStream( &tmpBuf, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, 0, BS_WRITER ) ; FDKpushFor( &tmpBuf, hAss->audioMuxLengthBytesPos ); FDKwriteBits( &tmpBuf, hAss->audioMuxLengthBytes, 13 ); FDKsyncCache( &tmpBuf ); } } /* Write AudioMuxElement byte alignment fill bits */ FDKwriteBits(hBs, 0, hAss->fillBits); FDK_ASSERT( (FDKgetValidBits(hBs) % 8) == 0); hAss->subFrameCnt = 0; FDKsyncCache(hBs); *bytes = (FDKgetValidBits(hBs) + 7)>>3; //FDKfetchBuffer(hBs, buffer, (UINT*)bytes); if (hAss->muxConfigPeriod > 0) { hAss->latmFrameCounter++; if (hAss->latmFrameCounter >= hAss->muxConfigPeriod) { hAss->latmFrameCounter = 0; hAss->noSubframes = hAss->noSubframes_next; } } } else { /* No data this time */ *bytes = 0; } } /** * Init LATM/LOAS */ TRANSPORTENC_ERROR transportEnc_Latm_Init( HANDLE_LATM_STREAM hAss, HANDLE_FDK_BITSTREAM hBs, CODER_CONFIG *layerConfig, UINT audioMuxVersion, TRANSPORT_TYPE tt, CSTpCallBacks *cb ) { TRANSPORTENC_ERROR ErrorStatus; int fractDelayPresent = 0; int prog, layer; int setupDataDistanceFrames = layerConfig->headerPeriod; FDK_ASSERT(setupDataDistanceFrames>=0); for (prog=0; progconfig[prog][layer] = NULL; hAss->m_linfo[prog][layer].streamID = -1; } } hAss->config[0][0] = layerConfig; hAss->m_linfo[0][0].streamID = 0; ErrorStatus = transportEnc_InitLatmStream( hAss, fractDelayPresent, setupDataDistanceFrames, (audioMuxVersion)?1:0, tt ); if (ErrorStatus != TRANSPORTENC_OK) goto bail; ErrorStatus = transportEnc_LatmSetNrOfSubframes( hAss, layerConfig->nSubFrames ); if (ErrorStatus != TRANSPORTENC_OK) goto bail; /* Get the size of the StreamMuxConfig somehow */ AdvanceAudioMuxElement(hAss, hBs, 0, 0, cb); //CreateStreamMuxConfig(hAss, hBs, 0); bail: return ErrorStatus; } fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_adts.h0000644000175000017500000002050112372261464020745 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: Alex Groeschel contents/description: ADTS Transport writer ******************************************************************************/ #ifndef TPENC_ADTS_H #define TPENC_ADTS_H #include "tp_data.h" #include "FDK_crc.h" typedef struct { INT sample_freq; CHANNEL_MODE channel_mode; UCHAR decoderCanDoMpeg4; UCHAR mpeg_id; UCHAR layer; UCHAR protection_absent; UCHAR profile; UCHAR sample_freq_index; UCHAR private_bit; UCHAR original; UCHAR home; UCHAR copyright_id; UCHAR copyright_start; USHORT frame_length; UCHAR num_raw_blocks; UCHAR BufferFullnesStartFlag; int headerBits; /*!< Header bit demand for the current raw data block */ int currentBlock; /*!< Index of current raw data block */ int subFrameStartBit; /*!< Bit position where the current raw data block begins */ FDK_CRCINFO crcInfo; } STRUCT_ADTS; typedef STRUCT_ADTS *HANDLE_ADTS; /** * \brief Initialize ADTS data structure * * \param hAdts ADTS data handle * \param config a valid CODER_CONFIG struct from where the required * information for the ADTS header is extrated from * * \return 0 in case of success. */ INT adtsWrite_Init( HANDLE_ADTS hAdts, CODER_CONFIG *config ); /** * \brief Get the total bit overhead caused by ADTS * * \hAdts handle to ADTS data * * \return Amount of additional bits required for the current raw data block */ int adtsWrite_GetHeaderBits( HANDLE_ADTS hAdts ); /** * \brief Write an ADTS header into the given bitstream. May not write a header * in case of multiple raw data blocks. * * \param hAdts ADTS data handle * \param hBitStream bitstream handle into which the ADTS may be written into * \param buffer_fullness the buffer fullness value for the ADTS header * \param the current raw data block length * * \return 0 in case of success. */ INT adtsWrite_EncodeHeader( HANDLE_ADTS hAdts, HANDLE_FDK_BITSTREAM hBitStream, int bufferFullness, int frame_length ); /** * \brief Finish a ADTS raw data block * * \param hAdts ADTS data handle * \param hBs bitstream handle into which the ADTS may be written into * \param pBits a pointer to a integer holding the current bitstream buffer bit count, * which is corrected to the current raw data block boundary. * */ void adtsWrite_EndRawDataBlock( HANDLE_ADTS hAdts, HANDLE_FDK_BITSTREAM hBs, int *bits ); /** * \brief Start CRC region with a maximum number of bits * If mBits is positive zero padding will be used for CRC calculation, if there * are less than mBits bits available. * If mBits is negative no zero padding is done. * If mBits is zero the memory for the buffer is allocated dynamically, the * number of bits is not limited. * * \param pAdts ADTS data handle * \param hBs bitstream handle of which the CRC region ends * \param mBits limit of number of bits to be considered for the requested CRC region * * \return ID for the created region, -1 in case of an error */ int adtsWrite_CrcStartReg( HANDLE_ADTS pAdts, HANDLE_FDK_BITSTREAM hBs, int mBits ); /** * \brief Ends CRC region identified by reg * * \param pAdts ADTS data handle * \param hBs bitstream handle of which the CRC region ends * \param reg a CRC region ID returned previously by adtsWrite_CrcStartReg() */ void adtsWrite_CrcEndReg( HANDLE_ADTS pAdts, HANDLE_FDK_BITSTREAM hBs, int reg ); #endif /* TPENC_ADTS_H */ fdk-aac-0.1.3/libMpegTPEnc/src/tpenc_lib.cpp0000644000175000017500000005034612372261464021125 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** MPEG-4 Transport Encoder ************************ Author(s): Manuel Jander Description: MPEG Transport encode ******************************************************************************/ #include "tpenc_lib.h" /* library info */ #include "version" #define MODULE_NAME "transportEnc" #include "tpenc_asc.h" #include "conv_string.h" #include "tpenc_adts.h" #include "tpenc_adif.h" #include "tpenc_latm.h" typedef struct { int curSubFrame; int nSubFrames; int prevBits; } RAWPACKETS_INFO; struct TRANSPORTENC { CODER_CONFIG config; TRANSPORT_TYPE transportFmt; /*!< MPEG4 transport type. */ FDK_BITSTREAM bitStream; UCHAR *bsBuffer; INT bsBufferSize; INT pceFrameCounter; /*!< Indicates frame period when PCE must be written in raw_data_block. -1 means not to write a PCE in raw_dat_block. */ union { STRUCT_ADTS adts; ADIF_INFO adif; LATM_STREAM latm; RAWPACKETS_INFO raw; } writer; CSTpCallBacks callbacks; }; typedef struct _TRANSPORTENC_STRUCT TRANSPORTENC_STRUCT; /* * MEMORY Declaration */ C_ALLOC_MEM(Ram_TransportEncoder, TRANSPORTENC, 1) TRANSPORTENC_ERROR transportEnc_Open( HANDLE_TRANSPORTENC *phTpEnc ) { HANDLE_TRANSPORTENC hTpEnc; if ( phTpEnc == NULL ){ return TRANSPORTENC_INVALID_PARAMETER; } hTpEnc = GetRam_TransportEncoder(0); if ( hTpEnc == NULL ) { return TRANSPORTENC_NO_MEM; } *phTpEnc = hTpEnc; return TRANSPORTENC_OK; } /** * \brief Get frame period of PCE in raw_data_block. * * - Write PCE only if necessary. PCE can be part of the ASC if chConfig==0 whererfore * no additonal PCE will be written in raw_data_block. * - A matrixMixdown coefficient can only be written if chConfig is 5.0 or 5.1. * - The PCE repetition rate in raw_data_block can be controlled via headerPeriod parameter. * * \param channelConfig Channel Configuration derived from Channel Mode * \param transportFmt Format of the transport to be written. * \param headerPeriod Chosen PCE frame repetition rate. * \param matrixMixdownA Indicates if a valid Matrix Mixdown coefficient is available. * * \return PCE frame repetition rate. -1 means no PCE present in raw_data_block. */ static INT getPceRepetitionRate( const int channelConfig, const TRANSPORT_TYPE transportFmt, const int headerPeriod, const int matrixMixdownA ) { INT pceFrameCounter = -1; /* variable to be returned */ if (headerPeriod>0) { switch ( channelConfig ) { case 0: switch (transportFmt) { case TT_MP4_ADTS: case TT_MP4_LATM_MCP0: case TT_MP4_RAW: pceFrameCounter = headerPeriod; break; case TT_MP4_ADIF: /* ADIF header comprises PCE */ case TT_MP4_LOAS: /* PCE in ASC if chChonfig==0 */ case TT_MP4_LATM_MCP1: /* PCE in ASC if chChonfig==0 */ case TT_DRM: /* PCE not allowed in DRM */ default: pceFrameCounter = -1; /* no PCE in raw_data_block */ } break; case 5: /* MODE_1_2_2 */ case 6: /* MODE_1_2_2_1 */ /* matrixMixdownCoefficient can only be written if 5.0 and 5.1 config present. */ if (matrixMixdownA!=0) { switch (transportFmt) { case TT_MP4_ADIF: /* ADIF header comprises PCE */ case TT_MP4_ADTS: case TT_MP4_LOAS: /* no PCE in ASC because chConfig!=0 */ case TT_MP4_LATM_MCP1: /* no PCE in ASC because chConfig!=0 */ case TT_MP4_LATM_MCP0: case TT_MP4_RAW: pceFrameCounter = headerPeriod; break; case TT_DRM: /* PCE not allowed in DRM */ default: pceFrameCounter = -1; /* no PCE in raw_data_block */ } /* switch transportFmt */ } /* if matrixMixdownA!=0 */ break; default: pceFrameCounter = -1; /* no PCE in raw_data_block */ } /* switch getChannelConfig() */ } /* if headerPeriod>0 */ else { pceFrameCounter = -1; /* no PCE in raw_data_block */ } return pceFrameCounter; } TRANSPORTENC_ERROR transportEnc_Init( HANDLE_TRANSPORTENC hTpEnc, UCHAR *bsBuffer, INT bsBufferSize, TRANSPORT_TYPE transportFmt, CODER_CONFIG *cconfig, UINT flags ) { /* Copy configuration structure */ FDKmemcpy(&hTpEnc->config, cconfig, sizeof(CODER_CONFIG)); /* Init transportEnc struct. */ hTpEnc->transportFmt = transportFmt; hTpEnc->bsBuffer = bsBuffer; hTpEnc->bsBufferSize = bsBufferSize; FDKinitBitStream(&hTpEnc->bitStream, hTpEnc->bsBuffer, hTpEnc->bsBufferSize, 0, BS_WRITER); switch (transportFmt) { case TT_MP4_ADIF: /* Sanity checks */ if ( (hTpEnc->config.aot != AOT_AAC_LC) ||(hTpEnc->config.samplesPerFrame != 1024)) { return TRANSPORTENC_INVALID_PARAMETER; } hTpEnc->writer.adif.headerWritten = 0; hTpEnc->writer.adif.samplingRate = hTpEnc->config.samplingRate; hTpEnc->writer.adif.bitRate = hTpEnc->config.bitRate; hTpEnc->writer.adif.profile = ((int)hTpEnc->config.aot) - 1; hTpEnc->writer.adif.cm = hTpEnc->config.channelMode; hTpEnc->writer.adif.bVariableRate = 0; hTpEnc->writer.adif.instanceTag = 0; break; case TT_MP4_ADTS: /* Sanity checks */ if ( ( hTpEnc->config.aot != AOT_AAC_LC) ||(hTpEnc->config.samplesPerFrame != 1024) ) { return TRANSPORTENC_INVALID_PARAMETER; } if ( adtsWrite_Init(&hTpEnc->writer.adts, &hTpEnc->config) != 0) { return TRANSPORTENC_INVALID_PARAMETER; } break; case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: { TRANSPORTENC_ERROR error; error = transportEnc_Latm_Init( &hTpEnc->writer.latm, &hTpEnc->bitStream, &hTpEnc->config, flags & TP_FLAG_LATM_AMV, transportFmt, &hTpEnc->callbacks ); if (error != TRANSPORTENC_OK) { return error; } } break; case TT_MP4_RAW: hTpEnc->writer.raw.curSubFrame = 0; hTpEnc->writer.raw.nSubFrames = hTpEnc->config.nSubFrames; break; default: return TRANSPORTENC_INVALID_PARAMETER; } /* pceFrameCounter indicates if PCE must be written in raw_data_block. */ hTpEnc->pceFrameCounter = getPceRepetitionRate( getChannelConfig(hTpEnc->config.channelMode), transportFmt, hTpEnc->config.headerPeriod, hTpEnc->config.matrixMixdownA); return TRANSPORTENC_OK; } HANDLE_FDK_BITSTREAM transportEnc_GetBitstream( HANDLE_TRANSPORTENC hTp ) { return &hTp->bitStream; } int transportEnc_RegisterSbrCallback( HANDLE_TRANSPORTENC hTpEnc, const cbSbr_t cbSbr, void* user_data) { if (hTpEnc == NULL) { return -1; } hTpEnc->callbacks.cbSbr = cbSbr; hTpEnc->callbacks.cbSbrData = user_data; return 0; } TRANSPORTENC_ERROR transportEnc_WriteAccessUnit( HANDLE_TRANSPORTENC hTp, INT frameUsedBits, int bufferFullness, int ncc ) { TRANSPORTENC_ERROR err = TRANSPORTENC_OK; if (!hTp) { return TRANSPORTENC_INVALID_PARAMETER; } HANDLE_FDK_BITSTREAM hBs = &hTp->bitStream; /* In case of writing PCE in raw_data_block frameUsedBits must be adapted. */ if (hTp->pceFrameCounter>=hTp->config.headerPeriod) { frameUsedBits += transportEnc_GetPCEBits(hTp->config.channelMode, hTp->config.matrixMixdownA, 3); /* Consider 3 bits ID signalling in alignment */ } switch (hTp->transportFmt) { case TT_MP4_ADIF: FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0, BS_WRITER); adifWrite_EncodeHeader( &hTp->writer.adif, hBs, bufferFullness ); break; case TT_MP4_ADTS: bufferFullness /= ncc; /* Number of Considered Channels */ bufferFullness /= 32; bufferFullness = FDKmin(0x7FF, bufferFullness); /* Signal variable rate */ adtsWrite_EncodeHeader( &hTp->writer.adts, &hTp->bitStream, bufferFullness, frameUsedBits ); break; case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: bufferFullness /= ncc; /* Number of Considered Channels */ bufferFullness /= 32; bufferFullness = FDKmin(0xFF, bufferFullness); /* Signal variable rate */ transportEnc_LatmWrite( &hTp->writer.latm, hBs, frameUsedBits, bufferFullness, &hTp->callbacks ); break; case TT_MP4_RAW: if (hTp->writer.raw.curSubFrame >= hTp->writer.raw.nSubFrames) { hTp->writer.raw.curSubFrame = 0; FDKinitBitStream(&hTp->bitStream, hTp->bsBuffer, hTp->bsBufferSize, 0, BS_WRITER); } hTp->writer.raw.prevBits = FDKgetValidBits(hBs); break; default: err = TRANSPORTENC_UNSUPPORTED_FORMAT; break; } /* Write PCE in raw_data_block if required */ if (hTp->pceFrameCounter>=hTp->config.headerPeriod) { INT crcIndex = 0; /* Align inside PCE with repsect to the first bit of the raw_data_block() */ UINT alignAnchor = FDKgetValidBits(&hTp->bitStream); /* Write PCE element ID bits */ FDKwriteBits(&hTp->bitStream, ID_PCE, 3); if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) { crcIndex = adtsWrite_CrcStartReg(&hTp->writer.adts, &hTp->bitStream, 0); } /* Write PCE as first raw_data_block element */ transportEnc_writePCE(&hTp->bitStream, hTp->config.channelMode, hTp->config.samplingRate, 0, 1, hTp->config.matrixMixdownA, (hTp->config.flags&CC_PSEUDO_SURROUND)?1:0, alignAnchor); if ( (hTp->transportFmt==TT_MP4_ADTS) && !hTp->writer.adts.protection_absent) { adtsWrite_CrcEndReg(&hTp->writer.adts, &hTp->bitStream, crcIndex); } hTp->pceFrameCounter = 0; /* reset pce frame counter */ } if (hTp->pceFrameCounter!=-1) { hTp->pceFrameCounter++; /* Update pceFrameCounter only if PCE writing is active. */ } return err; } TRANSPORTENC_ERROR transportEnc_EndAccessUnit(HANDLE_TRANSPORTENC hTp, int *bits) { switch (hTp->transportFmt) { case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: case TT_MP4_LOAS: transportEnc_LatmAdjustSubframeBits(&hTp->writer.latm, bits); break; case TT_MP4_ADTS: adtsWrite_EndRawDataBlock(&hTp->writer.adts, &hTp->bitStream, bits); break; case TT_MP4_ADIF: /* Substract ADIF header from AU bits, not to be considered. */ *bits -= adifWrite_GetHeaderBits(&hTp->writer.adif); hTp->writer.adif.headerWritten = 1; break; case TT_MP4_RAW: *bits -= hTp->writer.raw.prevBits; break; default: break; } return TRANSPORTENC_OK; } TRANSPORTENC_ERROR transportEnc_GetFrame(HANDLE_TRANSPORTENC hTpEnc, int *nbytes) { HANDLE_FDK_BITSTREAM hBs = &hTpEnc->bitStream; switch (hTpEnc->transportFmt) { case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: case TT_MP4_LOAS: *nbytes = hTpEnc->bsBufferSize; transportEnc_LatmGetFrame(&hTpEnc->writer.latm, hBs, nbytes); break; case TT_MP4_ADTS: if (hTpEnc->writer.adts.currentBlock >= hTpEnc->writer.adts.num_raw_blocks+1) { *nbytes = (FDKgetValidBits(hBs) + 7)>>3; hTpEnc->writer.adts.currentBlock = 0; } else { *nbytes = 0; } break; case TT_MP4_ADIF: FDK_ASSERT((INT)FDKgetValidBits(hBs) >= 0); *nbytes = (FDKgetValidBits(hBs) + 7)>>3; break; case TT_MP4_RAW: FDKsyncCache(hBs); hTpEnc->writer.raw.curSubFrame++; *nbytes = ((FDKgetValidBits(hBs)-hTpEnc->writer.raw.prevBits) + 7)>>3; break; default: break; } return TRANSPORTENC_OK; } INT transportEnc_GetStaticBits( HANDLE_TRANSPORTENC hTp, int auBits ) { INT nbits = 0, nPceBits = 0; /* Write PCE within raw_data_block in transport lib. */ if (hTp->pceFrameCounter>=hTp->config.headerPeriod) { nPceBits = transportEnc_GetPCEBits(hTp->config.channelMode, hTp->config.matrixMixdownA, 3); /* Consider 3 bits ID signalling in alignment */ auBits += nPceBits; /* Adapt required raw_data_block bit consumtpion for AU length information e.g. in LATM/LOAS configuration. */ } switch (hTp->transportFmt) { case TT_MP4_ADIF: case TT_MP4_RAW: nbits = 0; /* Do not consider the ADIF header into the total bitrate */ break; case TT_MP4_ADTS: nbits = adtsWrite_GetHeaderBits(&hTp->writer.adts); break; case TT_MP4_LOAS: case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: nbits = transportEnc_LatmCountTotalBitDemandHeader( &hTp->writer.latm, auBits ); break; default: nbits = 0; break; } /* PCE is written in the transport library therefore the bit consumption is part of the transport static bits. */ nbits += nPceBits; return nbits; } void transportEnc_Close(HANDLE_TRANSPORTENC *phTp) { if (phTp != NULL) { if (*phTp != NULL) { FreeRam_TransportEncoder(phTp); } } } int transportEnc_CrcStartReg(HANDLE_TRANSPORTENC hTpEnc, int mBits) { int crcReg = 0; switch (hTpEnc->transportFmt) { case TT_MP4_ADTS: crcReg = adtsWrite_CrcStartReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, mBits); break; default: break; } return crcReg; } void transportEnc_CrcEndReg(HANDLE_TRANSPORTENC hTpEnc, int reg) { switch (hTpEnc->transportFmt) { case TT_MP4_ADTS: adtsWrite_CrcEndReg(&hTpEnc->writer.adts, &hTpEnc->bitStream, reg); break; default: break; } } TRANSPORTENC_ERROR transportEnc_GetConf(HANDLE_TRANSPORTENC hTpEnc, CODER_CONFIG *cc, FDK_BITSTREAM *dataBuffer, UINT *confType) { TRANSPORTENC_ERROR tpErr = TRANSPORTENC_OK; HANDLE_LATM_STREAM hLatmConfig = &hTpEnc->writer.latm; *confType = 0; /* set confType variable to default */ /* write StreamMuxConfig or AudioSpecificConfig depending on format used */ switch (hTpEnc->transportFmt) { case TT_MP4_LATM_MCP0: case TT_MP4_LATM_MCP1: case TT_MP4_LOAS: tpErr = CreateStreamMuxConfig(hLatmConfig, dataBuffer, 0, &hTpEnc->callbacks); *confType = 1; /* config is SMC */ break; default: if (transportEnc_writeASC(dataBuffer, cc, &hTpEnc->callbacks) != 0) { tpErr = TRANSPORTENC_UNKOWN_ERROR; } } return tpErr; } TRANSPORTENC_ERROR transportEnc_GetLibInfo( LIB_INFO *info ) { int i; if (info == NULL) { return TRANSPORTENC_INVALID_PARAMETER; } /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) { return TRANSPORTENC_UNKOWN_ERROR; } info += i; info->module_id = FDK_TPENC; info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2); LIB_VERSION_STRING(info); info->build_date = __DATE__; info->build_time = __TIME__; info->title = TP_LIB_TITLE; /* Set flags */ info->flags = 0 | CAPF_ADIF | CAPF_ADTS | CAPF_LATM | CAPF_LOAS | CAPF_RAWPACKETS ; return TRANSPORTENC_OK; } fdk-aac-0.1.3/libSBRdec/0000755000175000017500000000000012372262442015200 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRdec/include/0000755000175000017500000000000012372262445016626 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRdec/include/sbrdecoder.h0000644000175000017500000003755612372261464021133 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************ Fraunhofer IIS SBR decoder library ****************** Author(s): Description: SBR decoder front-end prototypes and definitions. ******************************************************************************/ #ifndef __SBRDECODER_H #define __SBRDECODER_H #include "common_fix.h" #include "FDK_bitstream.h" #include "FDK_audio.h" #define SBR_DEBUG_EXTHLP "\ --- SBR ---\n\ 0x00000010 Ancillary data and SBR-Header\n\ 0x00000020 SBR-Side info\n\ 0x00000040 Decoded SBR-bitstream data, e.g. envelope data\n\ 0x00000080 SBR-Bitstream statistics\n\ 0x00000100 Miscellaneous SBR-messages\n\ 0x00000200 SBR-Energies and gains in the adjustor\n\ 0x00000400 Fatal SBR errors\n\ 0x00000800 Transposer coefficients for inverse filtering\n\ " /* Capability flags */ #define CAPF_SBR_LP 0x00000001 /*!< Flag indicating library's capability of Low Power mode. */ #define CAPF_SBR_HQ 0x00000002 /*!< Flag indicating library's capability of High Quality mode. */ #define CAPF_SBR_DRM_BS 0x00000004 /*!< Flag indicating library's capability to decode DRM SBR data. */ #define CAPF_SBR_CONCEALMENT 0x00000008 /*!< Flag indicating library's capability to conceal erroneous frames. */ #define CAPF_SBR_DRC 0x00000010 /*!< Flag indicating library's capability for Dynamic Range Control. */ #define CAPF_SBR_PS_MPEG 0x00000020 /*!< Flag indicating library's capability to do MPEG Parametric Stereo. */ #define CAPF_SBR_PS_DRM 0x00000040 /*!< Flag indicating library's capability to do DRM Parametric Stereo. */ typedef enum { SBRDEC_OK = 0, /*!< All fine. */ /* SBRDEC_CONCEAL, */ /* SBRDEC_NOSYNCH, */ /* SBRDEC_ILLEGAL_PROGRAM, */ /* SBRDEC_ILLEGAL_TAG, */ /* SBRDEC_ILLEGAL_CHN_CONFIG, */ /* SBRDEC_ILLEGAL_SECTION, */ /* SBRDEC_ILLEGAL_SCFACTORS, */ /* SBRDEC_ILLEGAL_PULSE_DATA, */ /* SBRDEC_MAIN_PROFILE_NOT_IMPLEMENTED, */ /* SBRDEC_GC_NOT_IMPLEMENTED, */ /* SBRDEC_ILLEGAL_PLUS_ELE_ID, */ SBRDEC_CREATE_ERROR, /*!< */ SBRDEC_NOT_INITIALIZED, /*!< */ SBRDEC_MEM_ALLOC_FAILED, /*!< Memory allocation failed. Probably not enough memory available. */ SBRDEC_PARSE_ERROR, /*!< */ SBRDEC_UNSUPPORTED_CONFIG, /*!< */ SBRDEC_SET_PARAM_FAIL /*!< */ } SBR_ERROR; typedef enum { SBR_SYSTEM_BITSTREAM_DELAY, /*!< System: Switch to enable an additional SBR bitstream delay of one frame. */ SBR_QMF_MODE, /*!< Set QMF mode, either complex or low power. */ SBR_LD_QMF_TIME_ALIGN, /*!< Set QMF type, either LD-MPS or CLDFB. Relevant for ELD streams only. */ SBR_BS_INTERRUPTION /*!< Signal bit stream interruption. Value is ignored. */ } SBRDEC_PARAM; typedef struct SBR_DECODER_INSTANCE *HANDLE_SBRDECODER; #ifdef __cplusplus extern "C" { #endif /** * \brief Allocates and initializes one SBR decoder instance. * \param pSelf Pointer to where a SBR decoder handle is copied into. * \return Error code. */ SBR_ERROR sbrDecoder_Open ( HANDLE_SBRDECODER *pSelf ); /** * \brief Initialize a SBR decoder runtime instance. Must be called before decoding starts. * * \param self Handle to a SBR decoder instance. * \param sampleRateIn Input samplerate of the SBR decoder instance. * \param sampleRateOut Output samplerate of the SBR decoder instance. * \param samplesPerFrame Number of samples per frames. * \param coreCodec Audio Object Type (AOT) of the core codec. * \param elementID Table with MPEG-4 element Ids in canonical order. * \param forceReset Flag that enforces a complete decoder reset. * * \return Error code. */ SBR_ERROR sbrDecoder_InitElement ( HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const int elementIndex ); /** * \brief pass out of band SBR header to SBR decoder * * \param self Handle to a SBR decoder instance. * \param hBs bit stream handle data source. * \param elementID SBR element ID. * \param elementIndex SBR element index. * * \return Error code. */ INT sbrDecoder_Header ( HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, const INT sampleRateOut, const INT samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const INT elementIndex ); /** * \brief Set a parameter of the SBR decoder runtime instance. * \param self SBR decoder handle. * \param param Parameter which will be set if successfull. * \param value New parameter value. * \return Error code. */ SBR_ERROR sbrDecoder_SetParam ( HANDLE_SBRDECODER self, const SBRDEC_PARAM param, const INT value ); /** * \brief Feed DRC channel data into a SBR decoder runtime instance. * * \param self SBR decoder handle. * \param ch Channel number to which the DRC data is associated to. * \param numBands Number of DRC bands. * \param pNextFact_mag Pointer to a table with the DRC factor magnitudes. * \param nextFact_exp Exponent for all DRC factors. * \param drcInterpolationScheme DRC interpolation scheme. * \param winSequence Window sequence from core coder (eight short or one long window). * \param pBandTop Pointer to a table with the top borders for all DRC bands. * * \return Error code. */ SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, INT ch, UINT numBands, FIXP_DBL *pNextFact_mag, INT nextFact_exp, SHORT drcInterpolationScheme, UCHAR winSequence, USHORT *pBandTop ); /** * \brief Disable SBR DRC for a certain channel. * * \param hSbrDecoder SBR decoder handle. * \param ch Number of the channel that has to be disabled. * * \return None. */ void sbrDecoder_drcDisable ( HANDLE_SBRDECODER self, INT ch ); /** * \brief Parse one SBR element data extension data block. The bit stream position will * be placed at the end of the SBR payload block. The remaining bits will be returned * into *count if a payload length is given (byPayLen > 0). If no SBR payload length is * given (bsPayLen < 0) then the bit stream position on return will be random after this * function call in case of errors, and any further decoding will be completely pointless. * * \param self SBR decoder handle. * \param hBs Bit stream handle as data source. * \param count Pointer to an integer where the amount of parsed SBR payload bits is stored into. * \param bsPayLen If > 0 this value is the SBR payload length. If < 0, the SBR payload length is unknown. * \param flags CRC flag (0: EXT_SBR_DATA; 1: EXT_SBR_DATA_CRC) * \param prev_element Previous MPEG-4 element ID. * \param element_index Index of the current element. * * \return Error code. */ SBR_ERROR sbrDecoder_Parse ( HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, int *count, int bsPayLen, int crcFlag, MP4_ELEMENT_ID prev_element, int element_index, int fGlobalIndependencyFlag ); /** * \brief This function decodes the given SBR bitstreams and applies SBR to the given time data. * * SBR-processing works InPlace. I.e. the calling function has to provide * a time domain buffer timeData which can hold the completely decoded * result. * * Left and right channel are read and stored according to the * interleaving flag, frame length and number of channels. * * \param self Handle of an open SBR decoder instance. * \param hSbrBs SBR Bitstream handle. * \param timeData Pointer to input and finally upsampled output data. * \param numChannels Pointer to a buffer holding the number of channels in time data buffer. * \param sampleRate Output samplerate. * \param channelMapping Channel mapping indices. * \param interleaved Flag indicating if time data is stored interleaved (1: Interleaved time data, 0: non-interleaved timedata). * \param coreDecodedOk Flag indicating if the core decoder did not find any error (0: core decoder found errors, 1: no errors). * \param psDecoded Pointer to a buffer holding a flag. Input: PS is possible, Output: PS has been rendered. * * \return Error code. */ SBR_ERROR sbrDecoder_Apply ( HANDLE_SBRDECODER self, INT_PCM *timeData, int *numChannels, int *sampleRate, const UCHAR channelMapping[(6)], const int interleaved, const int coreDecodedOk, UCHAR *psDecoded ); /** * \brief Close SBR decoder instance and free memory. * \param self SBR decoder handle. * \return Error Code. */ SBR_ERROR sbrDecoder_Close ( HANDLE_SBRDECODER *self ); /** * \brief Get SBR decoder library information. * \param info Pointer to a LIB_INFO struct, where library information is written to. * \return 0 on success, -1 if invalid handle or if no free element is available to write information to. */ INT sbrDecoder_GetLibInfo( LIB_INFO *info ); #ifdef __cplusplus } #endif #endif fdk-aac-0.1.3/libSBRdec/src/0000755000175000017500000000000012372262445015772 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRdec/src/huff_dec.h0000644000175000017500000001150412372261464017707 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Huffman Decoder */ #ifndef __HUFF_DEC_H #define __HUFF_DEC_H #include "sbrdecoder.h" #include "FDK_bitstream.h" typedef const SCHAR (*Huffman)[2]; int DecodeHuffmanCW (Huffman h, HANDLE_FDK_BITSTREAM hBitBuf); #endif fdk-aac-0.1.3/libSBRdec/src/sbrdec_freq_sca.h0000644000175000017500000001214512372261464021253 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Frequency scale prototypes */ #ifndef __FREQ_SCA_H #define __FREQ_SCA_H #include "sbrdecoder.h" #include "env_extr.h" int sbrdecUpdateFreqScale(UCHAR * v_k_master, UCHAR *numMaster, HANDLE_SBR_HEADER_DATA headerData); void sbrdecDownSampleLoRes(UCHAR *v_result, UCHAR num_result, UCHAR *freqBandTableRef, UCHAR num_Ref); void shellsort(UCHAR *in, UCHAR n); SBR_ERROR resetFreqBandTables(HANDLE_SBR_HEADER_DATA hHeaderData, const UINT flags); #endif fdk-aac-0.1.3/libSBRdec/src/sbrdec_freq_sca.cpp0000644000175000017500000005630612372261464021615 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Frequency scale calculation */ #include "sbrdec_freq_sca.h" #include "transcendent.h" #include "sbr_rom.h" #include "env_extr.h" #include "genericStds.h" /* need log() for debug-code only */ #define MAX_OCTAVE 29 #define MAX_SECOND_REGION 50 static int numberOfBands(FIXP_SGL bpo_div16, int start, int stop, int warpFlag); static void CalcBands(UCHAR * diff, UCHAR start, UCHAR stop, UCHAR num_bands); static SBR_ERROR modifyBands(UCHAR max_band, UCHAR * diff, UCHAR length); static void cumSum(UCHAR start_value, UCHAR* diff, UCHAR length, UCHAR *start_adress); /*! \brief Retrieve QMF-band where the SBR range starts Convert startFreq which was read from the bitstream into a QMF-channel number. \return Number of start band */ static UCHAR getStartBand(UINT fs, /*!< Output sampling frequency */ UCHAR startFreq, /*!< Index to table of possible start bands */ UINT headerDataFlags) /*!< Info to SBR mode */ { INT band; UINT fsMapped; fsMapped = fs; switch (fsMapped) { case 96000: case 88200: band = FDK_sbrDecoder_sbr_start_freq_88[startFreq]; break; case 64000: band = FDK_sbrDecoder_sbr_start_freq_64[startFreq]; break; case 48000: band = FDK_sbrDecoder_sbr_start_freq_48[startFreq]; break; case 44100: band = FDK_sbrDecoder_sbr_start_freq_44[startFreq]; break; case 32000: band = FDK_sbrDecoder_sbr_start_freq_32[startFreq]; break; case 24000: band = FDK_sbrDecoder_sbr_start_freq_24[startFreq]; break; case 22050: band = FDK_sbrDecoder_sbr_start_freq_22[startFreq]; break; case 16000: band = FDK_sbrDecoder_sbr_start_freq_16[startFreq]; break; default: band = 255; } return band; } /*! \brief Retrieve QMF-band where the SBR range starts Convert startFreq which was read from the bitstream into a QMF-channel number. \return Number of start band */ static UCHAR getStopBand(UINT fs, /*!< Output sampling frequency */ UCHAR stopFreq, /*!< Index to table of possible start bands */ UINT headerDataFlags, /*!< Info to SBR mode */ UCHAR k0) /*!< Start freq index */ { UCHAR k2; if (stopFreq < 14) { INT stopMin; UCHAR diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; UCHAR *diff0 = diff_tot; UCHAR *diff1 = diff_tot+MAX_OCTAVE; if (fs < 32000) { stopMin = (((2*6000*2*(64)) / fs) + 1) >> 1; } else { if (fs < 64000) { stopMin = (((2*8000*2*(64)) / fs) + 1) >> 1; } else { stopMin = (((2*10000*2*(64)) / fs) + 1) >> 1; } } /* Choose a stop band between k1 and 64 depending on stopFreq (0..13), based on a logarithmic scale. The vectors diff0 and diff1 are used temporarily here. */ CalcBands( diff0, stopMin, 64, 13); shellsort( diff0, 13); cumSum(stopMin, diff0, 13, diff1); k2 = diff1[stopFreq]; } else if (stopFreq==14) k2 = 2*k0; else k2 = 3*k0; /* Limit to Nyquist */ if (k2 > (64)) k2 = (64); /* Range checks */ /* 1 <= difference <= 48; 1 <= fs <= 96000 */ if ( ((k2 - k0) > MAX_FREQ_COEFFS) || (k2 <= k0) ) { return 255; } if (headerDataFlags & (SBRDEC_SYNTAX_USAC|SBRDEC_SYNTAX_RSVD50)) { /* 1 <= difference <= 35; 42000 <= fs <= 96000 */ if ( (fs >= 42000) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS44100 ) ) { return 255; } /* 1 <= difference <= 32; 46009 <= fs <= 96000 */ if ( (fs >= 46009) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS48000 ) ) { return 255; } } else { /* 1 <= difference <= 35; fs == 44100 */ if ( (fs == 44100) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS44100 ) ) { return 255; } /* 1 <= difference <= 32; 48000 <= fs <= 96000 */ if ( (fs >= 48000) && ( (k2 - k0) > MAX_FREQ_COEFFS_FS48000 ) ) { return 255; } } return k2; } /*! \brief Generates master frequency tables Frequency tables are calculated according to the selected domain (linear/logarithmic) and granularity. IEC 14496-3 4.6.18.3.2.1 \return errorCode, 0 if successful */ SBR_ERROR sbrdecUpdateFreqScale(UCHAR * v_k_master, /*!< Master table to be created */ UCHAR *numMaster, /*!< Number of entries in master table */ UINT fs, /*!< SBR working sampling rate */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Control data from bitstream */ UINT flags) { FIXP_SGL bpo_div16; /* bands_per_octave divided by 16 */ INT dk=0; /* Internal variables */ UCHAR k0, k2, i; UCHAR num_bands0 = 0; UCHAR num_bands1 = 0; UCHAR diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; UCHAR *diff0 = diff_tot; UCHAR *diff1 = diff_tot+MAX_OCTAVE; INT k2_achived; INT k2_diff; INT incr=0; /* Determine start band */ k0 = getStartBand(fs, hHeaderData->bs_data.startFreq, flags); if (k0 == 255) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Determine stop band */ k2 = getStopBand(fs, hHeaderData->bs_data.stopFreq, flags, k0); if (k2 == 255) { return SBRDEC_UNSUPPORTED_CONFIG; } if(hHeaderData->bs_data.freqScale>0) { /* Bark */ INT k1; if(hHeaderData->bs_data.freqScale==1) { bpo_div16 = FL2FXCONST_SGL(12.0f/16.0f); } else if(hHeaderData->bs_data.freqScale==2) { bpo_div16 = FL2FXCONST_SGL(10.0f/16.0f); } else { bpo_div16 = FL2FXCONST_SGL(8.0f/16.0f); } if( 1000 * k2 > 2245 * k0 ) { /* Two or more regions */ k1 = 2*k0; num_bands0 = numberOfBands(bpo_div16, k0, k1, 0); num_bands1 = numberOfBands(bpo_div16, k1, k2, hHeaderData->bs_data.alterScale ); if ( num_bands0 < 1) { return SBRDEC_UNSUPPORTED_CONFIG; } if ( num_bands1 < 1 ) { return SBRDEC_UNSUPPORTED_CONFIG; } CalcBands(diff0, k0, k1, num_bands0); shellsort( diff0, num_bands0); if (diff0[0] == 0) { #ifdef DEBUG_TOOLS #endif return SBRDEC_UNSUPPORTED_CONFIG; } cumSum(k0, diff0, num_bands0, v_k_master); CalcBands(diff1, k1, k2, num_bands1); shellsort( diff1, num_bands1); if(diff0[num_bands0-1] > diff1[0]) { SBR_ERROR err; err = modifyBands(diff0[num_bands0-1],diff1, num_bands1); if (err) return SBRDEC_UNSUPPORTED_CONFIG; } /* Add 2nd region */ cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); *numMaster = num_bands0 + num_bands1; /* Output nr of bands */ } else { /* Only one region */ k1=k2; num_bands0 = numberOfBands(bpo_div16, k0, k1, 0); if ( num_bands0 < 1) { return SBRDEC_UNSUPPORTED_CONFIG; } CalcBands(diff0, k0, k1, num_bands0); shellsort(diff0, num_bands0); if (diff0[0] == 0) { #ifdef DEBUG_TOOLS #endif return SBRDEC_UNSUPPORTED_CONFIG; } cumSum(k0, diff0, num_bands0, v_k_master); *numMaster = num_bands0; /* Output nr of bands */ } } else { /* Linear mode */ if (hHeaderData->bs_data.alterScale==0) { dk = 1; /* FLOOR to get to few number of bands (next lower even number) */ num_bands0 = (k2 - k0) & 254; } else { dk = 2; num_bands0 = ( ((k2 - k0) >> 1) + 1 ) & 254; /* ROUND to the closest fit */ } if (num_bands0 < 1) { return SBRDEC_UNSUPPORTED_CONFIG; /* We must return already here because 'i' can become negative below. */ } k2_achived = k0 + num_bands0*dk; k2_diff = k2 - k2_achived; for(i=0;i 0) { incr = -1; i = num_bands0-1; } /* Adjust diff vector to get sepc. SBR range */ while (k2_diff != 0) { diff_tot[i] = diff_tot[i] - incr; i = i + incr; k2_diff = k2_diff + incr; } cumSum(k0, diff_tot, num_bands0, v_k_master);/* cumsum */ *numMaster = num_bands0; /* Output nr of bands */ } if (*numMaster < 1) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Print out the calculated table */ return SBRDEC_OK; } /*! \brief Calculate frequency ratio of one SBR band All SBR bands should span a constant frequency range in the logarithmic domain. This function calculates the ratio of any SBR band's upper and lower frequency. \return num_band-th root of k_start/k_stop */ static FIXP_SGL calcFactorPerBand(int k_start, int k_stop, int num_bands) { /* Scaled bandfactor and step 1 bit right to avoid overflow * use double data type */ FIXP_DBL bandfactor = FL2FXCONST_DBL(0.25f); /* Start value */ FIXP_DBL step = FL2FXCONST_DBL(0.125f); /* Initial increment for factor */ int direction = 1; /* Because saturation can't be done in INT IIS, * changed start and stop data type from FIXP_SGL to FIXP_DBL */ FIXP_DBL start = k_start << (DFRACT_BITS-8); FIXP_DBL stop = k_stop << (DFRACT_BITS-8); FIXP_DBL temp; int j, i=0; while ( step > FL2FXCONST_DBL(0.0f)) { i++; temp = stop; /* Calculate temp^num_bands: */ for (j=0; j> 1); direction = 1; bandfactor = bandfactor + step; } else { /* Factor is too weak: make it stronger */ if (direction == 1) step = (FIXP_DBL)((LONG)step >> 1); direction = 0; bandfactor = bandfactor - step; } if (i>100) { step = FL2FXCONST_DBL(0.0f); } } return FX_DBL2FX_SGL(bandfactor<<1); } /*! \brief Calculate number of SBR bands between start and stop band Given the number of bands per octave, this function calculates how many bands fit in the given frequency range. When the warpFlag is set, the 'band density' is decreased by a factor of 1/1.3 \return number of bands */ static int numberOfBands(FIXP_SGL bpo_div16, /*!< Input: number of bands per octave divided by 16 */ int start, /*!< First QMF band of SBR frequency range */ int stop, /*!< Last QMF band of SBR frequency range + 1 */ int warpFlag) /*!< Stretching flag */ { FIXP_SGL num_bands_div128; int num_bands; num_bands_div128 = FX_DBL2FX_SGL(fMult(FDK_getNumOctavesDiv8(start,stop),bpo_div16)); if (warpFlag) { /* Apply the warp factor of 1.3 to get wider bands. We use a value of 32768/25200 instead of the exact value to avoid critical cases of rounding. */ num_bands_div128 = FX_DBL2FX_SGL(fMult(num_bands_div128, FL2FXCONST_SGL(25200.0/32768.0))); } /* add scaled 1 for rounding to even numbers: */ num_bands_div128 = num_bands_div128 + FL2FXCONST_SGL( 1.0f/128.0f ); /* scale back to right aligned integer and double the value: */ num_bands = 2 * ((LONG)num_bands_div128 >> (FRACT_BITS - 7)); return(num_bands); } /*! \brief Calculate width of SBR bands Given the desired number of bands within the SBR frequency range, this function calculates the width of each SBR band in QMF channels. The bands get wider from start to stop (bark scale). */ static void CalcBands(UCHAR * diff, /*!< Vector of widths to be calculated */ UCHAR start, /*!< Lower end of subband range */ UCHAR stop, /*!< Upper end of subband range */ UCHAR num_bands) /*!< Desired number of bands */ { int i; int previous; int current; FIXP_SGL exact, temp; FIXP_SGL bandfactor = calcFactorPerBand(start, stop, num_bands); previous = stop; /* Start with highest QMF channel */ exact = (FIXP_SGL)(stop << (FRACT_BITS-8)); /* Shift left to gain some accuracy */ for(i=num_bands-1; i>=0; i--) { /* Calculate border of next lower sbr band */ exact = FX_DBL2FX_SGL(fMult(exact,bandfactor)); /* Add scaled 0.5 for rounding: We use a value 128/256 instead of 0.5 to avoid some critical cases of rounding. */ temp = exact + FL2FXCONST_SGL(128.0/32768.0); /* scale back to right alinged integer: */ current = (LONG)temp >> (FRACT_BITS-8); /* Save width of band i */ diff[i] = previous - current; previous = current; } } /*! \brief Calculate cumulated sum vector from delta vector */ static void cumSum(UCHAR start_value, UCHAR* diff, UCHAR length, UCHAR *start_adress) { int i; start_adress[0]=start_value; for(i=1; i<=length; i++) start_adress[i] = start_adress[i-1] + diff[i-1]; } /*! \brief Adapt width of frequency bands in the second region If SBR spans more than 2 octaves, the upper part of a bark-frequency-scale is calculated separately. This function tries to avoid that the second region starts with a band smaller than the highest band of the first region. */ static SBR_ERROR modifyBands(UCHAR max_band_previous, UCHAR * diff, UCHAR length) { int change = max_band_previous - diff[0]; /* Limit the change so that the last band cannot get narrower than the first one */ if ( change > (diff[length-1]-diff[0])>>1 ) change = (diff[length-1]-diff[0])>>1; diff[0] += change; diff[length-1] -= change; shellsort(diff, length); return SBRDEC_OK; } /*! \brief Update high resolution frequency band table */ static void sbrdecUpdateHiRes(UCHAR * h_hires, UCHAR * num_hires, UCHAR * v_k_master, UCHAR num_bands, UCHAR xover_band) { UCHAR i; *num_hires = num_bands-xover_band; for(i=xover_band; i<=num_bands; i++) { h_hires[i-xover_band] = v_k_master[i]; } } /*! \brief Build low resolution table out of high resolution table */ static void sbrdecUpdateLoRes(UCHAR * h_lores, UCHAR * num_lores, UCHAR * h_hires, UCHAR num_hires) { UCHAR i; if( (num_hires & 1) == 0) { /* If even number of hires bands */ *num_lores = num_hires >> 1; /* Use every second lores=hires[0,2,4...] */ for(i=0; i<=*num_lores; i++) h_lores[i] = h_hires[i*2]; } else { /* Odd number of hires, which means xover is odd */ *num_lores = (num_hires+1) >> 1; /* Use lores=hires[0,1,3,5 ...] */ h_lores[0] = h_hires[0]; for(i=1; i<=*num_lores; i++) { h_lores[i] = h_hires[i*2-1]; } } } /*! \brief Derive a low-resolution frequency-table from the master frequency table */ void sbrdecDownSampleLoRes(UCHAR *v_result, UCHAR num_result, UCHAR *freqBandTableRef, UCHAR num_Ref) { int step; int i,j; int org_length,result_length; int v_index[MAX_FREQ_COEFFS>>1]; /* init */ org_length = num_Ref; result_length = num_result; v_index[0] = 0; /* Always use left border */ i=0; while(org_length > 0) { /* Create downsample vector */ i++; step = org_length / result_length; org_length = org_length - step; result_length--; v_index[i] = v_index[i-1] + step; } for(j=0;j<=i;j++) { /* Use downsample vector to index LoResolution vector */ v_result[j]=freqBandTableRef[v_index[j]]; } } /*! \brief Sorting routine */ void shellsort(UCHAR *in, UCHAR n) { int i, j, v, w; int inc = 1; do inc = 3 * inc + 1; while (inc <= n); do { inc = inc / 3; for (i = inc; i < n; i++) { v = in[i]; j = i; while ((w=in[j-inc]) > v) { in[j] = w; j -= inc; if (j < inc) break; } in[j] = v; } } while (inc > 1); } /*! \brief Reset frequency band tables \return errorCode, 0 if successful */ SBR_ERROR resetFreqBandTables(HANDLE_SBR_HEADER_DATA hHeaderData, const UINT flags) { SBR_ERROR err = SBRDEC_OK; int k2,kx, lsb, usb; int intTemp; UCHAR nBandsLo, nBandsHi; HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; /* Calculate master frequency function */ err = sbrdecUpdateFreqScale(hFreq->v_k_master, &hFreq->numMaster, hHeaderData->sbrProcSmplRate, hHeaderData, flags); if ( err || (hHeaderData->bs_info.xover_band > hFreq->numMaster) ) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Derive Hiresolution from master frequency function */ sbrdecUpdateHiRes(hFreq->freqBandTable[1], &nBandsHi, hFreq->v_k_master, hFreq->numMaster, hHeaderData->bs_info.xover_band ); /* Derive Loresolution from Hiresolution */ sbrdecUpdateLoRes(hFreq->freqBandTable[0], &nBandsLo, hFreq->freqBandTable[1], nBandsHi); hFreq->nSfb[0] = nBandsLo; hFreq->nSfb[1] = nBandsHi; /* Check index to freqBandTable[0] */ if ( !(nBandsLo > 0) || (nBandsLo > (MAX_FREQ_COEFFS>>1)) ) { return SBRDEC_UNSUPPORTED_CONFIG; } lsb = hFreq->freqBandTable[0][0]; usb = hFreq->freqBandTable[0][nBandsLo]; /* Additional check for lsb */ if ( (lsb > (32)) || (lsb >= usb) ) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Calculate number of noise bands */ k2 = hFreq->freqBandTable[1][nBandsHi]; kx = hFreq->freqBandTable[1][0]; if (hHeaderData->bs_data.noise_bands == 0) { hFreq->nNfb = 1; } else /* Calculate no of noise bands 1,2 or 3 bands/octave */ { /* Fetch number of octaves divided by 32 */ intTemp = (LONG)FDK_getNumOctavesDiv8(kx,k2) >> 2; /* Integer-Multiplication with number of bands: */ intTemp = intTemp * hHeaderData->bs_data.noise_bands; /* Add scaled 0.5 for rounding: */ intTemp = intTemp + (LONG)FL2FXCONST_SGL(0.5f/32.0f); /* Convert to right-aligned integer: */ intTemp = intTemp >> (FRACT_BITS - 1 /*sign*/ - 5 /* rescale */); /* Compare with float calculation */ FDK_ASSERT( intTemp == (int)((hHeaderData->bs_data.noise_bands * FDKlog( (float)k2/kx) / (float)(FDKlog(2.0)))+0.5) ); if( intTemp==0) intTemp=1; hFreq->nNfb = intTemp; } hFreq->nInvfBands = hFreq->nNfb; if( hFreq->nNfb > MAX_NOISE_COEFFS ) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Get noise bands */ sbrdecDownSampleLoRes(hFreq->freqBandTableNoise, hFreq->nNfb, hFreq->freqBandTable[0], nBandsLo); hFreq->lowSubband = lsb; hFreq->highSubband = usb; return SBRDEC_OK; } fdk-aac-0.1.3/libSBRdec/src/env_calc.cpp0000644000175000017500000024335012372261464020257 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Envelope calculation The envelope adjustor compares the energies present in the transposed highband to the reference energies conveyed with the bitstream. The highband is amplified (sometimes) or attenuated (mostly) to the desired level. The spectral shape of the reference energies can be changed several times per frame if necessary. Each set of energy values corresponding to a certain range in time will be called an envelope here. The bitstream supports several frequency scales and two resolutions. Normally, one or more QMF-subbands are grouped to one SBR-band. An envelope contains reference energies for each SBR-band. In addition to the energy envelopes, noise envelopes are transmitted that define the ratio of energy which is generated by adding noise instead of transposing the lowband. The noise envelopes are given in a coarser time and frequency resolution. If a signal contains strong tonal components, synthetic sines can be generated in individual SBR bands. An overlap buffer of 6 QMF-timeslots is used to allow a more flexible alignment of the envelopes in time that is not restricted to the core codec's frame borders. Therefore the envelope adjustor has access to the spectral data of the current frame as well as the last 6 QMF-timeslots of the previous frame. However, in average only the data of 1 frame is being processed as the adjustor is called once per frame. Depending on the frequency range set in the bitstream, only QMF-subbands between lowSubband and highSubband are adjusted. Scaling of spectral data to maximize SNR (see #QMF_SCALE_FACTOR) as well as a special Mantissa-Exponent format ( see calculateSbrEnvelope() ) are being used. The main entry point for this modules is calculateSbrEnvelope(). \sa sbr_scale.h, #QMF_SCALE_FACTOR, calculateSbrEnvelope(), \ref documentationOverview */ #include "env_calc.h" #include "sbrdec_freq_sca.h" #include "env_extr.h" #include "transcendent.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "genericStds.h" /* need FDKpow() for debug outputs */ #if defined(__arm__) #include "arm/env_calc_arm.cpp" #endif typedef struct { FIXP_DBL nrgRef[MAX_FREQ_COEFFS]; FIXP_DBL nrgEst[MAX_FREQ_COEFFS]; FIXP_DBL nrgGain[MAX_FREQ_COEFFS]; FIXP_DBL noiseLevel[MAX_FREQ_COEFFS]; FIXP_DBL nrgSine[MAX_FREQ_COEFFS]; SCHAR nrgRef_e[MAX_FREQ_COEFFS]; SCHAR nrgEst_e[MAX_FREQ_COEFFS]; SCHAR nrgGain_e[MAX_FREQ_COEFFS]; SCHAR noiseLevel_e[MAX_FREQ_COEFFS]; SCHAR nrgSine_e[MAX_FREQ_COEFFS]; } ENV_CALC_NRGS; /*static*/ void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, SCHAR *filtBuffer_e, FIXP_DBL *NrgGain, SCHAR *NrgGain_e, int subbands); /*static*/ void calcNrgPerSubband(FIXP_DBL **analysBufferReal, FIXP_DBL **analysBufferImag, int lowSubband, int highSubband, int start_pos, int next_pos, SCHAR frameExp, FIXP_DBL *nrgEst, SCHAR *nrgEst_e ); /*static*/ void calcNrgPerSfb(FIXP_DBL **analysBufferReal, FIXP_DBL **analysBufferImag, int nSfb, UCHAR *freqBandTable, int start_pos, int next_pos, SCHAR input_e, FIXP_DBL *nrg_est, SCHAR *nrg_est_e ); /*static*/ void calcSubbandGain(FIXP_DBL nrgRef, SCHAR nrgRef_e, ENV_CALC_NRGS* nrgs, int c, FIXP_DBL tmpNoise, SCHAR tmpNoise_e, UCHAR sinePresentFlag, UCHAR sineMapped, int noNoiseFlag); /*static*/ void calcAvgGain(ENV_CALC_NRGS* nrgs, int lowSubband, int highSubband, FIXP_DBL *sumRef_m, SCHAR *sumRef_e, FIXP_DBL *ptrAvgGain_m, SCHAR *ptrAvgGain_e); /*static*/ void adjustTimeSlotLC(FIXP_DBL *ptrReal, ENV_CALC_NRGS* nrgs, UCHAR *ptrHarmIndex, int lowSubbands, int noSubbands, int scale_change, int noNoiseFlag, int *ptrPhaseIndex, int fCldfb); /*static*/ void adjustTimeSlotHQ(FIXP_DBL *ptrReal, FIXP_DBL *ptrImag, HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS* nrgs, int lowSubbands, int noSubbands, int scale_change, FIXP_SGL smooth_ratio, int noNoiseFlag, int filtBufferNoiseShift); /*! \brief Map sine flags from bitstream to QMF bands The bitstream carries only 1 sine flag per band and frame. This function maps every sine flag from the bitstream to a specific QMF subband and to a specific envelope where the sine shall start. The result is stored in the vector sineMapped which contains one entry per QMF subband. The value of an entry specifies the envelope where a sine shall start. A value of #MAX_ENVELOPES indicates that no sine is present in the subband. The missing harmonics flags from the previous frame (harmFlagsPrev) determine if a sine starts at the beginning of the frame or at the transient position. Additionally, the flags in harmFlagsPrev are being updated by this function for the next frame. */ /*static*/ void mapSineFlags(UCHAR *freqBandTable, /*!< Band borders (there's only 1 flag per band) */ int nSfb, /*!< Number of bands in the table */ UCHAR *addHarmonics, /*!< vector with 1 flag per sfb */ int *harmFlagsPrev, /*!< Packed 'addHarmonics' */ int tranEnv, /*!< Transient position */ SCHAR *sineMapped) /*!< Resulting vector of sine start positions for each QMF band */ { int i; int lowSubband2 = freqBandTable[0]<<1; int bitcount = 0; int oldflags = *harmFlagsPrev; int newflags = 0; /* Format of harmFlagsPrev: first word = flags for highest 16 sfb bands in use second word = flags for next lower 16 sfb bands (if present) third word = flags for lowest 16 sfb bands (if present) Up to MAX_FREQ_COEFFS sfb bands can be flagged for a sign. The lowest bit of the first word corresponds to the _highest_ sfb band in use. This is ensures that each flag is mapped to the same QMF band even after a change of the crossover-frequency. */ /* Reset the output vector first */ FDKmemset(sineMapped, MAX_ENVELOPES,MAX_FREQ_COEFFS); /* MAX_ENVELOPES means 'no sine' */ freqBandTable += nSfb; addHarmonics += nSfb-1; for (i=nSfb; i!=0; i--) { int ui = *freqBandTable--; /* Upper limit of the current scale factor band. */ int li = *freqBandTable; /* Lower limit of the current scale factor band. */ if ( *addHarmonics-- ) { /* There is a sine in this band */ unsigned int mask = 1 << bitcount; newflags |= mask; /* Set flag */ /* If there was a sine in the last frame, let it continue from the first envelope on else start at the transient position. */ sineMapped[(ui+li-lowSubband2) >> 1] = ( oldflags & mask ) ? 0 : tranEnv; } if ((++bitcount == 16) || i==1) { bitcount = 0; *harmFlagsPrev++ = newflags; oldflags = *harmFlagsPrev; /* Fetch 16 of the old flags */ newflags = 0; } } } /*! \brief Reduce gain-adjustment induced aliasing for real valued filterbank. */ /*static*/ void aliasingReduction(FIXP_DBL* degreeAlias, /*!< estimated aliasing for each QMF channel */ ENV_CALC_NRGS* nrgs, int* useAliasReduction, /*!< synthetic sine engergy for each subband, used as flag */ int noSubbands) /*!< number of QMF channels to process */ { FIXP_DBL* nrgGain = nrgs->nrgGain; /*!< subband gains to be modified */ SCHAR* nrgGain_e = nrgs->nrgGain_e; /*!< subband gains to be modified (exponents) */ FIXP_DBL* nrgEst = nrgs->nrgEst; /*!< subband energy before amplification */ SCHAR* nrgEst_e = nrgs->nrgEst_e; /*!< subband energy before amplification (exponents) */ int grouping = 0, index = 0, noGroups, k; int groupVector[MAX_FREQ_COEFFS]; /* Calculate grouping*/ for (k = 0; k < noSubbands-1; k++ ){ if ( (degreeAlias[k + 1] != FL2FXCONST_DBL(0.0f)) && useAliasReduction[k] ) { if(grouping==0){ groupVector[index++] = k; grouping = 1; } else{ if(groupVector[index-1] + 3 == k){ groupVector[index++] = k + 1; grouping = 0; } } } else{ if(grouping){ if(useAliasReduction[k]) groupVector[index++] = k + 1; else groupVector[index++] = k; grouping = 0; } } } if(grouping){ groupVector[index++] = noSubbands; } noGroups = index >> 1; /*Calculate new gain*/ for (int group = 0; group < noGroups; group ++) { FIXP_DBL nrgOrig = FL2FXCONST_DBL(0.0f); /* Original signal energy in current group of bands */ SCHAR nrgOrig_e = 0; FIXP_DBL nrgAmp = FL2FXCONST_DBL(0.0f); /* Amplified signal energy in group (using current gains) */ SCHAR nrgAmp_e = 0; FIXP_DBL nrgMod = FL2FXCONST_DBL(0.0f); /* Signal energy in group when applying modified gains */ SCHAR nrgMod_e = 0; FIXP_DBL groupGain; /* Total energy gain in group */ SCHAR groupGain_e; FIXP_DBL compensation; /* Compensation factor for the energy change when applying modified gains */ SCHAR compensation_e; int startGroup = groupVector[2*group]; int stopGroup = groupVector[2*group+1]; /* Calculate total energy in group before and after amplification with current gains: */ for(k = startGroup; k < stopGroup; k++){ /* Get original band energy */ FIXP_DBL tmp = nrgEst[k]; SCHAR tmp_e = nrgEst_e[k]; FDK_add_MantExp(tmp, tmp_e, nrgOrig, nrgOrig_e, &nrgOrig, &nrgOrig_e); /* Multiply band energy with current gain */ tmp = fMult(tmp,nrgGain[k]); tmp_e = tmp_e + nrgGain_e[k]; FDK_add_MantExp(tmp, tmp_e, nrgAmp, nrgAmp_e, &nrgAmp, &nrgAmp_e); } /* Calculate total energy gain in group */ FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgOrig, nrgOrig_e, &groupGain, &groupGain_e); for(k = startGroup; k < stopGroup; k++){ FIXP_DBL tmp; SCHAR tmp_e; FIXP_DBL alpha = degreeAlias[k]; if (k < noSubbands - 1) { if (degreeAlias[k + 1] > alpha) alpha = degreeAlias[k + 1]; } /* Modify gain depending on the degree of aliasing */ FDK_add_MantExp( fMult(alpha,groupGain), groupGain_e, fMult(/*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - alpha,nrgGain[k]), nrgGain_e[k], &nrgGain[k], &nrgGain_e[k] ); /* Apply modified gain to original energy */ tmp = fMult(nrgGain[k],nrgEst[k]); tmp_e = nrgGain_e[k] + nrgEst_e[k]; /* Accumulate energy with modified gains applied */ FDK_add_MantExp( tmp, tmp_e, nrgMod, nrgMod_e, &nrgMod, &nrgMod_e ); } /* Calculate compensation factor to retain the energy of the amplified signal */ FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgMod, nrgMod_e, &compensation, &compensation_e); /* Apply compensation factor to all gains of the group */ for(k = startGroup; k < stopGroup; k++){ nrgGain[k] = fMult(nrgGain[k],compensation); nrgGain_e[k] = nrgGain_e[k] + compensation_e; } } } /* Convert headroom bits to exponent */ #define SCALE2EXP(s) (15-(s)) #define EXP2SCALE(e) (15-(e)) /*! \brief Apply spectral envelope to subband samples This function is called from sbr_dec.cpp in each frame. To enhance accuracy and due to the usage of tables for squareroots and inverse, some calculations are performed with the operands being split into mantissa and exponent. The variable names in the source code carry the suffixes _m and _e respectively. The control data in #hFrameData containts envelope data which is represented by this format but stored in single words. (See requantizeEnvelopeData() for details). This data is unpacked within calculateSbrEnvelope() to follow the described suffix convention. The actual value (comparable to the corresponding float-variable in the research-implementation) of a mantissa/exponent-pair can be calculated as \f$ value = value\_m * 2^{value\_e} \f$ All energies and noise levels decoded from the bitstream suit for an original signal magnitude of \f$\pm 32768 \f$ rather than \f$ \pm 1\f$. Therefore, the scale factor hb_scale passed into this function will be converted to an 'input exponent' (#input_e), which fits the internal representation. Before the actual processing, an exponent #adj_e for resulting adjusted samples is derived from the maximum reference energy. Then, for each envelope, the following steps are performed: \li Calculate energy in the signal to be adjusted. Depending on the the value of #interpolFreq (interpolation mode), this is either done seperately for each QMF-subband or for each SBR-band. The resulting energies are stored in #nrgEst_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgEst_e[#MAX_FREQ_COEFFS] (exponents). \li Calculate gain and noise level for each subband:
\f$ gain = \sqrt{ \frac{nrgRef}{nrgEst} \cdot (1 - noiseRatio) } \hspace{2cm} noise = \sqrt{ nrgRef \cdot noiseRatio } \f$
where noiseRatio and nrgRef are extracted from the bitstream and nrgEst is the subband energy before adjustment. The resulting gains are stored in #nrgGain_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgGain_e[#MAX_FREQ_COEFFS] (exponents), the noise levels are stored in #noiseLevel_m[#MAX_FREQ_COEFFS] and #noiseLevel_e[#MAX_FREQ_COEFFS] (exponents). The sine levels are stored in #nrgSine_m[#MAX_FREQ_COEFFS] and #nrgSine_e[#MAX_FREQ_COEFFS]. \li Noise limiting: The gain for each subband is limited both absolutely and relatively compared to the total gain over all subbands. \li Boost gain: Calculate and apply boost factor for each limiter band in order to compensate for the energy loss imposed by the limiting. \li Apply gains and add noise: The gains and noise levels are applied to all timeslots of the current envelope. A short FIR-filter (length 4 QMF-timeslots) can be used to smooth the sudden change at the envelope borders. Each complex subband sample of the current timeslot is multiplied by the smoothed gain, then random noise with the calculated level is added. \note To reduce the stack size, some of the local arrays could be located within the time output buffer. Of the 512 samples temporarily available there, about half the size is already used by #SBR_FRAME_DATA. A pointer to the remaining free memory could be supplied by an additional argument to calculateSbrEnvelope() in sbr_dec: \par \code calculateSbrEnvelope (&hSbrDec->sbrScaleFactor, &hSbrDec->SbrCalculateEnvelope, hHeaderData, hFrameData, QmfBufferReal, QmfBufferImag, timeOutPtr + sizeof(SBR_FRAME_DATA)/sizeof(Float) + 1); \endcode \par Within calculateSbrEnvelope(), some pointers could be defined instead of the arrays #nrgRef_m, #nrgRef_e, #nrgEst_m, #nrgEst_e, #noiseLevel_m: \par \code fract* nrgRef_m = timeOutPtr; SCHAR* nrgRef_e = nrgRef_m + MAX_FREQ_COEFFS; fract* nrgEst_m = nrgRef_e + MAX_FREQ_COEFFS; SCHAR* nrgEst_e = nrgEst_m + MAX_FREQ_COEFFS; fract* noiseLevel_m = nrgEst_e + MAX_FREQ_COEFFS; \endcode
*/ void calculateSbrEnvelope (QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, /*!< Handle to struct filled by the create-function */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ FIXP_DBL **analysBufferReal, /*!< Real part of subband samples to be processed */ FIXP_DBL **analysBufferImag, /*!< Imag part of subband samples to be processed */ const int useLP, FIXP_DBL *degreeAlias, /*!< Estimated aliasing for each QMF channel */ const UINT flags, const int frameErrorFlag ) { int c, i, j, envNoise = 0; UCHAR* borders = hFrameData->frameInfo.borders; FIXP_SGL *noiseLevels = hFrameData->sbrNoiseFloorLevel; HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; int lowSubband = hFreq->lowSubband; int highSubband = hFreq->highSubband; int noSubbands = highSubband - lowSubband; int noNoiseBands = hFreq->nNfb; int no_cols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; UCHAR first_start = borders[0] * hHeaderData->timeStep; SCHAR sineMapped[MAX_FREQ_COEFFS]; SCHAR ov_adj_e = SCALE2EXP(sbrScaleFactor->ov_hb_scale); SCHAR adj_e = 0; SCHAR output_e; SCHAR final_e = 0; SCHAR maxGainLimit_e = (frameErrorFlag) ? MAX_GAIN_CONCEAL_EXP : MAX_GAIN_EXP; int useAliasReduction[64]; UCHAR smooth_length = 0; FIXP_SGL * pIenv = hFrameData->iEnvelope; /* Extract sine flags for all QMF bands */ mapSineFlags(hFreq->freqBandTable[1], hFreq->nSfb[1], hFrameData->addHarmonics, h_sbr_cal_env->harmFlagsPrev, hFrameData->frameInfo.tranEnv, sineMapped); /* Scan for maximum in bufferd noise levels. This is needed in case that we had strong noise in the previous frame which is smoothed into the current frame. The resulting exponent is used as start value for the maximum search in reference energies */ if (!useLP) adj_e = h_sbr_cal_env->filtBufferNoise_e - getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands); /* Scan for maximum reference energy to be able to select appropriate values for adj_e and final_e. */ for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) { INT maxSfbNrg_e = -FRACT_BITS+NRG_EXP_OFFSET; /* start value for maximum search */ /* Fetch frequency resolution for current envelope: */ for (j=hFreq->nSfb[hFrameData->frameInfo.freqRes[i]]; j!=0; j--) { maxSfbNrg_e = fixMax(maxSfbNrg_e,(INT)((LONG)(*pIenv++) & MASK_E)); } maxSfbNrg_e -= NRG_EXP_OFFSET; /* Energy -> magnitude (sqrt halfens exponent) */ maxSfbNrg_e = (maxSfbNrg_e+1) >> 1; /* +1 to go safe (round to next higher int) */ /* Some safety margin is needed for 2 reasons: - The signal energy is not equally spread over all subband samples in a specific sfb of an envelope (Nrg could be too high by a factor of envWidth * sfbWidth) - Smoothing can smear high gains of the previous envelope into the current */ maxSfbNrg_e += 6; if (borders[i] < hHeaderData->numberTimeSlots) /* This envelope affects timeslots that belong to the output frame */ adj_e = (maxSfbNrg_e > adj_e) ? maxSfbNrg_e : adj_e; if (borders[i+1] > hHeaderData->numberTimeSlots) /* This envelope affects timeslots after the output frame */ final_e = (maxSfbNrg_e > final_e) ? maxSfbNrg_e : final_e; } /* Calculate adjustment factors and apply them for every envelope. */ pIenv = hFrameData->iEnvelope; for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) { int k, noNoiseFlag; SCHAR noise_e, input_e = SCALE2EXP(sbrScaleFactor->hb_scale); C_ALLOC_SCRATCH_START(pNrgs, ENV_CALC_NRGS, 1); /* Helper variables. */ UCHAR start_pos = hHeaderData->timeStep * borders[i]; /* Start-position in time (subband sample) for current envelope. */ UCHAR stop_pos = hHeaderData->timeStep * borders[i+1]; /* Stop-position in time (subband sample) for current envelope. */ UCHAR freq_res = hFrameData->frameInfo.freqRes[i]; /* Frequency resolution for current envelope. */ /* Always do fully initialize the temporary energy table. This prevents negative energies and extreme gain factors in cases where the number of limiter bands exceeds the number of subbands. The latter can be caused by undetected bit errors and is tested by some streams from the certification set. */ FDKmemclear(pNrgs, sizeof(ENV_CALC_NRGS)); /* If the start-pos of the current envelope equals the stop pos of the current noise envelope, increase the pointer (i.e. choose the next noise-floor).*/ if (borders[i] == hFrameData->frameInfo.bordersNoise[envNoise+1]){ noiseLevels += noNoiseBands; /* The noise floor data is stored in a row [noiseFloor1 noiseFloor2...].*/ envNoise++; } if(i==hFrameData->frameInfo.tranEnv || i==h_sbr_cal_env->prevTranEnv) /* attack */ { noNoiseFlag = 1; if (!useLP) smooth_length = 0; /* No smoothing on attacks! */ } else { noNoiseFlag = 0; if (!useLP) smooth_length = (1 - hHeaderData->bs_data.smoothingLength) << 2; /* can become either 0 or 4 */ } /* Energy estimation in transposed highband. */ if (hHeaderData->bs_data.interpolFreq) calcNrgPerSubband(analysBufferReal, (useLP) ? NULL : analysBufferImag, lowSubband, highSubband, start_pos, stop_pos, input_e, pNrgs->nrgEst, pNrgs->nrgEst_e); else calcNrgPerSfb(analysBufferReal, (useLP) ? NULL : analysBufferImag, hFreq->nSfb[freq_res], hFreq->freqBandTable[freq_res], start_pos, stop_pos, input_e, pNrgs->nrgEst, pNrgs->nrgEst_e); /* Calculate subband gains */ { UCHAR * table = hFreq->freqBandTable[freq_res]; UCHAR * pUiNoise = &hFreq->freqBandTableNoise[1]; /*! Upper limit of the current noise floor band. */ FIXP_SGL * pNoiseLevels = noiseLevels; FIXP_DBL tmpNoise = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); SCHAR tmpNoise_e = (UCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; int cc = 0; c = 0; for (j = 0; j < hFreq->nSfb[freq_res]; j++) { FIXP_DBL refNrg = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pIenv) & MASK_M)); SCHAR refNrg_e = (SCHAR)((LONG)(*pIenv) & MASK_E) - NRG_EXP_OFFSET; UCHAR sinePresentFlag = 0; int li = table[j]; int ui = table[j+1]; for (k=li; k= sineMapped[cc]); cc++; } for (k=li; k= *pUiNoise) { tmpNoise = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); tmpNoise_e = (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; pUiNoise++; } FDK_ASSERT(k >= lowSubband); if (useLP) useAliasReduction[k-lowSubband] = !sinePresentFlag; pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f); pNrgs->nrgSine_e[c] = 0; calcSubbandGain(refNrg, refNrg_e, pNrgs, c, tmpNoise, tmpNoise_e, sinePresentFlag, i >= sineMapped[c], noNoiseFlag); pNrgs->nrgRef[c] = refNrg; pNrgs->nrgRef_e[c] = refNrg_e; c++; } pIenv++; } } /* Noise limiting */ for (c = 0; c < hFreq->noLimiterBands; c++) { FIXP_DBL sumRef, boostGain, maxGain; FIXP_DBL accu = FL2FXCONST_DBL(0.0f); SCHAR sumRef_e, boostGain_e, maxGain_e, accu_e = 0; calcAvgGain(pNrgs, hFreq->limiterBandTable[c], hFreq->limiterBandTable[c+1], &sumRef, &sumRef_e, &maxGain, &maxGain_e); /* Multiply maxGain with limiterGain: */ maxGain = fMult(maxGain, FDK_sbrDecoder_sbr_limGains_m[hHeaderData->bs_data.limiterGains]); maxGain_e += FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains]; /* Scale mantissa of MaxGain into range between 0.5 and 1: */ if (maxGain == FL2FXCONST_DBL(0.0f)) maxGain_e = -FRACT_BITS; else { SCHAR charTemp = CountLeadingBits(maxGain); maxGain_e -= charTemp; maxGain <<= (int)charTemp; } if (maxGain_e >= maxGainLimit_e) { /* upper limit (e.g. 96 dB) */ maxGain = FL2FXCONST_DBL(0.5f); maxGain_e = maxGainLimit_e; } /* Every subband gain is compared to the scaled "average gain" and limited if necessary: */ for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c+1]; k++) { if ( (pNrgs->nrgGain_e[k] > maxGain_e) || (pNrgs->nrgGain_e[k] == maxGain_e && pNrgs->nrgGain[k]>maxGain) ) { FIXP_DBL noiseAmp; SCHAR noiseAmp_e; FDK_divide_MantExp(maxGain, maxGain_e, pNrgs->nrgGain[k], pNrgs->nrgGain_e[k], &noiseAmp, &noiseAmp_e); pNrgs->noiseLevel[k] = fMult(pNrgs->noiseLevel[k],noiseAmp); pNrgs->noiseLevel_e[k] += noiseAmp_e; pNrgs->nrgGain[k] = maxGain; pNrgs->nrgGain_e[k] = maxGain_e; } } /* -- Boost gain Calculate and apply boost factor for each limiter band: 1. Check how much energy would be present when using the limited gain 2. Calculate boost factor by comparison with reference energy 3. Apply boost factor to compensate for the energy loss due to limiting */ for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; k++) { /* 1.a Add energy of adjusted signal (using preliminary gain) */ FIXP_DBL tmp = fMult(pNrgs->nrgGain[k],pNrgs->nrgEst[k]); SCHAR tmp_e = pNrgs->nrgGain_e[k] + pNrgs->nrgEst_e[k]; FDK_add_MantExp(tmp, tmp_e, accu, accu_e, &accu, &accu_e); /* 1.b Add sine energy (if present) */ if(pNrgs->nrgSine[k] != FL2FXCONST_DBL(0.0f)) { FDK_add_MantExp(pNrgs->nrgSine[k], pNrgs->nrgSine_e[k], accu, accu_e, &accu, &accu_e); } else { /* 1.c Add noise energy (if present) */ if(noNoiseFlag == 0) { FDK_add_MantExp(pNrgs->noiseLevel[k], pNrgs->noiseLevel_e[k], accu, accu_e, &accu, &accu_e); } } } /* 2.a Calculate ratio of wanted energy and accumulated energy */ if (accu == (FIXP_DBL)0) { /* If divisor is 0, limit quotient to +4 dB */ boostGain = FL2FXCONST_DBL(0.6279716f); boostGain_e = 2; } else { INT div_e; boostGain = fDivNorm(sumRef, accu, &div_e); boostGain_e = sumRef_e - accu_e + div_e; } /* 2.b Result too high? --> Limit the boost factor to +4 dB */ if((boostGain_e > 3) || (boostGain_e == 2 && boostGain > FL2FXCONST_DBL(0.6279716f)) || (boostGain_e == 3 && boostGain > FL2FXCONST_DBL(0.3139858f)) ) { boostGain = FL2FXCONST_DBL(0.6279716f); boostGain_e = 2; } /* 3. Multiply all signal components with the boost factor */ for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; k++) { pNrgs->nrgGain[k] = fMultDiv2(pNrgs->nrgGain[k],boostGain); pNrgs->nrgGain_e[k] = pNrgs->nrgGain_e[k] + boostGain_e + 1; pNrgs->nrgSine[k] = fMultDiv2(pNrgs->nrgSine[k],boostGain); pNrgs->nrgSine_e[k] = pNrgs->nrgSine_e[k] + boostGain_e + 1; pNrgs->noiseLevel[k] = fMultDiv2(pNrgs->noiseLevel[k],boostGain); pNrgs->noiseLevel_e[k] = pNrgs->noiseLevel_e[k] + boostGain_e + 1; } } /* End of noise limiting */ if (useLP) aliasingReduction(degreeAlias+lowSubband, pNrgs, useAliasReduction, noSubbands); /* For the timeslots within the range for the output frame, use the same scale for the noise levels. Drawback: If the envelope exceeds the frame border, the noise levels will have to be rescaled later to fit final_e of the gain-values. */ noise_e = (start_pos < no_cols) ? adj_e : final_e; /* Convert energies to amplitude levels */ for (k=0; knrgSine[k], &pNrgs->nrgSine_e[k], &noise_e); FDK_sqrt_MantExp(&pNrgs->nrgGain[k], &pNrgs->nrgGain_e[k], &pNrgs->nrgGain_e[k]); FDK_sqrt_MantExp(&pNrgs->noiseLevel[k], &pNrgs->noiseLevel_e[k], &noise_e); } /* Apply calculated gains and adaptive noise */ /* assembleHfSignals() */ { int scale_change, sc_change; FIXP_SGL smooth_ratio; int filtBufferNoiseShift=0; /* Initialize smoothing buffers with the first valid values */ if (h_sbr_cal_env->startUp) { if (!useLP) { h_sbr_cal_env->filtBufferNoise_e = noise_e; FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, noSubbands*sizeof(SCHAR)); FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, noSubbands*sizeof(FIXP_DBL)); FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, noSubbands*sizeof(FIXP_DBL)); } h_sbr_cal_env->startUp = 0; } if (!useLP) { equalizeFiltBufferExp(h_sbr_cal_env->filtBuffer, /* buffered */ h_sbr_cal_env->filtBuffer_e, /* buffered */ pNrgs->nrgGain, /* current */ pNrgs->nrgGain_e, /* current */ noSubbands); /* Adapt exponent of buffered noise levels to the current exponent so they can easily be smoothed */ if((h_sbr_cal_env->filtBufferNoise_e - noise_e)>=0) { int shift = fixMin(DFRACT_BITS-1,(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); for (k=0; kfiltBufferNoise[k] <<= shift; } else { int shift = fixMin(DFRACT_BITS-1,-(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); for (k=0; kfiltBufferNoise[k] >>= shift; } h_sbr_cal_env->filtBufferNoise_e = noise_e; } /* find best scaling! */ scale_change = -(DFRACT_BITS-1); for(k=0;knrgGain_e[k]); } sc_change = (start_posnrgGain_e[k] + (sc_change-1); pNrgs->nrgGain[k] >>= sc; pNrgs->nrgGain_e[k] += sc; } if (!useLP) { for(k=0;kfiltBuffer_e[k] + (sc_change-1); h_sbr_cal_env->filtBuffer[k] >>= sc; } } for (j = start_pos; j < stop_pos; j++) { /* This timeslot is located within the first part of the processing buffer and will be fed into the QMF-synthesis for the current frame. adj_e - input_e This timeslot will not yet be fed into the QMF so we do not care about the adj_e. sc_change = final_e - input_e */ if ( (j==no_cols) && (start_posfiltBufferNoise[k] will be applied in function adjustTimeSlotHQ() */ if (shift>=0) { shift = fixMin(DFRACT_BITS-1,shift); for (k=0; knrgSine[k] <<= shift; pNrgs->noiseLevel[k] <<= shift; /* if (!useLP) h_sbr_cal_env->filtBufferNoise[k] <<= shift; */ } } else { shift = fixMin(DFRACT_BITS-1,-shift); for (k=0; knrgSine[k] >>= shift; pNrgs->noiseLevel[k] >>= shift; /* if (!useLP) h_sbr_cal_env->filtBufferNoise[k] >>= shift; */ } } /* update noise scaling */ noise_e = final_e; if (!useLP) h_sbr_cal_env->filtBufferNoise_e = noise_e; /* scaling value unused! */ /* update gain buffer*/ sc_change -= (final_e - input_e); if (sc_change<0) { for(k=0;knrgGain[k] >>= -sc_change; pNrgs->nrgGain_e[k] += -sc_change; } if (!useLP) { for(k=0;kfiltBuffer[k] >>= -sc_change; } } } else { scale_change+=sc_change; } } // if if (!useLP) { /* Prevent the smoothing filter from running on constant levels */ if (j-start_pos < smooth_length) smooth_ratio = FDK_sbrDecoder_sbr_smoothFilter[j-start_pos]; else smooth_ratio = FL2FXCONST_SGL(0.0f); adjustTimeSlotHQ(&analysBufferReal[j][lowSubband], &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs, lowSubband, noSubbands, scale_change, smooth_ratio, noNoiseFlag, filtBufferNoiseShift); } else { adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs, &h_sbr_cal_env->harmIndex, lowSubband, noSubbands, scale_change, noNoiseFlag, &h_sbr_cal_env->phaseIndex, (flags & SBRDEC_ELD_GRID)); } } // for if (!useLP) { /* Update time-smoothing-buffers for gains and noise levels The gains and the noise values of the current envelope are copied into the buffer. This has to be done at the end of each envelope as the values are required for a smooth transition to the next envelope. */ FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, noSubbands*sizeof(FIXP_DBL)); FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, noSubbands*sizeof(SCHAR)); FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, noSubbands*sizeof(FIXP_DBL)); } } C_ALLOC_SCRATCH_END(pNrgs, ENV_CALC_NRGS, 1); } /* Rescale output samples */ { FIXP_DBL maxVal; int ov_reserve, reserve; /* Determine headroom in old adjusted samples */ maxVal = maxSubbandSample( analysBufferReal, (useLP) ? NULL : analysBufferImag, lowSubband, highSubband, 0, first_start); ov_reserve = fNorm(maxVal); /* Determine headroom in new adjusted samples */ maxVal = maxSubbandSample( analysBufferReal, (useLP) ? NULL : analysBufferImag, lowSubband, highSubband, first_start, no_cols); reserve = fNorm(maxVal); /* Determine common output exponent */ if (ov_adj_e - ov_reserve > adj_e - reserve ) /* set output_e to the maximum */ output_e = ov_adj_e - ov_reserve; else output_e = adj_e - reserve; /* Rescale old samples */ rescaleSubbandSamples( analysBufferReal, (useLP) ? NULL : analysBufferImag, lowSubband, highSubband, 0, first_start, ov_adj_e - output_e); /* Rescale new samples */ rescaleSubbandSamples( analysBufferReal, (useLP) ? NULL : analysBufferImag, lowSubband, highSubband, first_start, no_cols, adj_e - output_e); } /* Update hb_scale */ sbrScaleFactor->hb_scale = EXP2SCALE(output_e); /* Save the current final exponent for the next frame: */ sbrScaleFactor->ov_hb_scale = EXP2SCALE(final_e); /* We need to remeber to the next frame that the transient will occur in the first envelope (if tranEnv == nEnvelopes). */ if(hFrameData->frameInfo.tranEnv == hFrameData->frameInfo.nEnvelopes) h_sbr_cal_env->prevTranEnv = 0; else h_sbr_cal_env->prevTranEnv = -1; } /*! \brief Create envelope instance Must be called once for each channel before calculateSbrEnvelope() can be used. \return errorCode, 0 if successful */ SBR_ERROR createSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hs, /*!< pointer to envelope instance */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< static SBR control data, initialized with defaults */ const int chan, /*!< Channel for which to assign buffers */ const UINT flags) { SBR_ERROR err = SBRDEC_OK; int i; /* Clear previous missing harmonics flags */ for (i=0; i<(MAX_FREQ_COEFFS+15)>>4; i++) { hs->harmFlagsPrev[i] = 0; } hs->harmIndex = 0; /* Setup pointers for time smoothing. The buffer itself will be initialized later triggered by the startUp-flag. */ hs->prevTranEnv = -1; /* initialization */ resetSbrEnvelopeCalc(hs); if (chan==0) { /* do this only once */ err = resetFreqBandTables(hHeaderData, flags); } return err; } /*! \brief Create envelope instance Must be called once for each channel before calculateSbrEnvelope() can be used. \return errorCode, 0 if successful */ int deleteSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hs) { return 0; } /*! \brief Reset envelope instance This function must be called for each channel on a change of configuration. Note that resetFreqBandTables should also be called in this case. \return errorCode, 0 if successful */ void resetSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hCalEnv) /*!< pointer to envelope instance */ { hCalEnv->phaseIndex = 0; /* Noise exponent needs to be reset because the output exponent for the next frame depends on it */ hCalEnv->filtBufferNoise_e = 0; hCalEnv->startUp = 1; } /*! \brief Equalize exponents of the buffered gain values and the new ones After equalization of exponents, the FIR-filter addition for smoothing can be performed. This function is called once for each envelope before adjusting. */ /*static*/ void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, /*!< bufferd gains */ SCHAR *filtBuffer_e, /*!< exponents of bufferd gains */ FIXP_DBL *nrgGain, /*!< gains for current envelope */ SCHAR *nrgGain_e, /*!< exponents of gains for current envelope */ int subbands) /*!< Number of QMF subbands */ { int band; int diff; for (band=0; band0) { filtBuffer[band] >>= diff; /* Compensate for the scale change by shifting the mantissa. */ filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */ } else if (diff<0) { /* The buffered gains seem to be larger, but maybe there are some unused bits left in the mantissa */ int reserve = CntLeadingZeros(fixp_abs(filtBuffer[band]))-1; if ((-diff) <= reserve) { /* There is enough space in the buffered mantissa so that we can take the new exponent as common. */ filtBuffer[band] <<= (-diff); filtBuffer_e[band] += diff; /* becomes equal to *ptrNewExp */ } else { filtBuffer[band] <<= reserve; /* Shift the mantissa as far as possible: */ filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */ /* For the remaining difference, change the new gain value */ diff = fixMin(-(reserve + diff),DFRACT_BITS-1); nrgGain[band] >>= diff; nrgGain_e[band] += diff; } } } } /*! \brief Shift left the mantissas of all subband samples in the giventime and frequency range by the specified number of bits. This function is used to rescale the audio data in the overlap buffer which has already been envelope adjusted with the last frame. */ void rescaleSubbandSamples(FIXP_DBL ** re, /*!< Real part of input and output subband samples */ FIXP_DBL ** im, /*!< Imaginary part of input and output subband samples */ int lowSubband, /*!< Begin of frequency range to process */ int highSubband, /*!< End of frequency range to process */ int start_pos, /*!< Begin of time rage (QMF-timeslot) */ int next_pos, /*!< End of time rage (QMF-timeslot) */ int shift) /*!< number of bits to shift */ { int width = highSubband-lowSubband; if ( (width > 0) && (shift!=0) ) { if (im!=NULL) { for (int l=start_pos; l 0 ) { if (im!=NULL) { for (int l=start_pos; l>(DFRACT_BITS-1))); maxVal |= (FIXP_DBL)((LONG)(tmp2)^((LONG)tmp2>>(DFRACT_BITS-1))); } while(--k!=0); #endif } } else { for (int l=start_pos; l>(DFRACT_BITS-1))); }while(--k!=0); } } } return(maxVal); } #define SHIFT_BEFORE_SQUARE (3) /* (7/2) */ /*!< If the accumulator does not provide enough overflow bits or does not provide a high dynamic range, the below energy calculation requires an additional shift operation for each sample. On the other hand, doing the shift allows using a single-precision multiplication for the square (at least 16bit x 16bit). For even values of OVRFLW_BITS (0, 2, 4, 6), saturated arithmetic is required for the energy accumulation. Theoretically, the sample-squares can sum up to a value of 76, requiring 7 overflow bits. However since such situations are *very* rare, accu can be limited to 64. In case native saturated arithmetic is not available, overflows can be prevented by replacing the above #define by #define SHIFT_BEFORE_SQUARE ((8 - OVRFLW_BITS) / 2) which will result in slightly reduced accuracy. */ /*! \brief Estimates the mean energy of each filter-bank channel for the duration of the current envelope This function is used when interpolFreq is true. */ /*static*/ void calcNrgPerSubband(FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ int lowSubband, /*!< Begin of the SBR frequency range */ int highSubband, /*!< High end of the SBR frequency range */ int start_pos, /*!< First QMF-slot of current envelope */ int next_pos, /*!< Last QMF-slot of current envelope + 1 */ SCHAR frameExp, /*!< Common exponent for all input samples */ FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ SCHAR *nrgEst_e ) /*!< Exponent of resulting Energy */ { FIXP_SGL invWidth; SCHAR preShift; SCHAR shift; FIXP_DBL sum; int k,l; /* Divide by width of envelope later: */ invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); /* The common exponent needs to be doubled because all mantissas are squared: */ frameExp = frameExp << 1; for (k=lowSubband; k>(DFRACT_BITS-1))); bufferReal[l] = analysBufferReal[l][k]; maxVal |= (FIXP_DBL)((LONG)(bufferReal[l])^((LONG)bufferReal[l]>>(DFRACT_BITS-1))); } } else { for (l=start_pos;l>(DFRACT_BITS-1))); } } if (maxVal!=FL2FXCONST_DBL(0.f)) { /* If the accu does not provide enough overflow bits, we cannot shift the samples up to the limit. Instead, keep up to 3 free bits in each sample, i.e. up to 6 bits after calculation of square. Please note the comment on saturated arithmetic above! */ FIXP_DBL accu = FL2FXCONST_DBL(0.0f); preShift = CntLeadingZeros(maxVal)-1; preShift -= SHIFT_BEFORE_SQUARE; if (preShift>=0) { if (analysBufferImag!=NULL) { for (l=start_pos; l> (int)negpreShift; FIXP_DBL temp2 = bufferImag[l] >> (int)negpreShift; accu = fPow2AddDiv2(accu, temp1); accu = fPow2AddDiv2(accu, temp2); } } else { for (l=start_pos; l> (int)negpreShift; accu = fPow2AddDiv2(accu, temp); } } } accu <<= 1; /* Convert double precision to Mantissa/Exponent: */ shift = fNorm(accu); sum = accu << (int)shift; /* Divide by width of envelope and apply frame scale: */ *nrgEst++ = fMult(sum, invWidth); shift += 2 * preShift; if (analysBufferImag!=NULL) *nrgEst_e++ = frameExp - shift; else *nrgEst_e++ = frameExp - shift + 1; /* +1 due to missing imag. part */ } /* maxVal!=0 */ else { /* Prevent a zero-mantissa-number from being misinterpreted due to its exponent. */ *nrgEst++ = FL2FXCONST_DBL(0.0f); *nrgEst_e++ = 0; } } } /*! \brief Estimates the mean energy of each Scale factor band for the duration of the current envelope. This function is used when interpolFreq is false. */ /*static*/ void calcNrgPerSfb(FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ int nSfb, /*!< Number of scale factor bands */ UCHAR *freqBandTable, /*!< First Subband for each Sfb */ int start_pos, /*!< First QMF-slot of current envelope */ int next_pos, /*!< Last QMF-slot of current envelope + 1 */ SCHAR input_e, /*!< Common exponent for all input samples */ FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ SCHAR *nrgEst_e ) /*!< Exponent of resulting Energy */ { FIXP_SGL invWidth; FIXP_DBL temp; SCHAR preShift; SCHAR shift, sum_e; FIXP_DBL sum; int j,k,l,li,ui; FIXP_DBL sumAll, sumLine; /* Single precision would be sufficient, but overflow bits are required for accumulation */ /* Divide by width of envelope later: */ invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); /* The common exponent needs to be doubled because all mantissas are squared: */ input_e = input_e << 1; for(j=0; j=0) { for (l=start_pos; l> -(int)preShift; sumLine += fPow2Div2(temp); temp = analysBufferImag[l][k] >> -(int)preShift; sumLine += fPow2Div2(temp); } } } else { if (preShift>=0) { for (l=start_pos; l> -(int)preShift; sumLine += fPow2Div2(temp); } } } /* The number of QMF-channels per SBR bands may be up to 15. Shift right to avoid overflows in sum over all channels. */ sumLine = sumLine >> (4-1); sumAll += sumLine; } /* Convert double precision to Mantissa/Exponent: */ shift = fNorm(sumAll); sum = sumAll << (int)shift; /* Divide by width of envelope: */ sum = fMult(sum,invWidth); /* Divide by width of Sfb: */ sum = fMult(sum, FX_DBL2FX_SGL(GetInvInt(ui-li))); /* Set all Subband energies in the Sfb to the average energy: */ if (analysBufferImag!=NULL) sum_e = input_e + 4 - shift; /* -4 to compensate right-shift */ else sum_e = input_e + 4 + 1 - shift; /* -4 to compensate right-shift; +1 due to missing imag. part */ sum_e -= 2 * preShift; } /* maxVal!=0 */ else { /* Prevent a zero-mantissa-number from being misinterpreted due to its exponent. */ sum = FL2FXCONST_DBL(0.0f); sum_e = 0; } for (k=li; knrgEst[i]; /*!< Energy in transposed signal */ SCHAR nrgEst_e = nrgs->nrgEst_e[i]; /*!< Energy in transposed signal (exponent) */ FIXP_DBL *ptrNrgGain = &nrgs->nrgGain[i]; /*!< Resulting energy gain */ SCHAR *ptrNrgGain_e = &nrgs->nrgGain_e[i]; /*!< Resulting energy gain (exponent) */ FIXP_DBL *ptrNoiseLevel = &nrgs->noiseLevel[i]; /*!< Resulting absolute noise energy */ SCHAR *ptrNoiseLevel_e = &nrgs->noiseLevel_e[i]; /*!< Resulting absolute noise energy (exponent) */ FIXP_DBL *ptrNrgSine = &nrgs->nrgSine[i]; /*!< Additional sine energy */ SCHAR *ptrNrgSine_e = &nrgs->nrgSine_e[i]; /*!< Additional sine energy (exponent) */ FIXP_DBL a, b, c; SCHAR a_e, b_e, c_e; /* This addition of 1 prevents divisions by zero in the reference code. For very small energies in nrgEst, it prevents the gains from becoming very high which could cause some trouble due to the smoothing. */ b_e = (int)(nrgEst_e - 1); if (b_e>=0) { nrgEst = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e+1,DFRACT_BITS-1)) + (nrgEst >> 1); nrgEst_e += 1; /* shift by 1 bit to avoid overflow */ } else { nrgEst = (nrgEst >> (INT)(fixMin(-b_e+1,DFRACT_BITS-1))) + (FL2FXCONST_DBL(0.5f) >> 1); nrgEst_e = 2; /* shift by 1 bit to avoid overflow */ } /* A = NrgRef * TmpNoise */ a = fMult(nrgRef,tmpNoise); a_e = nrgRef_e + tmpNoise_e; /* B = 1 + TmpNoise */ b_e = (int)(tmpNoise_e - 1); if (b_e>=0) { b = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e+1,DFRACT_BITS-1)) + (tmpNoise >> 1); b_e = tmpNoise_e + 1; /* shift by 1 bit to avoid overflow */ } else { b = (tmpNoise >> (INT)(fixMin(-b_e+1,DFRACT_BITS-1))) + (FL2FXCONST_DBL(0.5f) >> 1); b_e = 2; /* shift by 1 bit to avoid overflow */ } /* noiseLevel = A / B = (NrgRef * TmpNoise) / (1 + TmpNoise) */ FDK_divide_MantExp( a, a_e, b, b_e, ptrNoiseLevel, ptrNoiseLevel_e); if (sinePresentFlag) { /* C = (1 + TmpNoise) * NrgEst */ c = fMult(b,nrgEst); c_e = b_e + nrgEst_e; /* gain = A / C = (NrgRef * TmpNoise) / (1 + TmpNoise) * NrgEst */ FDK_divide_MantExp( a, a_e, c, c_e, ptrNrgGain, ptrNrgGain_e); if (sineMapped) { /* sineLevel = nrgRef/ (1 + TmpNoise) */ FDK_divide_MantExp( nrgRef, nrgRef_e, b, b_e, ptrNrgSine, ptrNrgSine_e); } } else { if (noNoiseFlag) { /* B = NrgEst */ b = nrgEst; b_e = nrgEst_e; } else { /* B = NrgEst * (1 + TmpNoise) */ b = fMult(b,nrgEst); b_e = b_e + nrgEst_e; } /* gain = nrgRef / B */ FDK_divide_MantExp( nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e); } } /*! \brief Calculate "average gain" for the specified subband range. This is rather a gain of the average magnitude than the average of gains! The result is used as a relative limit for all gains within the current "limiter band" (a certain frequency range). */ /*static*/ void calcAvgGain(ENV_CALC_NRGS* nrgs, int lowSubband, /*!< Begin of the limiter band */ int highSubband, /*!< High end of the limiter band */ FIXP_DBL *ptrSumRef, SCHAR *ptrSumRef_e, FIXP_DBL *ptrAvgGain, /*!< Resulting overall gain (mantissa) */ SCHAR *ptrAvgGain_e) /*!< Resulting overall gain (exponent) */ { FIXP_DBL *nrgRef = nrgs->nrgRef; /*!< Reference Energy according to envelope data */ SCHAR *nrgRef_e = nrgs->nrgRef_e; /*!< Reference Energy according to envelope data (exponent) */ FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< Energy in transposed signal */ SCHAR *nrgEst_e = nrgs->nrgEst_e; /*!< Energy in transposed signal (exponent) */ FIXP_DBL sumRef = 1; FIXP_DBL sumEst = 1; SCHAR sumRef_e = -FRACT_BITS; SCHAR sumEst_e = -FRACT_BITS; int k; for (k=lowSubband; knrgGain; /*!< Gains of current envelope */ FIXP_DBL *pNoiseLevel = nrgs->noiseLevel; /*!< Noise levels of current envelope */ FIXP_DBL *pSineLevel = nrgs->nrgSine; /*!< Sine levels */ int k; int index = *ptrPhaseIndex; UCHAR harmIndex = *ptrHarmIndex; UCHAR freqInvFlag = (lowSubband & 1); FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev; int tone_count = 0; int sineSign = 1; #define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f*0.00815f)) #define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f*0.16773f)) /* First pass for k=0 pulled out of the loop: */ index = (index + 1) & (SBR_NF_NO_RANDOM_VAL - 1); /* The next multiplication constitutes the actual envelope adjustment of the signal and should be carried out with full accuracy (supplying #FRACT_BITS valid bits). */ signalReal = fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); sineLevel = *pSineLevel++; sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f); if (sineLevel!=FL2FXCONST_DBL(0.0f)) tone_count++; else if (!noNoiseFlag) /* Add noisefloor to the amplified signal */ signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); if (fCldfb) { if (!(harmIndex&0x1)) { /* harmIndex 0,2 */ signalReal += (harmIndex&0x2) ? -sineLevel : sineLevel; *ptrReal++ = signalReal; } else { /* harmIndex 1,3 in combination with freqInvFlag */ int shift = (int) (scale_change+1); shift = (shift>=0) ? fixMin(DFRACT_BITS-1,shift) : fixMax(-(DFRACT_BITS-1),shift); FIXP_DBL tmp1 = scaleValue( fMultDiv2(C1_CLDFB, sineLevel), -shift ); FIXP_DBL tmp2 = fMultDiv2(C1_CLDFB, sineLevelNext); /* save switch and compare operations and reduce to XOR statement */ if ( ((harmIndex>>1)&0x1)^freqInvFlag) { *(ptrReal-1) += tmp1; signalReal -= tmp2; } else { *(ptrReal-1) -= tmp1; signalReal += tmp2; } *ptrReal++ = signalReal; freqInvFlag = !freqInvFlag; } } else { if (!(harmIndex&0x1)) { /* harmIndex 0,2 */ signalReal += (harmIndex&0x2) ? -sineLevel : sineLevel; *ptrReal++ = signalReal; } else { /* harmIndex 1,3 in combination with freqInvFlag */ int shift = (int) (scale_change+1); shift = (shift>=0) ? fixMin(DFRACT_BITS-1,shift) : fixMax(-(DFRACT_BITS-1),shift); FIXP_DBL tmp1 = (shift>=0) ? ( fMultDiv2(C1, sineLevel) >> shift ) : ( fMultDiv2(C1, sineLevel) << (-shift) ); FIXP_DBL tmp2 = fMultDiv2(C1, sineLevelNext); /* save switch and compare operations and reduce to XOR statement */ if ( ((harmIndex>>1)&0x1)^freqInvFlag) { *(ptrReal-1) += tmp1; signalReal -= tmp2; } else { *(ptrReal-1) -= tmp1; signalReal += tmp2; } *ptrReal++ = signalReal; freqInvFlag = !freqInvFlag; } } pNoiseLevel++; if ( noSubbands > 2 ) { if (!(harmIndex&0x1)) { /* harmIndex 0,2 */ if(!harmIndex) { sineSign = 0; } for (k=noSubbands-2; k!=0; k--) { FIXP_DBL sinelevel = *pSineLevel++; index++; if (((signalReal = (sineSign ? -sinelevel : sinelevel)) == FL2FXCONST_DBL(0.0f)) && !noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); } /* The next multiplication constitutes the actual envelope adjustment of the signal. */ signalReal += fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); pNoiseLevel++; *ptrReal++ = signalReal; } /* for ... */ } else { /* harmIndex 1,3 in combination with freqInvFlag */ if (harmIndex==1) freqInvFlag = !freqInvFlag; for (k=noSubbands-2; k!=0; k--) { index++; /* The next multiplication constitutes the actual envelope adjustment of the signal. */ signalReal = fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); if (*pSineLevel++!=FL2FXCONST_DBL(0.0f)) tone_count++; else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); } pNoiseLevel++; if (tone_count <= 16) { FIXP_DBL addSine = fMultDiv2((pSineLevel[-2] - pSineLevel[0]), C1); signalReal += (freqInvFlag) ? (-addSine) : (addSine); } *ptrReal++ = signalReal; freqInvFlag = !freqInvFlag; } /* for ... */ } } if (noSubbands > -1) { index++; /* The next multiplication constitutes the actual envelope adjustment of the signal. */ signalReal = fMultDiv2(*ptrReal,*pGain) << ((int)scale_change); sineLevelPrev = fMultDiv2(pSineLevel[-1],FL2FX_SGL(0.0163f)); sineLevel = pSineLevel[0]; if (pSineLevel[0]!=FL2FXCONST_DBL(0.0f)) tone_count++; else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); signalReal = signalReal + (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); } if (!(harmIndex&0x1)) { /* harmIndex 0,2 */ *ptrReal = signalReal + ( (sineSign) ? -sineLevel : sineLevel); } else { /* harmIndex 1,3 in combination with freqInvFlag */ if(tone_count <= 16){ if (freqInvFlag) { *ptrReal++ = signalReal - sineLevelPrev; if (noSubbands + lowSubband < 63) *ptrReal = *ptrReal + fMultDiv2(C1, sineLevel); } else { *ptrReal++ = signalReal + sineLevelPrev; if (noSubbands + lowSubband < 63) *ptrReal = *ptrReal - fMultDiv2(C1, sineLevel); } } else *ptrReal = signalReal; } } *ptrHarmIndex = (harmIndex + 1) & 3; *ptrPhaseIndex = index & (SBR_NF_NO_RANDOM_VAL - 1); } void adjustTimeSlotHQ(FIXP_DBL *RESTRICT ptrReal, /*!< Subband samples to be adjusted, real part */ FIXP_DBL *RESTRICT ptrImag, /*!< Subband samples to be adjusted, imag part */ HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS* nrgs, int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ int noSubbands, /*!< Number of QMF subbands */ int scale_change, /*!< Number of bits to shift adjusted samples */ FIXP_SGL smooth_ratio, /*!< Impact of last envelope */ int noNoiseFlag, /*!< Start index to random number array */ int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */ { FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */ FIXP_DBL *RESTRICT noiseLevel = nrgs->noiseLevel; /*!< Noise levels of current envelope */ FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ FIXP_DBL *RESTRICT filtBuffer = h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */ FIXP_DBL *RESTRICT filtBufferNoise = h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */ UCHAR *RESTRICT ptrHarmIndex =&h_sbr_cal_env->harmIndex; /*!< Harmonic index */ int *RESTRICT ptrPhaseIndex =&h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */ int k; FIXP_DBL signalReal, signalImag; FIXP_DBL noiseReal, noiseImag; FIXP_DBL smoothedGain, smoothedNoise; FIXP_SGL direct_ratio = /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio; int index = *ptrPhaseIndex; UCHAR harmIndex = *ptrHarmIndex; register int freqInvFlag = (lowSubband & 1); FIXP_DBL sineLevel; int shift; *ptrPhaseIndex = (index+noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); *ptrHarmIndex = (harmIndex + 1) & 3; /* Possible optimization: smooth_ratio and harmIndex stay constant during the loop. It might be faster to include a separate loop in each path. the check for smooth_ratio is now outside the loop and the workload of the whole function decreased by about 20 % */ filtBufferNoiseShift += 1; /* due to later use of fMultDiv2 instead of fMult */ if (filtBufferNoiseShift<0) shift = fixMin(DFRACT_BITS-1,-filtBufferNoiseShift); else shift = fixMin(DFRACT_BITS-1, filtBufferNoiseShift); if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { for (k=0; k>shift) + fMult(direct_ratio,noiseLevel[k]); } else { smoothedNoise = (fMultDiv2(smooth_ratio,filtBufferNoise[k])<>5) { if (workLimiterBandTable[hiLimIndex] == workLimiterBandTable[loLimIndex]) { workLimiterBandTable[hiLimIndex] = highSubband; nBands--; hiLimIndex++; continue; } isPatchBorder[0] = isPatchBorder[1] = 0; for (k = 0; k <= noPatches; k++) { if (workLimiterBandTable[hiLimIndex] == patchBorders[k]) { isPatchBorder[1] = 1; break; } } if (!isPatchBorder[1]) { workLimiterBandTable[hiLimIndex] = highSubband; nBands--; hiLimIndex++; continue; } for (k = 0; k <= noPatches; k++) { if (workLimiterBandTable[loLimIndex] == patchBorders[k]) { isPatchBorder[0] = 1; break; } } if (!isPatchBorder[0]) { workLimiterBandTable[loLimIndex] = highSubband; nBands--; } } loLimIndex = hiLimIndex; hiLimIndex++; } shellsort(workLimiterBandTable, tempNoLim + 1); /* Test if algorithm exceeded maximum allowed limiterbands */ if( nBands > MAX_NUM_LIMITERS || nBands <= 0) { return SBRDEC_UNSUPPORTED_CONFIG; } /* Copy limiterbands from working buffer into final destination */ for (k = 0; k <= nBands; k++) { limiterBandTable[k] = workLimiterBandTable[k]; } } *noLimiterBands = nBands; return SBRDEC_OK; } fdk-aac-0.1.3/libSBRdec/src/psdec.h0000644000175000017500000004672112372261464017253 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr decoder */ #ifndef __PSDEC_H #define __PSDEC_H #include "sbrdecoder.h" /* This PS decoder implements the baseline version. So it always uses the */ /* hybrid filter structure for 20 stereo bands and does not implemet IPD/OPD */ /* synthesis. The baseline version has to support the complete PS bitstream */ /* syntax. But IPD/OPD data is ignored and set to 0. If 34 stereo band config */ /* is used in the bitstream for IIS/ICC the decoded parameters are mapped to */ /* 20 stereo bands. */ #include "FDK_bitstream.h" #include "psdec_hybrid.h" #define SCAL_HEADROOM ( 2 ) #define PS_EXTENSION_SIZE_BITS ( 4 ) #define PS_EXTENSION_ESC_COUNT_BITS ( 8 ) #define NO_QMF_CHANNELS ( 64 ) #define MAX_NUM_COL ( 32 ) #define NO_QMF_BANDS_HYBRID20 ( 3 ) #define NO_SUB_QMF_CHANNELS ( 12 ) #define NRG_INT_COEFF ( 0.75f ) #define INT_FILTER_COEFF (FL2FXCONST_DBL( 1.0f - NRG_INT_COEFF )) #define PEAK_DECAY_FACTOR (FL2FXCONST_DBL( 0.765928338364649f )) #define TRANSIENT_IMPACT_FACTOR (FL2FXCONST_DBL( 2.0 / 3.0 )) #define NO_SERIAL_ALLPASS_LINKS ( 3 ) #define MAX_NO_PS_ENV ( 4 + 1 ) /* +1 needed for VAR_BORDER */ #define MAX_DELAY_BUFFER_SIZE ( 14 ) #define NO_DELAY_BUFFER_BANDS ( 35 ) #define NO_HI_RES_BINS ( 34 ) #define NO_MID_RES_BINS ( 20 ) #define NO_LOW_RES_BINS ( 10 ) #define FIRST_DELAY_SB ( 23 ) #define NO_SAMPLE_DELAY_ALLPASS ( 2 ) #define NO_DELAY_LENGTH_VECTORS ( 12 ) /* d(m): d(0)=3 + d(1)=4 + d(2)=5 */ #define NO_HI_RES_IID_BINS ( NO_HI_RES_BINS ) #define NO_HI_RES_ICC_BINS ( NO_HI_RES_BINS ) #define NO_MID_RES_IID_BINS ( NO_MID_RES_BINS ) #define NO_MID_RES_ICC_BINS ( NO_MID_RES_BINS ) #define NO_LOW_RES_IID_BINS ( NO_LOW_RES_BINS ) #define NO_LOW_RES_ICC_BINS ( NO_LOW_RES_BINS ) #define SUBQMF_GROUPS ( 10 ) #define QMF_GROUPS ( 12 ) #define SUBQMF_GROUPS_HI_RES ( 32 ) #define QMF_GROUPS_HI_RES ( 18 ) #define NO_IID_GROUPS ( SUBQMF_GROUPS + QMF_GROUPS ) #define NO_IID_GROUPS_HI_RES ( SUBQMF_GROUPS_HI_RES + QMF_GROUPS_HI_RES ) #define NO_IID_STEPS ( 7 ) /* 1 .. + 7 */ #define NO_IID_STEPS_FINE ( 15 ) /* 1 .. +15 */ #define NO_ICC_STEPS ( 8 ) /* 0 .. + 7 */ #define NO_IID_LEVELS ( 2 * NO_IID_STEPS + 1 ) /* - 7 .. + 7 */ #define NO_IID_LEVELS_FINE ( 2 * NO_IID_STEPS_FINE + 1 ) /* -15 .. +15 */ #define NO_ICC_LEVELS ( NO_ICC_STEPS ) /* 0 .. + 7 */ #define FIXP_SQRT05 ((FIXP_DBL)0x5a827980) /* 1/SQRT2 */ struct PS_DEC_COEFFICIENTS { FIXP_DBL H11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL H12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL H21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL H22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL DeltaH11r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL DeltaH12r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL DeltaH21r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ FIXP_DBL DeltaH22r[NO_IID_GROUPS]; /*!< coefficients of the sub-subband groups */ SCHAR aaIidIndexMapped[MAX_NO_PS_ENV][NO_HI_RES_IID_BINS]; /*!< The mapped IID index for all envelopes and all IID bins */ SCHAR aaIccIndexMapped[MAX_NO_PS_ENV][NO_HI_RES_ICC_BINS]; /*!< The mapped ICC index for all envelopes and all ICC bins */ }; typedef enum { ppt_none = 0, ppt_mpeg = 1, ppt_drm = 2 } PS_PAYLOAD_TYPE; typedef struct { UCHAR bPsHeaderValid; /*!< set if new header is available from bitstream */ UCHAR bEnableIid; /*!< One bit denoting the presence of IID parameters */ UCHAR bEnableIcc; /*!< One bit denoting the presence of ICC parameters */ UCHAR bEnableExt; /*!< The PS extension layer is enabled using the enable_ext bit. If it is set to %1 the IPD and OPD parameters are sent. If it is disabled, i.e. %0, the extension layer is skipped. */ UCHAR modeIid; /*!< The configuration of IID parameters (number of bands and quantisation grid, iid_quant) is determined by iid_mode. */ UCHAR modeIcc; /*!< The configuration of Inter-channel Coherence parameters (number of bands and quantisation grid) is determined by icc_mode. */ UCHAR freqResIid; /*!< 0=low, 1=mid or 2=high frequency resolution for iid */ UCHAR freqResIcc; /*!< 0=low, 1=mid or 2=high frequency resolution for icc */ UCHAR bFineIidQ; /*!< Use fine Iid quantisation. */ UCHAR bFrameClass; /*!< The frame_class bit determines whether the parameter positions of the current frame are uniformly spaced accross the frame or they are defined using the positions described by border_position. */ UCHAR noEnv; /*!< The number of envelopes per frame */ UCHAR aEnvStartStop[MAX_NO_PS_ENV+1]; /*!< In case of variable parameter spacing the parameter positions are determined by border_position */ SCHAR abIidDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for IID, 0 => freq */ SCHAR abIccDtFlag[MAX_NO_PS_ENV]; /*!< Deltacoding time/freq flag for ICC, 0 => freq */ SCHAR aaIidIndex[MAX_NO_PS_ENV][NO_HI_RES_IID_BINS]; /*!< The IID index for all envelopes and all IID bins */ SCHAR aaIccIndex[MAX_NO_PS_ENV][NO_HI_RES_ICC_BINS]; /*!< The ICC index for all envelopes and all ICC bins */ } MPEG_PS_BS_DATA; struct PS_DEC { SCHAR noSubSamples; SCHAR noChannels; SCHAR procFrameBased; /*!< Helper to detected switching from frame based to slot based processing */ PS_PAYLOAD_TYPE bPsDataAvail[(1)+1]; /*!< set if new data available from bitstream */ UCHAR psDecodedPrv; /*!< set if PS has been processed in the last frame */ /* helpers for frame delay line */ UCHAR bsLastSlot; /*!< Index of last read slot. */ UCHAR bsReadSlot; /*!< Index of current read slot for additional delay. */ UCHAR processSlot; /*!< Index of current slot for processing (need for add. delay). */ INT rescal; INT sf_IntBuffer; union { /* Bitstream data */ MPEG_PS_BS_DATA mpeg; /*!< Struct containing all MPEG specific PS data from bitstream. */ } bsData[(1)+1]; shouldBeUnion { /* Static data */ struct { SCHAR aIidPrevFrameIndex[NO_HI_RES_IID_BINS]; /*!< The IID index for previous frame */ SCHAR aIccPrevFrameIndex[NO_HI_RES_ICC_BINS]; /*!< The ICC index for previous frame */ UCHAR delayBufIndex; /*!< Pointer to where the latest sample is in buffer */ UCHAR noSampleDelay; /*!< How many QMF samples delay is used. */ UCHAR lastUsb; /*!< uppermost WMF delay band of last frame */ UCHAR aDelayRBufIndexSer[NO_SERIAL_ALLPASS_LINKS]; /*!< Delay buffer for reverb filter */ UCHAR aDelayBufIndexDelayQmf[NO_QMF_CHANNELS-FIRST_DELAY_SB]; /*!< Delay buffer for ICC group 20 & 21 */ SCHAR scaleFactorPsDelayBuffer; /*!< Scale factor for ps delay buffer */ /* hybrid filter bank delay lines */ FIXP_DBL aaQmfDelayBufReal[(NO_QMF_CHANNELS-FIRST_DELAY_SB) + (MAX_DELAY_BUFFER_SIZE-1)*(NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB)]; FIXP_DBL aaQmfDelayBufImag[(NO_QMF_CHANNELS-FIRST_DELAY_SB) + (MAX_DELAY_BUFFER_SIZE-1)*(NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB)]; FIXP_DBL *pAaRealDelayBufferQmf[MAX_DELAY_BUFFER_SIZE]; /*!< Real part delay buffer */ FIXP_DBL *pAaImagDelayBufferQmf[MAX_DELAY_BUFFER_SIZE]; /*!< Imaginary part delay buffer */ FIXP_DBL aaRealDelayBufferQmf[NO_SAMPLE_DELAY_ALLPASS][FIRST_DELAY_SB]; /*!< Real part delay buffer */ FIXP_DBL aaImagDelayBufferQmf[NO_SAMPLE_DELAY_ALLPASS][FIRST_DELAY_SB]; /*!< Imaginary part delay buffer*/ FIXP_DBL aaRealDelayBufferSubQmf[NO_SAMPLE_DELAY_ALLPASS][NO_SUB_QMF_CHANNELS]; /*!< Real part delay buffer */ FIXP_DBL aaImagDelayBufferSubQmf[NO_SAMPLE_DELAY_ALLPASS][NO_SUB_QMF_CHANNELS]; /*!< Imaginary part delay buffer */ FIXP_DBL aaaRealDelayRBufferSerQmf[FIRST_DELAY_SB][NO_DELAY_LENGTH_VECTORS]; /*!< Real part delay buffer */ FIXP_DBL aaaImagDelayRBufferSerQmf[FIRST_DELAY_SB][NO_DELAY_LENGTH_VECTORS]; /*!< Imaginary part delay buffer */ FIXP_DBL aaaRealDelayRBufferSerSubQmf[NO_SUB_QMF_CHANNELS][NO_DELAY_LENGTH_VECTORS]; /*!< Real part delay buffer */ FIXP_DBL aaaImagDelayRBufferSerSubQmf[NO_SUB_QMF_CHANNELS][NO_DELAY_LENGTH_VECTORS]; /*!< Imaginary part delay buffer */ HYBRID hybrid; /*!< hybrid filter bank struct 1 or 2. */ FIXP_DBL aPrevNrgBin[NO_MID_RES_BINS]; /*!< energy of previous frame */ FIXP_DBL aPrevPeakDiffBin[NO_MID_RES_BINS]; /*!< peak difference of previous frame */ FIXP_DBL aPeakDecayFastBin[NO_MID_RES_BINS]; /*!< Saved max. peak decay value per bin */ SCHAR aPowerPrevScal[NO_MID_RES_BINS]; /*!< Last power value (each bin) of previous frame */ FIXP_DBL h11rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) coefficients */ FIXP_DBL h12rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) coefficients */ FIXP_DBL h21rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) coefficients */ FIXP_DBL h22rPrev[NO_IID_GROUPS]; /*!< previous calculated h(xy) coefficients */ PS_DEC_COEFFICIENTS coef; /*!< temporal coefficients (reusable scratch memory) */ } mpeg; } specificTo; }; typedef struct PS_DEC *HANDLE_PS_DEC; int CreatePsDec(HANDLE_PS_DEC *h_PS_DEC, int aacSamplesPerFrame); int DeletePsDec(HANDLE_PS_DEC *h_PS_DEC); void scalFilterBankValues( HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ FIXP_DBL **fixpQmfReal, /* qmf filterbank values */ FIXP_DBL **fixpQmfImag, /* qmf filterbank values */ int lsb, /* sbr start subband */ int scaleFactorLowBandSplitLow, int scaleFactorLowBandSplitHigh, SCHAR *scaleFactorLowBand_lb, SCHAR *scaleFactorLowBand_hb, int scaleFactorHighBands, INT *scaleFactorHighBand, INT noCols); void rescalFilterBankValues( HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ FIXP_DBL **QmfBufferReal, /* qmf filterbank values */ FIXP_DBL **QmfBufferImag, /* qmf filterbank values */ int lsb, /* sbr start subband */ INT noCols); void initSlotBasedRotation( HANDLE_PS_DEC h_ps_d, int env, int usb); void ApplyPsSlot( HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ FIXP_DBL **rIntBufferLeft, /* real values of left qmf timeslot */ FIXP_DBL **iIntBufferLeft, /* imag values of left qmf timeslot */ FIXP_DBL *rIntBufferRight, /* real values of right qmf timeslot */ FIXP_DBL *iIntBufferRight); /* imag values of right qmf timeslot */ #endif /* __PSDEC_H */ fdk-aac-0.1.3/libSBRdec/src/env_extr.h0000644000175000017500000003477312372261464020013 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Envelope extraction prototypes */ #ifndef __ENVELOPE_EXTRACTION_H #define __ENVELOPE_EXTRACTION_H #include "sbrdecoder.h" #include "FDK_bitstream.h" #include "lpp_tran.h" #include "psdec.h" #define ENV_EXP_FRACT 0 /*!< Shift raw envelope data to support fractional numbers. Can be set to 8 instead of 0 to enhance accuracy during concealment. This is not required for conformance and #requantizeEnvelopeData() will become more expensive. */ #define EXP_BITS 6 /*!< Size of exponent-part of a pseudo float envelope value (should be at least 6). The remaining bits in each word are used for the mantissa (should be at least 10). This format is used in the arrays iEnvelope[] and sbrNoiseFloorLevel[] in the FRAME_DATA struct which must fit in a certain part of the output buffer (See buffer management in sbr_dec.cpp). Exponents and mantissas could also be stored in separate arrays. Accessing the exponent or the mantissa would be simplified and the masks #MASK_E resp. #MASK_M would no longer be required. */ #define MASK_M (((1 << (FRACT_BITS - EXP_BITS)) - 1) << EXP_BITS) /*!< Mask for extracting the mantissa of a pseudo float envelope value */ #define MASK_E ((1 << EXP_BITS) - 1) /*!< Mask for extracting the exponent of a pseudo float envelope value */ #define SIGN_EXT ( ((SCHAR)-1) ^ MASK_E) /*!< a CHAR-constant with all bits above our sign-bit set */ #define ROUNDING ( (FIXP_SGL)(1<<(EXP_BITS-1)) ) /*!< 0.5-offset for rounding the mantissa of a pseudo-float envelope value */ #define NRG_EXP_OFFSET 16 /*!< Will be added to the reference energy's exponent to prevent negative numbers */ #define NOISE_EXP_OFFSET 38 /*!< Will be added to the noise level exponent to prevent negative numbers */ typedef enum { HEADER_NOT_PRESENT, HEADER_OK, HEADER_RESET } SBR_HEADER_STATUS; typedef enum { SBR_NOT_INITIALIZED, UPSAMPLING, SBR_HEADER, SBR_ACTIVE } SBR_SYNC_STATE; typedef enum { COUPLING_OFF = 0, COUPLING_LEVEL, COUPLING_BAL } COUPLING_MODE; typedef struct { UCHAR nSfb[2]; /*!< Number of SBR-bands for low and high freq-resolution */ UCHAR nNfb; /*!< Actual number of noise bands to read from the bitstream*/ UCHAR numMaster; /*!< Number of SBR-bands in v_k_master */ UCHAR lowSubband; /*!< QMF-band where SBR frequency range starts */ UCHAR highSubband; /*!< QMF-band where SBR frequency range ends */ UCHAR limiterBandTable[MAX_NUM_LIMITERS+1]; /*!< Limiter band table. */ UCHAR noLimiterBands; /*!< Number of limiter bands. */ UCHAR nInvfBands; /*!< Number of bands for inverse filtering */ UCHAR *freqBandTable[2]; /*!< Pointers to freqBandTableLo and freqBandTableHi */ UCHAR freqBandTableLo[MAX_FREQ_COEFFS/2+1]; /*!< Mapping of SBR bands to QMF bands for low frequency resolution */ UCHAR freqBandTableHi[MAX_FREQ_COEFFS+1]; /*!< Mapping of SBR bands to QMF bands for high frequency resolution */ UCHAR freqBandTableNoise[MAX_NOISE_COEFFS+1]; /*!< Mapping of SBR noise bands to QMF bands */ UCHAR v_k_master[MAX_FREQ_COEFFS+1]; /*!< Master BandTable which freqBandTable is derived from */ } FREQ_BAND_DATA; typedef FREQ_BAND_DATA *HANDLE_FREQ_BAND_DATA; #define SBRDEC_ELD_GRID 1 #define SBRDEC_SYNTAX_SCAL 2 #define SBRDEC_SYNTAX_USAC 4 #define SBRDEC_SYNTAX_RSVD50 8 #define SBRDEC_LOW_POWER 16 /* Flag indicating that Low Power QMF mode shall be used. */ #define SBRDEC_PS_DECODED 32 /* Flag indicating that PS was decoded and rendered. */ #define SBRDEC_LD_MPS_QMF 512 /* Flag indicating that the LD-MPS QMF shall be used. */ #define SBRDEC_HDR_STAT_RESET 1 #define SBRDEC_HDR_STAT_UPDATE 2 typedef struct { UCHAR ampResolution; /*!< Amplitude resolution of envelope values (0: 1.5dB, 1: 3dB) */ UCHAR xover_band; /*!< Start index in #v_k_master[] used for dynamic crossover frequency */ UCHAR sbr_preprocessing; /*!< SBR prewhitening flag. */ } SBR_HEADER_DATA_BS_INFO; typedef struct { /* Changes in these variables causes a reset of the decoder */ UCHAR startFreq; /*!< Index for SBR start frequency */ UCHAR stopFreq; /*!< Index for SBR highest frequency */ UCHAR freqScale; /*!< 0: linear scale, 1-3 logarithmic scales */ UCHAR alterScale; /*!< Flag for coarser frequency resolution */ UCHAR noise_bands; /*!< Noise bands per octave, read from bitstream*/ /* don't require reset */ UCHAR limiterBands; /*!< Index for number of limiter bands per octave */ UCHAR limiterGains; /*!< Index to select gain limit */ UCHAR interpolFreq; /*!< Select gain calculation method (1: per QMF channel, 0: per SBR band) */ UCHAR smoothingLength; /*!< Smoothing of gains over time (0: on 1: off) */ } SBR_HEADER_DATA_BS; typedef struct { SBR_SYNC_STATE syncState; /*!< The current initialization status of the header */ UCHAR status; /*!< Flags field used for signaling a reset right before the processing starts and an update from config (e.g. ASC). */ UCHAR frameErrorFlag; /*!< Frame data valid flag. CAUTION: This variable will be overwritten by the flag stored in the element structure. This is necessary because of the frame delay. There it might happen that different slots use the same header. */ UCHAR numberTimeSlots; /*!< AAC: 16,15 */ UCHAR numberOfAnalysisBands; /*!< Number of QMF analysis bands */ UCHAR timeStep; /*!< Time resolution of SBR in QMF-slots */ UINT sbrProcSmplRate; /*!< SBR processing sampling frequency (!= OutputSamplingRate) (always: CoreSamplingRate * UpSamplingFactor; even in single rate mode) */ SBR_HEADER_DATA_BS bs_data; /*!< current SBR header. */ SBR_HEADER_DATA_BS_INFO bs_info; /*!< SBR info. */ FREQ_BAND_DATA freqBandData; /*!< Pointer to struct #FREQ_BAND_DATA */ } SBR_HEADER_DATA; typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; typedef struct { UCHAR frameClass; /*!< Select grid type */ UCHAR nEnvelopes; /*!< Number of envelopes */ UCHAR borders[MAX_ENVELOPES+1]; /*!< Envelope borders (in SBR-timeslots, e.g. mp3PRO: 0..11) */ UCHAR freqRes[MAX_ENVELOPES]; /*!< Frequency resolution for each envelope (0=low, 1=high) */ SCHAR tranEnv; /*!< Transient envelope, -1 if none */ UCHAR nNoiseEnvelopes; /*!< Number of noise envelopes */ UCHAR bordersNoise[MAX_NOISE_ENVELOPES+1];/*!< borders of noise envelopes */ } FRAME_INFO; typedef struct { FIXP_SGL sfb_nrg_prev[MAX_FREQ_COEFFS]; /*!< Previous envelope (required for differential-coded values) */ FIXP_SGL prevNoiseLevel[MAX_NOISE_COEFFS]; /*!< Previous noise envelope (required for differential-coded values) */ COUPLING_MODE coupling; /*!< Stereo-mode of previous frame */ INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Previous strength of filtering in transposer */ UCHAR ampRes; /*!< Previous amplitude resolution (0: 1.5dB, 1: 3dB) */ UCHAR stopPos; /*!< Position in time where last envelope ended */ UCHAR frameErrorFlag; /*!< Previous frame status */ } SBR_PREV_FRAME_DATA; typedef SBR_PREV_FRAME_DATA *HANDLE_SBR_PREV_FRAME_DATA; typedef struct { int nScaleFactors; /*!< total number of scalefactors in frame */ FRAME_INFO frameInfo; /*!< time grid for current frame */ UCHAR domain_vec[MAX_ENVELOPES]; /*!< Bitfield containing direction of delta-coding for each envelope (0:frequency, 1:time) */ UCHAR domain_vec_noise[MAX_NOISE_ENVELOPES]; /*!< Same as above, but for noise envelopes */ INVF_MODE sbr_invf_mode[MAX_INVF_BANDS]; /*!< Strength of filtering in transposer */ COUPLING_MODE coupling; /*!< Stereo-mode */ int ampResolutionCurrentFrame; /*!< Amplitude resolution of envelope values (0: 1.5dB, 1: 3dB) */ UCHAR addHarmonics[MAX_FREQ_COEFFS]; /*!< Flags for synthetic sine addition */ FIXP_SGL iEnvelope[MAX_NUM_ENVELOPE_VALUES]; /*!< Envelope data */ FIXP_SGL sbrNoiseFloorLevel[MAX_NUM_NOISE_VALUES]; /*!< Noise envelope data */ } SBR_FRAME_DATA; typedef SBR_FRAME_DATA *HANDLE_SBR_FRAME_DATA; void initSbrPrevFrameData (HANDLE_SBR_PREV_FRAME_DATA h_prev_data, int timeSlots); int sbrGetSingleChannelElement (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA hFrameData, HANDLE_FDK_BITSTREAM hBitBuf, HANDLE_PS_DEC hParametricStereoDec, const UINT flags, const int overlap ); int sbrGetChannelPairElement (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA hFrameDataLeft, HANDLE_SBR_FRAME_DATA hFrameDataRight, HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags, const int overlap); SBR_HEADER_STATUS sbrGetHeaderData (HANDLE_SBR_HEADER_DATA headerData, HANDLE_FDK_BITSTREAM hBitBuf, const UINT flags, const int fIsSbrData); /*! \brief Initialize SBR header data Copy default values to the header data struct and patch some entries depending on the core codec. */ SBR_ERROR initHeaderData ( HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, const int sampleRateOut, const int samplesPerFrame, const UINT flags ); #endif fdk-aac-0.1.3/libSBRdec/src/psdec_hybrid.cpp0000644000175000017500000006203212372261464021140 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "psdec_hybrid.h" #include "fft.h" #include "sbr_ram.h" #include "FDK_tools_rom.h" #include "sbr_rom.h" /******************************************************************************* Functionname: InitHybridFilterBank ******************************************************************************* Description: Init one instance of HANDLE_HYBRID stuct Arguments: Return: none *******************************************************************************/ SBR_ERROR InitHybridFilterBank ( HANDLE_HYBRID hs, /*!< Handle to HYBRID struct. */ SCHAR frameSize, /*!< Framesize (in Qmf súbband samples). */ SCHAR noBands, /*!< Number of Qmf bands for hybrid filtering. */ const UCHAR *pResolution ) /*!< Resolution in Qmf bands (length noBands). */ { SCHAR i; UCHAR maxNoChannels = 0; for (i = 0; i < noBands; i++) { hs->pResolution[i] = pResolution[i]; if(pResolution[i] > maxNoChannels) maxNoChannels = pResolution[i]; } hs->nQmfBands = noBands; hs->frameSize = frameSize; hs->qmfBufferMove = HYBRID_FILTER_LENGTH - 1; hs->sf_mQmfBuffer = 0; return SBRDEC_OK; } /******************************************************************************* Functionname: dualChannelFiltering ******************************************************************************* Description: fast 2-channel real-valued filtering with 6-tap delay. Arguments: Return: none *******************************************************************************/ /*! 2 channel filter
   Filter Coefs:
   0.0,
   0.01899487526049,
   0.0,
   -0.07293139167538,
   0.0,
   0.30596630545168,
   0.5,
   0.30596630545168,
   0.0,
   -0.07293139167538,
   0.0,
   0.01899487526049,
   0.0


   Filter design:
   h[q,n] = g[n] * cos(2pi/2 * q * (n-6) );  n = 0..12,  q = 0,1;

   ->  h[0,n] = g[n] * 1;
   ->  h[1,n] = g[n] * pow(-1,n);
*/ static void slotBasedDualChannelFiltering( const FIXP_DBL *pQmfReal, const FIXP_DBL *pQmfImag, FIXP_DBL *mHybridReal, FIXP_DBL *mHybridImag) { FIXP_DBL t1, t3, t5, t6; /* symmetric filter coefficients */ /* you don't have to shift the result after fMult because of p2_13_20 <= 0.5 */ t1 = fMultDiv2(p2_13_20[1] , ( (pQmfReal[1] >> 1) + (pQmfReal[11] >> 1))); t3 = fMultDiv2(p2_13_20[3] , ( (pQmfReal[3] >> 1) + (pQmfReal[ 9] >> 1))); t5 = fMultDiv2(p2_13_20[5] , ( (pQmfReal[5] >> 1) + (pQmfReal[ 7] >> 1))); t6 = fMultDiv2(p2_13_20[6] , (pQmfReal[6] >> 1) ); mHybridReal[0] = (t1 + t3 + t5 + t6) << 2; mHybridReal[1] = (- t1 - t3 - t5 + t6) << 2; t1 = fMultDiv2(p2_13_20[1] , ( (pQmfImag[1] >> 1) + (pQmfImag[11] >> 1))); t3 = fMultDiv2(p2_13_20[3] , ( (pQmfImag[3] >> 1) + (pQmfImag[ 9] >> 1))); t5 = fMultDiv2(p2_13_20[5] , ( (pQmfImag[5] >> 1) + (pQmfImag[ 7] >> 1))); t6 = fMultDiv2(p2_13_20[6] , pQmfImag[6] >> 1 ); mHybridImag[0] = (t1 + t3 + t5 + t6) << 2; mHybridImag[1] = (- t1 - t3 - t5 + t6) << 2; } /******************************************************************************* Functionname: eightChannelFiltering ******************************************************************************* Description: fast 8-channel complex-valued filtering with 6-tap delay. Arguments: Return: none *******************************************************************************/ /*! 8 channel filter Implementation using a FFT of length 8
   prototype filter coefficients:
   0.00746082949812   0.02270420949825   0.04546865930473   0.07266113929591   0.09885108575264   0.11793710567217
   0.125
   0.11793710567217   0.09885108575264   0.07266113929591   0.04546865930473   0.02270420949825   0.00746082949812

   Filter design:
   N = 13; Q = 8;
   h[q,n]       = g[n] * exp(j * 2 * pi / Q * (q + .5) * (n - 6));  n = 0..(N-1),  q = 0..(Q-1);

   Time Signal:   x[t];
   Filter Bank Output
   y[q,t] = conv(x[t],h[q,t]) = conv(h[q,t],x[t]) = sum(x[k] * h[q, t - k] ) = sum(h[q, k] * x[t - k] ); k = 0..(N-1);

   y[q,t] =   x[t - 12]*h[q, 12]  +  x[t - 11]*h[q, 11]  +  x[t - 10]*h[q, 10]  +  x[t -  9]*h[q,  9]
           +  x[t -  8]*h[q,  8]  +  x[t -  7]*h[q,  7]
           +  x[t -  6]*h[q,  6]
           +  x[t -  5]*h[q,  5]  +  x[t -  4]*h[q,  4]
           +  x[t -  3]*h[q,  3]  +  x[t -  2]*h[q,  2]  +  x[t -  1]*h[q,  1]  +  x[t -  0]*h[q,  0];

   h'[q, n] = h[q,(N-1)-n] = g[n] * exp(j * 2 * pi / Q * (q + .5) * (6 - n));  n = 0..(N-1),  q = 0..(Q-1);

   y[q,t] =   x[t - 12]*h'[q,  0]  +  x[t - 11]*h'[q,  1]  +  x[t - 10]*h'[q,  2]  +  x[t -  9]*h'[q,  3]
           +  x[t -  8]*h'[q,  4]  +  x[t -  7]*h'[q,  5]
           +  x[t -  6]*h'[q,  6]
           +  x[t -  5]*h'[q,  7]  +  x[t -  4]*h'[q,  8]
           +  x[t -  3]*h'[q,  9]  +  x[t -  2]*h'[q, 10]  +  x[t -  1]*h'[q, 11]  +  x[t -  0]*h'[q, 12];

   Try to split off FFT Modulation Term:
   FFT(x[t], q) = sum(x[t+k]*exp(-j*2*pi/N *q * k))
                                           c                                           m
   Step 1:  h'[q,n] = g[n] * ( exp(j * 2 * pi / 8 * .5 * (6 - n)) ) * ( exp (j * 2 * pi / 8 * q * (6 - n)) );

    h'[q,n] = g[n] *c[n] * m[q,n]; (see above)
    c[n]    = exp( j * 2 * pi / 8 * .5 * (6 - n) );
    m[q,n]  = exp( j * 2 * pi / 8 *  q * (6 - n) );

    y[q,t] = x[t -  0]*g[0]*c[0]*m[q,0]  +  x[t -  1]*g[1]*c[ 1]*m[q, 1]  + ...
             ...                         +  x[t - 12]*g[2]*c[12]*m[q,12];

                                                                              |
    n                   m                            *exp(-j*2*pi)            |   n'                   fft
-------------------------------------------------------------------------------------------------------------------------
    0       exp( j * 2 * pi / 8 * q * 6) ->  exp(-j * 2 * pi / 8 * q * 2)     |   2         exp(-j * 2 * pi / 8 * q * 0)
    1       exp( j * 2 * pi / 8 * q * 5) ->  exp(-j * 2 * pi / 8 * q * 3)     |   3         exp(-j * 2 * pi / 8 * q * 1)
    2       exp( j * 2 * pi / 8 * q * 4) ->  exp(-j * 2 * pi / 8 * q * 4)     |   4         exp(-j * 2 * pi / 8 * q * 2)
    3       exp( j * 2 * pi / 8 * q * 3) ->  exp(-j * 2 * pi / 8 * q * 5)     |   5         exp(-j * 2 * pi / 8 * q * 3)
    4       exp( j * 2 * pi / 8 * q * 2) ->  exp(-j * 2 * pi / 8 * q * 6)     |   6         exp(-j * 2 * pi / 8 * q * 4)
    5       exp( j * 2 * pi / 8 * q * 1) ->  exp(-j * 2 * pi / 8 * q * 7)     |   7         exp(-j * 2 * pi / 8 * q * 5)
    6       exp( j * 2 * pi / 8 * q * 0)                                      |   0         exp(-j * 2 * pi / 8 * q * 6)
    7       exp(-j * 2 * pi / 8 * q * 1)                                      |   1         exp(-j * 2 * pi / 8 * q * 7)
    8       exp(-j * 2 * pi / 8 * q * 2)                                      |   2
    9       exp(-j * 2 * pi / 8 * q * 3)                                      |   3
    10      exp(-j * 2 * pi / 8 * q * 4)                                      |   4
    11      exp(-j * 2 * pi / 8 * q * 5)                                      |   5
    12      exp(-j * 2 * pi / 8 * q * 6)                                      |   6


    now use fft modulation coefficients
    m[6]  =       = fft[0]
    m[7]  =       = fft[1]
    m[8]  = m[ 0] = fft[2]
    m[9]  = m[ 1] = fft[3]
    m[10] = m[ 2] = fft[4]
    m[11] = m[ 3] = fft[5]
    m[12] = m[ 4] = fft[6]
            m[ 5] = fft[7]

    y[q,t] = (                       x[t- 6]*g[ 6]*c[ 6] ) * fft[q,0]  +
             (                       x[t- 7]*g[ 7]*c[ 7] ) * fft[q,1]  +
             ( x[t- 0]*g[ 0]*c[ 0] + x[t- 8]*g[ 8]*c[ 8] ) * fft[q,2]  +
             ( x[t- 1]*g[ 1]*c[ 1] + x[t- 9]*g[ 9]*c[ 9] ) * fft[q,3]  +
             ( x[t- 2]*g[ 2]*c[ 2] + x[t-10]*g[10]*c[10] ) * fft[q,4]  +
             ( x[t- 3]*g[ 3]*c[ 3] + x[t-11]*g[11]*c[11] ) * fft[q,5]  +
             ( x[t- 4]*g[ 4]*c[ 4] + x[t-12]*g[12]*c[12] ) * fft[q,6]  +
             ( x[t- 5]*g[ 5]*c[ 5]                       ) * fft[q,7];

    pre twiddle factors c[n] = exp(j * 2 * pi / 8 * .5 * (6 - n));
    n                c]           |  n                c[n]         |  n                c[n]
---------------------------------------------------------------------------------------------------
    0       exp( j * 6 * pi / 8)  |  1       exp( j * 5 * pi / 8)  |  2       exp( j * 4 * pi / 8)
    3       exp( j * 3 * pi / 8)  |  4       exp( j * 2 * pi / 8)  |  5       exp( j * 1 * pi / 8)
    6       exp( j * 0 * pi / 8)  |  7       exp(-j * 1 * pi / 8)  |  8       exp(-j * 2 * pi / 8)
    9       exp(-j * 3 * pi / 8)  | 10       exp(-j * 4 * pi / 8)  | 11       exp(-j * 5 * pi / 8)
   12       exp(-j * 6 * pi / 8)  |                                |
*/ /* defining rotation factors for *ChannelFiltering */ #define cos0Pi FL2FXCONST_DBL( 1.f) #define sin0Pi FL2FXCONST_DBL( 0.f) #define cos1Pi FL2FXCONST_DBL(-1.f) #define sin1Pi FL2FXCONST_DBL( 0.f) #define cos1Pi_2 FL2FXCONST_DBL( 0.f) #define sin1Pi_2 FL2FXCONST_DBL( 1.f) #define cos1Pi_3 FL2FXCONST_DBL( 0.5f) #define sin1Pi_3 FL2FXCONST_DBL( 0.86602540378444f) #define cos0Pi_4 cos0Pi #define cos1Pi_4 FL2FXCONST_DBL(0.70710678118655f) #define cos2Pi_4 cos1Pi_2 #define cos3Pi_4 (-cos1Pi_4) #define cos4Pi_4 (-cos0Pi_4) #define cos5Pi_4 cos3Pi_4 #define cos6Pi_4 cos2Pi_4 #define sin0Pi_4 sin0Pi #define sin1Pi_4 FL2FXCONST_DBL(0.70710678118655f) #define sin2Pi_4 sin1Pi_2 #define sin3Pi_4 sin1Pi_4 #define sin4Pi_4 sin0Pi_4 #define sin5Pi_4 (-sin3Pi_4) #define sin6Pi_4 (-sin2Pi_4) #define cos0Pi_8 cos0Pi #define cos1Pi_8 FL2FXCONST_DBL(0.92387953251129f) #define cos2Pi_8 cos1Pi_4 #define cos3Pi_8 FL2FXCONST_DBL(0.38268343236509f) #define cos4Pi_8 cos2Pi_4 #define cos5Pi_8 (-cos3Pi_8) #define cos6Pi_8 (-cos2Pi_8) #define sin0Pi_8 sin0Pi #define sin1Pi_8 cos3Pi_8 #define sin2Pi_8 sin1Pi_4 #define sin3Pi_8 cos1Pi_8 #define sin4Pi_8 sin2Pi_4 #define sin5Pi_8 sin3Pi_8 #define sin6Pi_8 sin1Pi_4 #if defined(ARCH_PREFER_MULT_32x16) #define FIXP_HYB FIXP_SGL #define FIXP_CAST FX_DBL2FX_SGL #else #define FIXP_HYB FIXP_DBL #define FIXP_CAST #endif static const FIXP_HYB cr[13] = { FIXP_CAST(cos6Pi_8), FIXP_CAST(cos5Pi_8), FIXP_CAST(cos4Pi_8), FIXP_CAST(cos3Pi_8), FIXP_CAST(cos2Pi_8), FIXP_CAST(cos1Pi_8), FIXP_CAST(cos0Pi_8), FIXP_CAST(cos1Pi_8), FIXP_CAST(cos2Pi_8), FIXP_CAST(cos3Pi_8), FIXP_CAST(cos4Pi_8), FIXP_CAST(cos5Pi_8), FIXP_CAST(cos6Pi_8) }; static const FIXP_HYB ci[13] = { FIXP_CAST( sin6Pi_8), FIXP_CAST( sin5Pi_8), FIXP_CAST( sin4Pi_8), FIXP_CAST( sin3Pi_8), FIXP_CAST( sin2Pi_8), FIXP_CAST( sin1Pi_8), FIXP_CAST( sin0Pi_8) , FIXP_CAST(-sin1Pi_8), FIXP_CAST(-sin2Pi_8), FIXP_CAST(-sin3Pi_8), FIXP_CAST(-sin4Pi_8), FIXP_CAST(-sin5Pi_8), FIXP_CAST(-sin6Pi_8) }; static void slotBasedEightChannelFiltering( const FIXP_DBL *pQmfReal, const FIXP_DBL *pQmfImag, FIXP_DBL *mHybridReal, FIXP_DBL *mHybridImag) { int bin; FIXP_DBL _fft[128 + ALIGNMENT_DEFAULT - 1]; FIXP_DBL *fft = (FIXP_DBL *)ALIGN_PTR(_fft); #if defined(ARCH_PREFER_MULT_32x16) const FIXP_SGL *p = p8_13_20; /* BASELINE_PS */ #else const FIXP_DBL *p = p8_13_20; /* BASELINE_PS */ #endif /* pre twiddeling */ /* x*(a*b + c*d) = fMultDiv2(x, fMultAddDiv2(fMultDiv2(a, b), c, d)) */ /* x*(a*b - c*d) = fMultDiv2(x, fMultSubDiv2(fMultDiv2(a, b), c, d)) */ FIXP_DBL accu1, accu2, accu3, accu4; #define TWIDDLE_1(n_0,n_1,n_2) \ cplxMultDiv2(&accu1, &accu2, pQmfReal[n_0], pQmfImag[n_0], cr[n_0], ci[n_0]); \ accu1 = fMultDiv2(p[n_0], accu1); \ accu2 = fMultDiv2(p[n_0], accu2); \ cplxMultDiv2(&accu3, &accu4, pQmfReal[n_1], pQmfImag[n_1], cr[n_1], ci[n_1]); \ accu3 = fMultDiv2(p[n_1], accu3); \ accu4 = fMultDiv2(p[n_1], accu4); \ fft[FIXP_FFT_IDX_R(n_2)] = accu1 + accu3; \ fft[FIXP_FFT_IDX_I(n_2)] = accu2 + accu4; #define TWIDDLE_0(n_0,n_1) \ cplxMultDiv2(&accu1, &accu2, pQmfReal[n_0], pQmfImag[n_0], cr[n_0], ci[n_0]); \ fft[FIXP_FFT_IDX_R(n_1)] = fMultDiv2(p[n_0], accu1); \ fft[FIXP_FFT_IDX_I(n_1)] = fMultDiv2(p[n_0], accu2); TWIDDLE_0( 6, 0) TWIDDLE_0( 7, 1) TWIDDLE_1( 0, 8, 2) TWIDDLE_1( 1, 9, 3) TWIDDLE_1( 2,10, 4) TWIDDLE_1( 3,11, 5) TWIDDLE_1( 4,12, 6) TWIDDLE_0( 5, 7) fft_8 (fft); /* resort fft data into output array*/ for(bin=0; bin<8;bin++ ) { mHybridReal[bin] = fft[FIXP_FFT_IDX_R(bin)] << 4; mHybridImag[bin] = fft[FIXP_FFT_IDX_I(bin)] << 4; } } /******************************************************************************* Functionname: fillHybridDelayLine ******************************************************************************* Description: The delay line of the hybrid filter is filled and copied from left to right. Return: none *******************************************************************************/ void fillHybridDelayLine( FIXP_DBL **fixpQmfReal, /*!< Qmf real Values */ FIXP_DBL **fixpQmfImag, /*!< Qmf imag Values */ FIXP_DBL fixpHybridLeftR[12], /*!< Hybrid real Values left channel */ FIXP_DBL fixpHybridLeftI[12], /*!< Hybrid imag Values left channel */ FIXP_DBL fixpHybridRightR[12], /*!< Hybrid real Values right channel */ FIXP_DBL fixpHybridRightI[12], /*!< Hybrid imag Values right channel */ HANDLE_HYBRID hHybrid ) { int i; for (i = 0; i < HYBRID_FILTER_DELAY; i++) { slotBasedHybridAnalysis ( fixpQmfReal[i], fixpQmfReal[i], fixpHybridLeftR, fixpHybridLeftI, hHybrid ); } FDKmemcpy(fixpHybridRightR, fixpHybridLeftR, sizeof(FIXP_DBL)*NO_SUB_QMF_CHANNELS); FDKmemcpy(fixpHybridRightI, fixpHybridLeftI, sizeof(FIXP_DBL)*NO_SUB_QMF_CHANNELS); } /******************************************************************************* Functionname: slotBasedHybridAnalysis ******************************************************************************* Description: The lower QMF subbands are further split to provide better frequency resolution for PS processing. Return: none *******************************************************************************/ void slotBasedHybridAnalysis ( FIXP_DBL *fixpQmfReal, /*!< Qmf real Values */ FIXP_DBL *fixpQmfImag, /*!< Qmf imag Values */ FIXP_DBL fixpHybridReal[12], /*!< Hybrid real Values */ FIXP_DBL fixpHybridImag[12], /*!< Hybrid imag Values */ HANDLE_HYBRID hHybrid) { int k, band; HYBRID_RES hybridRes; int chOffset = 0; C_ALLOC_SCRATCH_START(pTempRealSlot, FIXP_DBL, 4*HYBRID_FILTER_LENGTH); FIXP_DBL *pTempImagSlot = pTempRealSlot + HYBRID_FILTER_LENGTH; FIXP_DBL *pWorkRealSlot = pTempImagSlot + HYBRID_FILTER_LENGTH; FIXP_DBL *pWorkImagSlot = pWorkRealSlot + HYBRID_FILTER_LENGTH; /*! Hybrid filtering is applied to the first hHybrid->nQmfBands QMF bands (3 when 10 or 20 stereo bands are used, 5 when 34 stereo bands are used). For the remaining QMF bands a delay would be necessary. But there is no need to implement a delay because there is a look-ahead of HYBRID_FILTER_DELAY = 6 QMF samples in the low-band buffer. */ for(band = 0; band < hHybrid->nQmfBands; band++) { /* get hybrid resolution per qmf band */ /* in case of baseline ps 10/20 band stereo mode : */ /* */ /* qmfBand[0] : 8 ( HYBRID_8_CPLX ) */ /* qmfBand[1] : 2 ( HYBRID_2_REAL ) */ /* qmfBand[2] : 2 ( HYBRID_2_REAL ) */ /* */ /* (split the 3 lower qmf band to 12 hybrid bands) */ hybridRes = (HYBRID_RES)hHybrid->pResolution[band]; FDKmemcpy(pWorkRealSlot, hHybrid->mQmfBufferRealSlot[band], hHybrid->qmfBufferMove * sizeof(FIXP_DBL)); FDKmemcpy(pWorkImagSlot, hHybrid->mQmfBufferImagSlot[band], hHybrid->qmfBufferMove * sizeof(FIXP_DBL)); pWorkRealSlot[hHybrid->qmfBufferMove] = fixpQmfReal[band]; pWorkImagSlot[hHybrid->qmfBufferMove] = fixpQmfImag[band]; FDKmemcpy(hHybrid->mQmfBufferRealSlot[band], pWorkRealSlot + 1, hHybrid->qmfBufferMove * sizeof(FIXP_DBL)); FDKmemcpy(hHybrid->mQmfBufferImagSlot[band], pWorkImagSlot + 1, hHybrid->qmfBufferMove * sizeof(FIXP_DBL)); if (fixpQmfReal) { /* actual filtering only if output signal requested */ switch( hybridRes ) { /* HYBRID_2_REAL & HYBRID_8_CPLX are only needful for baseline ps */ case HYBRID_2_REAL: slotBasedDualChannelFiltering( pWorkRealSlot, pWorkImagSlot, pTempRealSlot, pTempImagSlot); break; case HYBRID_8_CPLX: slotBasedEightChannelFiltering( pWorkRealSlot, pWorkImagSlot, pTempRealSlot, pTempImagSlot); break; default: FDK_ASSERT(0); } for(k = 0; k < (SCHAR)hybridRes; k++) { fixpHybridReal [chOffset + k] = pTempRealSlot[k]; fixpHybridImag [chOffset + k] = pTempImagSlot[k]; } chOffset += hybridRes; } /* if (mHybridReal) */ } /* group hybrid channels 3+4 -> 3 and 2+5 -> 2 */ fixpHybridReal[3] += fixpHybridReal[4]; fixpHybridImag[3] += fixpHybridImag[4]; fixpHybridReal[4] = (FIXP_DBL)0; fixpHybridImag[4] = (FIXP_DBL)0; fixpHybridReal[2] += fixpHybridReal[5]; fixpHybridImag[2] += fixpHybridImag[5]; fixpHybridReal[5] = (FIXP_DBL)0; fixpHybridImag[5] = (FIXP_DBL)0; /* free memory on scratch */ C_ALLOC_SCRATCH_END(pTempRealSlot, FIXP_DBL, 4*HYBRID_FILTER_LENGTH); } /******************************************************************************* Functionname: slotBasedHybridSynthesis ******************************************************************************* Description: The coefficients offering higher resolution for the lower QMF channel are simply added prior to the synthesis with the 54 subbands QMF. Arguments: Return: none *******************************************************************************/ /*!
      l,r0(n) ---\
      l,r1(n) ---- + --\
      l,r2(n) ---/      \
                         + --> F0(w)
      l,r3(n) ---\      /
      l,r4(n) ---- + --/
      l,r5(n) ---/


      l,r6(n) ---\
                  + ---------> F1(w)
      l,r7(n) ---/


      l,r8(n) ---\
                  + ---------> F2(w)
      l,r9(n) ---/

    
Hybrid QMF synthesis filterbank for the 10 and 20 stereo-bands configurations. The coefficients offering higher resolution for the lower QMF channel are simply added prior to the synthesis with the 54 subbands QMF. [see ISO/IEC 14496-3:2001/FDAM 2:2004(E) - Page 52] */ void slotBasedHybridSynthesis ( FIXP_DBL *fixpHybridReal, /*!< Hybrid real Values */ FIXP_DBL *fixpHybridImag, /*!< Hybrid imag Values */ FIXP_DBL *fixpQmfReal, /*!< Qmf real Values */ FIXP_DBL *fixpQmfImag, /*!< Qmf imag Values */ HANDLE_HYBRID hHybrid ) /*!< Handle to HYBRID struct. */ { int k, band; HYBRID_RES hybridRes; int chOffset = 0; for(band = 0; band < hHybrid->nQmfBands; band++) { FIXP_DBL qmfReal = FL2FXCONST_DBL(0.f); FIXP_DBL qmfImag = FL2FXCONST_DBL(0.f); hybridRes = (HYBRID_RES)hHybrid->pResolution[band]; for(k = 0; k < (SCHAR)hybridRes; k++) { qmfReal += fixpHybridReal[chOffset + k]; qmfImag += fixpHybridImag[chOffset + k]; } fixpQmfReal[band] = qmfReal; fixpQmfImag[band] = qmfImag; chOffset += hybridRes; } } fdk-aac-0.1.3/libSBRdec/src/sbrdec_drc.h0000644000175000017500000001411612372261464020240 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Dynamic range control (DRC) decoder tool for SBR ******************************************************************************/ #ifndef _SBRDEC_DRC_H_ #define _SBRDEC_DRC_H_ #include "sbrdecoder.h" #define SBRDEC_MAX_DRC_CHANNELS (6) #define SBRDEC_MAX_DRC_BANDS ( 16 ) typedef struct { FIXP_DBL prevFact_mag[(64)]; INT prevFact_exp; FIXP_DBL currFact_mag[SBRDEC_MAX_DRC_BANDS]; FIXP_DBL nextFact_mag[SBRDEC_MAX_DRC_BANDS]; INT currFact_exp; INT nextFact_exp; UINT numBandsCurr; UINT numBandsNext; USHORT bandTopCurr[SBRDEC_MAX_DRC_BANDS]; USHORT bandTopNext[SBRDEC_MAX_DRC_BANDS]; SHORT drcInterpolationSchemeCurr; SHORT drcInterpolationSchemeNext; SHORT enable; UCHAR winSequenceCurr; UCHAR winSequenceNext; } SBRDEC_DRC_CHANNEL; typedef SBRDEC_DRC_CHANNEL * HANDLE_SBR_DRC_CHANNEL; void sbrDecoder_drcInitChannel ( HANDLE_SBR_DRC_CHANNEL hDrcData ); void sbrDecoder_drcUpdateChannel ( HANDLE_SBR_DRC_CHANNEL hDrcData ); void sbrDecoder_drcApplySlot ( HANDLE_SBR_DRC_CHANNEL hDrcData, FIXP_DBL *qmfRealSlot, FIXP_DBL *qmfImagSlot, int col, int numQmfSubSamples, int maxShift ); void sbrDecoder_drcApply ( HANDLE_SBR_DRC_CHANNEL hDrcData, FIXP_DBL **QmfBufferReal, FIXP_DBL **QmfBufferImag, int numQmfSubSamples, int *scaleFactor ); #endif /* _SBRDEC_DRC_H_ */ fdk-aac-0.1.3/libSBRdec/src/lpp_tran.cpp0000644000175000017500000010566112372261464020326 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Low Power Profile Transposer, This module provides the transposer. The main entry point is lppTransposer(). The function generates high frequency content by copying data from the low band (provided by core codec) into the high band. This process is also referred to as "patching". The function also implements spectral whitening by means of inverse filtering based on LPC coefficients. Together with the QMF filterbank the transposer can be tested using a supplied test program. See main_audio.cpp for details. This module does use fractional arithmetic and the accuracy of the computations has an impact on the overall sound quality. The module also needs to take into account the different scaling of spectral data. \sa lppTransposer(), main_audio.cpp, sbr_scale.h, \ref documentationOverview */ #include "lpp_tran.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "genericStds.h" #include "autocorr2nd.h" #if defined(__arm__) #include "arm/lpp_tran_arm.cpp" #endif #define LPC_SCALE_FACTOR 2 /*! * * \brief Get bandwidth expansion factor from filtering level * * Returns a filter parameter (bandwidth expansion factor) depending on * the desired filtering level signalled in the bitstream. * When switching the filtering level from LOW to OFF, an additional * level is being inserted to achieve a smooth transition. */ #ifndef FUNCTION_mapInvfMode static FIXP_DBL mapInvfMode (INVF_MODE mode, INVF_MODE prevMode, WHITENING_FACTORS whFactors) { switch (mode) { case INVF_LOW_LEVEL: if(prevMode == INVF_OFF) return whFactors.transitionLevel; else return whFactors.lowLevel; case INVF_MID_LEVEL: return whFactors.midLevel; case INVF_HIGH_LEVEL: return whFactors.highLevel; default: if(prevMode == INVF_LOW_LEVEL) return whFactors.transitionLevel; else return whFactors.off; } } #endif /* #ifndef FUNCTION_mapInvfMode */ /*! * * \brief Perform inverse filtering level emphasis * * Retrieve bandwidth expansion factor and apply smoothing for each filter band * */ #ifndef FUNCTION_inverseFilteringLevelEmphasis static void inverseFilteringLevelEmphasis(HANDLE_SBR_LPP_TRANS hLppTrans,/*!< Handle of lpp transposer */ UCHAR nInvfBands, /*!< Number of bands for inverse filtering */ INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ INVF_MODE *sbr_invf_mode_prev, /*!< Previous inverse filtering modes */ FIXP_DBL * bwVector /*!< Resulting filtering levels */ ) { for(int i = 0; i < nInvfBands; i++) { FIXP_DBL accu; FIXP_DBL bwTmp = mapInvfMode (sbr_invf_mode[i], sbr_invf_mode_prev[i], hLppTrans->pSettings->whFactors); if(bwTmp < hLppTrans->bwVectorOld[i]) { accu = fMultDiv2(FL2FXCONST_DBL(0.75f),bwTmp) + fMultDiv2(FL2FXCONST_DBL(0.25f),hLppTrans->bwVectorOld[i]); } else { accu = fMultDiv2(FL2FXCONST_DBL(0.90625f),bwTmp) + fMultDiv2(FL2FXCONST_DBL(0.09375f),hLppTrans->bwVectorOld[i]); } if (accu < FL2FXCONST_DBL(0.015625f)>>1) bwVector[i] = FL2FXCONST_DBL(0.0f); else bwVector[i] = fixMin(accu<<1,FL2FXCONST_DBL(0.99609375f)); } } #endif /* #ifndef FUNCTION_inverseFilteringLevelEmphasis */ /* Resulting autocorrelation determinant exponent */ #define ACDET_EXP (2*(DFRACT_BITS+sbrScaleFactor->lb_scale+10-ac.det_scale)) #define AC_EXP (-sbrScaleFactor->lb_scale+LPC_SCALE_FACTOR) #define ALPHA_EXP (-sbrScaleFactor->lb_scale+LPC_SCALE_FACTOR+1) /* Resulting transposed QMF values exponent 16 bit normalized samplebits assumed. */ #define QMFOUT_EXP ((SAMPLE_BITS-15)-sbrScaleFactor->lb_scale) /*! * * \brief Perform transposition by patching of subband samples. * This function serves as the main entry point into the module. The function determines the areas for the * patching process (these are the source range as well as the target range) and implements spectral whitening * by means of inverse filtering. The function autoCorrelation2nd() is an auxiliary function for calculating the * LPC coefficients for the filtering. The actual calculation of the LPC coefficients and the implementation * of the filtering are done as part of lppTransposer(). * * Note that the filtering is done on all available QMF subsamples, whereas the patching is only done on those QMF * subsamples that will be used in the next QMF synthesis. The filtering is also implemented before the patching * includes further dependencies on parameters from the SBR data. * */ void lppTransposer (HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ FIXP_DBL **qmfBufferReal, /*!< Pointer to pointer to real part of subband samples (source) */ FIXP_DBL *degreeAlias, /*!< Vector for results of aliasing estimation */ FIXP_DBL **qmfBufferImag, /*!< Pointer to pointer to imaginary part of subband samples (source) */ const int useLP, const int timeStep, /*!< Time step of envelope */ const int firstSlotOffs, /*!< Start position in time */ const int lastSlotOffs, /*!< Number of overlap-slots into next frame */ const int nInvfBands, /*!< Number of bands for inverse filtering */ INVF_MODE *sbr_invf_mode, /*!< Current inverse filtering modes */ INVF_MODE *sbr_invf_mode_prev /*!< Previous inverse filtering modes */ ) { INT bwIndex[MAX_NUM_PATCHES]; FIXP_DBL bwVector[MAX_NUM_PATCHES]; /*!< pole moving factors */ int i; int loBand, start, stop; TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings; PATCH_PARAM *patchParam = pSettings->patchParam; int patch; FIXP_SGL alphar[LPC_ORDER], a0r, a1r; FIXP_SGL alphai[LPC_ORDER], a0i=0, a1i=0; FIXP_SGL bw = FL2FXCONST_SGL(0.0f); int autoCorrLength; FIXP_DBL k1, k1_below=0, k1_below2=0; ACORR_COEFS ac; int startSample; int stopSample; int stopSampleClear; int comLowBandScale; int ovLowBandShift; int lowBandShift; /* int ovHighBandShift;*/ int targetStopBand; alphai[0] = FL2FXCONST_SGL(0.0f); alphai[1] = FL2FXCONST_SGL(0.0f); startSample = firstSlotOffs * timeStep; stopSample = pSettings->nCols + lastSlotOffs * timeStep; inverseFilteringLevelEmphasis(hLppTrans, nInvfBands, sbr_invf_mode, sbr_invf_mode_prev, bwVector); stopSampleClear = stopSample; autoCorrLength = pSettings->nCols + pSettings->overlap; /* Set upper subbands to zero: This is required in case that the patches do not cover the complete highband (because the last patch would be too short). Possible optimization: Clearing bands up to usb would be sufficient here. */ targetStopBand = patchParam[pSettings->noOfPatches-1].targetStartBand + patchParam[pSettings->noOfPatches-1].numBandsInPatch; int memSize = ((64) - targetStopBand) * sizeof(FIXP_DBL); if (!useLP) { for (i = startSample; i < stopSampleClear; i++) { FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize); FDKmemclear(&qmfBufferImag[i][targetStopBand], memSize); } } else for (i = startSample; i < stopSampleClear; i++) { FDKmemclear(&qmfBufferReal[i][targetStopBand], memSize); } /* init bwIndex for each patch */ FDKmemclear(bwIndex, pSettings->noOfPatches*sizeof(INT)); /* Calc common low band scale factor */ comLowBandScale = fixMin(sbrScaleFactor->ov_lb_scale,sbrScaleFactor->lb_scale); ovLowBandShift = sbrScaleFactor->ov_lb_scale - comLowBandScale; lowBandShift = sbrScaleFactor->lb_scale - comLowBandScale; /* ovHighBandShift = firstSlotOffs == 0 ? ovLowBandShift:0;*/ /* outer loop over bands to do analysis only once for each band */ if (!useLP) { start = pSettings->lbStartPatching; stop = pSettings->lbStopPatching; } else { start = fixMax(1, pSettings->lbStartPatching - 2); stop = patchParam[0].targetStartBand; } for ( loBand = start; loBand < stop; loBand++ ) { FIXP_DBL lowBandReal[(((1024)/(32))+(6))+LPC_ORDER]; FIXP_DBL *plowBandReal = lowBandReal; FIXP_DBL **pqmfBufferReal = qmfBufferReal; FIXP_DBL lowBandImag[(((1024)/(32))+(6))+LPC_ORDER]; FIXP_DBL *plowBandImag = lowBandImag; FIXP_DBL **pqmfBufferImag = qmfBufferImag; int resetLPCCoeffs=0; int dynamicScale = DFRACT_BITS-1-LPC_SCALE_FACTOR; int acDetScale = 0; /* scaling of autocorrelation determinant */ for(i=0;ilpcFilterStatesReal[i][loBand]; if (!useLP) *plowBandImag++ = hLppTrans->lpcFilterStatesImag[i][loBand]; } /* Take old slope length qmf slot source values out of (overlap)qmf buffer */ if (!useLP) { for(i=0;inCols+pSettings->overlap;i++){ *plowBandReal++ = (*pqmfBufferReal++)[loBand]; *plowBandImag++ = (*pqmfBufferImag++)[loBand]; } } else { /* pSettings->overlap is always even */ FDK_ASSERT((pSettings->overlap & 1) == 0); for(i=0;i<((pSettings->overlap+pSettings->nCols)>>1);i++) { *plowBandReal++ = (*pqmfBufferReal++)[loBand]; *plowBandReal++ = (*pqmfBufferReal++)[loBand]; } if (pSettings->nCols & 1) { *plowBandReal++ = (*pqmfBufferReal++)[loBand]; } } /* Determine dynamic scaling value. */ dynamicScale = fixMin(dynamicScale, getScalefactor(lowBandReal, LPC_ORDER+pSettings->overlap) + ovLowBandShift); dynamicScale = fixMin(dynamicScale, getScalefactor(&lowBandReal[LPC_ORDER+pSettings->overlap], pSettings->nCols) + lowBandShift); if (!useLP) { dynamicScale = fixMin(dynamicScale, getScalefactor(lowBandImag, LPC_ORDER+pSettings->overlap) + ovLowBandShift); dynamicScale = fixMin(dynamicScale, getScalefactor(&lowBandImag[LPC_ORDER+pSettings->overlap], pSettings->nCols) + lowBandShift); } dynamicScale = fixMax(0, dynamicScale-1); /* one additional bit headroom to prevent -1.0 */ /* Scale temporal QMF buffer. */ scaleValues(&lowBandReal[0], LPC_ORDER+pSettings->overlap, dynamicScale-ovLowBandShift); scaleValues(&lowBandReal[LPC_ORDER+pSettings->overlap], pSettings->nCols, dynamicScale-lowBandShift); if (!useLP) { scaleValues(&lowBandImag[0], LPC_ORDER+pSettings->overlap, dynamicScale-ovLowBandShift); scaleValues(&lowBandImag[LPC_ORDER+pSettings->overlap], pSettings->nCols, dynamicScale-lowBandShift); } if (!useLP) { acDetScale += autoCorr2nd_cplx(&ac, lowBandReal+LPC_ORDER, lowBandImag+LPC_ORDER, autoCorrLength); } else { acDetScale += autoCorr2nd_real(&ac, lowBandReal+LPC_ORDER, autoCorrLength); } /* Examine dynamic of determinant in autocorrelation. */ acDetScale += 2*(comLowBandScale + dynamicScale); acDetScale *= 2; /* two times reflection coefficent scaling */ acDetScale += ac.det_scale; /* ac scaling of determinant */ /* In case of determinant < 10^-38, resetLPCCoeffs=1 has to be enforced. */ if (acDetScale>126 ) { resetLPCCoeffs = 1; } alphar[1] = FL2FXCONST_SGL(0.0f); if (!useLP) alphai[1] = FL2FXCONST_SGL(0.0f); if (ac.det != FL2FXCONST_DBL(0.0f)) { FIXP_DBL tmp,absTmp,absDet; absDet = fixp_abs(ac.det); if (!useLP) { tmp = ( fMultDiv2(ac.r01r,ac.r12r) >> (LPC_SCALE_FACTOR-1) ) - ( (fMultDiv2(ac.r01i,ac.r12i) + fMultDiv2(ac.r02r,ac.r11r)) >> (LPC_SCALE_FACTOR-1) ); } else { tmp = ( fMultDiv2(ac.r01r,ac.r12r) >> (LPC_SCALE_FACTOR-1) ) - ( fMultDiv2(ac.r02r,ac.r11r) >> (LPC_SCALE_FACTOR-1) ); } absTmp = fixp_abs(tmp); /* Quick check: is first filter coeff >= 1(4) */ { INT scale; FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); scale = scale+ac.det_scale; if ( (scale > 0) && (result >= (FIXP_DBL)MAXVAL_DBL>>scale) ) { resetLPCCoeffs = 1; } else { alphar[1] = FX_DBL2FX_SGL(scaleValue(result,scale)); if((tmp> (LPC_SCALE_FACTOR-1) ) + ( (fMultDiv2(ac.r01r,ac.r12i) - (FIXP_DBL)fMultDiv2(ac.r02i,ac.r11r)) >> (LPC_SCALE_FACTOR-1) ) ; absTmp = fixp_abs(tmp); /* Quick check: is second filter coeff >= 1(4) */ { INT scale; FIXP_DBL result = fDivNorm(absTmp, absDet, &scale); scale = scale+ac.det_scale; if ( (scale > 0) && (result >= /*FL2FXCONST_DBL(1.f)*/ (FIXP_DBL)MAXVAL_DBL>>scale) ) { resetLPCCoeffs = 1; } else { alphai[1] = FX_DBL2FX_SGL(scaleValue(result,scale)); if((tmp=0 */ FIXP_DBL tmp,absTmp; if (!useLP) { tmp = (ac.r01r>>(LPC_SCALE_FACTOR+1)) + (fMultDiv2(alphar[1],ac.r12r) + fMultDiv2(alphai[1],ac.r12i)); } else { if(ac.r01r>=FL2FXCONST_DBL(0.0f)) tmp = (ac.r01r>>(LPC_SCALE_FACTOR+1)) + fMultDiv2(alphar[1],ac.r12r); else tmp = -((-ac.r01r)>>(LPC_SCALE_FACTOR+1)) + fMultDiv2(alphar[1],ac.r12r); } absTmp = fixp_abs(tmp); /* Quick check: is first filter coeff >= 1(4) */ if (absTmp >= (ac.r11r>>1)) { resetLPCCoeffs=1; } else { INT scale; FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); alphar[0] = FX_DBL2FX_SGL(scaleValue(result,scale+1)); if((tmp>FL2FX_DBL(0.0f)) ^ (ac.r11r>(LPC_SCALE_FACTOR+1)) + (fMultDiv2(alphai[1],ac.r12r) - fMultDiv2(alphar[1],ac.r12i)); absTmp = fixp_abs(tmp); /* Quick check: is second filter coeff >= 1(4) */ if (absTmp >= (ac.r11r>>1)) { resetLPCCoeffs=1; } else { INT scale; FIXP_DBL result = fDivNorm(absTmp, fixp_abs(ac.r11r), &scale); alphai[0] = FX_DBL2FX_SGL(scaleValue(result,scale+1)); if((tmp>FL2FX_DBL(0.0f)) ^ (ac.r11r= FL2FXCONST_DBL(0.5f) ) resetLPCCoeffs=1; if( (fMultDiv2(alphar[1],alphar[1]) + fMultDiv2(alphai[1],alphai[1])) >= FL2FXCONST_DBL(0.5f) ) resetLPCCoeffs=1; } if(resetLPCCoeffs){ alphar[0] = FL2FXCONST_SGL(0.0f); alphar[1] = FL2FXCONST_SGL(0.0f); if (!useLP) { alphai[0] = FL2FXCONST_SGL(0.0f); alphai[1] = FL2FXCONST_SGL(0.0f); } } if (useLP) { /* Aliasing detection */ if(ac.r11r==FL2FXCONST_DBL(0.0f)) { k1 = FL2FXCONST_DBL(0.0f); } else { if ( fixp_abs(ac.r01r) >= fixp_abs(ac.r11r) ) { if ( fMultDiv2(ac.r01r,ac.r11r) < FL2FX_DBL(0.0f)) { k1 = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_SGL(1.0f)*/; }else { /* Since this value is squared later, it must not ever become -1.0f. */ k1 = (FIXP_DBL)(MINVAL_DBL+1) /*FL2FXCONST_SGL(-1.0f)*/; } } else { INT scale; FIXP_DBL result = fDivNorm(fixp_abs(ac.r01r), fixp_abs(ac.r11r), &scale); k1 = scaleValue(result,scale); if(!((ac.r01r 1){ /* Check if the gain should be locked */ FIXP_DBL deg = /*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - fPow2(k1_below); degreeAlias[loBand] = FL2FXCONST_DBL(0.0f); if (((loBand & 1) == 0) && (k1 < FL2FXCONST_DBL(0.0f))){ if (k1_below < FL2FXCONST_DBL(0.0f)) { /* 2-Ch Aliasing Detection */ degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; if ( k1_below2 > FL2FXCONST_DBL(0.0f) ) { /* 3-Ch Aliasing Detection */ degreeAlias[loBand-1] = deg; } } else if ( k1_below2 > FL2FXCONST_DBL(0.0f) ) { /* 3-Ch Aliasing Detection */ degreeAlias[loBand] = deg; } } if (((loBand & 1) == 1) && (k1 > FL2FXCONST_DBL(0.0f))){ if (k1_below > FL2FXCONST_DBL(0.0f)) { /* 2-CH Aliasing Detection */ degreeAlias[loBand] = (FIXP_DBL)MAXVAL_DBL /*FL2FXCONST_DBL(1.0f)*/; if ( k1_below2 < FL2FXCONST_DBL(0.0f) ) { /* 3-CH Aliasing Detection */ degreeAlias[loBand-1] = deg; } } else if ( k1_below2 < FL2FXCONST_DBL(0.0f) ) { /* 3-CH Aliasing Detection */ degreeAlias[loBand] = deg; } } } /* remember k1 values of the 2 QMF channels below the current channel */ k1_below2 = k1_below; k1_below = k1; } patch = 0; while ( patch < pSettings->noOfPatches ) { /* inner loop over every patch */ int hiBand = loBand + patchParam[patch].targetBandOffs; if ( loBand < patchParam[patch].sourceStartBand || loBand >= patchParam[patch].sourceStopBand //|| hiBand >= hLppTrans->pSettings->noChannels ) { /* Lowband not in current patch - proceed */ patch++; continue; } FDK_ASSERT( hiBand < (64) ); /* bwIndex[patch] is already initialized with value from previous band inside this patch */ while (hiBand >= pSettings->bwBorders[bwIndex[patch]]) bwIndex[patch]++; /* Filter Step 2: add the left slope with the current filter to the buffer pure source values are already in there */ bw = FX_DBL2FX_SGL(bwVector[bwIndex[patch]]); a0r = FX_DBL2FX_SGL(fMult(bw,alphar[0])); /* Apply current bandwidth expansion factor */ if (!useLP) a0i = FX_DBL2FX_SGL(fMult(bw,alphai[0])); bw = FX_DBL2FX_SGL(fPow2(bw)); a1r = FX_DBL2FX_SGL(fMult(bw,alphar[1])); if (!useLP) a1i = FX_DBL2FX_SGL(fMult(bw,alphai[1])); /* Filter Step 3: insert the middle part which won't be windowed */ if ( bw <= FL2FXCONST_SGL(0.0f) ) { if (!useLP) { int descale = fixMin(DFRACT_BITS-1, (LPC_SCALE_FACTOR+dynamicScale)); for(i = startSample; i < stopSample; i++ ) { qmfBufferReal[i][hiBand] = lowBandReal[LPC_ORDER+i]>>descale; qmfBufferImag[i][hiBand] = lowBandImag[LPC_ORDER+i]>>descale; } } else { int descale = fixMin(DFRACT_BITS-1, (LPC_SCALE_FACTOR+dynamicScale)); for(i = startSample; i < stopSample; i++ ) { qmfBufferReal[i][hiBand] = lowBandReal[LPC_ORDER+i]>>descale; } } } else { /* bw <= 0 */ if (!useLP) { int descale = fixMin(DFRACT_BITS-1, (LPC_SCALE_FACTOR+dynamicScale)); #ifdef FUNCTION_LPPTRANSPOSER_func1 lppTransposer_func1(lowBandReal+LPC_ORDER+startSample,lowBandImag+LPC_ORDER+startSample, qmfBufferReal+startSample,qmfBufferImag+startSample, stopSample-startSample, (int) hiBand, dynamicScale,descale, a0r, a0i, a1r, a1i); #else for(i = startSample; i < stopSample; i++ ) { FIXP_DBL accu1, accu2; accu1 = (fMultDiv2(a0r,lowBandReal[LPC_ORDER+i-1]) - fMultDiv2(a0i,lowBandImag[LPC_ORDER+i-1]) + fMultDiv2(a1r,lowBandReal[LPC_ORDER+i-2]) - fMultDiv2(a1i,lowBandImag[LPC_ORDER+i-2]))>>dynamicScale; accu2 = (fMultDiv2(a0i,lowBandReal[LPC_ORDER+i-1]) + fMultDiv2(a0r,lowBandImag[LPC_ORDER+i-1]) + fMultDiv2(a1i,lowBandReal[LPC_ORDER+i-2]) + fMultDiv2(a1r,lowBandImag[LPC_ORDER+i-2]))>>dynamicScale; qmfBufferReal[i][hiBand] = (lowBandReal[LPC_ORDER+i]>>descale) + (accu1<<1); qmfBufferImag[i][hiBand] = (lowBandImag[LPC_ORDER+i]>>descale) + (accu2<<1); } #endif } else { int descale = fixMin(DFRACT_BITS-1, (LPC_SCALE_FACTOR+dynamicScale)); FDK_ASSERT(dynamicScale >= 0); for(i = startSample; i < stopSample; i++ ) { FIXP_DBL accu1; accu1 = (fMultDiv2(a0r,lowBandReal[LPC_ORDER+i-1]) + fMultDiv2(a1r,lowBandReal[LPC_ORDER+i-2]))>>dynamicScale; qmfBufferReal[i][hiBand] = (lowBandReal[LPC_ORDER+i]>>descale) + (accu1<<1); } } } /* bw <= 0 */ patch++; } /* inner loop over patches */ /* * store the unmodified filter coefficients if there is * an overlapping envelope *****************************************************************/ } /* outer loop over bands (loBand) */ if (useLP) { for ( loBand = pSettings->lbStartPatching; loBand < pSettings->lbStopPatching; loBand++ ) { patch = 0; while ( patch < pSettings->noOfPatches ) { UCHAR hiBand = loBand + patchParam[patch].targetBandOffs; if ( loBand < patchParam[patch].sourceStartBand || loBand >= patchParam[patch].sourceStopBand || hiBand >= (64) /* Highband out of range (biterror) */ ) { /* Lowband not in current patch or highband out of range (might be caused by biterrors)- proceed */ patch++; continue; } if(hiBand != patchParam[patch].targetStartBand) degreeAlias[hiBand] = degreeAlias[loBand]; patch++; } }/* end for loop */ } for (i = 0; i < nInvfBands; i++ ) { hLppTrans->bwVectorOld[i] = bwVector[i]; } /* set high band scale factor */ sbrScaleFactor->hb_scale = comLowBandScale-(LPC_SCALE_FACTOR); } /*! * * \brief Initialize one low power transposer instance * * */ SBR_ERROR createLppTransposer (HANDLE_SBR_LPP_TRANS hs, /*!< Handle of low power transposer */ TRANSPOSER_SETTINGS *pSettings, /*!< Pointer to settings */ const int highBandStartSb, /*!< ? */ UCHAR *v_k_master, /*!< Master table */ const int numMaster, /*!< Valid entries in master table */ const int usb, /*!< Highband area stop subband */ const int timeSlots, /*!< Number of time slots */ const int nCols, /*!< Number of colums (codec qmf bank) */ UCHAR *noiseBandTable, /*!< Mapping of SBR noise bands to QMF bands */ const int noNoiseBands, /*!< Number of noise bands */ UINT fs, /*!< Sample Frequency */ const int chan, /*!< Channel number */ const int overlap ) { /* FB inverse filtering settings */ hs->pSettings = pSettings; pSettings->nCols = nCols; pSettings->overlap = overlap; switch (timeSlots) { case 15: case 16: break; default: return SBRDEC_UNSUPPORTED_CONFIG; /* Unimplemented */ } if (chan==0) { /* Init common data only once */ hs->pSettings->nCols = nCols; return resetLppTransposer (hs, highBandStartSb, v_k_master, numMaster, noiseBandTable, noNoiseBands, usb, fs); } return SBRDEC_OK; } static int findClosestEntry(UCHAR goalSb, UCHAR *v_k_master, UCHAR numMaster, UCHAR direction) { int index; if( goalSb <= v_k_master[0] ) return v_k_master[0]; if( goalSb >= v_k_master[numMaster] ) return v_k_master[numMaster]; if(direction) { index = 0; while( v_k_master[index] < goalSb ) { index++; } } else { index = numMaster; while( v_k_master[index] > goalSb ) { index--; } } return v_k_master[index]; } /*! * * \brief Reset memory for one lpp transposer instance * * \return SBRDEC_OK on success, SBRDEC_UNSUPPORTED_CONFIG on error */ SBR_ERROR resetLppTransposer (HANDLE_SBR_LPP_TRANS hLppTrans, /*!< Handle of lpp transposer */ UCHAR highBandStartSb, /*!< High band area: start subband */ UCHAR *v_k_master, /*!< Master table */ UCHAR numMaster, /*!< Valid entries in master table */ UCHAR *noiseBandTable, /*!< Mapping of SBR noise bands to QMF bands */ UCHAR noNoiseBands, /*!< Number of noise bands */ UCHAR usb, /*!< High band area: stop subband */ UINT fs /*!< SBR output sampling frequency */ ) { TRANSPOSER_SETTINGS *pSettings = hLppTrans->pSettings; PATCH_PARAM *patchParam = pSettings->patchParam; int i, patch; int targetStopBand; int sourceStartBand; int patchDistance; int numBandsInPatch; int lsb = v_k_master[0]; /* Start subband expressed in "non-critical" sampling terms*/ int xoverOffset = highBandStartSb - lsb; /* Calculate distance in QMF bands between k0 and kx */ int startFreqHz; int desiredBorder; usb = fixMin(usb, v_k_master[numMaster]); /* Avoid endless loops (compare with float code). */ /* * Plausibility check */ if ( lsb - SHIFT_START_SB < 4 ) { return SBRDEC_UNSUPPORTED_CONFIG; } /* * Initialize the patching parameter */ /* ISO/IEC 14496-3 (Figure 4.48): goalSb = round( 2.048e6 / fs ) */ desiredBorder = (((2048000*2) / fs) + 1) >> 1; desiredBorder = findClosestEntry(desiredBorder, v_k_master, numMaster, 1); /* Adapt region to master-table */ /* First patch */ sourceStartBand = SHIFT_START_SB + xoverOffset; targetStopBand = lsb + xoverOffset; /* upperBand */ /* Even (odd) numbered channel must be patched to even (odd) numbered channel */ patch = 0; while(targetStopBand < usb) { /* Too many patches? Allow MAX_NUM_PATCHES+1 patches here. we need to check later again, since patch might be the highest patch AND contain less than 3 bands => actual number of patches will be reduced by 1. */ if (patch > MAX_NUM_PATCHES) { return SBRDEC_UNSUPPORTED_CONFIG; } patchParam[patch].guardStartBand = targetStopBand; patchParam[patch].targetStartBand = targetStopBand; numBandsInPatch = desiredBorder - targetStopBand; /* Get the desired range of the patch */ if ( numBandsInPatch >= lsb - sourceStartBand ) { /* Desired number bands are not available -> patch whole source range */ patchDistance = targetStopBand - sourceStartBand; /* Get the targetOffset */ patchDistance = patchDistance & ~1; /* Rounding off odd numbers and make all even */ numBandsInPatch = lsb - (targetStopBand - patchDistance); /* Update number of bands to be patched */ numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, v_k_master, numMaster, 0) - targetStopBand; /* Adapt region to master-table */ } /* Desired number bands are available -> get the minimal even patching distance */ patchDistance = numBandsInPatch + targetStopBand - lsb; /* Get minimal distance */ patchDistance = (patchDistance + 1) & ~1; /* Rounding up odd numbers and make all even */ if (numBandsInPatch > 0) { patchParam[patch].sourceStartBand = targetStopBand - patchDistance; patchParam[patch].targetBandOffs = patchDistance; patchParam[patch].numBandsInPatch = numBandsInPatch; patchParam[patch].sourceStopBand = patchParam[patch].sourceStartBand + numBandsInPatch; targetStopBand += patchParam[patch].numBandsInPatch; patch++; } /* All patches but first */ sourceStartBand = SHIFT_START_SB; /* Check if we are close to desiredBorder */ if( desiredBorder - targetStopBand < 3) /* MPEG doc */ { desiredBorder = usb; } } patch--; /* If highest patch contains less than three subband: skip it */ if ( (patch>0) && (patchParam[patch].numBandsInPatch < 3) ) { patch--; targetStopBand = patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch; } /* now check if we don't have one too many */ if (patch >= MAX_NUM_PATCHES) { return SBRDEC_UNSUPPORTED_CONFIG; } pSettings->noOfPatches = patch + 1; /* Check lowest and highest source subband */ pSettings->lbStartPatching = targetStopBand; pSettings->lbStopPatching = 0; for ( patch = 0; patch < pSettings->noOfPatches; patch++ ) { pSettings->lbStartPatching = fixMin( pSettings->lbStartPatching, patchParam[patch].sourceStartBand ); pSettings->lbStopPatching = fixMax( pSettings->lbStopPatching, patchParam[patch].sourceStopBand ); } for(i = 0 ; i < noNoiseBands; i++){ pSettings->bwBorders[i] = noiseBandTable[i+1]; } /* * Choose whitening factors */ startFreqHz = ( (lsb + xoverOffset)*fs ) >> 7; /* Shift does a division by 2*(64) */ for( i = 1; i < NUM_WHFACTOR_TABLE_ENTRIES; i++ ) { if( startFreqHz < FDK_sbrDecoder_sbr_whFactorsIndex[i]) break; } i--; pSettings->whFactors.off = FDK_sbrDecoder_sbr_whFactorsTable[i][0]; pSettings->whFactors.transitionLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][1]; pSettings->whFactors.lowLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][2]; pSettings->whFactors.midLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][3]; pSettings->whFactors.highLevel = FDK_sbrDecoder_sbr_whFactorsTable[i][4]; return SBRDEC_OK; } fdk-aac-0.1.3/libSBRdec/src/psbitdec.cpp0000644000175000017500000005066612372261464020310 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "psbitdec.h" #include "sbr_rom.h" #include "huff_dec.h" /* PS dec privat functions */ SBR_ERROR ResetPsDec(HANDLE_PS_DEC h_ps_d); void ResetPsDeCor (HANDLE_PS_DEC h_ps_d); /***************************************************************************/ /*! \brief huffman decoding by codebook table \return index of huffman codebook table ****************************************************************************/ static SCHAR decode_huff_cw (Huffman h, /*!< pointer to huffman codebook table */ HANDLE_FDK_BITSTREAM hBitBuf, /*!< Handle to Bitbuffer */ int *length) /*!< length of huffman codeword (or NULL) */ { UCHAR bit = 0; SCHAR index = 0; UCHAR bitCount = 0; while (index >= 0) { bit = FDKreadBits (hBitBuf, 1); bitCount++; index = h[index][bit]; } if (length) { *length = bitCount; } return( index+64 ); /* Add offset */ } /***************************************************************************/ /*! \brief helper function - limiting of value to min/max values \return limited value ****************************************************************************/ static SCHAR limitMinMax(SCHAR i, SCHAR min, SCHAR max) { if (imax) return max; else return i; } /***************************************************************************/ /*! \brief Decodes delta values in-place and updates data buffers according to quantization classes. When delta coded in frequency the first element is deltacode from zero. aIndex buffer is decoded from delta values to actual values. \return none ****************************************************************************/ static void deltaDecodeArray(SCHAR enable, SCHAR *aIndex, /*!< ICC/IID parameters */ SCHAR *aPrevFrameIndex, /*!< ICC/IID parameters of previous frame */ SCHAR DtDf, UCHAR nrElements, /*!< as conveyed in bitstream */ /*!< output array size: nrElements*stride */ UCHAR stride, /*!< 1=dflt, 2=half freq. resolution */ SCHAR minIdx, SCHAR maxIdx) { int i; /* Delta decode */ if ( enable==1 ) { if (DtDf == 0) { /* Delta coded in freq */ aIndex[0] = 0 + aIndex[0]; aIndex[0] = limitMinMax(aIndex[0],minIdx,maxIdx); for (i = 1; i < nrElements; i++) { aIndex[i] = aIndex[i-1] + aIndex[i]; aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); } } else { /* Delta time */ for (i = 0; i < nrElements; i++) { aIndex[i] = aPrevFrameIndex[i*stride] + aIndex[i]; aIndex[i] = limitMinMax(aIndex[i],minIdx,maxIdx); } } } else { /* No data is sent, set index to zero */ for (i = 0; i < nrElements; i++) { aIndex[i] = 0; } } if (stride==2) { for (i=nrElements*stride-1; i>0; i--) { aIndex[i] = aIndex[i>>1]; } } } /***************************************************************************/ /*! \brief Mapping of ICC/IID parameters to 20 stereo bands \return none ****************************************************************************/ static void map34IndexTo20 (SCHAR *aIndex, /*!< decoded ICC/IID parameters */ UCHAR noBins) /*!< number of stereo bands */ { aIndex[0] = (2*aIndex[0]+aIndex[1])/3; aIndex[1] = (aIndex[1]+2*aIndex[2])/3; aIndex[2] = (2*aIndex[3]+aIndex[4])/3; aIndex[3] = (aIndex[4]+2*aIndex[5])/3; aIndex[4] = (aIndex[6]+aIndex[7])/2; aIndex[5] = (aIndex[8]+aIndex[9])/2; aIndex[6] = aIndex[10]; aIndex[7] = aIndex[11]; aIndex[8] = (aIndex[12]+aIndex[13])/2; aIndex[9] = (aIndex[14]+aIndex[15])/2; aIndex[10] = aIndex[16]; /* For IPD/OPD it stops here */ if (noBins == NO_HI_RES_BINS) { aIndex[11] = aIndex[17]; aIndex[12] = aIndex[18]; aIndex[13] = aIndex[19]; aIndex[14] = (aIndex[20]+aIndex[21])/2; aIndex[15] = (aIndex[22]+aIndex[23])/2; aIndex[16] = (aIndex[24]+aIndex[25])/2; aIndex[17] = (aIndex[26]+aIndex[27])/2; aIndex[18] = (aIndex[28]+aIndex[29]+aIndex[30]+aIndex[31])/4; aIndex[19] = (aIndex[32]+aIndex[33])/2; } } /***************************************************************************/ /*! \brief Decodes delta coded IID, ICC, IPD and OPD indices \return PS processing flag. If set to 1 ****************************************************************************/ int DecodePs( struct PS_DEC *h_ps_d, /*!< PS handle */ const UCHAR frameError ) /*!< Flag telling that frame had errors */ { MPEG_PS_BS_DATA *pBsData; UCHAR gr, env; int bPsHeaderValid, bPsDataAvail; /* Shortcuts to avoid deferencing and keep the code readable */ pBsData = &h_ps_d->bsData[h_ps_d->processSlot].mpeg; bPsHeaderValid = pBsData->bPsHeaderValid; bPsDataAvail = (h_ps_d->bPsDataAvail[h_ps_d->processSlot] == ppt_mpeg) ? 1 : 0; /*************************************************************************************** * Decide whether to process or to conceal PS data or not. */ if ( ( h_ps_d->psDecodedPrv && !frameError && !bPsDataAvail) || (!h_ps_d->psDecodedPrv && (frameError || !bPsDataAvail || !bPsHeaderValid)) ) { /* Don't apply PS processing. * Declare current PS header and bitstream data invalid. */ pBsData->bPsHeaderValid = 0; h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; return (0); } if (frameError || !bPsHeaderValid) { /* no new PS data available (e.g. frame loss) */ /* => keep latest data constant (i.e. FIX with noEnv=0) */ pBsData->noEnv = 0; } /*************************************************************************************** * Decode bitstream payload or prepare parameter for concealment: */ for (env=0; envnoEnv; env++) { SCHAR *aPrevIidIndex; SCHAR *aPrevIccIndex; UCHAR noIidSteps = pBsData->bFineIidQ?NO_IID_STEPS_FINE:NO_IID_STEPS; if (env==0) { aPrevIidIndex = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex; aPrevIccIndex = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex; } else { aPrevIidIndex = pBsData->aaIidIndex[env-1]; aPrevIccIndex = pBsData->aaIccIndex[env-1]; } deltaDecodeArray(pBsData->bEnableIid, pBsData->aaIidIndex[env], aPrevIidIndex, pBsData->abIidDtFlag[env], FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid], (pBsData->freqResIid)?1:2, -noIidSteps, noIidSteps); deltaDecodeArray(pBsData->bEnableIcc, pBsData->aaIccIndex[env], aPrevIccIndex, pBsData->abIccDtFlag[env], FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc], (pBsData->freqResIcc)?1:2, 0, NO_ICC_STEPS-1); } /* for (env=0; envnoEnv; env++) */ /* handling of FIX noEnv=0 */ if (pBsData->noEnv==0) { /* set noEnv=1, keep last parameters or force 0 if not enabled */ pBsData->noEnv = 1; if (pBsData->bEnableIid) { for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { pBsData->aaIidIndex[pBsData->noEnv-1][gr] = h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr]; } } else { for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { pBsData->aaIidIndex[pBsData->noEnv-1][gr] = 0; } } if (pBsData->bEnableIcc) { for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { pBsData->aaIccIndex[pBsData->noEnv-1][gr] = h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr]; } } else { for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { pBsData->aaIccIndex[pBsData->noEnv-1][gr] = 0; } } } /* Update previous frame index buffers */ for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { h_ps_d->specificTo.mpeg.aIidPrevFrameIndex[gr] = pBsData->aaIidIndex[pBsData->noEnv-1][gr]; } for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { h_ps_d->specificTo.mpeg.aIccPrevFrameIndex[gr] = pBsData->aaIccIndex[pBsData->noEnv-1][gr]; } /* PS data from bitstream (if avail) was decoded now */ h_ps_d->bPsDataAvail[h_ps_d->processSlot] = ppt_none; /* handling of env borders for FIX & VAR */ if (pBsData->bFrameClass == 0) { /* FIX_BORDERS NoEnv=0,1,2,4 */ pBsData->aEnvStartStop[0] = 0; for (env=1; envnoEnv; env++) { pBsData->aEnvStartStop[env] = (env * h_ps_d->noSubSamples) / pBsData->noEnv; } pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; /* 1024 (32 slots) env borders: 0, 8, 16, 24, 32 */ /* 960 (30 slots) env borders: 0, 7, 15, 22, 30 */ } else { /* if (h_ps_d->bFrameClass == 0) */ /* VAR_BORDERS NoEnv=1,2,3,4 */ pBsData->aEnvStartStop[0] = 0; /* handle case aEnvStartStop[noEnv]aEnvStartStop[pBsData->noEnv] < h_ps_d->noSubSamples) { for (gr = 0; gr < NO_HI_RES_IID_BINS; gr++) { pBsData->aaIidIndex[pBsData->noEnv][gr] = pBsData->aaIidIndex[pBsData->noEnv-1][gr]; } for (gr = 0; gr < NO_HI_RES_ICC_BINS; gr++) { pBsData->aaIccIndex[pBsData->noEnv][gr] = pBsData->aaIccIndex[pBsData->noEnv-1][gr]; } pBsData->noEnv++; pBsData->aEnvStartStop[pBsData->noEnv] = h_ps_d->noSubSamples; } /* enforce strictly monotonic increasing borders */ for (env=1; envnoEnv; env++) { UCHAR thr; thr = (UCHAR)h_ps_d->noSubSamples - (pBsData->noEnv - env); if (pBsData->aEnvStartStop[env] > thr) { pBsData->aEnvStartStop[env] = thr; } else { thr = pBsData->aEnvStartStop[env-1]+1; if (pBsData->aEnvStartStop[env] < thr) { pBsData->aEnvStartStop[env] = thr; } } } } /* if (h_ps_d->bFrameClass == 0) ... else */ /* copy data prior to possible 20<->34 in-place mapping */ for (env=0; envnoEnv; env++) { UCHAR i; for (i=0; ispecificTo.mpeg.coef.aaIidIndexMapped[env][i] = pBsData->aaIidIndex[env][i]; } for (i=0; ispecificTo.mpeg.coef.aaIccIndexMapped[env][i] = pBsData->aaIccIndex[env][i]; } } /* MPEG baseline PS */ /* Baseline version of PS always uses the hybrid filter structure with 20 stereo bands. */ /* If ICC/IID parameters for 34 stereo bands are decoded they have to be mapped to 20 */ /* stereo bands. */ /* Additionaly the IPD/OPD parameters won't be used. */ for (env=0; envnoEnv; env++) { if (pBsData->freqResIid == 2) map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env], NO_HI_RES_IID_BINS); if (pBsData->freqResIcc == 2) map34IndexTo20 (h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env], NO_HI_RES_ICC_BINS); /* IPD/OPD is disabled in baseline version and thus was removed here */ } return (1); } /***************************************************************************/ /*! \brief Reads parametric stereo data from bitstream \return ****************************************************************************/ unsigned int ReadPsData (HANDLE_PS_DEC h_ps_d, /*!< handle to struct PS_DEC */ HANDLE_FDK_BITSTREAM hBitBuf, /*!< handle to struct BIT_BUF */ int nBitsLeft /*!< max number of bits available */ ) { MPEG_PS_BS_DATA *pBsData; UCHAR gr, env; SCHAR dtFlag; INT startbits; Huffman CurrentTable; SCHAR bEnableHeader; if (!h_ps_d) return 0; pBsData = &h_ps_d->bsData[h_ps_d->bsReadSlot].mpeg; if (h_ps_d->bsReadSlot != h_ps_d->bsLastSlot) { /* Copy last header data */ FDKmemcpy(pBsData, &h_ps_d->bsData[h_ps_d->bsLastSlot].mpeg, sizeof(MPEG_PS_BS_DATA)); } startbits = (INT) FDKgetValidBits(hBitBuf); bEnableHeader = (SCHAR) FDKreadBits (hBitBuf, 1); /* Read header */ if (bEnableHeader) { pBsData->bPsHeaderValid = 1; pBsData->bEnableIid = (UCHAR) FDKreadBits (hBitBuf, 1); if (pBsData->bEnableIid) { pBsData->modeIid = (UCHAR) FDKreadBits (hBitBuf, 3); } pBsData->bEnableIcc = (UCHAR) FDKreadBits (hBitBuf, 1); if (pBsData->bEnableIcc) { pBsData->modeIcc = (UCHAR) FDKreadBits (hBitBuf, 3); } pBsData->bEnableExt = (UCHAR) FDKreadBits (hBitBuf, 1); } pBsData->bFrameClass = (UCHAR) FDKreadBits (hBitBuf, 1); if (pBsData->bFrameClass == 0) { /* FIX_BORDERS NoEnv=0,1,2,4 */ pBsData->noEnv = FDK_sbrDecoder_aFixNoEnvDecode[(UCHAR) FDKreadBits (hBitBuf, 2)]; /* all additional handling of env borders is now in DecodePs() */ } else { /* VAR_BORDERS NoEnv=1,2,3,4 */ pBsData->noEnv = 1+(UCHAR) FDKreadBits (hBitBuf, 2); for (env=1; envnoEnv+1; env++) pBsData->aEnvStartStop[env] = ((UCHAR) FDKreadBits (hBitBuf, 5)) + 1; /* all additional handling of env borders is now in DecodePs() */ } /* verify that IID & ICC modes (quant grid, freq res) are supported */ if ((pBsData->modeIid > 5) || (pBsData->modeIcc > 5)) { /* no useful PS data could be read from bitstream */ h_ps_d->bPsDataAvail[h_ps_d->bsReadSlot] = ppt_none; /* discard all remaining bits */ nBitsLeft -= startbits - FDKgetValidBits(hBitBuf); while (nBitsLeft) { int i = nBitsLeft; if (i>8) { i = 8; } FDKreadBits (hBitBuf, i); nBitsLeft -= i; } return (startbits - FDKgetValidBits(hBitBuf)); } if (pBsData->modeIid > 2){ pBsData->freqResIid = pBsData->modeIid-3; pBsData->bFineIidQ = 1; } else{ pBsData->freqResIid = pBsData->modeIid; pBsData->bFineIidQ = 0; } if (pBsData->modeIcc > 2){ pBsData->freqResIcc = pBsData->modeIcc-3; } else{ pBsData->freqResIcc = pBsData->modeIcc; } /* Extract IID data */ if (pBsData->bEnableIid) { for (env=0; envnoEnv; env++) { dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); if (!dtFlag) { if (pBsData->bFineIidQ) CurrentTable = (Huffman)&aBookPsIidFineFreqDecode; else CurrentTable = (Huffman)&aBookPsIidFreqDecode; } else { if (pBsData->bFineIidQ) CurrentTable = (Huffman)&aBookPsIidFineTimeDecode; else CurrentTable = (Huffman)&aBookPsIidTimeDecode; } for (gr = 0; gr < FDK_sbrDecoder_aNoIidBins[pBsData->freqResIid]; gr++) pBsData->aaIidIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); pBsData->abIidDtFlag[env] = dtFlag; } } /* Extract ICC data */ if (pBsData->bEnableIcc) { for (env=0; envnoEnv; env++) { dtFlag = (SCHAR)FDKreadBits (hBitBuf, 1); if (!dtFlag) CurrentTable = (Huffman)&aBookPsIccFreqDecode; else CurrentTable = (Huffman)&aBookPsIccTimeDecode; for (gr = 0; gr < FDK_sbrDecoder_aNoIccBins[pBsData->freqResIcc]; gr++) pBsData->aaIccIndex[env][gr] = decode_huff_cw(CurrentTable,hBitBuf,NULL); pBsData->abIccDtFlag[env] = dtFlag; } } if (pBsData->bEnableExt) { /*! Decoders that support only the baseline version of the PS tool are allowed to ignore the IPD/OPD data, but according header data has to be parsed. ISO/IEC 14496-3 Subpart 8 Annex 4 */ int cnt = FDKreadBits(hBitBuf, PS_EXTENSION_SIZE_BITS); if (cnt == (1<bPsDataAvail[h_ps_d->bsReadSlot] = ppt_mpeg; return (startbits - FDKgetValidBits(hBitBuf)); } fdk-aac-0.1.3/libSBRdec/src/env_dec.h0000644000175000017500000001176712372261464017562 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Envelope decoding */ #ifndef __ENV_DEC_H #define __ENV_DEC_H #include "sbrdecoder.h" #include "env_extr.h" void decodeSbrData (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_data_left, HANDLE_SBR_PREV_FRAME_DATA h_prev_data_left, HANDLE_SBR_FRAME_DATA h_data_right, HANDLE_SBR_PREV_FRAME_DATA h_prev_data_right); #endif fdk-aac-0.1.3/libSBRdec/src/sbr_dec.h0000644000175000017500000002041112372261464017542 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr decoder */ #ifndef __SBR_DEC_H #define __SBR_DEC_H #include "sbrdecoder.h" #include "lpp_tran.h" #include "qmf.h" #include "env_calc.h" #include "FDK_audio.h" #include "sbrdec_drc.h" #define SACDEC_ALIGNMENT_FIX typedef struct { QMF_FILTER_BANK AnalysiscQMF; QMF_FILTER_BANK SynthesisQMF; SBR_CALCULATE_ENVELOPE SbrCalculateEnvelope; SBR_LPP_TRANS LppTrans; QMF_SCALE_FACTOR sbrScaleFactor; QMF_SCALE_FACTOR sbrScaleFactorRight; /*! Delayed spectral data needed for the dynamic framing of SBR. Not required in case of CLDFB */ FIXP_DBL * pSbrOverlapBuffer; /* References to workbuffers */ FIXP_DBL * WorkBuffer1; FIXP_DBL * WorkBuffer2; /* QMF filter states */ FIXP_QAS anaQmfStates[(320)]; FIXP_QSS * pSynQmfStates; /* Reference pointer arrays for QMF time slots, mixed among overlap and current slots. */ FIXP_DBL * QmfBufferReal[(((1024)/(32))+(6))]; FIXP_DBL * QmfBufferImag[(((1024)/(32))+(6))]; int useLP; /* QMF domain extension time slot reference pointer array */ SBRDEC_DRC_CHANNEL sbrDrcChannel; } SBR_DEC; typedef SBR_DEC *HANDLE_SBR_DEC; typedef struct { SBR_FRAME_DATA frameData[(1)+1]; SBR_PREV_FRAME_DATA prevFrameData; SBR_DEC SbrDec; } SBR_CHANNEL; typedef SBR_CHANNEL *HANDLE_SBR_CHANNEL; void SbrDecodeAndProcess (HANDLE_SBR_DEC hSbrDec, INT_PCM *timeIn, HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA hFrameData, HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, int applyProcessing, int channelNr , UCHAR useLP ); void SbrConstructTimeOutput (HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ INT_PCM *timeOut, /*!< pointer to output time signal */ HANDLE_SBR_HEADER_DATA hHeaderData,/*!< Static control data */ HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, /*!< Some control data of last frame */ int channelNr ,UCHAR useLP ); void sbr_dec (HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ INT_PCM *timeIn, /*!< pointer to input time signal */ INT_PCM *timeOut, /*!< pointer to output time signal */ HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ INT_PCM *timeOutRight, /*!< pointer to output time signal */ const int strideIn, /*!< Time data traversal strideIn */ const int strideOut, /*!< Time data traversal strideOut */ HANDLE_SBR_HEADER_DATA hHeaderData,/*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, /*!< Some control data of last frame */ const int applyProcessing, /*!< Flag for SBR operation */ HANDLE_PS_DEC h_ps_d, const UINT flags ); SBR_ERROR createSbrDec (SBR_CHANNEL * hSbrChannel, HANDLE_SBR_HEADER_DATA hHeaderData, TRANSPOSER_SETTINGS *pSettings, const int downsampleFac, const UINT qmfFlags, const UINT flags, const int overlap, int chan); int deleteSbrDec (SBR_CHANNEL * hSbrChannel); SBR_ERROR resetSbrDec (HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, const int useLP, const int downsampleFac); #endif fdk-aac-0.1.3/libSBRdec/src/env_dec.cpp0000644000175000017500000007764412372261464020123 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief envelope decoding This module provides envelope decoding and error concealment algorithms. The main entry point is decodeSbrData(). \sa decodeSbrData(),\ref documentationOverview */ #include "env_dec.h" #include "env_extr.h" #include "transcendent.h" #include "genericStds.h" static void decodeEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data_otherChannel); static void sbr_envelope_unmapping (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_data_left, HANDLE_SBR_FRAME_DATA h_data_right); static void requantizeEnvelopeData (HANDLE_SBR_FRAME_DATA h_sbr_data, int ampResolution); static void deltaToLinearPcmEnvelopeDecoding (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data); static void decodeNoiseFloorlevels (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data); static void timeCompensateFirstEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data); static int checkEnvelopeData (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_sbr_data, HANDLE_SBR_PREV_FRAME_DATA h_prev_data); #define SBR_ENERGY_PAN_OFFSET (12 << ENV_EXP_FRACT) #define SBR_MAX_ENERGY (35 << ENV_EXP_FRACT) #define DECAY ( 1 << ENV_EXP_FRACT) #if ENV_EXP_FRACT #define DECAY_COUPLING ( 1 << (ENV_EXP_FRACT-1) ) /*!< corresponds to a value of 0.5 */ #else #define DECAY_COUPLING 1 /*!< If the energy data is not shifted, use 1 instead of 0.5 */ #endif /*! \brief Convert table index */ static int indexLow2High(int offset, /*!< mapping factor */ int index, /*!< index to scalefactor band */ int res) /*!< frequency resolution */ { if(res == 0) { if (offset >= 0) { if (index < offset) return(index); else return(2*index - offset); } else { offset = -offset; if (index < offset) return(2*index+index); else return(2*index + offset); } } else return(index); } /*! \brief Update previous envelope value for delta-coding The current envelope values needs to be stored for delta-coding in the next frame. The stored envelope is always represented with the high frequency resolution. If the current envelope uses the low frequency resolution, the energy value will be mapped to the corresponding high-res bands. */ static void mapLowResEnergyVal(FIXP_SGL currVal, /*!< current energy value */ FIXP_SGL* prevData,/*!< pointer to previous data vector */ int offset, /*!< mapping factor */ int index, /*!< index to scalefactor band */ int res) /*!< frequeny resolution */ { if(res == 0) { if (offset >= 0) { if(index < offset) prevData[index] = currVal; else { prevData[2*index - offset] = currVal; prevData[2*index+1 - offset] = currVal; } } else { offset = -offset; if (index < offset) { prevData[3*index] = currVal; prevData[3*index+1] = currVal; prevData[3*index+2] = currVal; } else { prevData[2*index + offset] = currVal; prevData[2*index + 1 + offset] = currVal; } } } else prevData[index] = currVal; } /*! \brief Convert raw envelope and noisefloor data to energy levels This function is being called by sbrDecoder_ParseElement() and provides two important algorithms: First the function decodes envelopes and noise floor levels as described in requantizeEnvelopeData() and sbr_envelope_unmapping(). The function also implements concealment algorithms in case there are errors within the sbr data. For both operations fractional arithmetic is used. Therefore you might encounter different output values on your target system compared to the reference implementation. */ void decodeSbrData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_data_left, /*!< pointer to left channel frame data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data_left, /*!< pointer to left channel previous frame data */ HANDLE_SBR_FRAME_DATA h_data_right, /*!< pointer to right channel frame data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data_right)/*!< pointer to right channel previous frame data */ { FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS]; int errLeft; /* Save previous energy values to be able to reuse them later for concealment. */ FDKmemcpy (tempSfbNrgPrev, h_prev_data_left->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); decodeEnvelope (hHeaderData, h_data_left, h_prev_data_left, h_prev_data_right); decodeNoiseFloorlevels (hHeaderData, h_data_left, h_prev_data_left); if(h_data_right != NULL) { errLeft = hHeaderData->frameErrorFlag; decodeEnvelope (hHeaderData, h_data_right, h_prev_data_right, h_prev_data_left); decodeNoiseFloorlevels (hHeaderData, h_data_right, h_prev_data_right); if (!errLeft && hHeaderData->frameErrorFlag) { /* If an error occurs in the right channel where the left channel seemed ok, we apply concealment also on the left channel. This ensures that the coupling modes of both channels match and that we have the same number of envelopes in coupling mode. However, as the left channel has already been processed before, the resulting energy levels are not the same as if the left channel had been concealed during the first call of decodeEnvelope(). */ /* Restore previous energy values for concealment, because the values have been overwritten by the first call of decodeEnvelope(). */ FDKmemcpy (h_prev_data_left->sfb_nrg_prev, tempSfbNrgPrev, MAX_FREQ_COEFFS * sizeof(FIXP_SGL)); /* Do concealment */ decodeEnvelope (hHeaderData, h_data_left, h_prev_data_left, h_prev_data_right); } if (h_data_left->coupling) { sbr_envelope_unmapping (hHeaderData, h_data_left, h_data_right); } } /* Display the data for debugging: */ } /*! \brief Convert from coupled channels to independent L/R data */ static void sbr_envelope_unmapping (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_data_left, /*!< pointer to left channel */ HANDLE_SBR_FRAME_DATA h_data_right) /*!< pointer to right channel */ { int i; FIXP_SGL tempL_m, tempR_m, tempRplus1_m, newL_m, newR_m; SCHAR tempL_e, tempR_e, tempRplus1_e, newL_e, newR_e; /* 1. Unmap (already dequantized) coupled envelope energies */ for (i = 0; i < h_data_left->nScaleFactors; i++) { tempR_m = (FIXP_SGL)((LONG)h_data_right->iEnvelope[i] & MASK_M); tempR_e = (SCHAR)((LONG)h_data_right->iEnvelope[i] & MASK_E); tempR_e -= (18 + NRG_EXP_OFFSET); /* -18 = ld(UNMAPPING_SCALE / h_data_right->nChannels) */ tempL_m = (FIXP_SGL)((LONG)h_data_left->iEnvelope[i] & MASK_M); tempL_e = (SCHAR)((LONG)h_data_left->iEnvelope[i] & MASK_E); tempL_e -= NRG_EXP_OFFSET; /* Calculate tempRight+1 */ FDK_add_MantExp( tempR_m, tempR_e, FL2FXCONST_SGL(0.5f), 1, /* 1.0 */ &tempRplus1_m, &tempRplus1_e); FDK_divide_MantExp( tempL_m, tempL_e+1, /* 2 * tempLeft */ tempRplus1_m, tempRplus1_e, &newR_m, &newR_e ); if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) { newR_m >>= 1; newR_e += 1; } newL_m = FX_DBL2FX_SGL(fMult(tempR_m,newR_m)); newL_e = tempR_e + newR_e; h_data_right->iEnvelope[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) + (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NRG_EXP_OFFSET) & MASK_E); h_data_left->iEnvelope[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) + (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NRG_EXP_OFFSET) & MASK_E); } /* 2. Dequantize and unmap coupled noise floor levels */ for (i = 0; i < hHeaderData->freqBandData.nNfb * h_data_left->frameInfo.nNoiseEnvelopes; i++) { tempL_e = (SCHAR)(6 - (LONG)h_data_left->sbrNoiseFloorLevel[i]); tempR_e = (SCHAR)((LONG)h_data_right->sbrNoiseFloorLevel[i] - 12) /*SBR_ENERGY_PAN_OFFSET*/; /* Calculate tempR+1 */ FDK_add_MantExp( FL2FXCONST_SGL(0.5f), 1+tempR_e, /* tempR */ FL2FXCONST_SGL(0.5f), 1, /* 1.0 */ &tempRplus1_m, &tempRplus1_e); /* Calculate 2*tempLeft/(tempR+1) */ FDK_divide_MantExp( FL2FXCONST_SGL(0.5f), tempL_e+2, /* 2 * tempLeft */ tempRplus1_m, tempRplus1_e, &newR_m, &newR_e ); /* if (newR_m >= ((FIXP_SGL)MAXVAL_SGL - ROUNDING)) { newR_m >>= 1; newR_e += 1; } */ /* L = tempR * R */ newL_m = newR_m; newL_e = newR_e + tempR_e; h_data_right->sbrNoiseFloorLevel[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newR_m + ROUNDING) & MASK_M)) + (FIXP_SGL)((SHORT)(FIXP_SGL)(newR_e + NOISE_EXP_OFFSET) & MASK_E); h_data_left->sbrNoiseFloorLevel[i] = ((FIXP_SGL)((SHORT)(FIXP_SGL)(newL_m + ROUNDING) & MASK_M)) + (FIXP_SGL)((SHORT)(FIXP_SGL)(newL_e + NOISE_EXP_OFFSET) & MASK_E); } } /*! \brief Simple alternative to the real SBR concealment If the real frameInfo is not available due to a frame loss, a replacement will be constructed with 1 envelope spanning the whole frame (FIX-FIX). The delta-coded energies are set to negative values, resulting in a fade-down. In case of coupling, the balance-channel will move towards the center. */ static void leanSbrConcealment(HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */ ) { FIXP_SGL target; /* targeted level for sfb_nrg_prev during fade-down */ FIXP_SGL step; /* speed of fade */ int i; int currentStartPos = h_prev_data->stopPos - hHeaderData->numberTimeSlots; int currentStopPos = hHeaderData->numberTimeSlots; /* Use some settings of the previous frame */ h_sbr_data->ampResolutionCurrentFrame = h_prev_data->ampRes; h_sbr_data->coupling = h_prev_data->coupling; for(i=0;isbr_invf_mode[i] = h_prev_data->sbr_invf_mode[i]; /* Generate concealing control data */ h_sbr_data->frameInfo.nEnvelopes = 1; h_sbr_data->frameInfo.borders[0] = currentStartPos; h_sbr_data->frameInfo.borders[1] = currentStopPos; h_sbr_data->frameInfo.freqRes[0] = 1; h_sbr_data->frameInfo.tranEnv = -1; /* no transient */ h_sbr_data->frameInfo.nNoiseEnvelopes = 1; h_sbr_data->frameInfo.bordersNoise[0] = currentStartPos; h_sbr_data->frameInfo.bordersNoise[1] = currentStopPos; h_sbr_data->nScaleFactors = hHeaderData->freqBandData.nSfb[1]; /* Generate fake envelope data */ h_sbr_data->domain_vec[0] = 1; if (h_sbr_data->coupling == COUPLING_BAL) { target = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; step = (FIXP_SGL)DECAY_COUPLING; } else { target = FL2FXCONST_SGL(0.0f); step = (FIXP_SGL)DECAY; } if (hHeaderData->bs_info.ampResolution == 0) { target <<= 1; step <<= 1; } for (i=0; i < h_sbr_data->nScaleFactors; i++) { if (h_prev_data->sfb_nrg_prev[i] > target) h_sbr_data->iEnvelope[i] = -step; else h_sbr_data->iEnvelope[i] = step; } /* Noisefloor levels are always cleared ... */ h_sbr_data->domain_vec_noise[0] = 1; for (i=0; i < hHeaderData->freqBandData.nNfb; i++) h_sbr_data->sbrNoiseFloorLevel[i] = FL2FXCONST_SGL(0.0f); /* ... and so are the sines */ FDKmemclear(h_sbr_data->addHarmonics, MAX_FREQ_COEFFS); } /*! \brief Build reference energies and noise levels from bitstream elements */ static void decodeEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< pointer to data of last frame */ HANDLE_SBR_PREV_FRAME_DATA otherChannel /*!< other channel's last frame data */ ) { int i; int fFrameError = hHeaderData->frameErrorFlag; FIXP_SGL tempSfbNrgPrev[MAX_FREQ_COEFFS]; if (!fFrameError) { /* To avoid distortions after bad frames, set the error flag if delta coding in time occurs. However, SBR can take a little longer to come up again. */ if ( h_prev_data->frameErrorFlag ) { if (h_sbr_data->domain_vec[0] != 0) { fFrameError = 1; } } else { /* Check that the previous stop position and the current start position match. (Could be done in checkFrameInfo(), but the previous frame data is not available there) */ if ( h_sbr_data->frameInfo.borders[0] != h_prev_data->stopPos - hHeaderData->numberTimeSlots ) { /* Both the previous as well as the current frame are flagged to be ok, but they do not match! */ if (h_sbr_data->domain_vec[0] == 1) { /* Prefer concealment over delta-time coding between the mismatching frames */ fFrameError = 1; } else { /* Close the gap in time by triggering timeCompensateFirstEnvelope() */ fFrameError = 1; } } } } if (fFrameError) /* Error is detected */ { leanSbrConcealment(hHeaderData, h_sbr_data, h_prev_data); /* decode the envelope data to linear PCM */ deltaToLinearPcmEnvelopeDecoding (hHeaderData, h_sbr_data, h_prev_data); } else /*Do a temporary dummy decoding and check that the envelope values are within limits */ { if (h_prev_data->frameErrorFlag) { timeCompensateFirstEnvelope (hHeaderData, h_sbr_data, h_prev_data); if (h_sbr_data->coupling != h_prev_data->coupling) { /* Coupling mode has changed during concealment. The stored energy levels need to be converted. */ for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) { /* Former Level-Channel will be used for both channels */ if (h_prev_data->coupling == COUPLING_BAL) h_prev_data->sfb_nrg_prev[i] = otherChannel->sfb_nrg_prev[i]; /* Former L/R will be combined as the new Level-Channel */ else if (h_sbr_data->coupling == COUPLING_LEVEL) h_prev_data->sfb_nrg_prev[i] = (h_prev_data->sfb_nrg_prev[i] + otherChannel->sfb_nrg_prev[i]) >> 1; else if (h_sbr_data->coupling == COUPLING_BAL) h_prev_data->sfb_nrg_prev[i] = (FIXP_SGL)SBR_ENERGY_PAN_OFFSET; } } } FDKmemcpy (tempSfbNrgPrev, h_prev_data->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof (FIXP_SGL)); deltaToLinearPcmEnvelopeDecoding (hHeaderData, h_sbr_data, h_prev_data); fFrameError = checkEnvelopeData (hHeaderData, h_sbr_data, h_prev_data); if (fFrameError) { hHeaderData->frameErrorFlag = 1; FDKmemcpy (h_prev_data->sfb_nrg_prev, tempSfbNrgPrev, MAX_FREQ_COEFFS * sizeof (FIXP_SGL)); decodeEnvelope (hHeaderData, h_sbr_data, h_prev_data, otherChannel); return; } } requantizeEnvelopeData (h_sbr_data, h_sbr_data->ampResolutionCurrentFrame); hHeaderData->frameErrorFlag = fFrameError; } /*! \brief Verify that envelope energies are within the allowed range \return 0 if all is fine, 1 if an envelope value was too high */ static int checkEnvelopeData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data /*!< pointer to data of last frame */ ) { FIXP_SGL *iEnvelope = h_sbr_data->iEnvelope; FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev; int i = 0, errorFlag = 0; FIXP_SGL sbr_max_energy = (h_sbr_data->ampResolutionCurrentFrame == 1) ? SBR_MAX_ENERGY : (SBR_MAX_ENERGY << 1); /* Range check for current energies */ for (i = 0; i < h_sbr_data->nScaleFactors; i++) { if (iEnvelope[i] > sbr_max_energy) { errorFlag = 1; } if (iEnvelope[i] < FL2FXCONST_SGL(0.0f)) { errorFlag = 1; /* iEnvelope[i] = FL2FXCONST_SGL(0.0f); */ } } /* Range check for previous energies */ for (i = 0; i < hHeaderData->freqBandData.nSfb[1]; i++) { sfb_nrg_prev[i] = fixMax(sfb_nrg_prev[i], FL2FXCONST_SGL(0.0f)); sfb_nrg_prev[i] = fixMin(sfb_nrg_prev[i], sbr_max_energy); } return (errorFlag); } /*! \brief Verify that the noise levels are within the allowed range The function is equivalent to checkEnvelopeData(). When the noise-levels are being decoded, it is already too late for concealment. Therefore the noise levels are simply limited here. */ static void limitNoiseLevels(HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data) /*!< pointer to current data */ { int i; int nNfb = hHeaderData->freqBandData.nNfb; /* Set range limits. The exact values depend on the coupling mode. However this limitation is primarily intended to avoid unlimited accumulation of the delta-coded noise levels. */ #define lowerLimit ((FIXP_SGL)0) /* lowerLimit actually refers to the _highest_ noise energy */ #define upperLimit ((FIXP_SGL)35) /* upperLimit actually refers to the _lowest_ noise energy */ /* Range check for current noise levels */ for (i = 0; i < h_sbr_data->frameInfo.nNoiseEnvelopes * nNfb; i++) { h_sbr_data->sbrNoiseFloorLevel[i] = fixMin(h_sbr_data->sbrNoiseFloorLevel[i], upperLimit); h_sbr_data->sbrNoiseFloorLevel[i] = fixMax(h_sbr_data->sbrNoiseFloorLevel[i], lowerLimit); } } /*! \brief Compensate for the wrong timing that might occur after a frame error. */ static void timeCompensateFirstEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to actual data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to data of last frame */ { int i, nScalefactors; FRAME_INFO *pFrameInfo = &h_sbr_data->frameInfo; UCHAR *nSfb = hHeaderData->freqBandData.nSfb; int estimatedStartPos = h_prev_data->stopPos - hHeaderData->numberTimeSlots; int refLen, newLen, shift; FIXP_SGL deltaExp; /* Original length of first envelope according to bitstream */ refLen = pFrameInfo->borders[1] - pFrameInfo->borders[0]; /* Corrected length of first envelope (concealing can make the first envelope longer) */ newLen = pFrameInfo->borders[1] - estimatedStartPos; if (newLen <= 0) { /* An envelope length of <= 0 would not work, so we don't use it. May occur if the previous frame was flagged bad due to a mismatch of the old and new frame infos. */ newLen = refLen; estimatedStartPos = pFrameInfo->borders[0]; } deltaExp = FDK_getNumOctavesDiv8(newLen, refLen); /* Shift by -3 to rescale ld-table, ampRes-1 to enable coarser steps */ shift = (FRACT_BITS - 1 - ENV_EXP_FRACT - 1 + h_sbr_data->ampResolutionCurrentFrame - 3); deltaExp = deltaExp >> shift; pFrameInfo->borders[0] = estimatedStartPos; pFrameInfo->bordersNoise[0] = estimatedStartPos; if (h_sbr_data->coupling != COUPLING_BAL) { nScalefactors = (pFrameInfo->freqRes[0]) ? nSfb[1] : nSfb[0]; for (i = 0; i < nScalefactors; i++) h_sbr_data->iEnvelope[i] = h_sbr_data->iEnvelope[i] + deltaExp; } } /*! \brief Convert each envelope value from logarithmic to linear domain Energy levels are transmitted in powers of 2, i.e. only the exponent is extracted from the bitstream. Therefore, normally only integer exponents can occur. However during fading (in case of a corrupt bitstream), a fractional part can also occur. The data in the array iEnvelope is shifted left by ENV_EXP_FRACT compared to an integer representation so that numbers smaller than 1 can be represented. This function calculates a mantissa corresponding to the fractional part of the exponent for each reference energy. The array iEnvelope is converted in place to save memory. Input and output data must be interpreted differently, as shown in the below figure: \image html EnvelopeData.png The data is then used in calculateSbrEnvelope(). */ static void requantizeEnvelopeData (HANDLE_SBR_FRAME_DATA h_sbr_data, int ampResolution) { int i; FIXP_SGL mantissa; int ampShift = 1 - ampResolution; int exponent; /* In case that ENV_EXP_FRACT is changed to something else but 0 or 8, the initialization of this array has to be adapted! */ #if ENV_EXP_FRACT static const FIXP_SGL pow2[ENV_EXP_FRACT] = { FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 1))), /* 0.7071 */ FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 2))), /* 0.5946 */ FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 3))), FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 4))), FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 5))), FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 6))), FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 7))), FL2FXCONST_SGL(0.5f * pow(2.0f, pow(0.5f, 8))) /* 0.5013 */ }; int bit, mask; #endif for (i = 0; i < h_sbr_data->nScaleFactors; i++) { exponent = (LONG)h_sbr_data->iEnvelope[i]; #if ENV_EXP_FRACT exponent = exponent >> ampShift; mantissa = 0.5f; /* Amplify mantissa according to the fractional part of the exponent (result will be between 0.500000 and 0.999999) */ mask = 1; /* begin with lowest bit of exponent */ for ( bit=ENV_EXP_FRACT-1; bit>=0; bit-- ) { if (exponent & mask) { /* The current bit of the exponent is set, multiply mantissa with the corresponding factor: */ mantissa = (FIXP_SGL)( (mantissa * pow2[bit]) << 1); } /* Advance to next bit */ mask = mask << 1; } /* Make integer part of exponent right aligned */ exponent = exponent >> ENV_EXP_FRACT; #else /* In case of the high amplitude resolution, 1 bit of the exponent gets lost by the shift. This will be compensated by a mantissa of 0.5*sqrt(2) instead of 0.5 if that bit is 1. */ mantissa = (exponent & ampShift) ? FL2FXCONST_SGL(0.707106781186548f) : FL2FXCONST_SGL(0.5f); exponent = exponent >> ampShift; #endif /* Mantissa was set to 0.5 (instead of 1.0, therefore increase exponent by 1). Multiply by L=nChannels=64 by increasing exponent by another 6. => Increase exponent by 7 */ exponent += 7 + NRG_EXP_OFFSET; /* Combine mantissa and exponent and write back the result */ h_sbr_data->iEnvelope[i] = (FIXP_SGL)(((LONG)mantissa & MASK_M) | (exponent & MASK_E)); } } /*! \brief Build new reference energies from old ones and delta coded data */ static void deltaToLinearPcmEnvelopeDecoding (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */ { int i, domain, no_of_bands, band, freqRes; FIXP_SGL *sfb_nrg_prev = h_prev_data->sfb_nrg_prev; FIXP_SGL *ptr_nrg = h_sbr_data->iEnvelope; int offset = 2 * hHeaderData->freqBandData.nSfb[0] - hHeaderData->freqBandData.nSfb[1]; for (i = 0; i < h_sbr_data->frameInfo.nEnvelopes; i++) { domain = h_sbr_data->domain_vec[i]; freqRes = h_sbr_data->frameInfo.freqRes[i]; FDK_ASSERT(freqRes >= 0 && freqRes <= 1); no_of_bands = hHeaderData->freqBandData.nSfb[freqRes]; FDK_ASSERT(no_of_bands < (64)); if (domain == 0) { mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, 0, freqRes); ptr_nrg++; for (band = 1; band < no_of_bands; band++) { *ptr_nrg = *ptr_nrg + *(ptr_nrg-1); mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes); ptr_nrg++; } } else { for (band = 0; band < no_of_bands; band++) { *ptr_nrg = *ptr_nrg + sfb_nrg_prev[indexLow2High(offset, band, freqRes)]; mapLowResEnergyVal(*ptr_nrg, sfb_nrg_prev, offset, band, freqRes); ptr_nrg++; } } } } /*! \brief Build new noise levels from old ones and delta coded data */ static void decodeNoiseFloorlevels (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_sbr_data, /*!< pointer to current data */ HANDLE_SBR_PREV_FRAME_DATA h_prev_data) /*!< pointer to previous data */ { int i; int nNfb = hHeaderData->freqBandData.nNfb; int nNoiseFloorEnvelopes = h_sbr_data->frameInfo.nNoiseEnvelopes; /* Decode first noise envelope */ if (h_sbr_data->domain_vec_noise[0] == 0) { FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[0]; for (i = 1; i < nNfb; i++) { noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i]; h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel; } } else { for (i = 0; i < nNfb; i++) { h_sbr_data->sbrNoiseFloorLevel[i] += h_prev_data->prevNoiseLevel[i]; } } /* If present, decode the second noise envelope Note: nNoiseFloorEnvelopes can only be 1 or 2 */ if (nNoiseFloorEnvelopes > 1) { if (h_sbr_data->domain_vec_noise[1] == 0) { FIXP_SGL noiseLevel = h_sbr_data->sbrNoiseFloorLevel[nNfb]; for (i = nNfb + 1; i < 2*nNfb; i++) { noiseLevel += h_sbr_data->sbrNoiseFloorLevel[i]; h_sbr_data->sbrNoiseFloorLevel[i] = noiseLevel; } } else { for (i = 0; i < nNfb; i++) { h_sbr_data->sbrNoiseFloorLevel[i + nNfb] += h_sbr_data->sbrNoiseFloorLevel[i]; } } } limitNoiseLevels(hHeaderData, h_sbr_data); /* Update prevNoiseLevel with the last noise envelope */ for (i = 0; i < nNfb; i++) h_prev_data->prevNoiseLevel[i] = h_sbr_data->sbrNoiseFloorLevel[i + nNfb*(nNoiseFloorEnvelopes-1)]; /* Requantize the noise floor levels in COUPLING_OFF-mode */ if (!h_sbr_data->coupling) { int nf_e; for (i = 0; i < nNoiseFloorEnvelopes*nNfb; i++) { nf_e = 6 - (LONG)h_sbr_data->sbrNoiseFloorLevel[i] + 1 + NOISE_EXP_OFFSET; /* +1 to compensate for a mantissa of 0.5 instead of 1.0 */ h_sbr_data->sbrNoiseFloorLevel[i] = (FIXP_SGL)( ((LONG)FL2FXCONST_SGL(0.5f)) + /* mantissa */ (nf_e & MASK_E) ); /* exponent */ } } } fdk-aac-0.1.3/libSBRdec/src/sbr_deb.cpp0000644000175000017500000001121712372261464020100 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Print selected debug messages */ #include "sbr_deb.h" fdk-aac-0.1.3/libSBRdec/src/sbr_ram.cpp0000644000175000017500000001741512372261464020133 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Memory layout This module declares all static and dynamic memory spaces */ #include "sbr_ram.h" #define WORKBUFFER1_TAG 0 #define WORKBUFFER2_TAG 1 /*! \name StaticSbrData Static memory areas, must not be overwritten in other sections of the decoder */ /* @{ */ /*! SBR Decoder main structure */ C_ALLOC_MEM(Ram_SbrDecoder, struct SBR_DECODER_INSTANCE, 1) /*! SBR Decoder element data
Dimension: (4) */ C_ALLOC_MEM2(Ram_SbrDecElement, SBR_DECODER_ELEMENT, 1, (4)) /*! SBR Decoder individual channel data
Dimension: (6) */ C_ALLOC_MEM2(Ram_SbrDecChannel, SBR_CHANNEL, 1, (6)+1) /*! Filter states for QMF-synthesis.
Dimension: #(6) * (#QMF_FILTER_STATE_SYN_SIZE-#(64)) */ C_AALLOC_MEM2_L(Ram_sbr_QmfStatesSynthesis, FIXP_QSS, (640)-(64), (6)+1, SECT_DATA_L1) /*! Delayed spectral data needed for the dynamic framing of SBR. For mp3PRO, 1/3 of a frame is buffered (#(6) 6) */ C_AALLOC_MEM2(Ram_sbr_OverlapBuffer, FIXP_DBL, 2 * (6) * (64), (6)+1) /*! Static Data of PS */ C_ALLOC_MEM(Ram_ps_dec, PS_DEC, 1) /* @} */ /*! \name DynamicSbrData Dynamic memory areas, might be reused in other algorithm sections, e.g. the core decoder
Depending on the mode set by DONT_USE_CORE_WORKBUFFER, workbuffers are defined additionally to the CoreWorkbuffer.
The size of WorkBuffers is ((1024)/(32))*(64) = 2048.
WorkBuffer2 is a pointer to the CoreWorkBuffer wich is reused here in the SBR part. In case of DONT_USE_CORE_WORKBUFFER, the CoreWorkbuffer is not used and the according Workbuffer2 is defined locally in this file.
WorkBuffer1 is reused in the AAC core (-> aacdecoder.cpp, aac_ram.cpp)
Use of WorkBuffers:

    -------------------------------------------------------------
    AAC core:

      CoreWorkbuffer: spectral coefficients
      WorkBuffer1:    CAacDecoderChannelInfo, CAacDecoderDynamicData

    -------------------------------------------------------------
    SBR part:
      ----------------------------------------------
      Low Power Mode (useLP=1 or LOW_POWER_SBR_ONLY), see assignLcTimeSlots()

        SLOT_BASED_PROTOTYPE_SYN_FILTER

        WorkBuffer1                                WorkBuffer2(=CoreWorkbuffer)
         ________________                           ________________
        | RealLeft       |                         | RealRight      |
        |________________|                         |________________|

      ----------------------------------------------
      High Quality Mode (!LOW_POWER_SBR_ONLY and useLP=0), see assignHqTimeSlots()

         SLOTBASED_PS

         WorkBuffer1                                WorkBuffer2(=CoreWorkbuffer)
         ________________                           ________________
        | Real/Imag      |  interleaved            | Real/Imag      |  interleaved
        |________________|  first half actual ch   |________________|  second half actual ch

    -------------------------------------------------------------

  
*/ /* @{ */ C_ALLOC_MEM_OVERLAY(Ram_SbrDecWorkBuffer1, FIXP_DBL, ((1024)/(32))*(64), SECT_DATA_L1, WORKBUFFER1_TAG) C_ALLOC_MEM_OVERLAY(Ram_SbrDecWorkBuffer2, FIXP_DBL, ((1024)/(32))*(64), SECT_DATA_L2, WORKBUFFER2_TAG) /* @} */ fdk-aac-0.1.3/libSBRdec/src/psdec_hybrid.h0000644000175000017500000001472512372261464020613 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #ifndef __HYBRID_H #define __HYBRID_H #include "sbrdecoder.h" #define HYBRID_FILTER_LENGTH 13 #define HYBRID_FILTER_DELAY 6 #define FAST_FILTER2 #define FAST_FILTER4 #define FAST_FILTER8 #define FAST_FILTER12 #define FFT_IDX_R(a) (2*a) #define FFT_IDX_I(a) (2*a+1) #define FIXP_FFT_IDX_R(a) (a<<1) #define FIXP_FFT_IDX_I(a) ((a<<1) + 1) typedef enum { HYBRID_2_REAL = 2, HYBRID_4_CPLX = 4, HYBRID_8_CPLX = 8, HYBRID_12_CPLX = 12 } HYBRID_RES; typedef struct { SCHAR nQmfBands; SCHAR frameSize; SCHAR qmfBufferMove; UCHAR pResolution[3]; FIXP_DBL mQmfBufferRealSlot[3][HYBRID_FILTER_LENGTH]; /**< Stores old Qmf samples. */ FIXP_DBL mQmfBufferImagSlot[3][HYBRID_FILTER_LENGTH]; SCHAR sf_mQmfBuffer; } HYBRID; typedef HYBRID *HANDLE_HYBRID; void fillHybridDelayLine( FIXP_DBL **fixpQmfReal, FIXP_DBL **fixpQmfImag, FIXP_DBL fixpHybridLeftR[12], FIXP_DBL fixpHybridLeftI[12], FIXP_DBL fixpHybridRightR[12], FIXP_DBL fixpHybridRightI[12], HANDLE_HYBRID hHybrid ); void slotBasedHybridAnalysis ( FIXP_DBL *fixpQmfReal, FIXP_DBL *fixpQmfImag, FIXP_DBL *fixpHybridReal, FIXP_DBL *fixpHybridImag, HANDLE_HYBRID hHybrid); void slotBasedHybridSynthesis ( FIXP_DBL *fixpHybridReal, FIXP_DBL *fixpHybridImag, FIXP_DBL *fixpQmfReal, FIXP_DBL *fixpQmfImag, HANDLE_HYBRID hHybrid ); SBR_ERROR InitHybridFilterBank ( HANDLE_HYBRID hHybrid, SCHAR frameSize, SCHAR noBands, const UCHAR *pResolution ); #endif /* __HYBRID_H */ fdk-aac-0.1.3/libSBRdec/src/sbr_crc.cpp0000644000175000017500000001472312372261464020122 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief CRC check coutines */ #include "sbr_crc.h" #include "FDK_bitstream.h" #include "transcendent.h" #define MAXCRCSTEP 16 #define MAXCRCSTEP_LD 4 /*! \brief crc calculation */ static ULONG calcCRC (HANDLE_CRC hCrcBuf, ULONG bValue, int nBits) { int i; ULONG bMask = (1UL << (nBits - 1)); for (i = 0; i < nBits; i++, bMask >>= 1) { USHORT flag = (hCrcBuf->crcState & hCrcBuf->crcMask) ? 1 : 0; USHORT flag1 = (bMask & bValue) ? 1 : 0; flag ^= flag1; hCrcBuf->crcState <<= 1; if (flag) hCrcBuf->crcState ^= hCrcBuf->crcPoly; } return (hCrcBuf->crcState); } /*! \brief crc */ static int getCrc (HANDLE_FDK_BITSTREAM hBs, ULONG NrBits) { int i; CRC_BUFFER CrcBuf; CrcBuf.crcState = SBR_CRC_START; CrcBuf.crcPoly = SBR_CRC_POLY; CrcBuf.crcMask = SBR_CRC_MASK; int CrcStep = NrBits>>MAXCRCSTEP_LD; int CrcNrBitsRest = (NrBits - CrcStep * MAXCRCSTEP); ULONG bValue; for (i = 0; i < CrcStep; i++) { bValue = FDKreadBits (hBs, MAXCRCSTEP); calcCRC (&CrcBuf, bValue, MAXCRCSTEP); } bValue = FDKreadBits (hBs, CrcNrBitsRest); calcCRC (&CrcBuf, bValue, CrcNrBitsRest); return (CrcBuf.crcState & SBR_CRC_RANGE); } /*! \brief crc interface \return 1: CRC OK, 0: CRC check failure */ int SbrCrcCheck (HANDLE_FDK_BITSTREAM hBs, /*!< handle to bit-buffer */ LONG NrBits) /*!< max. CRC length */ { int crcResult = 1; ULONG NrCrcBits; ULONG crcCheckResult; LONG NrBitsAvailable; ULONG crcCheckSum; crcCheckSum = FDKreadBits (hBs, 10); NrBitsAvailable = FDKgetValidBits(hBs); if (NrBitsAvailable <= 0){ return 0; } NrCrcBits = fixMin ((INT)NrBits, (INT)NrBitsAvailable); crcCheckResult = getCrc (hBs, NrCrcBits); FDKpushBack(hBs, (NrBitsAvailable - FDKgetValidBits(hBs)) ); if (crcCheckResult != crcCheckSum) { crcResult = 0; } return (crcResult); } fdk-aac-0.1.3/libSBRdec/src/sbr_scale.h0000644000175000017500000001364112372261464020105 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr scaling factors, To deal with the dynamic range in the different processing stages, a fixed point specific code has to rely on scaling factors. A floating point code carries a scaling factor -- the exponent -- for each value, so scaling is not necessary there. The output of the core decoder (low band) is scaled up to cover as much as possible bits for each value. As high band and low band are processed in different algorithm sections, they require their own scaling factors. In addition, any static buffers, e.g. filter states, require a separate scaling factor as well. The code takes care to do the proper adjustment, if scaling factors of a filter state and the time signal differ. \sa #QMF_SCALE_FACTOR, \ref documentationOverview */ #ifndef __SBR_SCALE_H #define __SBR_SCALE_H /*! \verbatim scale: 0 left aligned e.g. |max| >=0.5 FRACT_BITS-1 zero e.g |max| = 0 \endverbatim Dynamic scaling is used to achieve sufficient accuracy even when the signal energy is low. The dynamic framing of SBR produces a variable overlap area where samples from the previous QMF-Analysis are stored. Depending on the start position and stop position of the current SBR envelopes, the processing buffer consists of differently scaled regions like illustrated in the below figure. \image html scales.png Scale */ #endif fdk-aac-0.1.3/libSBRdec/src/psdec.cpp0000644000175000017500000015733612372261464017613 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief parametric stereo decoder */ #include "psdec.h" #include "FDK_bitbuffer.h" #include "psdec_hybrid.h" #include "sbr_rom.h" #include "sbr_ram.h" #include "FDK_tools_rom.h" #include "genericStds.h" #include "FDK_trigFcts.h" /********************************************************************/ /* MLQUAL DEFINES */ /********************************************************************/ #define FRACT_ZERO FRACT_BITS-1 /********************************************************************/ SBR_ERROR ResetPsDec( HANDLE_PS_DEC h_ps_d ); void ResetPsDeCor( HANDLE_PS_DEC h_ps_d ); /***** HELPERS *****/ static void assignTimeSlotsPS (FIXP_DBL *bufAdr, FIXP_DBL **bufPtr, const int numSlots, const int numChan); /*******************/ #define DIV3 FL2FXCONST_DBL(1.f/3.f) /* division 3.0 */ #define DIV1_5 FL2FXCONST_DBL(2.f/3.f) /* division 1.5 */ /***************************************************************************/ /*! \brief Creates one instance of the PS_DEC struct \return Error info ****************************************************************************/ int CreatePsDec( HANDLE_PS_DEC *h_PS_DEC, /*!< pointer to the module state */ int aacSamplesPerFrame ) { SBR_ERROR errorInfo = SBRDEC_OK; HANDLE_PS_DEC h_ps_d; int i; if (*h_PS_DEC == NULL) { /* Get ps dec ram */ h_ps_d = GetRam_ps_dec(); if (h_ps_d == NULL) { errorInfo = SBRDEC_MEM_ALLOC_FAILED; goto bail; } } else { /* Reset an open instance */ h_ps_d = *h_PS_DEC; } /* initialisation */ switch (aacSamplesPerFrame) { case 960: h_ps_d->noSubSamples = 30; /* col */ break; case 1024: h_ps_d->noSubSamples = 32; /* col */ break; default: h_ps_d->noSubSamples = -1; break; } if (h_ps_d->noSubSamples > MAX_NUM_COL || h_ps_d->noSubSamples <= 0) { goto bail; } h_ps_d->noChannels = NO_QMF_CHANNELS; /* row */ h_ps_d->psDecodedPrv = 0; h_ps_d->procFrameBased = -1; for (i = 0; i < (1)+1; i++) { h_ps_d->bPsDataAvail[i] = ppt_none; } for (i = 0; i < (1)+1; i++) { FDKmemclear(&h_ps_d->bsData[i].mpeg, sizeof(MPEG_PS_BS_DATA)); } errorInfo = ResetPsDec( h_ps_d ); if ( errorInfo != SBRDEC_OK ) goto bail; ResetPsDeCor( h_ps_d ); *h_PS_DEC = h_ps_d; return 0; bail: DeletePsDec(&h_ps_d); return -1; } /*END CreatePsDec */ /***************************************************************************/ /*! \brief Delete one instance of the PS_DEC struct \return Error info ****************************************************************************/ int DeletePsDec( HANDLE_PS_DEC *h_PS_DEC) /*!< pointer to the module state */ { if (*h_PS_DEC == NULL) { return -1; } FreeRam_ps_dec(h_PS_DEC); return 0; } /*END DeletePsDec */ /***************************************************************************/ /*! \brief resets some values of the PS handle to default states \return ****************************************************************************/ SBR_ERROR ResetPsDec( HANDLE_PS_DEC h_ps_d ) /*!< pointer to the module state */ { SBR_ERROR errorInfo = SBRDEC_OK; INT i; const UCHAR noQmfBandsInHybrid20 = 3; /* const UCHAR noQmfBandsInHybrid34 = 5; */ const UCHAR aHybridResolution20[] = { HYBRID_8_CPLX, HYBRID_2_REAL, HYBRID_2_REAL }; h_ps_d->specificTo.mpeg.delayBufIndex = 0; /* explicitly init state variables to safe values (until first ps header arrives) */ h_ps_d->specificTo.mpeg.lastUsb = 0; h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer = -(DFRACT_BITS-1); FDKmemclear(h_ps_d->specificTo.mpeg.aDelayBufIndexDelayQmf, (NO_QMF_CHANNELS-FIRST_DELAY_SB)*sizeof(UCHAR)); h_ps_d->specificTo.mpeg.noSampleDelay = delayIndexQmf[0]; for (i=0 ; i < NO_SERIAL_ALLPASS_LINKS; i++) { h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[i] = 0; } h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0] = h_ps_d->specificTo.mpeg.aaQmfDelayBufReal; assignTimeSlotsPS ( h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0] + (NO_QMF_CHANNELS-FIRST_DELAY_SB), &h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[1], h_ps_d->specificTo.mpeg.noSampleDelay-1, (NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB)); h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0] = h_ps_d->specificTo.mpeg.aaQmfDelayBufImag; assignTimeSlotsPS ( h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0] + (NO_QMF_CHANNELS-FIRST_DELAY_SB), &h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[1], h_ps_d->specificTo.mpeg.noSampleDelay-1, (NO_DELAY_BUFFER_BANDS-FIRST_DELAY_SB)); /* Hybrid Filter Bank 1 creation. */ errorInfo = InitHybridFilterBank ( &h_ps_d->specificTo.mpeg.hybrid, h_ps_d->noSubSamples, noQmfBandsInHybrid20, aHybridResolution20 ); for ( i = 0; i < NO_IID_GROUPS; i++ ) { h_ps_d->specificTo.mpeg.h11rPrev[i] = FL2FXCONST_DBL(0.5f); h_ps_d->specificTo.mpeg.h12rPrev[i] = FL2FXCONST_DBL(0.5f); } FDKmemclear( h_ps_d->specificTo.mpeg.h21rPrev, sizeof( h_ps_d->specificTo.mpeg.h21rPrev ) ); FDKmemclear( h_ps_d->specificTo.mpeg.h22rPrev, sizeof( h_ps_d->specificTo.mpeg.h22rPrev ) ); return errorInfo; } /***************************************************************************/ /*! \brief clear some buffers used in decorrelation process \return ****************************************************************************/ void ResetPsDeCor( HANDLE_PS_DEC h_ps_d ) /*!< pointer to the module state */ { INT i; FDKmemclear(h_ps_d->specificTo.mpeg.aPeakDecayFastBin, NO_MID_RES_BINS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aPrevNrgBin, NO_MID_RES_BINS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aPrevPeakDiffBin, NO_MID_RES_BINS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aPowerPrevScal, NO_MID_RES_BINS*sizeof(SCHAR)); for (i=0 ; i < FIRST_DELAY_SB ; i++) { FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); } for (i=0 ; i < NO_SUB_QMF_CHANNELS ; i++) { FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); } } /*******************************************************************************/ /* slot based funcion prototypes */ static void deCorrelateSlotBased( HANDLE_PS_DEC h_ps_d, FIXP_DBL *mHybridRealLeft, FIXP_DBL *mHybridImagLeft, SCHAR sf_mHybridLeft, FIXP_DBL *rIntBufferLeft, FIXP_DBL *iIntBufferLeft, SCHAR sf_IntBuffer, FIXP_DBL *mHybridRealRight, FIXP_DBL *mHybridImagRight, FIXP_DBL *rIntBufferRight, FIXP_DBL *iIntBufferRight ); static void applySlotBasedRotation( HANDLE_PS_DEC h_ps_d, FIXP_DBL *mHybridRealLeft, FIXP_DBL *mHybridImagLeft, FIXP_DBL *QmfLeftReal, FIXP_DBL *QmfLeftImag, FIXP_DBL *mHybridRealRight, FIXP_DBL *mHybridImagRight, FIXP_DBL *QmfRightReal, FIXP_DBL *QmfRightImag ); /***************************************************************************/ /*! \brief Get scale factor for all ps delay buffer. \return ****************************************************************************/ static int getScaleFactorPsStatesBuffer(HANDLE_PS_DEC h_ps_d) { INT i; int scale = DFRACT_BITS-1; for (i=0; ispecificTo.mpeg.hybrid.mQmfBufferRealSlot[i], NO_SUB_QMF_CHANNELS)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.hybrid.mQmfBufferImagSlot[i], NO_SUB_QMF_CHANNELS)); } for (i=0; ispecificTo.mpeg.aaRealDelayBufferQmf[i], FIRST_DELAY_SB)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[i], FIRST_DELAY_SB)); } for (i=0; ispecificTo.mpeg.aaRealDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS)); } for (i=0; ispecificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS)); } for (i=0; ispecificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS)); } for (i=0; ispecificTo.mpeg.pAaRealDelayBufferQmf[i], len)); scale = fMin(scale, getScalefactor(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[i], len)); } return (scale); } /***************************************************************************/ /*! \brief Rescale all ps delay buffer. \return ****************************************************************************/ static void scalePsStatesBuffer(HANDLE_PS_DEC h_ps_d, int scale) { INT i; if (scale < 0) scale = fixMax((INT)scale,(INT)-(DFRACT_BITS-1)); else scale = fixMin((INT)scale,(INT)DFRACT_BITS-1); for (i=0; ispecificTo.mpeg.hybrid.mQmfBufferRealSlot[i], NO_SUB_QMF_CHANNELS, scale ); scaleValues( h_ps_d->specificTo.mpeg.hybrid.mQmfBufferImagSlot[i], NO_SUB_QMF_CHANNELS, scale ); } for (i=0; ispecificTo.mpeg.aaRealDelayBufferQmf[i], FIRST_DELAY_SB, scale ); scaleValues( h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[i], FIRST_DELAY_SB, scale ); } for (i=0; ispecificTo.mpeg.aaRealDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS, scale ); scaleValues( h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[i], NO_SUB_QMF_CHANNELS, scale ); } for (i=0; ispecificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS, scale ); scaleValues( h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS, scale ); } for (i=0; ispecificTo.mpeg.aaaRealDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS, scale ); scaleValues( h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[i], NO_DELAY_LENGTH_VECTORS, scale ); } for (i=0; ispecificTo.mpeg.pAaRealDelayBufferQmf[i], len, scale ); scaleValues( h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[i], len, scale ); } scale <<= 1; scaleValues( h_ps_d->specificTo.mpeg.aPeakDecayFastBin, NO_MID_RES_BINS, scale ); scaleValues( h_ps_d->specificTo.mpeg.aPrevPeakDiffBin, NO_MID_RES_BINS, scale ); scaleValues( h_ps_d->specificTo.mpeg.aPrevNrgBin, NO_MID_RES_BINS, scale ); } /***************************************************************************/ /*! \brief Scale input channel to the same scalefactor and rescale hybrid filterbank values \return ****************************************************************************/ void scalFilterBankValues( HANDLE_PS_DEC h_ps_d, FIXP_DBL **fixpQmfReal, FIXP_DBL **fixpQmfImag, int lsb, int scaleFactorLowBandSplitLow, int scaleFactorLowBandSplitHigh, SCHAR *scaleFactorLowBand_lb, SCHAR *scaleFactorLowBand_hb, int scaleFactorHighBands, INT *scaleFactorHighBand, INT noCols ) { INT maxScal; INT i; scaleFactorHighBands = -scaleFactorHighBands; scaleFactorLowBandSplitLow = -scaleFactorLowBandSplitLow; scaleFactorLowBandSplitHigh = -scaleFactorLowBandSplitHigh; /* get max scale factor */ maxScal = fixMax(scaleFactorHighBands,fixMax(scaleFactorLowBandSplitLow, scaleFactorLowBandSplitHigh )); { int headroom = getScaleFactorPsStatesBuffer(h_ps_d); maxScal = fixMax(maxScal,(INT)(h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer-headroom)); maxScal += 1; } /* scale whole left channel to the same scale factor */ /* low band ( overlap buffer ) */ if ( maxScal != scaleFactorLowBandSplitLow ) { INT scale = scaleFactorLowBandSplitLow - maxScal; for ( i=0; i<(6); i++ ) { scaleValues( fixpQmfReal[i], lsb, scale ); scaleValues( fixpQmfImag[i], lsb, scale ); } } /* low band ( current frame ) */ if ( maxScal != scaleFactorLowBandSplitHigh ) { INT scale = scaleFactorLowBandSplitHigh - maxScal; /* for ( i=(6); i<(6)+MAX_NUM_COL; i++ ) { */ for ( i=(6); i<(6)+noCols; i++ ) { scaleValues( fixpQmfReal[i], lsb, scale ); scaleValues( fixpQmfImag[i], lsb, scale ); } } /* high band */ if ( maxScal != scaleFactorHighBands ) { INT scale = scaleFactorHighBands - maxScal; /* for ( i=0; ispecificTo.mpeg.scaleFactorPsDelayBuffer ) scalePsStatesBuffer(h_ps_d,(h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer-maxScal)); h_ps_d->specificTo.mpeg.hybrid.sf_mQmfBuffer = maxScal; h_ps_d->specificTo.mpeg.scaleFactorPsDelayBuffer = maxScal; *scaleFactorHighBand += maxScal - scaleFactorHighBands; h_ps_d->rescal = maxScal - scaleFactorLowBandSplitHigh; h_ps_d->sf_IntBuffer = maxScal; *scaleFactorLowBand_lb += maxScal - scaleFactorLowBandSplitLow; *scaleFactorLowBand_hb += maxScal - scaleFactorLowBandSplitHigh; } void rescalFilterBankValues( HANDLE_PS_DEC h_ps_d, /* parametric stereo decoder handle */ FIXP_DBL **QmfBufferReal, /* qmf filterbank values */ FIXP_DBL **QmfBufferImag, /* qmf filterbank values */ int lsb, /* sbr start subband */ INT noCols) { int i; /* scale back 6 timeslots look ahead for hybrid filterbank to original value */ for ( i=noCols; irescal ); scaleValues( QmfBufferImag[i], lsb, h_ps_d->rescal ); } } /***************************************************************************/ /*! \brief Generate decorrelated side channel using allpass/delay \return ****************************************************************************/ static void deCorrelateSlotBased( HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */ FIXP_DBL *mHybridRealLeft, /*!< left (mono) hybrid values real */ FIXP_DBL *mHybridImagLeft, /*!< left (mono) hybrid values imag */ SCHAR sf_mHybridLeft, /*!< scalefactor for left (mono) hybrid bands */ FIXP_DBL *rIntBufferLeft, /*!< real qmf bands left (mono) (38x64) */ FIXP_DBL *iIntBufferLeft, /*!< real qmf bands left (mono) (38x64) */ SCHAR sf_IntBuffer, /*!< scalefactor for all left and right qmf bands */ FIXP_DBL *mHybridRealRight, /*!< right (decorrelated) hybrid values real */ FIXP_DBL *mHybridImagRight, /*!< right (decorrelated) hybrid values imag */ FIXP_DBL *rIntBufferRight, /*!< real qmf bands right (decorrelated) (38x64) */ FIXP_DBL *iIntBufferRight ) /*!< real qmf bands right (decorrelated) (38x64) */ { INT i, m, sb, gr, bin; FIXP_DBL peakDiff, nrg, transRatio; FIXP_DBL *RESTRICT aaLeftReal; FIXP_DBL *RESTRICT aaLeftImag; FIXP_DBL *RESTRICT aaRightReal; FIXP_DBL *RESTRICT aaRightImag; FIXP_DBL *RESTRICT pRealDelayBuffer; FIXP_DBL *RESTRICT pImagDelayBuffer; C_ALLOC_SCRATCH_START(aaPowerSlot, FIXP_DBL, NO_MID_RES_BINS); C_ALLOC_SCRATCH_START(aaTransRatioSlot, FIXP_DBL, NO_MID_RES_BINS); /*!
   parameter index       qmf bands             hybrid bands
  ----------------------------------------------------------------------------
         0                   0                      0,7
         1                   0                      1,6
         2                   0                      2
         3                   0                      3           HYBRID BANDS
         4                   1                      9
         5                   1                      8
         6                   2                     10
         7                   2                     11
  ----------------------------------------------------------------------------
         8                   3
         9                   4
        10                   5
        11                   6
        12                   7
        13                   8
        14                   9,10      (2 )                      QMF BANDS
        15                   11 - 13   (3 )
        16                   14 - 17   (4 )
        17                   18 - 22   (5 )
        18                   23 - 34   (12)
        19                   35 - 63   (29)
  ----------------------------------------------------------------------------
*/ #define FLTR_SCALE 3 /* hybrid bands (parameter index 0 - 7) */ aaLeftReal = mHybridRealLeft; aaLeftImag = mHybridImagLeft; aaPowerSlot[0] = ( fMultAddDiv2( fMultDiv2(aaLeftReal[0], aaLeftReal[0]), aaLeftImag[0], aaLeftImag[0] ) >> FLTR_SCALE ) + ( fMultAddDiv2( fMultDiv2(aaLeftReal[7], aaLeftReal[7]), aaLeftImag[7], aaLeftImag[7] ) >> FLTR_SCALE ); aaPowerSlot[1] = ( fMultAddDiv2( fMultDiv2(aaLeftReal[1], aaLeftReal[1]), aaLeftImag[1], aaLeftImag[1] ) >> FLTR_SCALE ) + ( fMultAddDiv2( fMultDiv2(aaLeftReal[6], aaLeftReal[6]), aaLeftImag[6], aaLeftImag[6] ) >> FLTR_SCALE ); aaPowerSlot[2] = fMultAddDiv2( fMultDiv2(aaLeftReal[2], aaLeftReal[2]), aaLeftImag[2], aaLeftImag[2] ) >> FLTR_SCALE; aaPowerSlot[3] = fMultAddDiv2( fMultDiv2(aaLeftReal[3], aaLeftReal[3]), aaLeftImag[3], aaLeftImag[3] ) >> FLTR_SCALE; aaPowerSlot[4] = fMultAddDiv2( fMultDiv2(aaLeftReal[9], aaLeftReal[9]), aaLeftImag[9], aaLeftImag[9] ) >> FLTR_SCALE; aaPowerSlot[5] = fMultAddDiv2( fMultDiv2(aaLeftReal[8], aaLeftReal[8]), aaLeftImag[8], aaLeftImag[8] ) >> FLTR_SCALE; aaPowerSlot[6] = fMultAddDiv2( fMultDiv2(aaLeftReal[10], aaLeftReal[10]), aaLeftImag[10], aaLeftImag[10] ) >> FLTR_SCALE; aaPowerSlot[7] = fMultAddDiv2( fMultDiv2(aaLeftReal[11], aaLeftReal[11]), aaLeftImag[11], aaLeftImag[11] ) >> FLTR_SCALE; /* qmf bands (parameter index 8 - 19) */ for ( bin = 8; bin < NO_MID_RES_BINS; bin++ ) { FIXP_DBL slotNrg = FL2FXCONST_DBL(0.f); for ( i = groupBorders20[bin+2]; i < groupBorders20[bin+3]; i++ ) { /* max loops: 29 */ slotNrg += fMultAddDiv2 ( fMultDiv2(rIntBufferLeft[i], rIntBufferLeft[i]), iIntBufferLeft[i], iIntBufferLeft[i]) >> FLTR_SCALE; } aaPowerSlot[bin] = slotNrg; } /* calculation of transient ratio */ for (bin=0; bin < NO_MID_RES_BINS; bin++) { /* noBins = 20 ( BASELINE_PS ) */ h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] = fMult( h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin], PEAK_DECAY_FACTOR ); if (h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] < aaPowerSlot[bin]) { h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] = aaPowerSlot[bin]; } /* calculate PSmoothPeakDecayDiffNrg */ peakDiff = fMultAdd ( (h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin]>>1), INT_FILTER_COEFF, h_ps_d->specificTo.mpeg.aPeakDecayFastBin[bin] - aaPowerSlot[bin] - h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin]); /* save peakDiff for the next frame */ h_ps_d->specificTo.mpeg.aPrevPeakDiffBin[bin] = peakDiff; nrg = h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] + fMult( INT_FILTER_COEFF, aaPowerSlot[bin] - h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] ); /* Negative energies don't exist. But sometimes they appear due to rounding. */ nrg = fixMax(nrg,FL2FXCONST_DBL(0.f)); /* save nrg for the next frame */ h_ps_d->specificTo.mpeg.aPrevNrgBin[bin] = nrg; nrg = fMult( nrg, TRANSIENT_IMPACT_FACTOR ); /* save transient impact factor */ if ( peakDiff <= nrg || peakDiff == FL2FXCONST_DBL(0.0) ) { aaTransRatioSlot[bin] = (FIXP_DBL)MAXVAL_DBL /* FL2FXCONST_DBL(1.0f)*/; } else if ( nrg <= FL2FXCONST_DBL(0.0f) ) { aaTransRatioSlot[bin] = FL2FXCONST_DBL(0.f); } else { /* scale to denominator */ INT scale_left = fixMax(0, CntLeadingZeros(peakDiff) - 1); aaTransRatioSlot[bin] = schur_div( nrg<specificTo.mpeg.delayBufIndex; /* set delay indices */ pRealDelayBuffer = h_ps_d->specificTo.mpeg.aaRealDelayBufferSubQmf[TempDelay]; pImagDelayBuffer = h_ps_d->specificTo.mpeg.aaImagDelayBufferSubQmf[TempDelay]; aaLeftReal = mHybridRealLeft; aaLeftImag = mHybridImagLeft; aaRightReal = mHybridRealRight; aaRightImag = mHybridImagRight; /************************/ /* ICC groups : 0 - 9 */ /************************/ /* gr = ICC groups */ for (gr=0; gr < SUBQMF_GROUPS; gr++) { transRatio = aaTransRatioSlot[bins2groupMap20[gr]]; /* sb = subQMF/QMF subband */ sb = groupBorders20[gr]; /* Update delay buffers, sample delay allpass = 2 */ rTmp0 = pRealDelayBuffer[sb]; iTmp0 = pImagDelayBuffer[sb]; pRealDelayBuffer[sb] = aaLeftReal[sb]; pImagDelayBuffer[sb] = aaLeftImag[sb]; /* delay by fraction */ cplxMultDiv2(&rR0, &iR0, rTmp0, iTmp0, aaFractDelayPhaseFactorReSubQmf20[sb], aaFractDelayPhaseFactorImSubQmf20[sb]); rR0<<=1; iR0<<=1; FIXP_DBL *pAaaRealDelayRBufferSerSubQmf = h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerSubQmf[sb]; FIXP_DBL *pAaaImagDelayRBufferSerSubQmf = h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerSubQmf[sb]; for (m=0; mspecificTo.mpeg.aDelayRBufIndexSer[m]; /* get delayed values from according buffer : m(0)=3; m(1)=4; m(2)=5; */ rTmp0 = pAaaRealDelayRBufferSerSubQmf[tmpDelayRSer]; iTmp0 = pAaaImagDelayRBufferSerSubQmf[tmpDelayRSer]; /* delay by fraction */ cplxMultDiv2(&rTmp, &iTmp, rTmp0, iTmp0, aaFractDelayPhaseFactorSerReSubQmf20[sb][m], aaFractDelayPhaseFactorSerImSubQmf20[sb][m]); rTmp = (rTmp - fMultDiv2(aAllpassLinkDecaySer[m], rR0)) << 1; iTmp = (iTmp - fMultDiv2(aAllpassLinkDecaySer[m], iR0)) << 1; pAaaRealDelayRBufferSerSubQmf[tmpDelayRSer] = rR0 + fMult(aAllpassLinkDecaySer[m], rTmp); pAaaImagDelayRBufferSerSubQmf[tmpDelayRSer] = iR0 + fMult(aAllpassLinkDecaySer[m], iTmp); rR0 = rTmp; iR0 = iTmp; pAaaRealDelayRBufferSerSubQmf += aAllpassLinkDelaySer[m]; pAaaImagDelayRBufferSerSubQmf += aAllpassLinkDelaySer[m]; } /* m */ /* duck if a past transient is found */ aaRightReal[sb] = fMult(transRatio, rR0); aaRightImag[sb] = fMult(transRatio, iR0); } /* gr */ scaleValues( mHybridRealLeft, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM ); scaleValues( mHybridImagLeft, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM ); scaleValues( mHybridRealRight, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM ); scaleValues( mHybridImagRight, NO_SUB_QMF_CHANNELS, -SCAL_HEADROOM ); /************************/ aaLeftReal = rIntBufferLeft; aaLeftImag = iIntBufferLeft; aaRightReal = rIntBufferRight; aaRightImag = iIntBufferRight; pRealDelayBuffer = h_ps_d->specificTo.mpeg.aaRealDelayBufferQmf[TempDelay]; pImagDelayBuffer = h_ps_d->specificTo.mpeg.aaImagDelayBufferQmf[TempDelay]; /************************/ /* ICC groups : 10 - 19 */ /************************/ /* gr = ICC groups */ for (gr=SUBQMF_GROUPS; gr < NO_IID_GROUPS - NR_OF_DELAY_GROUPS; gr++) { transRatio = aaTransRatioSlot[bins2groupMap20[gr]]; /* sb = subQMF/QMF subband */ for (sb = groupBorders20[gr]; sb < groupBorders20[gr+1]; sb++) { FIXP_DBL resR, resI; /* decayScaleFactor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb; DECAY_SLOPE = 0.05 */ FIXP_DBL decayScaleFactor = decayScaleFactTable[sb]; /* Update delay buffers, sample delay allpass = 2 */ rTmp0 = pRealDelayBuffer[sb]; iTmp0 = pImagDelayBuffer[sb]; pRealDelayBuffer[sb] = aaLeftReal[sb]; pImagDelayBuffer[sb] = aaLeftImag[sb]; /* delay by fraction */ cplxMultDiv2(&rR0, &iR0, rTmp0, iTmp0, aaFractDelayPhaseFactorReQmf[sb], aaFractDelayPhaseFactorImQmf[sb]); rR0<<=1; iR0<<=1; resR = fMult(decayScaleFactor, rR0); resI = fMult(decayScaleFactor, iR0); FIXP_DBL *pAaaRealDelayRBufferSerQmf = h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[sb]; FIXP_DBL *pAaaImagDelayRBufferSerQmf = h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[sb]; for (m=0; mspecificTo.mpeg.aDelayRBufIndexSer[m]; /* get delayed values from according buffer : m(0)=3; m(1)=4; m(2)=5; */ rTmp0 = pAaaRealDelayRBufferSerQmf[tmpDelayRSer]; iTmp0 = pAaaImagDelayRBufferSerQmf[tmpDelayRSer]; /* delay by fraction */ cplxMultDiv2(&rTmp, &iTmp, rTmp0, iTmp0, aaFractDelayPhaseFactorSerReQmf[sb][m], aaFractDelayPhaseFactorSerImQmf[sb][m]); rTmp = (rTmp - fMultDiv2(aAllpassLinkDecaySer[m], resR))<<1; iTmp = (iTmp - fMultDiv2(aAllpassLinkDecaySer[m], resI))<<1; resR = fMult(decayScaleFactor, rTmp); resI = fMult(decayScaleFactor, iTmp); pAaaRealDelayRBufferSerQmf[tmpDelayRSer] = rR0 + fMult(aAllpassLinkDecaySer[m], resR); pAaaImagDelayRBufferSerQmf[tmpDelayRSer] = iR0 + fMult(aAllpassLinkDecaySer[m], resI); rR0 = rTmp; iR0 = iTmp; pAaaRealDelayRBufferSerQmf += aAllpassLinkDelaySer[m]; pAaaImagDelayRBufferSerQmf += aAllpassLinkDelaySer[m]; } /* m */ /* duck if a past transient is found */ aaRightReal[sb] = fMult(transRatio, rR0); aaRightImag[sb] = fMult(transRatio, iR0); } /* sb */ } /* gr */ /************************/ /* ICC groups : 20, 21 */ /************************/ /* gr = ICC groups */ for (gr=DELAY_GROUP_OFFSET; gr < NO_IID_GROUPS; gr++) { INT sbStart = groupBorders20[gr]; INT sbStop = groupBorders20[gr+1]; UCHAR *pDelayBufIdx = &h_ps_d->specificTo.mpeg.aDelayBufIndexDelayQmf[sbStart-FIRST_DELAY_SB]; transRatio = aaTransRatioSlot[bins2groupMap20[gr]]; /* sb = subQMF/QMF subband */ for (sb = sbStart; sb < sbStop; sb++) { /* Update delay buffers */ rR0 = h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB]; iR0 = h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB]; h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB] = aaLeftReal[sb]; h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[*pDelayBufIdx][sb-FIRST_DELAY_SB] = aaLeftImag[sb]; /* duck if a past transient is found */ aaRightReal[sb] = fMult(transRatio, rR0); aaRightImag[sb] = fMult(transRatio, iR0); if (++(*pDelayBufIdx) >= delayIndexQmf[sb]) { *pDelayBufIdx = 0; } pDelayBufIdx++; } /* sb */ } /* gr */ /* Update delay buffer index */ if (++h_ps_d->specificTo.mpeg.delayBufIndex >= NO_SAMPLE_DELAY_ALLPASS) h_ps_d->specificTo.mpeg.delayBufIndex = 0; for (m=0; mspecificTo.mpeg.aDelayRBufIndexSer[m] >= aAllpassLinkDelaySer[m]) h_ps_d->specificTo.mpeg.aDelayRBufIndexSer[m] = 0; } scaleValues( &rIntBufferLeft[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM ); scaleValues( &iIntBufferLeft[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM ); scaleValues( &rIntBufferRight[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM ); scaleValues( &iIntBufferRight[NO_QMF_BANDS_HYBRID20], NO_QMF_CHANNELS-NO_QMF_BANDS_HYBRID20, -SCAL_HEADROOM ); /* free memory on scratch */ C_ALLOC_SCRATCH_END(aaTransRatioSlot, FIXP_DBL, NO_MID_RES_BINS); C_ALLOC_SCRATCH_END(aaPowerSlot, FIXP_DBL, NO_MID_RES_BINS); } void initSlotBasedRotation( HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */ int env, int usb ) { INT group = 0; INT bin = 0; INT noIidSteps; /* const UCHAR *pQuantizedIIDs;*/ FIXP_SGL invL; FIXP_DBL ScaleL, ScaleR; FIXP_DBL Alpha, Beta; FIXP_DBL h11r, h12r, h21r, h22r; const FIXP_DBL *PScaleFactors; /* Overwrite old values in delay buffers when upper subband is higher than in last frame */ if (env == 0) { if ((usb > h_ps_d->specificTo.mpeg.lastUsb) && h_ps_d->specificTo.mpeg.lastUsb) { INT i,k,length; for (i=h_ps_d->specificTo.mpeg.lastUsb ; i < FIRST_DELAY_SB; i++) { FDKmemclear(h_ps_d->specificTo.mpeg.aaaRealDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); FDKmemclear(h_ps_d->specificTo.mpeg.aaaImagDelayRBufferSerQmf[i], NO_DELAY_LENGTH_VECTORS*sizeof(FIXP_DBL)); } for (k=0 ; kspecificTo.mpeg.pAaRealDelayBufferQmf[k], FIRST_DELAY_SB*sizeof(FIXP_DBL)); } length = (usb-FIRST_DELAY_SB)*sizeof(FIXP_DBL); if(length>0) { FDKmemclear(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[0], length); FDKmemclear(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[0], length); } length = (fixMin(NO_DELAY_BUFFER_BANDS,(INT)usb)-FIRST_DELAY_SB)*sizeof(FIXP_DBL); if(length>0) { for (k=1 ; k < h_ps_d->specificTo.mpeg.noSampleDelay; k++) { FDKmemclear(h_ps_d->specificTo.mpeg.pAaRealDelayBufferQmf[k], length); FDKmemclear(h_ps_d->specificTo.mpeg.pAaImagDelayBufferQmf[k], length); } } } h_ps_d->specificTo.mpeg.lastUsb = usb; } /* env == 0 */ if (h_ps_d->bsData[h_ps_d->processSlot].mpeg.bFineIidQ) { PScaleFactors = ScaleFactorsFine; /* values are shiftet right by one */ noIidSteps = NO_IID_STEPS_FINE; /*pQuantizedIIDs = quantizedIIDsFine;*/ } else { PScaleFactors = ScaleFactors; /* values are shiftet right by one */ noIidSteps = NO_IID_STEPS; /*pQuantizedIIDs = quantizedIIDs;*/ } /* dequantize and decode */ for ( group = 0; group < NO_IID_GROUPS; group++ ) { bin = bins2groupMap20[group]; /*!

type 'A' rotation

mixing procedure R_a, used in baseline version
Scale-factor vectors c1 and c2 are precalculated in initPsTables () and stored in scaleFactors[] and scaleFactorsFine[] = pScaleFactors []. From the linearized IID parameters (intensity differences), two scale factors are calculated. They are used to obtain the coefficients h11... h22. */ /* ScaleR and ScaleL are scaled by 1 shift right */ ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][bin]]; ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.coef.aaIidIndexMapped[env][bin]]; Beta = fMult (fMult( Alphas[h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][bin]], ( ScaleR - ScaleL )), FIXP_SQRT05); Alpha = Alphas[h_ps_d->specificTo.mpeg.coef.aaIccIndexMapped[env][bin]]>>1; /* Alpha and Beta are now both scaled by 2 shifts right */ /* calculate the coefficients h11... h22 from scale-factors and ICC parameters */ /* h values are scaled by 1 shift right */ { FIXP_DBL trigData[4]; inline_fixp_cos_sin(Beta + Alpha, Beta - Alpha, 2, trigData); h11r = fMult( ScaleL, trigData[0]); h12r = fMult( ScaleR, trigData[2]); h21r = fMult( ScaleL, trigData[1]); h22r = fMult( ScaleR, trigData[3]); } /*****************************************************************************************/ /* Interpolation of the matrices H11... H22: */ /* */ /* H11(k,n) = H11(k,n[e]) + (n-n[e]) * (H11(k,n[e+1] - H11(k,n[e])) / (n[e+1] - n[e]) */ /* ... */ /*****************************************************************************************/ /* invL = 1/(length of envelope) */ invL = FX_DBL2FX_SGL(GetInvInt(h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env + 1] - h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env])); h_ps_d->specificTo.mpeg.coef.H11r[group] = h_ps_d->specificTo.mpeg.h11rPrev[group]; h_ps_d->specificTo.mpeg.coef.H12r[group] = h_ps_d->specificTo.mpeg.h12rPrev[group]; h_ps_d->specificTo.mpeg.coef.H21r[group] = h_ps_d->specificTo.mpeg.h21rPrev[group]; h_ps_d->specificTo.mpeg.coef.H22r[group] = h_ps_d->specificTo.mpeg.h22rPrev[group]; h_ps_d->specificTo.mpeg.coef.DeltaH11r[group] = fMult ( h11r - h_ps_d->specificTo.mpeg.coef.H11r[group], invL ); h_ps_d->specificTo.mpeg.coef.DeltaH12r[group] = fMult ( h12r - h_ps_d->specificTo.mpeg.coef.H12r[group], invL ); h_ps_d->specificTo.mpeg.coef.DeltaH21r[group] = fMult ( h21r - h_ps_d->specificTo.mpeg.coef.H21r[group], invL ); h_ps_d->specificTo.mpeg.coef.DeltaH22r[group] = fMult ( h22r - h_ps_d->specificTo.mpeg.coef.H22r[group], invL ); /* update prev coefficients for interpolation in next envelope */ h_ps_d->specificTo.mpeg.h11rPrev[group] = h11r; h_ps_d->specificTo.mpeg.h12rPrev[group] = h12r; h_ps_d->specificTo.mpeg.h21rPrev[group] = h21r; h_ps_d->specificTo.mpeg.h22rPrev[group] = h22r; } /* group loop */ } static void applySlotBasedRotation( HANDLE_PS_DEC h_ps_d, /*!< pointer to the module state */ FIXP_DBL *mHybridRealLeft, /*!< hybrid values real left */ FIXP_DBL *mHybridImagLeft, /*!< hybrid values imag left */ FIXP_DBL *QmfLeftReal, /*!< real bands left qmf channel */ FIXP_DBL *QmfLeftImag, /*!< imag bands left qmf channel */ FIXP_DBL *mHybridRealRight, /*!< hybrid values real right */ FIXP_DBL *mHybridImagRight, /*!< hybrid values imag right */ FIXP_DBL *QmfRightReal, /*!< real bands right qmf channel */ FIXP_DBL *QmfRightImag /*!< imag bands right qmf channel */ ) { INT group; INT subband; FIXP_DBL *RESTRICT HybrLeftReal; FIXP_DBL *RESTRICT HybrLeftImag; FIXP_DBL *RESTRICT HybrRightReal; FIXP_DBL *RESTRICT HybrRightImag; FIXP_DBL tmpLeft, tmpRight; /**********************************************************************************************/ /*!

Mapping

The number of stereo bands that is actually used depends on the number of availble parameters for IID and ICC:
   nr. of IID para.| nr. of ICC para. | nr. of Stereo bands
   ----------------|------------------|-------------------
     10,20         |     10,20        |        20
     10,20         |     34           |        34
     34            |     10,20        |        34
     34            |     34           |        34
  
In the case the number of parameters for IIS and ICC differs from the number of stereo bands, a mapping from the lower number to the higher number of parameters is applied. Index mapping of IID and ICC parameters is already done in psbitdec.cpp. Further mapping is not needed here in baseline version. **********************************************************************************************/ /************************************************************************************************/ /*!

Mixing

To generate the QMF subband signals for the subband samples n = n[e]+1 ,,, n_[e+1] the parameters at position n[e] and n[e+1] are required as well as the subband domain signals s_k(n) and d_k(n) for n = n[e]+1... n_[e+1]. n[e] represents the start position for envelope e. The border positions n[e] are handled in DecodePS(). The stereo sub subband signals are constructed as:
  l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n)
  r_k(n) = H21(k,n) s_k(n) + H22(k,n) d_k(n)
  
In order to obtain the matrices H11(k,n)... H22 (k,n), the vectors h11(b)... h22(b) need to be calculated first (b: parameter index). Depending on ICC mode either mixing procedure R_a or R_b is used for that. For both procedures, the parameters for parameter position n[e+1] is used. ************************************************************************************************/ /************************************************************************************************/ /*!

Phase parameters

With disabled phase parameters (which is the case in baseline version), the H-matrices are just calculated by:
  H11(k,n[e+1] = h11(b(k))
  (...)
  b(k): parameter index according to mapping table
  

Processing of the samples in the sub subbands

this loop includes the interpolation of the coefficients Hxx ************************************************************************************************/ /* loop thru all groups ... */ HybrLeftReal = mHybridRealLeft; HybrLeftImag = mHybridImagLeft; HybrRightReal = mHybridRealRight; HybrRightImag = mHybridImagRight; /******************************************************/ /* construct stereo sub subband signals according to: */ /* */ /* l_k(n) = H11(k,n) s_k(n) + H21(k,n) d_k(n) */ /* r_k(n) = H12(k,n) s_k(n) + H22(k,n) d_k(n) */ /******************************************************/ for ( group = 0; group < SUBQMF_GROUPS; group++ ) { h_ps_d->specificTo.mpeg.coef.H11r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH11r[group]; h_ps_d->specificTo.mpeg.coef.H12r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH12r[group]; h_ps_d->specificTo.mpeg.coef.H21r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH21r[group]; h_ps_d->specificTo.mpeg.coef.H22r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH22r[group]; subband = groupBorders20[group]; tmpLeft = fMultAddDiv2( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightReal[subband]); tmpRight = fMultAddDiv2( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightReal[subband]); HybrLeftReal [subband] = tmpLeft<<1; HybrRightReal[subband] = tmpRight<<1; tmpLeft = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightImag[subband]); tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightImag[subband]); HybrLeftImag [subband] = tmpLeft; HybrRightImag[subband] = tmpRight; } /* continue in the qmf buffers */ HybrLeftReal = QmfLeftReal; HybrLeftImag = QmfLeftImag; HybrRightReal = QmfRightReal; HybrRightImag = QmfRightImag; for (; group < NO_IID_GROUPS; group++ ) { h_ps_d->specificTo.mpeg.coef.H11r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH11r[group]; h_ps_d->specificTo.mpeg.coef.H12r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH12r[group]; h_ps_d->specificTo.mpeg.coef.H21r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH21r[group]; h_ps_d->specificTo.mpeg.coef.H22r[group] += h_ps_d->specificTo.mpeg.coef.DeltaH22r[group]; for ( subband = groupBorders20[group]; subband < groupBorders20[group + 1]; subband++ ) { tmpLeft = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightReal[subband]); tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftReal[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightReal[subband]); HybrLeftReal [subband] = tmpLeft; HybrRightReal[subband] = tmpRight; tmpLeft = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H11r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H21r[group], HybrRightImag[subband]); tmpRight = fMultAdd( fMultDiv2(h_ps_d->specificTo.mpeg.coef.H12r[group], HybrLeftImag[subband]), h_ps_d->specificTo.mpeg.coef.H22r[group], HybrRightImag[subband]); HybrLeftImag [subband] = tmpLeft; HybrRightImag[subband] = tmpRight; } /* subband */ } } /***************************************************************************/ /*! \brief Applies IID, ICC, IPD and OPD parameters to the current frame. \return none ****************************************************************************/ void ApplyPsSlot( HANDLE_PS_DEC h_ps_d, /*!< handle PS_DEC*/ FIXP_DBL **rIntBufferLeft, /*!< real bands left qmf channel (38x64) */ FIXP_DBL **iIntBufferLeft, /*!< imag bands left qmf channel (38x64) */ FIXP_DBL *rIntBufferRight, /*!< real bands right qmf channel (38x64) */ FIXP_DBL *iIntBufferRight /*!< imag bands right qmf channel (38x64) */ ) { /*! The 64-band QMF representation of the monaural signal generated by the SBR tool is used as input of the PS tool. After the PS processing, the outputs of the left and right hybrid synthesis filterbanks are used to generate the stereo output signal.

             -------------            ----------            -------------
            | Hybrid      | M_n[k,m] |          | L_n[k,m] | Hybrid      | l[n]
   m[n] --->| analysis    |--------->|          |--------->| synthesis   |----->
            | filter bank |          |          |          | filter bank |
             -------------           | Stereo   |           -------------
                   |                 | recon-   |
                   |                 | stuction |
                  \|/                |          |
             -------------           |          |
            | De-         | D_n[k,m] |          |
            | correlation |--------->|          |
             -------------           |          |           -------------
                                     |          | R_n[k,m] | Hybrid      | r[n]
                                     |          |--------->| synthesis   |----->
   IID, ICC ------------------------>|          |          | filter bank |
  (IPD, OPD)                          ----------            -------------

  m[n]:      QMF represantation of the mono input
  M_n[k,m]:  (sub-)sub-band domain signals of the mono input
  D_n[k,m]:  decorrelated (sub-)sub-band domain signals
  L_n[k,m]:  (sub-)sub-band domain signals of the left output
  R_n[k,m]:  (sub-)sub-band domain signals of the right output
  l[n],r[n]: left/right output signals

  
*/ /* get temporary hybrid qmf values of one timeslot */ C_ALLOC_SCRATCH_START(hybridRealLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_START(hybridImagLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_START(hybridRealRight, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_START(hybridImagRight, FIXP_DBL, NO_SUB_QMF_CHANNELS); SCHAR sf_IntBuffer = h_ps_d->sf_IntBuffer; /* clear workbuffer */ FDKmemclear(hybridRealLeft, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL)); FDKmemclear(hybridImagLeft, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL)); FDKmemclear(hybridRealRight, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL)); FDKmemclear(hybridImagRight, NO_SUB_QMF_CHANNELS*sizeof(FIXP_DBL)); /*! Hybrid analysis filterbank: The lower 3 (5) of the 64 QMF subbands are further split to provide better frequency resolution. for PS processing. For the 10 and 20 stereo bands configuration, the QMF band H_0(w) is split up into 8 (sub-) sub-bands and the QMF bands H_1(w) and H_2(w) are spit into 2 (sub-) 4th. (See figures 8.20 and 8.22 of ISO/IEC 14496-3:2001/FDAM 2:2004(E) ) */ if (h_ps_d->procFrameBased == 1) /* If we have switched from frame to slot based processing */ { /* fill hybrid delay buffer. */ h_ps_d->procFrameBased = 0; fillHybridDelayLine( rIntBufferLeft, iIntBufferLeft, hybridRealLeft, hybridImagLeft, hybridRealRight, hybridImagRight, &h_ps_d->specificTo.mpeg.hybrid ); } slotBasedHybridAnalysis ( rIntBufferLeft[HYBRID_FILTER_DELAY], /* qmf filterbank values */ iIntBufferLeft[HYBRID_FILTER_DELAY], /* qmf filterbank values */ hybridRealLeft, /* hybrid filterbank values */ hybridImagLeft, /* hybrid filterbank values */ &h_ps_d->specificTo.mpeg.hybrid); /* hybrid filterbank handle */ SCHAR hybridScal = h_ps_d->specificTo.mpeg.hybrid.sf_mQmfBuffer; /*! Decorrelation: By means of all-pass filtering and delaying, the (sub-)sub-band samples s_k(n) are converted into de-correlated (sub-)sub-band samples d_k(n). - k: frequency in hybrid spectrum - n: time index */ deCorrelateSlotBased( h_ps_d, /* parametric stereo decoder handle */ hybridRealLeft, /* left hybrid time slot */ hybridImagLeft, hybridScal, /* scale factor of left hybrid time slot */ rIntBufferLeft[0], /* left qmf time slot */ iIntBufferLeft[0], sf_IntBuffer, /* scale factor of left and right qmf time slot */ hybridRealRight, /* right hybrid time slot */ hybridImagRight, rIntBufferRight, /* right qmf time slot */ iIntBufferRight ); /*! Stereo Processing: The sets of (sub-)sub-band samples s_k(n) and d_k(n) are processed according to the stereo cues which are defined per stereo band. */ applySlotBasedRotation( h_ps_d, /* parametric stereo decoder handle */ hybridRealLeft, /* left hybrid time slot */ hybridImagLeft, rIntBufferLeft[0], /* left qmf time slot */ iIntBufferLeft[0], hybridRealRight, /* right hybrid time slot */ hybridImagRight, rIntBufferRight, /* right qmf time slot */ iIntBufferRight ); /*! Hybrid synthesis filterbank: The stereo processed hybrid subband signals l_k(n) and r_k(n) are fed into the hybrid synthesis filterbanks which are identical to the 64 complex synthesis filterbank of the SBR tool. The input to the filterbank are slots of 64 QMF samples. For each slot the filterbank outputs one block of 64 samples of one reconstructed stereo channel. The hybrid synthesis filterbank is computed seperatly for the left and right channel. */ /* left channel */ slotBasedHybridSynthesis ( hybridRealLeft, /* one timeslot of hybrid filterbank values */ hybridImagLeft, rIntBufferLeft[0], /* one timeslot of qmf filterbank values */ iIntBufferLeft[0], &h_ps_d->specificTo.mpeg.hybrid ); /* hybrid filterbank handle */ /* right channel */ slotBasedHybridSynthesis ( hybridRealRight, /* one timeslot of hybrid filterbank values */ hybridImagRight, rIntBufferRight, /* one timeslot of qmf filterbank values */ iIntBufferRight, &h_ps_d->specificTo.mpeg.hybrid ); /* hybrid filterbank handle */ /* free temporary hybrid qmf values of one timeslot */ C_ALLOC_SCRATCH_END(hybridImagRight, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_END(hybridRealRight, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_END(hybridImagLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS); C_ALLOC_SCRATCH_END(hybridRealLeft, FIXP_DBL, NO_SUB_QMF_CHANNELS); }/* END ApplyPsSlot */ /***************************************************************************/ /*! \brief assigns timeslots to an array \return ****************************************************************************/ static void assignTimeSlotsPS (FIXP_DBL *bufAdr, FIXP_DBL **bufPtr, const int numSlots, const int numChan) { FIXP_DBL *ptr; int slot; ptr = bufAdr; for(slot=0; slot < numSlots; slot++) { bufPtr [slot] = ptr; ptr += numChan; } } fdk-aac-0.1.3/libSBRdec/src/sbr_crc.h0000644000175000017500000001244312372261464017564 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief CRC checking routines */ #ifndef __SBR_CRC_H #define __SBR_CRC_H #include "sbrdecoder.h" #include "FDK_bitstream.h" /* some useful crc polynoms: crc5: x^5+x^4+x^2+x^1+1 crc6: x^6+x^5+x^3+x^2+x+1 crc7: x^7+x^6+x^2+1 crc8: x^8+x^2+x+x+1 */ /* default SBR CRC */ /* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ #define SBR_CRC_POLY 0x0233 #define SBR_CRC_MASK 0x0200 #define SBR_CRC_START 0x0000 #define SBR_CRC_RANGE 0x03FF typedef struct { USHORT crcState; USHORT crcMask; USHORT crcPoly; } CRC_BUFFER; typedef CRC_BUFFER *HANDLE_CRC; int SbrCrcCheck (HANDLE_FDK_BITSTREAM hBitBuf, LONG NrCrcBits); #endif fdk-aac-0.1.3/libSBRdec/src/sbr_rom.h0000644000175000017500000002465612372261464017623 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Declaration of constant tables */ #ifndef __rom_H #define __rom_H #include "sbrdecoder.h" #include "env_extr.h" #include "qmf.h" #define INV_INT_TABLE_SIZE 49 #define SBR_NF_NO_RANDOM_VAL 512 /*!< Size of random number array for noise floor */ /* Frequency scales */ extern const UCHAR FDK_sbrDecoder_sbr_start_freq_16[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_22[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_24[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_32[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_40[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_44[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_48[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_64[16]; extern const UCHAR FDK_sbrDecoder_sbr_start_freq_88[16]; /* Low-Power-Profile Transposer */ #define NUM_WHFACTOR_TABLE_ENTRIES 9 extern const USHORT FDK_sbrDecoder_sbr_whFactorsIndex[NUM_WHFACTOR_TABLE_ENTRIES]; extern const FIXP_DBL FDK_sbrDecoder_sbr_whFactorsTable[NUM_WHFACTOR_TABLE_ENTRIES][6]; /* Envelope Adjustor */ extern const FIXP_SGL FDK_sbrDecoder_sbr_limGains_m[4]; extern const UCHAR FDK_sbrDecoder_sbr_limGains_e[4]; extern const FIXP_SGL FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4[4]; extern const FIXP_SGL FDK_sbrDecoder_sbr_smoothFilter[4]; extern const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2]; extern const FIXP_SGL harmonicPhaseX [2][4]; /* Envelope Extractor */ extern const int FDK_sbrDecoder_envelopeTable_8 [8][5]; extern const int FDK_sbrDecoder_envelopeTable_15 [15][6]; extern const int FDK_sbrDecoder_envelopeTable_16 [16][6]; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_15; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_15; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_15; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_15; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_16; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_16; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_16; extern const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_16; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10T[120][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10F[120][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10T[48][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10F[48][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11T[62][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11F[62][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11T[24][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11F[24][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T[62][2]; extern const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T[24][2]; /* Parametric stereo */ extern const FIXP_DBL decayScaleFactTable[NO_QMF_CHANNELS]; /* FIX_BORDER can have 0, 1, 2, 4 envelops */ extern const UCHAR FDK_sbrDecoder_aFixNoEnvDecode[4]; /* IID & ICC Huffman codebooks */ extern const SCHAR aBookPsIidTimeDecode[28][2]; extern const SCHAR aBookPsIidFreqDecode[28][2]; extern const SCHAR aBookPsIccTimeDecode[14][2]; extern const SCHAR aBookPsIccFreqDecode[14][2]; /* IID-fine Huffman codebooks */ extern const SCHAR aBookPsIidFineTimeDecode[60][2]; extern const SCHAR aBookPsIidFineFreqDecode[60][2]; /* the values of the following 3 tables are shiftet right by 1 ! */ extern const FIXP_DBL ScaleFactors[NO_IID_LEVELS]; extern const FIXP_DBL ScaleFactorsFine[NO_IID_LEVELS_FINE]; extern const FIXP_DBL Alphas[NO_ICC_LEVELS]; #if defined(ARCH_PREFER_MULT_32x16) extern const FIXP_SGL aAllpassLinkDecaySer[NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_SGL aaFractDelayPhaseFactorReQmf[NO_QMF_CHANNELS]; extern const FIXP_SGL aaFractDelayPhaseFactorImQmf[NO_QMF_CHANNELS]; extern const FIXP_SGL aaFractDelayPhaseFactorReSubQmf20[NO_SUB_QMF_CHANNELS]; extern const FIXP_SGL aaFractDelayPhaseFactorImSubQmf20[NO_SUB_QMF_CHANNELS]; extern const FIXP_SGL aaFractDelayPhaseFactorSerReQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_SGL aaFractDelayPhaseFactorSerImQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_SGL aaFractDelayPhaseFactorSerReSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_SGL aaFractDelayPhaseFactorSerImSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_SGL p8_13_20[13]; extern const FIXP_SGL p2_13_20[13]; #else extern const FIXP_DBL aAllpassLinkDecaySer[NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_DBL aaFractDelayPhaseFactorReQmf[NO_QMF_CHANNELS]; extern const FIXP_DBL aaFractDelayPhaseFactorImQmf[NO_QMF_CHANNELS]; extern const FIXP_DBL aaFractDelayPhaseFactorReSubQmf20[NO_SUB_QMF_CHANNELS]; extern const FIXP_DBL aaFractDelayPhaseFactorImSubQmf20[NO_SUB_QMF_CHANNELS]; extern const FIXP_DBL aaFractDelayPhaseFactorSerReQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_DBL aaFractDelayPhaseFactorSerImQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_DBL aaFractDelayPhaseFactorSerReSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_DBL aaFractDelayPhaseFactorSerImSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS]; extern const FIXP_DBL p8_13_20[13]; extern const FIXP_DBL p2_13_20[13]; #endif extern const UCHAR aAllpassLinkDelaySer[3]; extern const UCHAR delayIndexQmf[NO_QMF_CHANNELS]; extern const UCHAR groupBorders20[NO_IID_GROUPS + 1]; extern const UCHAR groupBorders34[NO_IID_GROUPS_HI_RES + 1]; extern const UCHAR bins2groupMap20[NO_IID_GROUPS]; extern const UCHAR quantizedIIDs[NO_IID_STEPS]; extern const UCHAR quantizedIIDsFine[NO_IID_STEPS_FINE]; extern const UCHAR FDK_sbrDecoder_aNoIidBins[3]; extern const UCHAR FDK_sbrDecoder_aNoIccBins[3]; /* Lookup tables for some arithmetic functions */ #define INV_TABLE_BITS 8 #define INV_TABLE_SIZE (1<>(FRACT_BITS-3)) ); } /************************************************************************/ /*! \brief Add two values given by mantissa and exponent. Mantissas are in fract format with values between 0 and 1.
The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
*/ /************************************************************************/ inline void FDK_add_MantExp(FIXP_SGL a_m, /*!< Mantissa of 1st operand a */ SCHAR a_e, /*!< Exponent of 1st operand a */ FIXP_SGL b_m, /*!< Mantissa of 2nd operand b */ SCHAR b_e, /*!< Exponent of 2nd operand b */ FIXP_SGL *ptrSum_m, /*!< Mantissa of result */ SCHAR *ptrSum_e) /*!< Exponent of result */ { FIXP_DBL accu; int shift; int shiftAbs; FIXP_DBL shiftedMantissa; FIXP_DBL otherMantissa; /* Equalize exponents of the summands. For the smaller summand, the exponent is adapted and for compensation, the mantissa is shifted right. */ shift = (int)(a_e - b_e); shiftAbs = (shift>0)? shift : -shift; shiftAbs = (shiftAbs < DFRACT_BITS-1)? shiftAbs : DFRACT_BITS-1; shiftedMantissa = (shift>0)? (FX_SGL2FX_DBL(b_m) >> shiftAbs) : (FX_SGL2FX_DBL(a_m) >> shiftAbs); otherMantissa = (shift>0)? FX_SGL2FX_DBL(a_m) : FX_SGL2FX_DBL(b_m); *ptrSum_e = (shift>0)? a_e : b_e; accu = (shiftedMantissa >> 1) + (otherMantissa >> 1); /* shift by 1 bit to avoid overflow */ if ( (accu >= (FL2FXCONST_DBL(0.5f) - (FIXP_DBL)1)) || (accu <= FL2FXCONST_DBL(-0.5f)) ) *ptrSum_e += 1; else accu = (shiftedMantissa + otherMantissa); *ptrSum_m = FX_DBL2FX_SGL(accu); } inline void FDK_add_MantExp(FIXP_DBL a, /*!< Mantissa of 1st operand a */ SCHAR a_e, /*!< Exponent of 1st operand a */ FIXP_DBL b, /*!< Mantissa of 2nd operand b */ SCHAR b_e, /*!< Exponent of 2nd operand b */ FIXP_DBL *ptrSum, /*!< Mantissa of result */ SCHAR *ptrSum_e) /*!< Exponent of result */ { FIXP_DBL accu; int shift; int shiftAbs; FIXP_DBL shiftedMantissa; FIXP_DBL otherMantissa; /* Equalize exponents of the summands. For the smaller summand, the exponent is adapted and for compensation, the mantissa is shifted right. */ shift = (int)(a_e - b_e); shiftAbs = (shift>0)? shift : -shift; shiftAbs = (shiftAbs < DFRACT_BITS-1)? shiftAbs : DFRACT_BITS-1; shiftedMantissa = (shift>0)? (b >> shiftAbs) : (a >> shiftAbs); otherMantissa = (shift>0)? a : b; *ptrSum_e = (shift>0)? a_e : b_e; accu = (shiftedMantissa >> 1) + (otherMantissa >> 1); /* shift by 1 bit to avoid overflow */ if ( (accu >= (FL2FXCONST_DBL(0.5f) - (FIXP_DBL)1)) || (accu <= FL2FXCONST_DBL(-0.5f)) ) *ptrSum_e += 1; else accu = (shiftedMantissa + otherMantissa); *ptrSum = accu; } /************************************************************************/ /*! \brief Divide two values given by mantissa and exponent. Mantissas are in fract format with values between 0 and 1.
The base for exponents is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
For performance reasons, the division is based on a table lookup which limits accuracy. */ /************************************************************************/ static inline void FDK_divide_MantExp(FIXP_SGL a_m, /*!< Mantissa of dividend a */ SCHAR a_e, /*!< Exponent of dividend a */ FIXP_SGL b_m, /*!< Mantissa of divisor b */ SCHAR b_e, /*!< Exponent of divisor b */ FIXP_SGL *ptrResult_m, /*!< Mantissa of quotient a/b */ SCHAR *ptrResult_e) /*!< Exponent of quotient a/b */ { int preShift, postShift, index, shift; FIXP_DBL ratio_m; FIXP_SGL bInv_m = FL2FXCONST_SGL(0.0f); preShift = CntLeadingZeros(FX_SGL2FX_DBL(b_m)); /* Shift b into the range from 0..INV_TABLE_SIZE-1, E.g. 10 bits must be skipped for INV_TABLE_BITS 8: - leave 8 bits as index for table - skip sign bit, - skip first bit of mantissa, because this is always the same (>0.5) We are dealing with energies, so we need not care about negative numbers */ /* The first interval has half width so the lowest bit of the index is needed for a doubled resolution. */ shift = (FRACT_BITS - 2 - INV_TABLE_BITS - preShift); index = (shift<0)? (LONG)b_m << (-shift) : (LONG)b_m >> shift; /* The index has INV_TABLE_BITS +1 valid bits here. Clear the other bits. */ index &= (1 << (INV_TABLE_BITS+1)) - 1; /* Remove offset of half an interval */ index--; /* Now the lowest bit is shifted out */ index = index >> 1; /* Fetch inversed mantissa from table: */ bInv_m = (index<0)? bInv_m : FDK_sbrDecoder_invTable[index]; /* Multiply a with the inverse of b: */ ratio_m = (index<0)? FX_SGL2FX_DBL(a_m >> 1) : fMultDiv2(bInv_m,a_m); postShift = CntLeadingZeros(ratio_m)-1; *ptrResult_m = FX_DBL2FX_SGL(ratio_m << postShift); *ptrResult_e = a_e - b_e + 1 + preShift - postShift; } static inline void FDK_divide_MantExp(FIXP_DBL a_m, /*!< Mantissa of dividend a */ SCHAR a_e, /*!< Exponent of dividend a */ FIXP_DBL b_m, /*!< Mantissa of divisor b */ SCHAR b_e, /*!< Exponent of divisor b */ FIXP_DBL *ptrResult_m, /*!< Mantissa of quotient a/b */ SCHAR *ptrResult_e) /*!< Exponent of quotient a/b */ { int preShift, postShift, index, shift; FIXP_DBL ratio_m; FIXP_SGL bInv_m = FL2FXCONST_SGL(0.0f); preShift = CntLeadingZeros(b_m); /* Shift b into the range from 0..INV_TABLE_SIZE-1, E.g. 10 bits must be skipped for INV_TABLE_BITS 8: - leave 8 bits as index for table - skip sign bit, - skip first bit of mantissa, because this is always the same (>0.5) We are dealing with energies, so we need not care about negative numbers */ /* The first interval has half width so the lowest bit of the index is needed for a doubled resolution. */ shift = (DFRACT_BITS - 2 - INV_TABLE_BITS - preShift); index = (shift<0)? (LONG)b_m << (-shift) : (LONG)b_m >> shift; /* The index has INV_TABLE_BITS +1 valid bits here. Clear the other bits. */ index &= (1 << (INV_TABLE_BITS+1)) - 1; /* Remove offset of half an interval */ index--; /* Now the lowest bit is shifted out */ index = index >> 1; /* Fetch inversed mantissa from table: */ bInv_m = (index<0)? bInv_m : FDK_sbrDecoder_invTable[index]; /* Multiply a with the inverse of b: */ ratio_m = (index<0)? (a_m >> 1) : fMultDiv2(bInv_m,a_m); postShift = CntLeadingZeros(ratio_m)-1; *ptrResult_m = ratio_m << postShift; *ptrResult_e = a_e - b_e + 1 + preShift - postShift; } /*! \brief Calculate the squareroot of a number given by mantissa and exponent Mantissa is in fract format with values between 0 and 1.
The base for the exponent is 2. Example: \f$ a = a\_m * 2^{a\_e} \f$
The operand is addressed via pointers and will be overwritten with the result. For performance reasons, the square root is based on a table lookup which limits accuracy. */ static inline void FDK_sqrt_MantExp(FIXP_DBL *mantissa, /*!< Pointer to mantissa */ SCHAR *exponent, const SCHAR *destScale) { FIXP_DBL input_m = *mantissa; int input_e = (int) *exponent; FIXP_DBL result = FL2FXCONST_DBL(0.0f); int result_e = -FRACT_BITS; /* Call lookup square root, which does internally normalization. */ result = sqrtFixp_lookup(input_m, &input_e); result_e = input_e; /* Write result */ if (exponent==destScale) { *mantissa = result; *exponent = result_e; } else { int shift = result_e - *destScale; *mantissa = (shift>=0) ? result << (INT)fixMin(DFRACT_BITS-1,shift) : result >> (INT)fixMin(DFRACT_BITS-1,-shift); *exponent = *destScale; } } #endif fdk-aac-0.1.3/libSBRdec/src/sbrdecoder.cpp0000644000175000017500000013243612372261464020623 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief SBR decoder frontend This module provides a frontend to the SBR decoder. The function openSBR() is called for initialization. The function sbrDecoder_Apply() is called for each frame. sbr_Apply() will call the required functions to decode the raw SBR data (provided by env_extr.cpp), to decode the envelope data and noise floor levels [decodeSbrData()], and to finally apply SBR to the current frame [sbr_dec()]. \sa sbrDecoder_Apply(), \ref documentationOverview */ /*! \page documentationOverview Overview of important information resources and source code documentation The primary source code documentation is based on generated and cross-referenced HTML files using doxygen. As part of this documentation you can find more extensive descriptions about key concepts and algorithms at the following locations:

Programming

\li Buffer management: sbrDecoder_Apply() and sbr_dec() \li Internal scale factors to maximize SNR on fixed point processors: #QMF_SCALE_FACTOR \li Special mantissa-exponent format: Created in requantizeEnvelopeData() and used in calculateSbrEnvelope()

Algorithmic details

\li About the SBR data format: \ref SBR_HEADER_ELEMENT and \ref SBR_STANDARD_ELEMENT \li Details about the bitstream decoder: env_extr.cpp \li Details about the QMF filterbank and the provided polyphase implementation: qmf_dec.cpp \li Details about the transposer: lpp_tran.cpp \li Details about the envelope adjuster: env_calc.cpp */ #include "sbrdecoder.h" #include "FDK_bitstream.h" #include "sbrdec_freq_sca.h" #include "env_extr.h" #include "sbr_dec.h" #include "env_dec.h" #include "sbr_crc.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "lpp_tran.h" #include "transcendent.h" #include "sbrdec_drc.h" #include "psbitdec.h" /* Decoder library info */ #define SBRDECODER_LIB_VL0 2 #define SBRDECODER_LIB_VL1 2 #define SBRDECODER_LIB_VL2 3 #define SBRDECODER_LIB_TITLE "SBR Decoder" #define SBRDECODER_LIB_BUILD_DATE __DATE__ #define SBRDECODER_LIB_BUILD_TIME __TIME__ static UCHAR getHeaderSlot( UCHAR currentSlot, UCHAR hdrSlotUsage[(1)+1] ) { UINT occupied = 0; int s; UCHAR slot = hdrSlotUsage[currentSlot]; FDK_ASSERT((1)+1 < 32); for (s = 0; s < (1)+1; s++) { if ( (hdrSlotUsage[s] == slot) && (s != slot) ) { occupied = 1; break; } } if (occupied) { occupied = 0; for (s = 0; s < (1)+1; s++) { occupied |= 1 << hdrSlotUsage[s]; } for (s = 0; s < (1)+1; s++) { if ( !(occupied & 0x1) ) { slot = s; break; } occupied >>= 1; } } return slot; } static void copySbrHeader( HANDLE_SBR_HEADER_DATA hDst, const HANDLE_SBR_HEADER_DATA hSrc ) { /* copy the whole header memory (including pointers) */ FDKmemcpy( hDst, hSrc, sizeof(SBR_HEADER_DATA) ); /* update pointers */ hDst->freqBandData.freqBandTable[0] = hDst->freqBandData.freqBandTableLo; hDst->freqBandData.freqBandTable[1] = hDst->freqBandData.freqBandTableHi; } /*! \brief Reset SBR decoder. Reset should only be called if SBR has been sucessfully detected by an appropriate checkForPayload() function. \return Error code. */ static SBR_ERROR sbrDecoder_ResetElement ( HANDLE_SBRDECODER self, int sampleRateIn, int sampleRateOut, int samplesPerFrame, const MP4_ELEMENT_ID elementID, const int elementIndex, const int overlap ) { SBR_ERROR sbrError = SBRDEC_OK; HANDLE_SBR_HEADER_DATA hSbrHeader; UINT qmfFlags = 0; int i, synDownsampleFac; /* Check in/out samplerates */ if ( sampleRateIn < 6400 || sampleRateIn > 48000 ) { sbrError = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } if ( sampleRateOut > 96000 ) { sbrError = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } /* Set QMF mode flags */ if (self->flags & SBRDEC_LOW_POWER) qmfFlags |= QMF_FLAG_LP; if (self->coreCodec == AOT_ER_AAC_ELD) { if (self->flags & SBRDEC_LD_MPS_QMF) { qmfFlags |= QMF_FLAG_MPSLDFB; } else { qmfFlags |= QMF_FLAG_CLDFB; } } /* Set downsampling factor for synthesis filter bank */ if (sampleRateOut == 0) { /* no single rate mode */ sampleRateOut = sampleRateIn<<1; /* In case of implicit signalling, assume dual rate SBR */ } if ( sampleRateIn == sampleRateOut ) { synDownsampleFac = 2; } else { synDownsampleFac = 1; } self->synDownsampleFac = synDownsampleFac; self->sampleRateOut = sampleRateOut; { int i; for (i = 0; i < (1)+1; i++) { hSbrHeader = &(self->sbrHeader[elementIndex][i]); /* init a default header such that we can at least do upsampling later */ sbrError = initHeaderData( hSbrHeader, sampleRateIn, sampleRateOut, samplesPerFrame, self->flags ); } } if (sbrError != SBRDEC_OK) { goto bail; } /* Init SBR channels going to be assigned to a SBR element */ { int ch; for (ch=0; chpSbrElement[elementIndex]->nChannels; ch++) { /* and create sbrDec */ sbrError = createSbrDec (self->pSbrElement[elementIndex]->pSbrChannel[ch], hSbrHeader, &self->pSbrElement[elementIndex]->transposerSettings, synDownsampleFac, qmfFlags, self->flags, overlap, ch ); if (sbrError != SBRDEC_OK) { goto bail; } } } //FDKmemclear(sbr_OverlapBuffer, sizeof(sbr_OverlapBuffer)); if (self->numSbrElements == 1) { switch ( self->coreCodec ) { case AOT_AAC_LC: case AOT_SBR: case AOT_PS: case AOT_ER_AAC_SCAL: case AOT_DRM_AAC: case AOT_DRM_SURROUND: if (CreatePsDec ( &self->hParametricStereoDec, samplesPerFrame )) { sbrError = SBRDEC_CREATE_ERROR; goto bail; } break; default: break; } } /* Init frame delay slot handling */ self->pSbrElement[elementIndex]->useFrameSlot = 0; for (i = 0; i < ((1)+1); i++) { self->pSbrElement[elementIndex]->useHeaderSlot[i] = i; } bail: return sbrError; } SBR_ERROR sbrDecoder_Open ( HANDLE_SBRDECODER * pSelf ) { HANDLE_SBRDECODER self = NULL; SBR_ERROR sbrError = SBRDEC_OK; /* Get memory for this instance */ self = GetRam_SbrDecoder(); if (self == NULL) { sbrError = SBRDEC_MEM_ALLOC_FAILED; goto bail; } self->workBuffer1 = GetRam_SbrDecWorkBuffer1(); self->workBuffer2 = GetRam_SbrDecWorkBuffer2(); if ( self->workBuffer1 == NULL || self->workBuffer2 == NULL ) { sbrError = SBRDEC_MEM_ALLOC_FAILED; goto bail; } /* Already zero because of calloc self->numSbrElements = 0; self->numSbrChannels = 0; self->codecFrameSize = 0; */ self->numDelayFrames = (1); /* set to the max value by default */ *pSelf = self; bail: return sbrError; } /** * \brief determine if the given core codec AOT can be processed or not. * \param coreCodec core codec audio object type. * \return 1 if SBR can be processed, 0 if SBR cannot be processed/applied. */ static int sbrDecoder_isCoreCodecValid(AUDIO_OBJECT_TYPE coreCodec) { switch (coreCodec) { case AOT_AAC_LC: case AOT_SBR: case AOT_PS: case AOT_ER_AAC_SCAL: case AOT_ER_AAC_ELD: return 1; default: return 0; } } static void sbrDecoder_DestroyElement ( HANDLE_SBRDECODER self, const int elementIndex ) { if (self->pSbrElement[elementIndex] != NULL) { int ch; for (ch=0; chpSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] ); FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] ); self->numSbrChannels -= 1; } } FreeRam_SbrDecElement( &self->pSbrElement[elementIndex] ); self->numSbrElements -= 1; } } SBR_ERROR sbrDecoder_InitElement ( HANDLE_SBRDECODER self, const int sampleRateIn, const int sampleRateOut, const int samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const int elementIndex ) { SBR_ERROR sbrError = SBRDEC_OK; int chCnt=0; int nSbrElementsStart = self->numSbrElements; /* Check core codec AOT */ if (! sbrDecoder_isCoreCodecValid(coreCodec) || elementIndex >= (4)) { sbrError = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } if ( elementID != ID_SCE && elementID != ID_CPE && elementID != ID_LFE ) { sbrError = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } if ( self->sampleRateIn == sampleRateIn && self->codecFrameSize == samplesPerFrame && self->coreCodec == coreCodec && self->pSbrElement[elementIndex] != NULL && self->pSbrElement[elementIndex]->elementID == elementID ) { /* Nothing to do */ return SBRDEC_OK; } self->sampleRateIn = sampleRateIn; self->codecFrameSize = samplesPerFrame; self->coreCodec = coreCodec; self->flags = 0; self->flags |= (coreCodec == AOT_ER_AAC_ELD) ? SBRDEC_ELD_GRID : 0; /* Init SBR elements */ { int elChannels, ch; if (self->pSbrElement[elementIndex] == NULL) { self->pSbrElement[elementIndex] = GetRam_SbrDecElement(elementIndex); if (self->pSbrElement[elementIndex] == NULL) { sbrError = SBRDEC_MEM_ALLOC_FAILED; goto bail; } self->numSbrElements ++; } else { self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels; } /* Save element ID for sanity checks and to have a fallback for concealment. */ self->pSbrElement[elementIndex]->elementID = elementID; /* Determine amount of channels for this element */ switch (elementID) { case ID_NONE: case ID_CPE: elChannels=2; break; case ID_LFE: case ID_SCE: elChannels=1; break; default: elChannels=0; break; } /* Handle case of Parametric Stereo */ if ( elementIndex == 0 && elementID == ID_SCE ) { switch (coreCodec) { case AOT_AAC_LC: case AOT_SBR: case AOT_PS: case AOT_ER_AAC_SCAL: case AOT_DRM_AAC: case AOT_DRM_SURROUND: elChannels = 2; break; default: break; } } self->pSbrElement[elementIndex]->nChannels = elChannels; for (ch=0; chpSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { self->pSbrElement[elementIndex]->pSbrChannel[ch] = GetRam_SbrDecChannel(chCnt); if (self->pSbrElement[elementIndex]->pSbrChannel[ch] == NULL) { sbrError = SBRDEC_MEM_ALLOC_FAILED; goto bail; } } self->numSbrChannels ++; sbrDecoder_drcInitChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.sbrDrcChannel ); /* Add reference pointer to workbuffers. */ self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer1 = self->workBuffer1; self->pSbrElement[elementIndex]->pSbrChannel[ch]->SbrDec.WorkBuffer2 = self->workBuffer2; chCnt++; } if (elChannels == 1 && self->pSbrElement[elementIndex]->pSbrChannel[ch] != NULL) { deleteSbrDec( self->pSbrElement[elementIndex]->pSbrChannel[ch] ); FreeRam_SbrDecChannel( &self->pSbrElement[elementIndex]->pSbrChannel[ch] ); } } /* clear error flags for all delay slots */ FDKmemclear(self->pSbrElement[elementIndex]->frameErrorFlag, ((1)+1)*sizeof(UCHAR)); /* Initialize this instance */ sbrError = sbrDecoder_ResetElement( self, sampleRateIn, sampleRateOut, samplesPerFrame, elementID, elementIndex, (coreCodec == AOT_ER_AAC_ELD) ? 0 : (6) ); bail: if (sbrError != SBRDEC_OK) { if (nSbrElementsStart < self->numSbrElements) { /* Free the memory allocated for this element */ sbrDecoder_DestroyElement( self, elementIndex ); } else if (self->pSbrElement[elementIndex] != NULL) { /* Set error flag to trigger concealment */ self->pSbrElement[elementIndex]->frameErrorFlag[self->pSbrElement[elementIndex]->useFrameSlot] = 1; } } return sbrError; } /** * \brief Apply decoded SBR header for one element. * \param self SBR decoder instance handle * \param hSbrHeader SBR header handle to be processed. * \param hSbrChannel pointer array to the SBR element channels corresponding to the SBR header. * \param headerStatus header status value returned from SBR header parser. * \param numElementChannels amount of channels for the SBR element whos header is to be processed. */ static SBR_ERROR sbrDecoder_HeaderUpdate( HANDLE_SBRDECODER self, HANDLE_SBR_HEADER_DATA hSbrHeader, SBR_HEADER_STATUS headerStatus, HANDLE_SBR_CHANNEL hSbrChannel[], const int numElementChannels ) { SBR_ERROR errorStatus = SBRDEC_OK; /* change of control data, reset decoder */ errorStatus = resetFreqBandTables(hSbrHeader, self->flags); if (errorStatus == SBRDEC_OK) { if (hSbrHeader->syncState == UPSAMPLING && headerStatus != HEADER_RESET) { /* As the default header would limit the frequency range, lowSubband and highSubband must be patched. */ hSbrHeader->freqBandData.lowSubband = hSbrHeader->numberOfAnalysisBands; hSbrHeader->freqBandData.highSubband = hSbrHeader->numberOfAnalysisBands; } /* Trigger a reset before processing this slot */ hSbrHeader->status |= SBRDEC_HDR_STAT_RESET; } return errorStatus; } INT sbrDecoder_Header ( HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, const INT sampleRateIn, const INT sampleRateOut, const INT samplesPerFrame, const AUDIO_OBJECT_TYPE coreCodec, const MP4_ELEMENT_ID elementID, const INT elementIndex ) { SBR_HEADER_STATUS headerStatus; HANDLE_SBR_HEADER_DATA hSbrHeader; SBR_ERROR sbrError = SBRDEC_OK; int headerIndex; if ( self == NULL || elementIndex > (4) ) { return SBRDEC_UNSUPPORTED_CONFIG; } if (! sbrDecoder_isCoreCodecValid(coreCodec)) { return SBRDEC_UNSUPPORTED_CONFIG; } sbrError = sbrDecoder_InitElement( self, sampleRateIn, sampleRateOut, samplesPerFrame, coreCodec, elementID, elementIndex ); if (sbrError != SBRDEC_OK) { goto bail; } headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, self->pSbrElement[elementIndex]->useHeaderSlot); hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); headerStatus = sbrGetHeaderData ( hSbrHeader, hBs, self->flags, 0); { SBR_DECODER_ELEMENT *pSbrElement; pSbrElement = self->pSbrElement[elementIndex]; /* Sanity check */ if (pSbrElement != NULL) { if ( (elementID == ID_CPE && pSbrElement->nChannels != 2) || (elementID != ID_CPE && pSbrElement->nChannels != 1) ) { return SBRDEC_UNSUPPORTED_CONFIG; } if ( headerStatus == HEADER_RESET ) { sbrError = sbrDecoder_HeaderUpdate( self, hSbrHeader, headerStatus, pSbrElement->pSbrChannel, pSbrElement->nChannels ); if (sbrError == SBRDEC_OK) { hSbrHeader->syncState = SBR_HEADER; hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; } /* else { Since we already have overwritten the old SBR header the only way out is UPSAMPLING! This will be prepared in the next step. } */ } } } bail: return sbrError; } SBR_ERROR sbrDecoder_SetParam (HANDLE_SBRDECODER self, const SBRDEC_PARAM param, const INT value ) { SBR_ERROR errorStatus = SBRDEC_OK; /* configure the subsystems */ switch (param) { case SBR_SYSTEM_BITSTREAM_DELAY: if (value < 0 || value > (1)) { errorStatus = SBRDEC_SET_PARAM_FAIL; break; } if (self == NULL) { errorStatus = SBRDEC_NOT_INITIALIZED; } else { self->numDelayFrames = (UCHAR)value; } break; case SBR_QMF_MODE: if (self == NULL) { errorStatus = SBRDEC_NOT_INITIALIZED; } else { if (value == 1) { self->flags |= SBRDEC_LOW_POWER; } else { self->flags &= ~SBRDEC_LOW_POWER; } } break; case SBR_LD_QMF_TIME_ALIGN: if (self == NULL) { errorStatus = SBRDEC_NOT_INITIALIZED; } else { if (value == 1) { self->flags |= SBRDEC_LD_MPS_QMF; } else { self->flags &= ~SBRDEC_LD_MPS_QMF; } } break; case SBR_BS_INTERRUPTION: { int elementIndex; if (self == NULL) { errorStatus = SBRDEC_NOT_INITIALIZED; break; } /* Loop over SBR elements */ for (elementIndex = 0; elementIndex < self->numSbrElements; elementIndex++) { HANDLE_SBR_HEADER_DATA hSbrHeader; int headerIndex = getHeaderSlot(self->pSbrElement[elementIndex]->useFrameSlot, self->pSbrElement[elementIndex]->useHeaderSlot); hSbrHeader = &(self->sbrHeader[elementIndex][headerIndex]); /* Set sync state UPSAMPLING for the corresponding slot. This switches off bitstream parsing until a new header arrives. */ hSbrHeader->syncState = UPSAMPLING; hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; } } break; default: errorStatus = SBRDEC_SET_PARAM_FAIL; break; } /* switch(param) */ return (errorStatus); } static SBRDEC_DRC_CHANNEL * sbrDecoder_drcGetChannel( const HANDLE_SBRDECODER self, const INT channel ) { SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; int elementIndex, elChanIdx=0, numCh=0; for (elementIndex = 0; (elementIndex < (4)) && (numCh <= channel); elementIndex++) { SBR_DECODER_ELEMENT *pSbrElement = self->pSbrElement[elementIndex]; int c, elChannels; elChanIdx = 0; if (pSbrElement == NULL) break; /* Determine amount of channels for this element */ switch (pSbrElement->elementID) { case ID_CPE: elChannels = 2; break; case ID_LFE: case ID_SCE: elChannels = 1; break; case ID_NONE: default: elChannels = 0; break; } /* Limit with actual allocated element channels */ elChannels = FDKmin(elChannels, pSbrElement->nChannels); for (c = 0; (c < elChannels) && (numCh <= channel); c++) { if (pSbrElement->pSbrChannel[elChanIdx] != NULL) { numCh++; elChanIdx++; } } } elementIndex -= 1; elChanIdx -= 1; if (elChanIdx < 0 || elementIndex < 0) { return NULL; } if ( self->pSbrElement[elementIndex] != NULL ) { if ( self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx] != NULL ) { pSbrDrcChannelData = &self->pSbrElement[elementIndex]->pSbrChannel[elChanIdx]->SbrDec.sbrDrcChannel; } } return (pSbrDrcChannelData); } SBR_ERROR sbrDecoder_drcFeedChannel ( HANDLE_SBRDECODER self, INT ch, UINT numBands, FIXP_DBL *pNextFact_mag, INT nextFact_exp, SHORT drcInterpolationScheme, UCHAR winSequence, USHORT *pBandTop ) { SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; int band, isValidData = 0; if (self == NULL) { return SBRDEC_NOT_INITIALIZED; } if (ch > (6) || pNextFact_mag == NULL) { return SBRDEC_SET_PARAM_FAIL; } /* Search for gain values different to 1.0f */ for (band = 0; band < numBands; band += 1) { if ( !((pNextFact_mag[band] == FL2FXCONST_DBL(0.5)) && (nextFact_exp == 1)) && !((pNextFact_mag[band] == (FIXP_DBL)MAXVAL_DBL) && (nextFact_exp == 0)) ) { isValidData = 1; break; } } /* Find the right SBR channel */ pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); if ( pSbrDrcChannelData != NULL ) { if ( pSbrDrcChannelData->enable || isValidData ) { /* Activate processing only with real and valid data */ int i; pSbrDrcChannelData->enable = 1; pSbrDrcChannelData->numBandsNext = numBands; pSbrDrcChannelData->winSequenceNext = winSequence; pSbrDrcChannelData->drcInterpolationSchemeNext = drcInterpolationScheme; pSbrDrcChannelData->nextFact_exp = nextFact_exp; for (i = 0; i < (int)numBands; i++) { pSbrDrcChannelData->bandTopNext[i] = pBandTop[i]; pSbrDrcChannelData->nextFact_mag[i] = pNextFact_mag[i]; } } } return SBRDEC_OK; } void sbrDecoder_drcDisable ( HANDLE_SBRDECODER self, INT ch ) { SBRDEC_DRC_CHANNEL *pSbrDrcChannelData = NULL; if ( (self == NULL) || (ch > (6)) || (self->numSbrElements == 0) || (self->numSbrChannels == 0) ) { return; } /* Find the right SBR channel */ pSbrDrcChannelData = sbrDecoder_drcGetChannel( self, ch ); if ( pSbrDrcChannelData != NULL ) { sbrDecoder_drcInitChannel( pSbrDrcChannelData ); } } SBR_ERROR sbrDecoder_Parse( HANDLE_SBRDECODER self, HANDLE_FDK_BITSTREAM hBs, int *count, int bsPayLen, int crcFlag, MP4_ELEMENT_ID prevElement, int elementIndex, int fGlobalIndependencyFlag ) { SBR_DECODER_ELEMENT *hSbrElement; HANDLE_SBR_HEADER_DATA hSbrHeader; HANDLE_SBR_CHANNEL *pSbrChannel; SBR_FRAME_DATA *hFrameDataLeft; SBR_FRAME_DATA *hFrameDataRight; SBR_ERROR errorStatus = SBRDEC_OK; SBR_SYNC_STATE initialSyncState; SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; INT startPos; INT CRCLen = 0; int stereo; int fDoDecodeSbrData = 1; int lastSlot, lastHdrSlot = 0, thisHdrSlot; /* Remember start position of SBR element */ startPos = FDKgetValidBits(hBs); /* SBR sanity checks */ if ( self == NULL || self->pSbrElement[elementIndex] == NULL ) { errorStatus = SBRDEC_NOT_INITIALIZED; goto bail; } hSbrElement = self->pSbrElement[elementIndex]; lastSlot = (hSbrElement->useFrameSlot > 0) ? hSbrElement->useFrameSlot-1 : self->numDelayFrames; lastHdrSlot = hSbrElement->useHeaderSlot[lastSlot]; thisHdrSlot = getHeaderSlot( hSbrElement->useFrameSlot, hSbrElement->useHeaderSlot ); /* Get a free header slot not used by frames not processed yet. */ /* Assign the free slot to store a new header if there is one. */ hSbrHeader = &self->sbrHeader[elementIndex][thisHdrSlot]; pSbrChannel = hSbrElement->pSbrChannel; stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; hFrameDataLeft = &self->pSbrElement[elementIndex]->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; hFrameDataRight = &self->pSbrElement[elementIndex]->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; initialSyncState = hSbrHeader->syncState; /* reset PS flag; will be set after PS was found */ self->flags &= ~SBRDEC_PS_DECODED; if (hSbrHeader->status & SBRDEC_HDR_STAT_UPDATE) { /* Got a new header from extern (e.g. from an ASC) */ headerStatus = HEADER_OK; hSbrHeader->status &= ~SBRDEC_HDR_STAT_UPDATE; } else if (thisHdrSlot != lastHdrSlot) { /* Copy the last header into this slot otherwise the header compare will trigger more HEADER_RESETs than needed. */ copySbrHeader( hSbrHeader, &self->sbrHeader[elementIndex][lastHdrSlot] ); } /* Check if bit stream data is valid and matches the element context */ if ( ((prevElement != ID_SCE) && (prevElement != ID_CPE)) || prevElement != hSbrElement->elementID) { /* In case of LFE we also land here, since there is no LFE SBR element (do upsampling only) */ fDoDecodeSbrData = 0; } if (fDoDecodeSbrData) { if ((INT)FDKgetValidBits(hBs) <= 0) { fDoDecodeSbrData = 0; } } /* SBR CRC-check */ if (fDoDecodeSbrData) { if (crcFlag == 1) { switch (self->coreCodec) { case AOT_ER_AAC_ELD: FDKpushFor (hBs, 10); /* check sbrcrc later: we don't know the payload length now */ break; default: CRCLen = bsPayLen - 10; /* change: 0 => i */ if (CRCLen < 0) { fDoDecodeSbrData = 0; } else { fDoDecodeSbrData = SbrCrcCheck (hBs, CRCLen); } break; } } } /* if (fDoDecodeSbrData) */ /* Read in the header data and issue a reset if change occured */ if (fDoDecodeSbrData) { int sbrHeaderPresent; { sbrHeaderPresent = FDKreadBit(hBs); } if ( sbrHeaderPresent ) { headerStatus = sbrGetHeaderData (hSbrHeader, hBs, self->flags, 1); } if (headerStatus == HEADER_RESET) { errorStatus = sbrDecoder_HeaderUpdate( self, hSbrHeader, headerStatus, pSbrChannel, hSbrElement->nChannels ); if (errorStatus == SBRDEC_OK) { hSbrHeader->syncState = SBR_HEADER; } else { hSbrHeader->syncState = SBR_NOT_INITIALIZED; } } if (errorStatus != SBRDEC_OK) { fDoDecodeSbrData = 0; } } /* if (fDoDecodeSbrData) */ /* Print debugging output only if state has changed */ /* read frame data */ if ((hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { int sbrFrameOk; /* read the SBR element data */ if (stereo) { sbrFrameOk = sbrGetChannelPairElement(hSbrHeader, hFrameDataLeft, hFrameDataRight, hBs, self->flags, self->pSbrElement[elementIndex]->transposerSettings.overlap); } else { if (self->hParametricStereoDec != NULL) { /* update slot index for PS bitstream parsing */ self->hParametricStereoDec->bsLastSlot = self->hParametricStereoDec->bsReadSlot; self->hParametricStereoDec->bsReadSlot = hSbrElement->useFrameSlot; } sbrFrameOk = sbrGetSingleChannelElement(hSbrHeader, hFrameDataLeft, hBs, self->hParametricStereoDec, self->flags, self->pSbrElement[elementIndex]->transposerSettings.overlap); } if (!sbrFrameOk) { fDoDecodeSbrData = 0; } else { INT valBits; if (bsPayLen > 0) { valBits = bsPayLen - ((INT)startPos - (INT)FDKgetValidBits(hBs)); } else { valBits = (INT)FDKgetValidBits(hBs); } if ( crcFlag == 1 ) { switch (self->coreCodec) { case AOT_ER_AAC_ELD: { /* late crc check for eld */ INT payloadbits = (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; INT crcLen = payloadbits - 10; FDKpushBack(hBs, payloadbits); fDoDecodeSbrData = SbrCrcCheck (hBs, crcLen); FDKpushFor(hBs, crcLen); } break; default: break; } } /* sanity check of remaining bits */ if (valBits < 0) { fDoDecodeSbrData = 0; } else { switch (self->coreCodec) { case AOT_SBR: case AOT_PS: case AOT_AAC_LC: { /* This sanity check is only meaningful with General Audio bitstreams */ int alignBits = valBits & 0x7; if (valBits > alignBits) { fDoDecodeSbrData = 0; } } break; default: /* No sanity check available */ break; } } } } if (!fDoDecodeSbrData) { /* Set error flag for this slot to trigger concealment */ self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 1; errorStatus = SBRDEC_PARSE_ERROR; } else { /* Everything seems to be ok so clear the error flag */ self->pSbrElement[elementIndex]->frameErrorFlag[hSbrElement->useFrameSlot] = 0; } if (!stereo) { /* Turn coupling off explicitely to avoid access to absent right frame data that might occur with corrupt bitstreams. */ hFrameDataLeft->coupling = COUPLING_OFF; } bail: if (errorStatus == SBRDEC_OK) { if (headerStatus == HEADER_NOT_PRESENT) { /* Use the old header for this frame */ hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = lastHdrSlot; } else { /* Use the new header for this frame */ hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot] = thisHdrSlot; } /* Move frame pointer to the next slot which is up to be decoded/applied next */ hSbrElement->useFrameSlot = (hSbrElement->useFrameSlot+1) % (self->numDelayFrames+1); } *count -= startPos - FDKgetValidBits(hBs); return errorStatus; } /** * \brief Render one SBR element into time domain signal. * \param self SBR decoder handle * \param timeData pointer to output buffer * \param interleaved flag indicating interleaved channel output * \param channelMapping pointer to UCHAR array where next 2 channel offsets are stored. * \param elementIndex enumerating index of the SBR element to render. * \param numInChannels number of channels from core coder (reading stride). * \param numOutChannels pointer to a location to return number of output channels. * \param psPossible flag indicating if PS is possible or not. * \return SBRDEC_OK if successfull, else error code */ static SBR_ERROR sbrDecoder_DecodeElement ( HANDLE_SBRDECODER self, INT_PCM *timeData, const int interleaved, const UCHAR *channelMapping, const int elementIndex, const int numInChannels, int *numOutChannels, const int psPossible ) { SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; HANDLE_SBR_CHANNEL *pSbrChannel = self->pSbrElement[elementIndex]->pSbrChannel; HANDLE_SBR_HEADER_DATA hSbrHeader = &self->sbrHeader[elementIndex][hSbrElement->useHeaderSlot[hSbrElement->useFrameSlot]]; HANDLE_PS_DEC h_ps_d = self->hParametricStereoDec; /* get memory for frame data from scratch */ SBR_FRAME_DATA *hFrameDataLeft = &hSbrElement->pSbrChannel[0]->frameData[hSbrElement->useFrameSlot]; SBR_FRAME_DATA *hFrameDataRight = &hSbrElement->pSbrChannel[1]->frameData[hSbrElement->useFrameSlot]; SBR_ERROR errorStatus = SBRDEC_OK; INT strideIn, strideOut, offset0, offset1; INT codecFrameSize = self->codecFrameSize; int stereo = (hSbrElement->elementID == ID_CPE) ? 1 : 0; int numElementChannels = hSbrElement->nChannels; /* Number of channels of the current SBR element */ /* Update the header error flag */ hSbrHeader->frameErrorFlag = hSbrElement->frameErrorFlag[hSbrElement->useFrameSlot]; /* Prepare filterbank for upsampling if no valid bit stream data is available. */ if ( hSbrHeader->syncState == SBR_NOT_INITIALIZED ) { errorStatus = initHeaderData( hSbrHeader, self->sampleRateIn, self->sampleRateOut, codecFrameSize, self->flags ); if (errorStatus != SBRDEC_OK) { return errorStatus; } hSbrHeader->syncState = UPSAMPLING; errorStatus = sbrDecoder_HeaderUpdate( self, hSbrHeader, HEADER_NOT_PRESENT, pSbrChannel, hSbrElement->nChannels ); if (errorStatus != SBRDEC_OK) { hSbrHeader->syncState = SBR_NOT_INITIALIZED; return errorStatus; } } /* reset */ if (hSbrHeader->status & SBRDEC_HDR_STAT_RESET) { int ch; for (ch = 0 ; ch < numElementChannels; ch++) { SBR_ERROR errorStatusTmp = SBRDEC_OK; errorStatusTmp = resetSbrDec ( &pSbrChannel[ch]->SbrDec, hSbrHeader, &pSbrChannel[ch]->prevFrameData, self->flags & SBRDEC_LOW_POWER, self->synDownsampleFac ); if (errorStatusTmp != SBRDEC_OK) { errorStatus = errorStatusTmp; } } hSbrHeader->status &= ~SBRDEC_HDR_STAT_RESET; } /* decoding */ if ( (hSbrHeader->syncState == SBR_ACTIVE) || ((hSbrHeader->syncState == SBR_HEADER) && (hSbrHeader->frameErrorFlag == 0)) ) { errorStatus = SBRDEC_OK; decodeSbrData (hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, (stereo) ? hFrameDataRight : NULL, (stereo) ? &pSbrChannel[1]->prevFrameData : NULL); /* Now we have a full parameter set and can do parameter based concealment instead of plain upsampling. */ hSbrHeader->syncState = SBR_ACTIVE; } /* decode PS data if available */ if (h_ps_d != NULL && psPossible) { int applyPs = 1; /* define which frame delay line slot to process */ h_ps_d->processSlot = hSbrElement->useFrameSlot; applyPs = DecodePs(h_ps_d, hSbrHeader->frameErrorFlag); self->flags |= (applyPs) ? SBRDEC_PS_DECODED : 0; } /* Set strides for reading and writing */ if (interleaved) { strideIn = numInChannels; if ( psPossible ) strideOut = (numInChannels < 2) ? 2 : numInChannels; else strideOut = numInChannels; offset0 = channelMapping[0]; offset1 = channelMapping[1]; } else { strideIn = 1; strideOut = 1; offset0 = channelMapping[0]*2*codecFrameSize; offset1 = channelMapping[1]*2*codecFrameSize; } /* use same buffers for left and right channel and apply PS per timeslot */ /* Process left channel */ //FDKprintf("self->codecFrameSize %d\t%d\n",self->codecFrameSize,self->sampleRateIn); sbr_dec (&pSbrChannel[0]->SbrDec, timeData + offset0, timeData + offset0, &pSbrChannel[1]->SbrDec, timeData + offset1, strideIn, strideOut, hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags ); if (stereo) { /* Process right channel */ sbr_dec (&pSbrChannel[1]->SbrDec, timeData + offset1, timeData + offset1, NULL, NULL, strideIn, strideOut, hSbrHeader, hFrameDataRight, &pSbrChannel[1]->prevFrameData, (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags ); } if (h_ps_d != NULL) { /* save PS status for next run */ h_ps_d->psDecodedPrv = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0 ; } if ( psPossible ) { FDK_ASSERT(strideOut > 1); if ( !(self->flags & SBRDEC_PS_DECODED) ) { /* A decoder which is able to decode PS has to produce a stereo output even if no PS data is availble. */ /* So copy left channel to right channel. */ if (interleaved) { INT_PCM *ptr; INT i; FDK_ASSERT(strideOut == 2); ptr = timeData; for (i = codecFrameSize; i--; ) { INT_PCM tmp; /* This temporal variable is required because some compilers can't do *ptr++ = *ptr++ correctly. */ tmp = *ptr++; *ptr++ = tmp; tmp = *ptr++; *ptr++ = tmp; } } else { FDKmemcpy( timeData+2*codecFrameSize, timeData, 2*codecFrameSize*sizeof(INT_PCM) ); } } *numOutChannels = 2; /* Output minimum two channels when PS is enabled. */ } return errorStatus; } SBR_ERROR sbrDecoder_Apply ( HANDLE_SBRDECODER self, INT_PCM *timeData, int *numChannels, int *sampleRate, const UCHAR channelMapping[(6)], const int interleaved, const int coreDecodedOk, UCHAR *psDecoded ) { SBR_ERROR errorStatus = SBRDEC_OK; int psPossible = 0; int sbrElementNum; int numCoreChannels = *numChannels; int numSbrChannels = 0; psPossible = *psDecoded; if (self->numSbrElements < 1) { /* exit immediately to avoid access violations */ return SBRDEC_CREATE_ERROR; } /* Sanity check of allocated SBR elements. */ for (sbrElementNum=0; sbrElementNumnumSbrElements; sbrElementNum++) { if (self->pSbrElement[sbrElementNum] == NULL) { return SBRDEC_CREATE_ERROR; } } if (self->numSbrElements != 1 || self->pSbrElement[0]->elementID != ID_SCE) { psPossible = 0; } /* In case of non-interleaved time domain data and upsampling, make room for bigger SBR output. */ if (self->synDownsampleFac == 1 && interleaved == 0) { int c, outputFrameSize; outputFrameSize = self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_channels * self->pSbrElement[0]->pSbrChannel[0]->SbrDec.SynthesisQMF.no_col; for (c=numCoreChannels-1; c>0; c--) { FDKmemmove(timeData + c*outputFrameSize, timeData + c*self->codecFrameSize , self->codecFrameSize*sizeof(INT_PCM)); } } /* Make sure that even if no SBR data was found/parsed *psDecoded is returned 1 if psPossible was 0. */ if (psPossible == 0) { self->flags &= ~SBRDEC_PS_DECODED; } /* Loop over SBR elements */ for (sbrElementNum = 0; sbrElementNumnumSbrElements; sbrElementNum++) { int numElementChan; if (psPossible && self->pSbrElement[sbrElementNum]->pSbrChannel[1] == NULL) { errorStatus = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } numElementChan = (self->pSbrElement[sbrElementNum]->elementID == ID_CPE) ? 2 : 1; /* If core signal is bad then force upsampling */ if ( ! coreDecodedOk ) { self->pSbrElement[sbrElementNum]->frameErrorFlag[self->pSbrElement[sbrElementNum]->useFrameSlot] = 1; } errorStatus = sbrDecoder_DecodeElement ( self, timeData, interleaved, channelMapping, sbrElementNum, numCoreChannels, &numElementChan, psPossible ); if (errorStatus != SBRDEC_OK) { goto bail; } numSbrChannels += numElementChan; channelMapping += numElementChan; if (numSbrChannels >= numCoreChannels) { break; } } /* Update numChannels and samplerate */ *numChannels = numSbrChannels; *sampleRate = self->sampleRateOut; *psDecoded = (self->flags & SBRDEC_PS_DECODED) ? 1 : 0; bail: return errorStatus; } SBR_ERROR sbrDecoder_Close ( HANDLE_SBRDECODER *pSelf ) { HANDLE_SBRDECODER self = *pSelf; int i; if (self != NULL) { if (self->hParametricStereoDec != NULL) { DeletePsDec ( &self->hParametricStereoDec ); } if (self->workBuffer1 != NULL) { FreeRam_SbrDecWorkBuffer1(&self->workBuffer1); } if (self->workBuffer2 != NULL) { FreeRam_SbrDecWorkBuffer2(&self->workBuffer2); } for (i = 0; i < (4); i++) { sbrDecoder_DestroyElement( self, i ); } FreeRam_SbrDecoder(pSelf); } return SBRDEC_OK; } INT sbrDecoder_GetLibInfo( LIB_INFO *info ) { int i; if (info == NULL) { return -1; } /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) return -1; info += i; info->module_id = FDK_SBRDEC; info->version = LIB_VERSION(SBRDECODER_LIB_VL0, SBRDECODER_LIB_VL1, SBRDECODER_LIB_VL2); LIB_VERSION_STRING(info); info->build_date = (char *)SBRDECODER_LIB_BUILD_DATE; info->build_time = (char *)SBRDECODER_LIB_BUILD_TIME; info->title = (char *)SBRDECODER_LIB_TITLE; /* Set flags */ info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_LP | CAPF_SBR_PS_MPEG | CAPF_SBR_CONCEALMENT | CAPF_SBR_DRC ; /* End of flags */ return 0; } fdk-aac-0.1.3/libSBRdec/src/sbr_ram.h0000644000175000017500000001570412372261464017577 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Memory layout */ #ifndef _SBR_RAM_H_ #define _SBR_RAM_H_ #include "sbrdecoder.h" #include "env_extr.h" #include "sbr_dec.h" #define SBRDEC_MAX_CH_PER_ELEMENT (2) typedef struct { SBR_CHANNEL *pSbrChannel[SBRDEC_MAX_CH_PER_ELEMENT]; TRANSPOSER_SETTINGS transposerSettings; /* Common transport settings for each individual channel of an element */ HANDLE_FDK_BITSTREAM hBs; MP4_ELEMENT_ID elementID; /* Element ID set during initialization. Can be used for concealment */ int nChannels; /* Number of elements output channels (=2 in case of PS) */ UCHAR frameErrorFlag[(1)+1]; /* Frame error status (for every slot in the delay line). Will be copied into header at the very beginning of decodeElement() routine. */ UCHAR useFrameSlot; /* Index which defines which slot will be decoded/filled next (used with additional delay) */ UCHAR useHeaderSlot[(1)+1]; /* Index array that provides the link between header and frame data (important when processing with additional delay). */ } SBR_DECODER_ELEMENT; struct SBR_DECODER_INSTANCE { SBR_DECODER_ELEMENT *pSbrElement[(4)]; SBR_HEADER_DATA sbrHeader[(4)][(1)+1]; /* Sbr header for each individual channel of an element */ FIXP_DBL *workBuffer1; FIXP_DBL *workBuffer2; HANDLE_PS_DEC hParametricStereoDec; /* Global parameters */ AUDIO_OBJECT_TYPE coreCodec; /* AOT of core codec */ int numSbrElements; int numSbrChannels; INT sampleRateIn; /* SBR decoder input sampling rate; might be different than the transposer input sampling rate. */ INT sampleRateOut; /* Sampling rate of the SBR decoder output audio samples. */ USHORT codecFrameSize; UCHAR synDownsampleFac; UCHAR numDelayFrames; /* The current number of additional delay frames used for processing. */ UINT flags; }; H_ALLOC_MEM(Ram_SbrDecElement, SBR_DECODER_ELEMENT) H_ALLOC_MEM(Ram_SbrDecChannel, SBR_CHANNEL) H_ALLOC_MEM(Ram_SbrDecoder, struct SBR_DECODER_INSTANCE) H_ALLOC_MEM(Ram_sbr_QmfStatesSynthesis, FIXP_QSS) H_ALLOC_MEM(Ram_sbr_OverlapBuffer, FIXP_DBL) H_ALLOC_MEM(Ram_ps_dec, PS_DEC) H_ALLOC_MEM_OVERLAY(Ram_SbrDecWorkBuffer1, FIXP_DBL) H_ALLOC_MEM_OVERLAY(Ram_SbrDecWorkBuffer2, FIXP_DBL) #endif /* _SBR_RAM_H_ */ fdk-aac-0.1.3/libSBRdec/src/sbrdec_drc.cpp0000644000175000017500000004032712372261464020576 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG-4 AAC Decoder ************************** Author(s): Christian Griebel Description: Dynamic range control (DRC) decoder tool for SBR ******************************************************************************/ #include "sbrdec_drc.h" /* DRC - Offset table for QMF interpolation. */ static const int offsetTab[2][16] = { { 0, 4, 8, 12, 16, 20, 24, 28, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 1024 framing */ { 0, 4, 8, 12, 16, 19, 22, 26, 0, 0, 0, 0, 0, 0, 0, 0 } /* 960 framing */ }; /*! \brief Initialize DRC QMF factors \hDrcData Handle to DRC channel data. \return none */ void sbrDecoder_drcInitChannel ( HANDLE_SBR_DRC_CHANNEL hDrcData ) { int band; if (hDrcData == NULL) { return; } for (band = 0; band < (64); band++) { hDrcData->prevFact_mag[band] = FL2FXCONST_DBL(0.5f); } for (band = 0; band < SBRDEC_MAX_DRC_BANDS; band++) { hDrcData->currFact_mag[band] = FL2FXCONST_DBL(0.5f); hDrcData->nextFact_mag[band] = FL2FXCONST_DBL(0.5f); } hDrcData->prevFact_exp = 1; hDrcData->currFact_exp = 1; hDrcData->nextFact_exp = 1; hDrcData->numBandsCurr = 1; hDrcData->numBandsNext = 1; hDrcData->winSequenceCurr = 0; hDrcData->winSequenceNext = 0; hDrcData->drcInterpolationSchemeCurr = 0; hDrcData->drcInterpolationSchemeNext = 0; hDrcData->enable = 0; } /*! \brief Swap DRC QMF scaling factors after they have been applied. \hDrcData Handle to DRC channel data. \return none */ void sbrDecoder_drcUpdateChannel ( HANDLE_SBR_DRC_CHANNEL hDrcData ) { if (hDrcData == NULL) { return; } if (hDrcData->enable != 1) { return; } /* swap previous data */ FDKmemcpy( hDrcData->currFact_mag, hDrcData->nextFact_mag, SBRDEC_MAX_DRC_BANDS * sizeof(FIXP_DBL) ); hDrcData->currFact_exp = hDrcData->nextFact_exp; hDrcData->numBandsCurr = hDrcData->numBandsNext; FDKmemcpy( hDrcData->bandTopCurr, hDrcData->bandTopNext, SBRDEC_MAX_DRC_BANDS * sizeof(USHORT) ); hDrcData->drcInterpolationSchemeCurr = hDrcData->drcInterpolationSchemeNext; hDrcData->winSequenceCurr = hDrcData->winSequenceNext; } /*! \brief Apply DRC factors slot based. \hDrcData Handle to DRC channel data. \qmfRealSlot Pointer to real valued QMF data of one time slot. \qmfImagSlot Pointer to the imaginary QMF data of one time slot. \col Number of the time slot. \numQmfSubSamples Total number of time slots for one frame. \scaleFactor Pointer to the out scale factor of the time slot. \return None. */ void sbrDecoder_drcApplySlot ( HANDLE_SBR_DRC_CHANNEL hDrcData, FIXP_DBL *qmfRealSlot, FIXP_DBL *qmfImagSlot, int col, int numQmfSubSamples, int maxShift ) { const int *offset; int band, bottomMdct, topMdct, bin, useLP; int indx = numQmfSubSamples - (numQmfSubSamples >> 1) - 10; /* l_border */ int frameLenFlag = (numQmfSubSamples == 30) ? 1 : 0; const FIXP_DBL *fact_mag = NULL; INT fact_exp = 0; UINT numBands = 0; USHORT *bandTop = NULL; int shortDrc = 0; FIXP_DBL alphaValue = FL2FXCONST_DBL(0.0f); if (hDrcData == NULL) { return; } if (hDrcData->enable != 1) { return; } offset = offsetTab[frameLenFlag]; useLP = (qmfImagSlot == NULL) ? 1 : 0; col += indx; bottomMdct = 0; bin = 0; /* get respective data and calc interpolation factor */ if (col < (numQmfSubSamples>>1)) { /* first half of current frame */ if (hDrcData->winSequenceCurr != 2) { /* long window */ int j = col + (numQmfSubSamples>>1); if (hDrcData->drcInterpolationSchemeCurr == 0) { INT k = (frameLenFlag) ? 0x4444444 : 0x4000000; alphaValue = (FIXP_DBL)(j * k); } else { if (j >= offset[hDrcData->drcInterpolationSchemeCurr - 1]) { alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } else { /* short windows */ shortDrc = 1; } fact_mag = hDrcData->currFact_mag; fact_exp = hDrcData->currFact_exp; numBands = hDrcData->numBandsCurr; bandTop = hDrcData->bandTopCurr; } else if (col < numQmfSubSamples) { /* second half of current frame */ if (hDrcData->winSequenceNext != 2) { /* next: long window */ int j = col - (numQmfSubSamples>>1); if (hDrcData->drcInterpolationSchemeNext == 0) { INT k = (frameLenFlag) ? 0x4444444 : 0x4000000; alphaValue = (FIXP_DBL)(j * k); } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { alphaValue = (FIXP_DBL)MAXVAL_DBL; } } fact_mag = hDrcData->nextFact_mag; fact_exp = hDrcData->nextFact_exp; numBands = hDrcData->numBandsNext; bandTop = hDrcData->bandTopNext; } else { /* next: short windows */ if (hDrcData->winSequenceCurr != 2) { /* current: long window */ alphaValue = (FIXP_DBL)0; fact_mag = hDrcData->nextFact_mag; fact_exp = hDrcData->nextFact_exp; numBands = hDrcData->numBandsNext; bandTop = hDrcData->bandTopNext; } else { /* current: short windows */ shortDrc = 1; fact_mag = hDrcData->currFact_mag; fact_exp = hDrcData->currFact_exp; numBands = hDrcData->numBandsCurr; bandTop = hDrcData->bandTopCurr; } } } else { /* first half of next frame */ if (hDrcData->winSequenceNext != 2) { /* long window */ int j = col - (numQmfSubSamples>>1); if (hDrcData->drcInterpolationSchemeNext == 0) { INT k = (frameLenFlag) ? 0x4444444 : 0x4000000; alphaValue = (FIXP_DBL)(j * k); } else { if (j >= offset[hDrcData->drcInterpolationSchemeNext - 1]) { alphaValue = (FIXP_DBL)MAXVAL_DBL; } } } else { /* short windows */ shortDrc = 1; } fact_mag = hDrcData->nextFact_mag; fact_exp = hDrcData->nextFact_exp; numBands = hDrcData->numBandsNext; bandTop = hDrcData->bandTopNext; col -= numQmfSubSamples; } /* process bands */ for (band = 0; band < (int)numBands; band++) { int bottomQmf, topQmf; FIXP_DBL drcFact_mag = (FIXP_DBL)MAXVAL_DBL; topMdct = (bandTop[band]+1) << 2; if (!shortDrc) { /* long window */ if (frameLenFlag) { /* 960 framing */ bottomMdct = 30 * (bottomMdct / 30); topMdct = 30 * (topMdct / 30); bottomQmf = fMultIfloor((FIXP_DBL)0x4444444, bottomMdct); topQmf = fMultIfloor((FIXP_DBL)0x4444444, topMdct); } else { /* 1024 framing */ bottomMdct &= ~0x1f; topMdct &= ~0x1f; bottomQmf = bottomMdct >> 5; topQmf = topMdct >> 5; } if (band == ((int)numBands-1)) { topQmf = (64); } for (bin = bottomQmf; bin < topQmf; bin++) { FIXP_DBL drcFact1_mag = hDrcData->prevFact_mag[bin]; FIXP_DBL drcFact2_mag = fact_mag[band]; /* normalize scale factors */ if (hDrcData->prevFact_exp < maxShift) { drcFact1_mag >>= maxShift - hDrcData->prevFact_exp; } if (fact_exp < maxShift) { drcFact2_mag >>= maxShift - fact_exp; } /* interpolate */ if (alphaValue == (FIXP_DBL)0) { drcFact_mag = drcFact1_mag; } else if (alphaValue == (FIXP_DBL)MAXVAL_DBL) { drcFact_mag = drcFact2_mag; } else { drcFact_mag = fMult(alphaValue, drcFact2_mag) + fMult(((FIXP_DBL)MAXVAL_DBL - alphaValue), drcFact1_mag); } /* apply scaling */ qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); if (!useLP) { qmfImagSlot[bin] = fMult(qmfImagSlot[bin], drcFact_mag); } /* save previous factors */ if (col == (numQmfSubSamples>>1)-1) { hDrcData->prevFact_mag[bin] = fact_mag[band]; } } } else { /* short windows */ int startSample, stopSample; FIXP_DBL invFrameSizeDiv8 = (frameLenFlag) ? (FIXP_DBL)0x1111111 : (FIXP_DBL)0x1000000; if (frameLenFlag) { /* 960 framing */ bottomMdct = 30/8 * (bottomMdct*8/30); topMdct = 30/8 * (topMdct*8/30); } else { /* 1024 framing */ bottomMdct &= ~0x03; topMdct &= ~0x03; } /* startSample is truncated to the nearest corresponding start subsample in the QMF of the short window bottom is present in:*/ startSample = ((fMultIfloor( invFrameSizeDiv8, bottomMdct ) & 0x7) * numQmfSubSamples) >> 3; /* stopSample is rounded upwards to the nearest corresponding stop subsample in the QMF of the short window top is present in. */ stopSample = ((fMultIceil( invFrameSizeDiv8, topMdct ) & 0xf) * numQmfSubSamples) >> 3; bottomQmf = fMultIfloor( invFrameSizeDiv8, ((bottomMdct%(numQmfSubSamples<<2)) << 5) ); topQmf = fMultIfloor( invFrameSizeDiv8, ((topMdct%(numQmfSubSamples<<2)) << 5) ); /* extend last band */ if (band == ((int)numBands-1)) { topQmf = (64); stopSample = numQmfSubSamples; } if (topQmf == 0) { topQmf = (64); } /* save previous factors */ if (stopSample == numQmfSubSamples) { int tmpBottom = bottomQmf; if (((numQmfSubSamples-1) & ~0x03) > startSample) { tmpBottom = 0; /* band starts in previous short window */ } for (bin = tmpBottom; bin < topQmf; bin++) { hDrcData->prevFact_mag[bin] = fact_mag[band]; } } /* apply */ if ((col >= startSample) && (col < stopSample)) { if ((col & ~0x03) > startSample) { bottomQmf = 0; /* band starts in previous short window */ } if (col < ((stopSample-1) & ~0x03)) { topQmf = (64); /* band ends in next short window */ } drcFact_mag = fact_mag[band]; /* normalize scale factor */ if (fact_exp < maxShift) { drcFact_mag >>= maxShift - fact_exp; } /* apply scaling */ for (bin = bottomQmf; bin < topQmf; bin++) { qmfRealSlot[bin] = fMult(qmfRealSlot[bin], drcFact_mag); if (!useLP) { qmfImagSlot[bin] = fMult(qmfImagSlot[bin], drcFact_mag); } } } } bottomMdct = topMdct; } /* end of bands loop */ if (col == (numQmfSubSamples>>1)-1) { hDrcData->prevFact_exp = fact_exp; } } /*! \brief Apply DRC factors frame based. \hDrcData Handle to DRC channel data. \qmfRealSlot Pointer to real valued QMF data of the whole frame. \qmfImagSlot Pointer to the imaginary QMF data of the whole frame. \numQmfSubSamples Total number of time slots for one frame. \scaleFactor Pointer to the out scale factor of the frame. \return None. */ void sbrDecoder_drcApply ( HANDLE_SBR_DRC_CHANNEL hDrcData, FIXP_DBL **QmfBufferReal, FIXP_DBL **QmfBufferImag, int numQmfSubSamples, int *scaleFactor ) { int col; int maxShift = 0; if (hDrcData == NULL) { return; } if (hDrcData->enable == 0) { return; /* Avoid changing the scaleFactor even though the processing is disabled. */ } /* get max scale factor */ if (hDrcData->prevFact_exp > maxShift) { maxShift = hDrcData->prevFact_exp; } if (hDrcData->currFact_exp > maxShift) { maxShift = hDrcData->currFact_exp; } if (hDrcData->nextFact_exp > maxShift) { maxShift = hDrcData->nextFact_exp; } for (col = 0; col < numQmfSubSamples; col++) { FIXP_DBL *qmfSlotReal = QmfBufferReal[col]; FIXP_DBL *qmfSlotImag = (QmfBufferImag == NULL) ? NULL : QmfBufferImag[col]; sbrDecoder_drcApplySlot ( hDrcData, qmfSlotReal, qmfSlotImag, col, numQmfSubSamples, maxShift ); } *scaleFactor += maxShift; } fdk-aac-0.1.3/libSBRdec/src/lpp_tran.h0000644000175000017500000002376712372261464020001 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Low Power Profile Transposer, */ #ifndef _LPP_TRANS_H #define _LPP_TRANS_H #include "sbrdecoder.h" #include "qmf.h" /* Common */ #define QMF_OUT_SCALE 8 /* Env-Adjust */ #define MAX_NOISE_ENVELOPES 2 #define MAX_NOISE_COEFFS 5 #define MAX_NUM_NOISE_VALUES (MAX_NOISE_ENVELOPES * MAX_NOISE_COEFFS) #define MAX_NUM_LIMITERS 12 /* Set MAX_ENVELOPES to the largest value of all supported BSFORMATs by overriding MAX_ENVELOPES in the correct order: */ #define MAX_ENVELOPES_HEAAC 5 #define MAX_ENVELOPES MAX_ENVELOPES_HEAAC #define MAX_FREQ_COEFFS 48 #define MAX_FREQ_COEFFS_FS44100 35 #define MAX_FREQ_COEFFS_FS48000 32 #define MAX_NUM_ENVELOPE_VALUES (MAX_ENVELOPES * MAX_FREQ_COEFFS) #define MAX_GAIN_EXP 34 /* Maximum gain will be sqrt(0.5 * 2^MAX_GAIN_EXP) example: 34=99dB */ #define MAX_GAIN_CONCEAL_EXP 1 /* Maximum gain will be sqrt(0.5 * 2^MAX_GAIN_CONCEAL_EXP) in concealment case (0dB) */ /* LPP Transposer */ #define LPC_ORDER 2 #define MAX_INVF_BANDS MAX_NOISE_COEFFS #define MAX_NUM_PATCHES 6 #define SHIFT_START_SB 1 /*!< lowest subband of source range */ typedef enum { INVF_OFF = 0, INVF_LOW_LEVEL, INVF_MID_LEVEL, INVF_HIGH_LEVEL, INVF_SWITCHED /* not a real choice but used here to control behaviour */ } INVF_MODE; /** parameter set for one single patch */ typedef struct { UCHAR sourceStartBand; /*!< first band in lowbands where to take the samples from */ UCHAR sourceStopBand; /*!< first band in lowbands which is not included in the patch anymore */ UCHAR guardStartBand; /*!< first band in highbands to be filled with zeros in order to reduce interferences between patches */ UCHAR targetStartBand; /*!< first band in highbands to be filled with whitened lowband signal */ UCHAR targetBandOffs; /*!< difference between 'startTargetBand' and 'startSourceBand' */ UCHAR numBandsInPatch; /*!< number of consecutive bands in this one patch */ } PATCH_PARAM; /** whitening factors for different levels of whitening need to be initialized corresponding to crossover frequency */ typedef struct { FIXP_DBL off; /*!< bw factor for signal OFF */ FIXP_DBL transitionLevel; FIXP_DBL lowLevel; /*!< bw factor for signal LOW_LEVEL */ FIXP_DBL midLevel; /*!< bw factor for signal MID_LEVEL */ FIXP_DBL highLevel; /*!< bw factor for signal HIGH_LEVEL */ } WHITENING_FACTORS; /*! The transposer settings are calculated on a header reset and are shared by both channels. */ typedef struct { UCHAR nCols; /*!< number subsamples of a codec frame */ UCHAR noOfPatches; /*!< number of patches */ UCHAR lbStartPatching; /*!< first band of lowbands that will be patched */ UCHAR lbStopPatching; /*!< first band that won't be patched anymore*/ UCHAR bwBorders[MAX_NUM_NOISE_VALUES]; /*!< spectral bands with different inverse filtering levels */ PATCH_PARAM patchParam[MAX_NUM_PATCHES]; /*!< new parameter set for patching */ WHITENING_FACTORS whFactors; /*!< the pole moving factors for certain whitening levels as indicated in the bitstream depending on the crossover frequency */ UCHAR overlap; /*!< Overlap size */ } TRANSPOSER_SETTINGS; typedef struct { TRANSPOSER_SETTINGS *pSettings; /*!< Common settings for both channels */ FIXP_DBL bwVectorOld[MAX_NUM_PATCHES]; /*!< pole moving factors of past frame */ FIXP_DBL lpcFilterStatesReal[LPC_ORDER][(32)]; /*!< pointer array to save filter states */ FIXP_DBL lpcFilterStatesImag[LPC_ORDER][(32)]; /*!< pointer array to save filter states */ } SBR_LPP_TRANS; typedef SBR_LPP_TRANS *HANDLE_SBR_LPP_TRANS; void lppTransposer (HANDLE_SBR_LPP_TRANS hLppTrans, QMF_SCALE_FACTOR *sbrScaleFactor, FIXP_DBL **qmfBufferReal, FIXP_DBL *degreeAlias, FIXP_DBL **qmfBufferImag, const int useLP, const int timeStep, const int firstSlotOffset, const int lastSlotOffset, const int nInvfBands, INVF_MODE *sbr_invf_mode, INVF_MODE *sbr_invf_mode_prev ); SBR_ERROR createLppTransposer (HANDLE_SBR_LPP_TRANS hLppTrans, TRANSPOSER_SETTINGS *pSettings, const int highBandStartSb, UCHAR *v_k_master, const int numMaster, const int usb, const int timeSlots, const int nCols, UCHAR *noiseBandTable, const int noNoiseBands, UINT fs, const int chan, const int overlap); SBR_ERROR resetLppTransposer (HANDLE_SBR_LPP_TRANS hLppTrans, UCHAR highBandStartSb, UCHAR *v_k_master, UCHAR numMaster, UCHAR *noiseBandTable, UCHAR noNoiseBands, UCHAR usb, UINT fs); #endif /* _LPP_TRANS_H */ fdk-aac-0.1.3/libSBRdec/src/env_extr.cpp0000644000175000017500000012631512372261464020340 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Envelope extraction The functions provided by this module are mostly called by applySBR(). After it is determined that there is valid SBR data, sbrGetHeaderData() might be called if the current SBR data contains an \ref SBR_HEADER_ELEMENT as opposed to a \ref SBR_STANDARD_ELEMENT. This function may return various error codes as defined in #SBR_HEADER_STATUS . Most importantly it returns HEADER_RESET when decoder settings need to be recalculated according to the SBR specifications. In that case applySBR() will initiatite the required re-configuration. The header data is stored in a #SBR_HEADER_DATA structure. The actual SBR data for the current frame is decoded into SBR_FRAME_DATA stuctures by sbrGetChannelPairElement() [for stereo streams] and sbrGetSingleChannelElement() [for mono streams]. There is no fractional arithmetic involved. Once the information is extracted, the data needs to be further prepared before the actual decoding process. This is done in decodeSbrData(). \sa Description of buffer management in applySBR(). \ref documentationOverview

About the SBR data format:

Each frame includes SBR data (side chain information), and can be either the \ref SBR_HEADER_ELEMENT or the \ref SBR_STANDARD_ELEMENT. Parts of the data can be protected by a CRC checksum. \anchor SBR_HEADER_ELEMENT

The SBR_HEADER_ELEMENT

The SBR_HEADER_ELEMENT can be transmitted with every frame, however, it typically is send every second or so. It contains fundamental information such as SBR sampling frequency and frequency range as well as control signals that do not require frequent changes. It also includes the \ref SBR_STANDARD_ELEMENT. Depending on the changes between the information in a current SBR_HEADER_ELEMENT and the previous SBR_HEADER_ELEMENT, the SBR decoder might need to be reset and reconfigured (e.g. new tables need to be calculated). \anchor SBR_STANDARD_ELEMENT

The SBR_STANDARD_ELEMENT

This data can be subdivided into "side info" and "raw data", where side info is defined as signals needed to decode the raw data and some decoder tuning signals. Raw data is referred to as PCM and Huffman coded envelope and noise floor estimates. The side info also includes information about the time-frequency grid for the current frame. \sa \ref documentationOverview */ #include "env_extr.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "huff_dec.h" #include "psbitdec.h" #define DRM_PARAMETRIC_STEREO 0 #define EXTENSION_ID_PS_CODING 2 static int extractFrameInfo (HANDLE_FDK_BITSTREAM hBs, HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_frame_data, const UINT nrOfChannels, const UINT flags ); static int sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_frame_data, HANDLE_FDK_BITSTREAM hBs, const UINT flags); static void sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA hFrameData, HANDLE_FDK_BITSTREAM hBs); static void sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_frame_data, HANDLE_FDK_BITSTREAM hBs); static int checkFrameInfo (FRAME_INFO *pFrameInfo, int numberOfTimeSlots, int overlap, int timeStep); SBR_ERROR initHeaderData ( HANDLE_SBR_HEADER_DATA hHeaderData, const int sampleRateIn, const int sampleRateOut, const int samplesPerFrame, const UINT flags ) { HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; SBR_ERROR sbrError = SBRDEC_OK; int numAnalysisBands; if ( sampleRateIn == sampleRateOut ) { hHeaderData->sbrProcSmplRate = sampleRateOut<<1; numAnalysisBands = 32; } else { hHeaderData->sbrProcSmplRate = sampleRateOut; if ( (sampleRateOut>>1) == sampleRateIn) { /* 1:2 */ numAnalysisBands = 32; } else if ( (sampleRateOut>>2) == sampleRateIn ) { /* 1:4 */ numAnalysisBands = 32; } else if ( (sampleRateOut*3)>>3 == (sampleRateIn*8)>>3 ) { /* 3:8, 3/4 core frame length */ numAnalysisBands = 24; } else { sbrError = SBRDEC_UNSUPPORTED_CONFIG; goto bail; } } /* Fill in default values first */ hHeaderData->syncState = SBR_NOT_INITIALIZED; hHeaderData->status = 0; hHeaderData->frameErrorFlag = 0; hHeaderData->bs_info.ampResolution = 1; hHeaderData->bs_info.xover_band = 0; hHeaderData->bs_info.sbr_preprocessing = 0; hHeaderData->bs_data.startFreq = 5; hHeaderData->bs_data.stopFreq = 0; hHeaderData->bs_data.freqScale = 2; hHeaderData->bs_data.alterScale = 1; hHeaderData->bs_data.noise_bands = 2; hHeaderData->bs_data.limiterBands = 2; hHeaderData->bs_data.limiterGains = 2; hHeaderData->bs_data.interpolFreq = 1; hHeaderData->bs_data.smoothingLength = 1; hHeaderData->timeStep = (flags & SBRDEC_ELD_GRID) ? 1 : 2; /* Setup pointers to frequency band tables */ hFreq->freqBandTable[0] = hFreq->freqBandTableLo; hFreq->freqBandTable[1] = hFreq->freqBandTableHi; /* Patch some entries */ if (sampleRateOut > 24000) { /* Trigger an error if SBR is going to be processed without */ hHeaderData->bs_data.startFreq = 7; /* having read these frequency values from bit stream before. */ hHeaderData->bs_data.stopFreq = 3; } /* One SBR timeslot corresponds to the amount of samples equal to the amount of analysis bands, divided by the timestep. */ hHeaderData->numberTimeSlots = (samplesPerFrame/numAnalysisBands) >> (hHeaderData->timeStep - 1); if (hHeaderData->numberTimeSlots > (16)) { sbrError = SBRDEC_UNSUPPORTED_CONFIG; } hHeaderData->numberOfAnalysisBands = numAnalysisBands; bail: return sbrError; } /*! \brief Initialize the SBR_PREV_FRAME_DATA struct */ void initSbrPrevFrameData (HANDLE_SBR_PREV_FRAME_DATA h_prev_data, /*!< handle to struct SBR_PREV_FRAME_DATA */ int timeSlots) /*!< Framelength in SBR-timeslots */ { int i; /* Set previous energy and noise levels to 0 for the case that decoding starts in the middle of a bitstream */ for (i=0; i < MAX_FREQ_COEFFS; i++) h_prev_data->sfb_nrg_prev[i] = (FIXP_DBL)0; for (i=0; i < MAX_NOISE_COEFFS; i++) h_prev_data->prevNoiseLevel[i] = (FIXP_DBL)0; for (i=0; i < MAX_INVF_BANDS; i++) h_prev_data->sbr_invf_mode[i] = INVF_OFF; h_prev_data->stopPos = timeSlots; h_prev_data->coupling = COUPLING_OFF; h_prev_data->ampRes = 0; } /*! \brief Read header data from bitstream \return error status - 0 if ok */ SBR_HEADER_STATUS sbrGetHeaderData (HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_FDK_BITSTREAM hBs, const UINT flags, const int fIsSbrData) { SBR_HEADER_DATA_BS *pBsData; SBR_HEADER_DATA_BS lastHeader; SBR_HEADER_DATA_BS_INFO lastInfo; int headerExtra1=0, headerExtra2=0; /* Copy SBR bit stream header to temporary header */ lastHeader = hHeaderData->bs_data; lastInfo = hHeaderData->bs_info; /* Read new header from bitstream */ { pBsData = &hHeaderData->bs_data; } { hHeaderData->bs_info.ampResolution = FDKreadBits (hBs, 1); } pBsData->startFreq = FDKreadBits (hBs, 4); pBsData->stopFreq = FDKreadBits (hBs, 4); { hHeaderData->bs_info.xover_band = FDKreadBits (hBs, 3); FDKreadBits (hBs, 2); } headerExtra1 = FDKreadBits (hBs, 1); headerExtra2 = FDKreadBits (hBs, 1); /* Handle extra header information */ if( headerExtra1) { pBsData->freqScale = FDKreadBits (hBs, 2); pBsData->alterScale = FDKreadBits (hBs, 1); pBsData->noise_bands = FDKreadBits (hBs, 2); } else { pBsData->freqScale = 2; pBsData->alterScale = 1; pBsData->noise_bands = 2; } if (headerExtra2) { pBsData->limiterBands = FDKreadBits (hBs, 2); pBsData->limiterGains = FDKreadBits (hBs, 2); pBsData->interpolFreq = FDKreadBits (hBs, 1); pBsData->smoothingLength = FDKreadBits (hBs, 1); } else { pBsData->limiterBands = 2; pBsData->limiterGains = 2; pBsData->interpolFreq = 1; pBsData->smoothingLength = 1; } /* Look for new settings. IEC 14496-3, 4.6.18.3.1 */ if(hHeaderData->syncState != SBR_ACTIVE || lastHeader.startFreq != pBsData->startFreq || lastHeader.stopFreq != pBsData->stopFreq || lastHeader.freqScale != pBsData->freqScale || lastHeader.alterScale != pBsData->alterScale || lastHeader.noise_bands != pBsData->noise_bands || lastInfo.xover_band != hHeaderData->bs_info.xover_band) { return HEADER_RESET; /* New settings */ } return HEADER_OK; } /*! \brief Get missing harmonics parameters (only used for AAC+SBR) \return error status - 0 if ok */ int sbrGetSyntheticCodedData(HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA hFrameData, HANDLE_FDK_BITSTREAM hBs) { int i, bitsRead = 0; int flag = FDKreadBits(hBs,1); bitsRead++; if(flag){ for(i=0;ifreqBandData.nSfb[1];i++){ hFrameData->addHarmonics[i] = FDKreadBits (hBs, 1 ); bitsRead++; } } else { for(i=0; iaddHarmonics[i] = 0; } return(bitsRead); } /*! \brief Reads extension data from the bitstream The bitstream format allows up to 4 kinds of extended data element. Extended data may contain several elements, each identified by a 2-bit-ID. So far, no extended data elements are defined hence the first 2 parameters are unused. The data should be skipped in order to update the number of read bits for the consistency check in applySBR(). */ static int extractExtendedData( HANDLE_SBR_HEADER_DATA hHeaderData, /*!< handle to SBR header */ HANDLE_FDK_BITSTREAM hBs /*!< Handle to the bit buffer */ ,HANDLE_PS_DEC hParametricStereoDec /*!< Parametric Stereo Decoder */ ) { INT nBitsLeft; int extended_data; int i, frameOk = 1; extended_data = FDKreadBits(hBs, 1); if (extended_data) { int cnt; int bPsRead = 0; cnt = FDKreadBits(hBs, 4); if (cnt == (1<<4)-1) cnt += FDKreadBits(hBs, 8); nBitsLeft = 8 * cnt; /* sanity check for cnt */ if (nBitsLeft > (INT)FDKgetValidBits(hBs)) { /* limit nBitsLeft */ nBitsLeft = (INT)FDKgetValidBits(hBs); /* set frame error */ frameOk = 0; } while (nBitsLeft > 7) { int extension_id = FDKreadBits(hBs, 2); nBitsLeft -= 2; switch(extension_id) { case EXTENSION_ID_PS_CODING: /* Read PS data from bitstream */ if (hParametricStereoDec != NULL) { if(bPsRead && !hParametricStereoDec->bsData[hParametricStereoDec->bsReadSlot].mpeg.bPsHeaderValid) { cnt = nBitsLeft >> 3; /* number of remaining bytes */ for (i=0; i> 3; /* number of remaining bytes */ for (i=0; icoupling = COUPLING_OFF; { /* Reserved bits */ if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ FDKreadBits(hBs, 4); if (flags & SBRDEC_SYNTAX_SCAL) { FDKreadBits(hBs, 4); } } } if (flags & SBRDEC_SYNTAX_SCAL) { FDKreadBits (hBs, 1); /* bs_coupling */ } /* Grid control */ if ( !extractFrameInfo ( hBs, hHeaderData, hFrameData, 1, flags) ) return 0; if ( !checkFrameInfo (&hFrameData->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) return 0; /* Fetch domain vectors (time or frequency direction for delta-coding) */ sbrGetDirectionControlData (hFrameData, hBs); for (i=0; ifreqBandData.nInvfBands; i++) { hFrameData->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); } /* raw data */ if ( !sbrGetEnvelope (hHeaderData, hFrameData, hBs, flags) ) return 0; sbrGetNoiseFloorData (hHeaderData, hFrameData, hBs); sbrGetSyntheticCodedData(hHeaderData, hFrameData, hBs); { /* sbr extended data */ if (! extractExtendedData( hHeaderData, hBs ,hParametricStereoDec )) { return 0; } } return 1; } /*! \brief Read bitstream elements of a channel pair \return SbrFrameOK */ int sbrGetChannelPairElement (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameDataLeft, /*!< Dynamic control data for first channel */ HANDLE_SBR_FRAME_DATA hFrameDataRight,/*!< Dynamic control data for second channel */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ const UINT flags, const int overlap ) { int i, bit; /* Reserved bits */ if (FDKreadBits(hBs, 1)) { /* bs_data_extra */ FDKreadBits(hBs, 4); FDKreadBits(hBs, 4); } /* Read coupling flag */ bit = FDKreadBits (hBs, 1); if (bit) { hFrameDataLeft->coupling = COUPLING_LEVEL; hFrameDataRight->coupling = COUPLING_BAL; } else { hFrameDataLeft->coupling = COUPLING_OFF; hFrameDataRight->coupling = COUPLING_OFF; } /* Grid control */ if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataLeft, 2, flags) ) return 0; if ( !checkFrameInfo (&hFrameDataLeft->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) return 0; if (hFrameDataLeft->coupling) { FDKmemcpy (&hFrameDataRight->frameInfo, &hFrameDataLeft->frameInfo, sizeof(FRAME_INFO)); hFrameDataRight->ampResolutionCurrentFrame = hFrameDataLeft->ampResolutionCurrentFrame; } else { if ( !extractFrameInfo (hBs, hHeaderData, hFrameDataRight, 2, flags) ) return 0; if ( !checkFrameInfo (&hFrameDataRight->frameInfo, hHeaderData->numberTimeSlots, overlap, hHeaderData->timeStep) ) return 0; } /* Fetch domain vectors (time or frequency direction for delta-coding) */ sbrGetDirectionControlData (hFrameDataLeft, hBs); sbrGetDirectionControlData (hFrameDataRight, hBs); for (i=0; ifreqBandData.nInvfBands; i++) { hFrameDataLeft->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); } if (hFrameDataLeft->coupling) { for (i=0; ifreqBandData.nInvfBands; i++) { hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i]; } if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) { return 0; } sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) { return 0; } } else { for (i=0; ifreqBandData.nInvfBands; i++) { hFrameDataRight->sbr_invf_mode[i] = (INVF_MODE) FDKreadBits (hBs, 2); } if ( !sbrGetEnvelope (hHeaderData, hFrameDataLeft, hBs, flags) ) return 0; if ( !sbrGetEnvelope (hHeaderData, hFrameDataRight, hBs, flags) ) return 0; sbrGetNoiseFloorData (hHeaderData, hFrameDataLeft, hBs); } sbrGetNoiseFloorData (hHeaderData, hFrameDataRight, hBs); sbrGetSyntheticCodedData(hHeaderData, hFrameDataLeft, hBs); sbrGetSyntheticCodedData(hHeaderData, hFrameDataRight, hBs); { if (! extractExtendedData( hHeaderData, hBs ,NULL ) ) { return 0; } } return 1; } /*! \brief Read direction control data from bitstream */ void sbrGetDirectionControlData (HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ { int i; for (i = 0; i < h_frame_data->frameInfo.nEnvelopes; i++) { h_frame_data->domain_vec[i] = FDKreadBits (hBs, 1); } for (i = 0; i < h_frame_data->frameInfo.nNoiseEnvelopes; i++) { h_frame_data->domain_vec_noise[i] = FDKreadBits (hBs, 1); } } /*! \brief Read noise-floor-level data from bitstream */ void sbrGetNoiseFloorData (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ HANDLE_FDK_BITSTREAM hBs) /*!< handle to struct BIT_BUF */ { int i,j; int delta; COUPLING_MODE coupling; int noNoiseBands = hHeaderData->freqBandData.nNfb; Huffman hcb_noiseF; Huffman hcb_noise; int envDataTableCompFactor; coupling = h_frame_data->coupling; /* Select huffman codebook depending on coupling mode */ if (coupling == COUPLING_BAL) { hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T; hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; /* "sbr_huffBook_NoiseBalance11F" */ envDataTableCompFactor = 1; } else { hcb_noise = (Huffman)&FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T; hcb_noiseF = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; /* "sbr_huffBook_NoiseLevel11F" */ envDataTableCompFactor = 0; } /* Read raw noise-envelope data */ for (i=0; iframeInfo.nNoiseEnvelopes; i++) { if (h_frame_data->domain_vec_noise[i] == 0) { if (coupling == COUPLING_BAL) { h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = (FIXP_SGL) (((int)FDKreadBits (hBs, 5)) << envDataTableCompFactor); } else { h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands] = (FIXP_SGL) (int)FDKreadBits (hBs, 5); } for (j = 1; j < noNoiseBands; j++) { delta = DecodeHuffmanCW(hcb_noiseF, hBs); h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); } } else { for (j = 0; j < noNoiseBands; j++) { delta = DecodeHuffmanCW(hcb_noise, hBs); h_frame_data->sbrNoiseFloorLevel[i*noNoiseBands+j] = (FIXP_SGL) (delta << envDataTableCompFactor); } } } } /*! \brief Read envelope data from bitstream */ static int sbrGetEnvelope (HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_frame_data, /*!< handle to struct SBR_FRAME_DATA */ HANDLE_FDK_BITSTREAM hBs, /*!< handle to struct BIT_BUF */ const UINT flags) { int i, j; UCHAR no_band[MAX_ENVELOPES]; int delta = 0; int offset = 0; COUPLING_MODE coupling = h_frame_data->coupling; int ampRes = hHeaderData->bs_info.ampResolution; int nEnvelopes = h_frame_data->frameInfo.nEnvelopes; int envDataTableCompFactor; int start_bits, start_bits_balance; Huffman hcb_t, hcb_f; h_frame_data->nScaleFactors = 0; if ( (h_frame_data->frameInfo.frameClass == 0) && (nEnvelopes == 1) ) { if (flags & SBRDEC_ELD_GRID) ampRes = h_frame_data->ampResolutionCurrentFrame; else ampRes = 0; } h_frame_data->ampResolutionCurrentFrame = ampRes; /* Set number of bits for first value depending on amplitude resolution */ if(ampRes == 1) { start_bits = 6; start_bits_balance = 5; } else { start_bits = 7; start_bits_balance = 6; } /* Calculate number of values for each envelope and alltogether */ for (i = 0; i < nEnvelopes; i++) { no_band[i] = hHeaderData->freqBandData.nSfb[h_frame_data->frameInfo.freqRes[i]]; h_frame_data->nScaleFactors += no_band[i]; } if (h_frame_data->nScaleFactors > MAX_NUM_ENVELOPE_VALUES) return 0; /* Select Huffman codebook depending on coupling mode and amplitude resolution */ if (coupling == COUPLING_BAL) { envDataTableCompFactor = 1; if (ampRes == 0) { hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10T; hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance10F; } else { hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11T; hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvBalance11F; } } else { envDataTableCompFactor = 0; if (ampRes == 0) { hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10T; hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel10F; } else { hcb_t = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11T; hcb_f = (Huffman)&FDK_sbrDecoder_sbr_huffBook_EnvLevel11F; } } /* Now read raw envelope data */ for (j = 0, offset = 0; j < nEnvelopes; j++) { if (h_frame_data->domain_vec[j] == 0) { if (coupling == COUPLING_BAL) { h_frame_data->iEnvelope[offset] = (FIXP_SGL) (( (int)FDKreadBits(hBs, start_bits_balance)) << envDataTableCompFactor); } else { h_frame_data->iEnvelope[offset] = (FIXP_SGL) (int)FDKreadBits (hBs, start_bits); } } for (i = (1 - h_frame_data->domain_vec[j]); i < no_band[j]; i++) { if (h_frame_data->domain_vec[j] == 0) { delta = DecodeHuffmanCW(hcb_f, hBs); } else { delta = DecodeHuffmanCW(hcb_t, hBs); } h_frame_data->iEnvelope[offset + i] = (FIXP_SGL) (delta << envDataTableCompFactor); } offset += no_band[j]; } #if ENV_EXP_FRACT /* Convert from int to scaled fract (ENV_EXP_FRACT bits for the fractional part) */ for (i = 0; i < h_frame_data->nScaleFactors; i++) { h_frame_data->iEnvelope[i] <<= ENV_EXP_FRACT; } #endif return 1; } //static const FRAME_INFO v_frame_info1_8 = { 0, 1, {0, 8}, {1}, -1, 1, {0, 8} }; static const FRAME_INFO v_frame_info2_8 = { 0, 2, {0, 4, 8}, {1, 1}, -1, 2, {0, 4, 8} }; static const FRAME_INFO v_frame_info4_8 = { 0, 4, {0, 2, 4, 6, 8}, {1, 1, 1, 1}, -1, 2, {0, 4, 8} }; /***************************************************************************/ /*! \brief Generates frame info for FIXFIXonly frame class used for low delay version \return nothing ****************************************************************************/ static void generateFixFixOnly ( FRAME_INFO *hSbrFrameInfo, int tranPosInternal, int numberTimeSlots ) { int nEnv, i, tranIdx; const int *pTable; switch (numberTimeSlots) { case 8: pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; break; case 15: pTable = FDK_sbrDecoder_envelopeTable_15[tranPosInternal]; break; case 16: pTable = FDK_sbrDecoder_envelopeTable_16[tranPosInternal]; break; default: FDK_ASSERT(0); } /* look number of envelopes in table */ nEnv = pTable[0]; /* look up envelope distribution in table */ for (i=1; iborders[i] = pTable[i+2]; /* open and close frame border */ hSbrFrameInfo->borders[0] = 0; hSbrFrameInfo->borders[nEnv] = numberTimeSlots; hSbrFrameInfo->nEnvelopes = nEnv; /* transient idx */ tranIdx = hSbrFrameInfo->tranEnv = pTable[1]; /* add noise floors */ hSbrFrameInfo->bordersNoise[0] = 0; hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1]; hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; /* nEnv is always > 1, so nNoiseEnvelopes is always 2 (IEC 14496-3 4.6.19.3.2) */ hSbrFrameInfo->nNoiseEnvelopes = 2; } /*! \brief Extracts LowDelaySBR control data from the bitstream. \return zero for bitstream error, one for correct. */ static int extractLowDelayGrid (HANDLE_FDK_BITSTREAM hBitBuf, /*!< bitbuffer handle */ HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_FRAME_DATA h_frame_data, /*!< contains the FRAME_INFO struct to be filled */ int timeSlots ) { FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; INT numberTimeSlots = hHeaderData->numberTimeSlots; INT temp = 0, k; /* FIXFIXonly framing case */ h_frame_data->frameInfo.frameClass = 0; /* get the transient position from the bitstream */ switch (timeSlots){ case 8: /* 3bit transient position (temp={0;..;7}) */ temp = FDKreadBits( hBitBuf, 3); break; case 16: case 15: /* 4bit transient position (temp={0;..;15}) */ temp = FDKreadBits( hBitBuf, 4); break; default: return 0; } /* calculate borders according to the transient position */ generateFixFixOnly ( pFrameInfo, temp, numberTimeSlots ); /* decode freq res: */ for (k = 0; k < pFrameInfo->nEnvelopes; k++) { pFrameInfo->freqRes[k] = (UCHAR) FDKreadBits (hBitBuf, 1); /* f = F [1 bits] */ } return 1; } /*! \brief Extract the frame information (structure FRAME_INFO) from the bitstream \return Zero for bitstream error, one for correct. */ int extractFrameInfo ( HANDLE_FDK_BITSTREAM hBs, /*!< bitbuffer handle */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA h_frame_data, /*!< pointer to memory where the frame-info will be stored */ const UINT nrOfChannels, const UINT flags ) { FRAME_INFO * pFrameInfo = &h_frame_data->frameInfo; int numberTimeSlots = hHeaderData->numberTimeSlots; int pointer_bits = 0, nEnv = 0, b = 0, border, i, n = 0, k, p, aL, aR, nL, nR, temp = 0, staticFreqRes; UCHAR frameClass; if (flags & SBRDEC_ELD_GRID) { /* CODEC_AACLD (LD+SBR) only uses the normal 0 Grid for non-transient Frames and the LowDelayGrid for transient Frames */ frameClass = FDKreadBits (hBs, 1); /* frameClass = [1 bit] */ if ( frameClass == 1 ) { /* if frameClass == 1, extract LowDelaySbrGrid, otherwise extract normal SBR-Grid for FIXIFX */ /* extract the AACLD-Sbr-Grid */ pFrameInfo->frameClass = frameClass; extractLowDelayGrid (hBs, hHeaderData, h_frame_data, numberTimeSlots); return 1; } } else { frameClass = FDKreadBits (hBs, 2); /* frameClass = C [2 bits] */ } switch (frameClass) { case 0: temp = FDKreadBits (hBs, 2); /* E [2 bits ] */ nEnv = (int) (1 << temp); /* E -> e */ if ((flags & SBRDEC_ELD_GRID) && (nEnv == 1)) h_frame_data->ampResolutionCurrentFrame = FDKreadBits( hBs, 1); /* new ELD Syntax 07-11-09 */ staticFreqRes = FDKreadBits (hBs, 1); { if (nEnv > MAX_ENVELOPES_HEAAC) return 0; } b = nEnv + 1; switch (nEnv) { case 1: switch (numberTimeSlots) { case 15: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_15, sizeof(FRAME_INFO)); break; case 16: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info1_16, sizeof(FRAME_INFO)); break; default: FDK_ASSERT(0); } break; case 2: switch (numberTimeSlots) { case 15: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_15, sizeof(FRAME_INFO)); break; case 16: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info2_16, sizeof(FRAME_INFO)); break; default: FDK_ASSERT(0); } break; case 4: switch (numberTimeSlots) { case 15: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_15, sizeof(FRAME_INFO)); break; case 16: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info4_16, sizeof(FRAME_INFO)); break; default: FDK_ASSERT(0); } break; case 8: #if (MAX_ENVELOPES >= 8) switch (numberTimeSlots) { case 15: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_15, sizeof(FRAME_INFO)); break; case 16: FDKmemcpy (pFrameInfo, &FDK_sbrDecoder_sbr_frame_info8_16, sizeof(FRAME_INFO)); break; default: FDK_ASSERT(0); } break; #else return 0; #endif } /* Apply correct freqRes (High is default) */ if (!staticFreqRes) { for (i = 0; i < nEnv ; i++) pFrameInfo->freqRes[i] = 0; } break; case 1: case 2: temp = FDKreadBits (hBs, 2); /* A [2 bits] */ n = FDKreadBits (hBs, 2); /* n = N [2 bits] */ nEnv = n + 1; /* # envelopes */ b = nEnv + 1; /* # borders */ break; } switch (frameClass) { case 1: /* Decode borders: */ pFrameInfo->borders[0] = 0; /* first border */ border = temp + numberTimeSlots; /* A -> aR */ i = b-1; /* frame info index for last border */ pFrameInfo->borders[i] = border; /* last border */ for (k = 0; k < n; k++) { temp = FDKreadBits (hBs, 2);/* R [2 bits] */ border -= (2 * temp + 2); /* R -> r */ pFrameInfo->borders[--i] = border; } /* Decode pointer: */ pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ if (p > n+1) return 0; pFrameInfo->tranEnv = p ? n + 2 - p : -1; /* Decode freq res: */ for (k = n; k >= 0; k--) { pFrameInfo->freqRes[k] = FDKreadBits (hBs, 1); /* f = F [1 bits] */ } /* Calculate noise floor middle border: */ if (p == 0 || p == 1) pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; else pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; break; case 2: /* Decode borders: */ border = temp; /* A -> aL */ pFrameInfo->borders[0] = border; /* first border */ for (k = 1; k <= n; k++) { temp = FDKreadBits (hBs, 2);/* R [2 bits] */ border += (2 * temp + 2); /* R -> r */ pFrameInfo->borders[k] = border; } pFrameInfo->borders[k] = numberTimeSlots; /* last border */ /* Decode pointer: */ pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(n+1)); p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ if (p > n+1) return 0; if (p == 0 || p == 1) pFrameInfo->tranEnv = -1; else pFrameInfo->tranEnv = p - 1; /* Decode freq res: */ for (k = 0; k <= n; k++) { pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ } /* Calculate noise floor middle border: */ switch (p) { case 0: pFrameInfo->bordersNoise[1] = pFrameInfo->borders[1]; break; case 1: pFrameInfo->bordersNoise[1] = pFrameInfo->borders[n]; break; default: pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; break; } break; case 3: /* v_ctrlSignal = [frameClass,aL,aR,nL,nR,v_rL,v_rR,p,v_fLR]; */ aL = FDKreadBits (hBs, 2); /* AL [2 bits], AL -> aL */ aR = FDKreadBits (hBs, 2) + numberTimeSlots; /* AR [2 bits], AR -> aR */ nL = FDKreadBits (hBs, 2); /* nL = NL [2 bits] */ nR = FDKreadBits (hBs, 2); /* nR = NR [2 bits] */ /*------------------------------------------------------------------------- Calculate help variables --------------------------------------------------------------------------*/ /* general: */ nEnv = nL + nR + 1; /* # envelopes */ if (nEnv > MAX_ENVELOPES) return 0; b = nEnv + 1; /* # borders */ /*------------------------------------------------------------------------- Decode envelopes --------------------------------------------------------------------------*/ /* L-borders: */ border = aL; /* first border */ pFrameInfo->borders[0] = border; for (k = 1; k <= nL; k++) { temp = FDKreadBits (hBs, 2);/* R [2 bits] */ border += (2 * temp + 2); /* R -> r */ pFrameInfo->borders[k] = border; } /* R-borders: */ border = aR; /* last border */ i = nEnv; pFrameInfo->borders[i] = border; for (k = 0; k < nR; k++) { temp = FDKreadBits (hBs, 2);/* R [2 bits] */ border -= (2 * temp + 2); /* R -> r */ pFrameInfo->borders[--i] = border; } /* decode pointer: */ pointer_bits = DFRACT_BITS - 1 - CountLeadingBits((FIXP_DBL)(nL+nR+1)); p = FDKreadBits (hBs, pointer_bits); /* p = P [pointer_bits bits] */ if (p > nL+nR+1) return 0; pFrameInfo->tranEnv = p ? b - p : -1; /* decode freq res: */ for (k = 0; k < nEnv; k++) { pFrameInfo->freqRes[k] = FDKreadBits(hBs, 1); /* f = F [1 bits] */ } /*------------------------------------------------------------------------- Decode noise floors --------------------------------------------------------------------------*/ pFrameInfo->bordersNoise[0] = aL; if (nEnv == 1) { /* 1 noise floor envelope: */ pFrameInfo->bordersNoise[1] = aR; } else { /* 2 noise floor envelopes */ if (p == 0 || p == 1) pFrameInfo->bordersNoise[1] = pFrameInfo->borders[nEnv - 1]; else pFrameInfo->bordersNoise[1] = pFrameInfo->borders[pFrameInfo->tranEnv]; pFrameInfo->bordersNoise[2] = aR; } break; } /* Store number of envelopes, noise floor envelopes and frame class */ pFrameInfo->nEnvelopes = nEnv; if (nEnv == 1) pFrameInfo->nNoiseEnvelopes = 1; else pFrameInfo->nNoiseEnvelopes = 2; pFrameInfo->frameClass = frameClass; if (pFrameInfo->frameClass == 2 || pFrameInfo->frameClass == 1) { /* calculate noise floor first and last borders: */ pFrameInfo->bordersNoise[0] = pFrameInfo->borders[0]; pFrameInfo->bordersNoise[pFrameInfo->nNoiseEnvelopes] = pFrameInfo->borders[nEnv]; } return 1; } /*! \brief Check if the frameInfo vector has reasonable values. \return Zero for error, one for correct */ static int checkFrameInfo (FRAME_INFO * pFrameInfo, /*!< pointer to frameInfo */ int numberOfTimeSlots, /*!< QMF time slots per frame */ int overlap, /*!< Amount of overlap QMF time slots */ int timeStep) /*!< QMF slots to SBR slots step factor */ { int maxPos,i,j; int startPos; int stopPos; int tranEnv; int startPosNoise; int stopPosNoise; int nEnvelopes = pFrameInfo->nEnvelopes; int nNoiseEnvelopes = pFrameInfo->nNoiseEnvelopes; if(nEnvelopes < 1 || nEnvelopes > MAX_ENVELOPES) return 0; if(nNoiseEnvelopes > MAX_NOISE_ENVELOPES) return 0; startPos = pFrameInfo->borders[0]; stopPos = pFrameInfo->borders[nEnvelopes]; tranEnv = pFrameInfo->tranEnv; startPosNoise = pFrameInfo->bordersNoise[0]; stopPosNoise = pFrameInfo->bordersNoise[nNoiseEnvelopes]; if (overlap < 0 || overlap > (6)) { return 0; } if (timeStep < 1 || timeStep > 2) { return 0; } maxPos = numberOfTimeSlots + (overlap/timeStep); /* Check that the start and stop positions of the frame are reasonable values. */ if( (startPos < 0) || (startPos >= stopPos) ) return 0; if( startPos > maxPos-numberOfTimeSlots ) /* First env. must start in or directly after the overlap buffer */ return 0; if( stopPos < numberOfTimeSlots ) /* One complete frame must be ready for output after processing */ return 0; if(stopPos > maxPos) return 0; /* Check that the start border for every envelope is strictly later in time */ for(i=0;iborders[i] >= pFrameInfo->borders[i+1]) return 0; } /* Check that the envelope to be shortened is actually among the envelopes */ if(tranEnv>nEnvelopes) return 0; /* Check the noise borders */ if(nEnvelopes==1 && nNoiseEnvelopes>1) return 0; if(startPos != startPosNoise || stopPos != stopPosNoise) return 0; /* Check that the start border for every noise-envelope is strictly later in time*/ for(i=0; ibordersNoise[i] >= pFrameInfo->bordersNoise[i+1]) return 0; } /* Check that every noise border is the same as an envelope border*/ for(i=0; ibordersNoise[i]; for(j=0; jborders[j] == startPosNoise) break; } if(j==nEnvelopes) return 0; } return 1; } fdk-aac-0.1.3/libSBRdec/src/sbr_rom.cpp0000644000175000017500000030363312372261464020151 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Definition of constant tables This module contains most of the constant data that can be stored in ROM. */ #include "sbr_rom.h" /*! \name StartStopBands \brief Start and stop subbands of the highband. k_o = startMin + offset[bs_start_freq]; startMin = {3000,4000,5000} * (128/FS_sbr) / FS_sbr < 32Khz, 32Khz <= FS_sbr < 64KHz, 64KHz <= FS_sbr The stop subband can also be calculated to save memory by defining #CALC_STOP_BAND. */ //@{ const UCHAR FDK_sbrDecoder_sbr_start_freq_16[16] = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; const UCHAR FDK_sbrDecoder_sbr_start_freq_22[16] = {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 26, 28, 30}; const UCHAR FDK_sbrDecoder_sbr_start_freq_24[16] = {11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 29, 32}; const UCHAR FDK_sbrDecoder_sbr_start_freq_32[16] = {10, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 27, 29, 32}; const UCHAR FDK_sbrDecoder_sbr_start_freq_40[16] = {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 26, 28, 30, 32}; const UCHAR FDK_sbrDecoder_sbr_start_freq_44[16] = { 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 28, 32}; const UCHAR FDK_sbrDecoder_sbr_start_freq_48[16] = { 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 31}; const UCHAR FDK_sbrDecoder_sbr_start_freq_64[16] = { 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 26, 30}; const UCHAR FDK_sbrDecoder_sbr_start_freq_88[16] = { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 23, 27, 31}; //@} /*! \name Whitening \brief Coefficients for spectral whitening in the transposer */ //@{ /*! Assignment of whitening tuning depending on the crossover frequency */ const USHORT FDK_sbrDecoder_sbr_whFactorsIndex[NUM_WHFACTOR_TABLE_ENTRIES] = { 0, 5000, 6000, 6500, 7000, 7500, 8000, 9000, 10000 }; /*! \brief Whithening levels tuning table With the current tuning, there are some redundant entries: \li NUM_WHFACTOR_TABLE_ENTRIES can be reduced by 3, \li the first coloumn can be eliminated. */ const FIXP_DBL FDK_sbrDecoder_sbr_whFactorsTable[NUM_WHFACTOR_TABLE_ENTRIES][6] = { /* OFF_LEVEL, TRANSITION_LEVEL, LOW_LEVEL, MID_LEVEL, HIGH_LEVEL */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* < 5000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 5000 < 6000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 6000 < 6500 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 6500 < 7000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 7000 < 7500 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 7500 < 8000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 8000 < 9000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* 9000 < 10000 */ { FL2FXCONST_DBL(0.00f), FL2FXCONST_DBL(0.6f), FL2FXCONST_DBL(0.75f), FL2FXCONST_DBL(0.90f), FL2FXCONST_DBL(0.98f)}, /* > 10000 */ }; //@} /*! \name EnvAdj \brief Constants and tables used for envelope adjustment */ //@{ /*! Mantissas of gain limits */ const FIXP_SGL FDK_sbrDecoder_sbr_limGains_m[4] = { FL2FXCONST_SGL(0.5011932025f), /*!< -3 dB. Gain limit when limiterGains in frameData is 0 */ FL2FXCONST_SGL(0.5f), /*!< 0 dB. Gain limit when limiterGains in frameData is 1 */ FL2FXCONST_SGL(0.9976346258f), /*!< +3 dB. Gain limit when limiterGains in frameData is 2 */ FL2FXCONST_SGL(0.6776263578f) /*!< Inf. Gain limit when limiterGains in frameData is 3 */ }; /*! Exponents of gain limits */ const UCHAR FDK_sbrDecoder_sbr_limGains_e[4] = { 0, 1, 1, 67 }; /*! Constants for calculating the number of limiter bands */ const FIXP_SGL FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4[4] = { FL2FXCONST_SGL(1.0f / 4.0f), FL2FXCONST_SGL(1.2f / 4.0f), FL2FXCONST_SGL(2.0f / 4.0f), FL2FXCONST_SGL(3.0f / 4.0f) }; /*! Ratio of old gains and noise levels for the first 4 timeslots of an envelope */ const FIXP_SGL FDK_sbrDecoder_sbr_smoothFilter[4] = { FL2FXCONST_SGL(0.66666666666666f), FL2FXCONST_SGL(0.36516383427084f), FL2FXCONST_SGL(0.14699433520835f), FL2FXCONST_SGL(0.03183050093751f) }; /*! Real and imaginary part of random noise which will be modulated to the desired level. An accuracy of 13 bits is sufficient for these random numbers. */ const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2] = { { FL2FXCONST_SGL(-0.99948153278296f / 8.0), FL2FXCONST_SGL(-0.59483417516607f / 8.0) }, { FL2FXCONST_SGL( 0.97113454393991f / 8.0), FL2FXCONST_SGL(-0.67528515225647f / 8.0) }, { FL2FXCONST_SGL( 0.14130051758487f / 8.0), FL2FXCONST_SGL(-0.95090983575689f / 8.0) }, { FL2FXCONST_SGL(-0.47005496701697f / 8.0), FL2FXCONST_SGL(-0.37340549728647f / 8.0) }, { FL2FXCONST_SGL( 0.80705063769351f / 8.0), FL2FXCONST_SGL( 0.29653668284408f / 8.0) }, { FL2FXCONST_SGL(-0.38981478896926f / 8.0), FL2FXCONST_SGL( 0.89572605717087f / 8.0) }, { FL2FXCONST_SGL(-0.01053049862020f / 8.0), FL2FXCONST_SGL(-0.66959058036166f / 8.0) }, { FL2FXCONST_SGL(-0.91266367957293f / 8.0), FL2FXCONST_SGL(-0.11522938140034f / 8.0) }, { FL2FXCONST_SGL( 0.54840422910309f / 8.0), FL2FXCONST_SGL( 0.75221367176302f / 8.0) }, { FL2FXCONST_SGL( 0.40009252867955f / 8.0), FL2FXCONST_SGL(-0.98929400334421f / 8.0) }, { FL2FXCONST_SGL(-0.99867974711855f / 8.0), FL2FXCONST_SGL(-0.88147068645358f / 8.0) }, { FL2FXCONST_SGL(-0.95531076805040f / 8.0), FL2FXCONST_SGL( 0.90908757154593f / 8.0) }, { FL2FXCONST_SGL(-0.45725933317144f / 8.0), FL2FXCONST_SGL(-0.56716323646760f / 8.0) }, { FL2FXCONST_SGL(-0.72929675029275f / 8.0), FL2FXCONST_SGL(-0.98008272727324f / 8.0) }, { FL2FXCONST_SGL( 0.75622801399036f / 8.0), FL2FXCONST_SGL( 0.20950329995549f / 8.0) }, { FL2FXCONST_SGL( 0.07069442601050f / 8.0), FL2FXCONST_SGL(-0.78247898470706f / 8.0) }, { FL2FXCONST_SGL( 0.74496252926055f / 8.0), FL2FXCONST_SGL(-0.91169004445807f / 8.0) }, { FL2FXCONST_SGL(-0.96440182703856f / 8.0), FL2FXCONST_SGL(-0.94739918296622f / 8.0) }, { FL2FXCONST_SGL( 0.30424629369539f / 8.0), FL2FXCONST_SGL(-0.49438267012479f / 8.0) }, { FL2FXCONST_SGL( 0.66565033746925f / 8.0), FL2FXCONST_SGL( 0.64652935542491f / 8.0) }, { FL2FXCONST_SGL( 0.91697008020594f / 8.0), FL2FXCONST_SGL( 0.17514097332009f / 8.0) }, { FL2FXCONST_SGL(-0.70774918760427f / 8.0), FL2FXCONST_SGL( 0.52548653416543f / 8.0) }, { FL2FXCONST_SGL(-0.70051415345560f / 8.0), FL2FXCONST_SGL(-0.45340028808763f / 8.0) }, { FL2FXCONST_SGL(-0.99496513054797f / 8.0), FL2FXCONST_SGL(-0.90071908066973f / 8.0) }, { FL2FXCONST_SGL( 0.98164490790123f / 8.0), FL2FXCONST_SGL(-0.77463155528697f / 8.0) }, { FL2FXCONST_SGL(-0.54671580548181f / 8.0), FL2FXCONST_SGL(-0.02570928536004f / 8.0) }, { FL2FXCONST_SGL(-0.01689629065389f / 8.0), FL2FXCONST_SGL( 0.00287506445732f / 8.0) }, { FL2FXCONST_SGL(-0.86110349531986f / 8.0), FL2FXCONST_SGL( 0.42548583726477f / 8.0) }, { FL2FXCONST_SGL(-0.98892980586032f / 8.0), FL2FXCONST_SGL(-0.87881132267556f / 8.0) }, { FL2FXCONST_SGL( 0.51756627678691f / 8.0), FL2FXCONST_SGL( 0.66926784710139f / 8.0) }, { FL2FXCONST_SGL(-0.99635026409640f / 8.0), FL2FXCONST_SGL(-0.58107730574765f / 8.0) }, { FL2FXCONST_SGL(-0.99969370862163f / 8.0), FL2FXCONST_SGL( 0.98369989360250f / 8.0) }, { FL2FXCONST_SGL( 0.55266258627194f / 8.0), FL2FXCONST_SGL( 0.59449057465591f / 8.0) }, { FL2FXCONST_SGL( 0.34581177741673f / 8.0), FL2FXCONST_SGL( 0.94879421061866f / 8.0) }, { FL2FXCONST_SGL( 0.62664209577999f / 8.0), FL2FXCONST_SGL(-0.74402970906471f / 8.0) }, { FL2FXCONST_SGL(-0.77149701404973f / 8.0), FL2FXCONST_SGL(-0.33883658042801f / 8.0) }, { FL2FXCONST_SGL(-0.91592244254432f / 8.0), FL2FXCONST_SGL( 0.03687901376713f / 8.0) }, { FL2FXCONST_SGL(-0.76285492357887f / 8.0), FL2FXCONST_SGL(-0.91371867919124f / 8.0) }, { FL2FXCONST_SGL( 0.79788337195331f / 8.0), FL2FXCONST_SGL(-0.93180971199849f / 8.0) }, { FL2FXCONST_SGL( 0.54473080610200f / 8.0), FL2FXCONST_SGL(-0.11919206037186f / 8.0) }, { FL2FXCONST_SGL(-0.85639281671058f / 8.0), FL2FXCONST_SGL( 0.42429854760451f / 8.0) }, { FL2FXCONST_SGL(-0.92882402971423f / 8.0), FL2FXCONST_SGL( 0.27871809078609f / 8.0) }, { FL2FXCONST_SGL(-0.11708371046774f / 8.0), FL2FXCONST_SGL(-0.99800843444966f / 8.0) }, { FL2FXCONST_SGL( 0.21356749817493f / 8.0), FL2FXCONST_SGL(-0.90716295627033f / 8.0) }, { FL2FXCONST_SGL(-0.76191692573909f / 8.0), FL2FXCONST_SGL( 0.99768118356265f / 8.0) }, { FL2FXCONST_SGL( 0.98111043100884f / 8.0), FL2FXCONST_SGL(-0.95854459734407f / 8.0) }, { FL2FXCONST_SGL(-0.85913269895572f / 8.0), FL2FXCONST_SGL( 0.95766566168880f / 8.0) }, { FL2FXCONST_SGL(-0.93307242253692f / 8.0), FL2FXCONST_SGL( 0.49431757696466f / 8.0) }, { FL2FXCONST_SGL( 0.30485754879632f / 8.0), FL2FXCONST_SGL(-0.70540034357529f / 8.0) }, { FL2FXCONST_SGL( 0.85289650925190f / 8.0), FL2FXCONST_SGL( 0.46766131791044f / 8.0) }, { FL2FXCONST_SGL( 0.91328082618125f / 8.0), FL2FXCONST_SGL(-0.99839597361769f / 8.0) }, { FL2FXCONST_SGL(-0.05890199924154f / 8.0), FL2FXCONST_SGL( 0.70741827819497f / 8.0) }, { FL2FXCONST_SGL( 0.28398686150148f / 8.0), FL2FXCONST_SGL( 0.34633555702188f / 8.0) }, { FL2FXCONST_SGL( 0.95258164539612f / 8.0), FL2FXCONST_SGL(-0.54893416026939f / 8.0) }, { FL2FXCONST_SGL(-0.78566324168507f / 8.0), FL2FXCONST_SGL(-0.75568541079691f / 8.0) }, { FL2FXCONST_SGL(-0.95789495447877f / 8.0), FL2FXCONST_SGL(-0.20423194696966f / 8.0) }, { FL2FXCONST_SGL( 0.82411158711197f / 8.0), FL2FXCONST_SGL( 0.96654618432562f / 8.0) }, { FL2FXCONST_SGL(-0.65185446735885f / 8.0), FL2FXCONST_SGL(-0.88734990773289f / 8.0) }, { FL2FXCONST_SGL(-0.93643603134666f / 8.0), FL2FXCONST_SGL( 0.99870790442385f / 8.0) }, { FL2FXCONST_SGL( 0.91427159529618f / 8.0), FL2FXCONST_SGL(-0.98290505544444f / 8.0) }, { FL2FXCONST_SGL(-0.70395684036886f / 8.0), FL2FXCONST_SGL( 0.58796798221039f / 8.0) }, { FL2FXCONST_SGL( 0.00563771969365f / 8.0), FL2FXCONST_SGL( 0.61768196727244f / 8.0) }, { FL2FXCONST_SGL( 0.89065051931895f / 8.0), FL2FXCONST_SGL( 0.52783352697585f / 8.0) }, { FL2FXCONST_SGL(-0.68683707712762f / 8.0), FL2FXCONST_SGL( 0.80806944710339f / 8.0) }, { FL2FXCONST_SGL( 0.72165342518718f / 8.0), FL2FXCONST_SGL(-0.69259857349564f / 8.0) }, { FL2FXCONST_SGL(-0.62928247730667f / 8.0), FL2FXCONST_SGL( 0.13627037407335f / 8.0) }, { FL2FXCONST_SGL( 0.29938434065514f / 8.0), FL2FXCONST_SGL(-0.46051329682246f / 8.0) }, { FL2FXCONST_SGL(-0.91781958879280f / 8.0), FL2FXCONST_SGL(-0.74012716684186f / 8.0) }, { FL2FXCONST_SGL( 0.99298717043688f / 8.0), FL2FXCONST_SGL( 0.40816610075661f / 8.0) }, { FL2FXCONST_SGL( 0.82368298622748f / 8.0), FL2FXCONST_SGL(-0.74036047190173f / 8.0) }, { FL2FXCONST_SGL(-0.98512833386833f / 8.0), FL2FXCONST_SGL(-0.99972330709594f / 8.0) }, { FL2FXCONST_SGL(-0.95915368242257f / 8.0), FL2FXCONST_SGL(-0.99237800466040f / 8.0) }, { FL2FXCONST_SGL(-0.21411126572790f / 8.0), FL2FXCONST_SGL(-0.93424819052545f / 8.0) }, { FL2FXCONST_SGL(-0.68821476106884f / 8.0), FL2FXCONST_SGL(-0.26892306315457f / 8.0) }, { FL2FXCONST_SGL( 0.91851997982317f / 8.0), FL2FXCONST_SGL( 0.09358228901785f / 8.0) }, { FL2FXCONST_SGL(-0.96062769559127f / 8.0), FL2FXCONST_SGL( 0.36099095133739f / 8.0) }, { FL2FXCONST_SGL( 0.51646184922287f / 8.0), FL2FXCONST_SGL(-0.71373332873917f / 8.0) }, { FL2FXCONST_SGL( 0.61130721139669f / 8.0), FL2FXCONST_SGL( 0.46950141175917f / 8.0) }, { FL2FXCONST_SGL( 0.47336129371299f / 8.0), FL2FXCONST_SGL(-0.27333178296162f / 8.0) }, { FL2FXCONST_SGL( 0.90998308703519f / 8.0), FL2FXCONST_SGL( 0.96715662938132f / 8.0) }, { FL2FXCONST_SGL( 0.44844799194357f / 8.0), FL2FXCONST_SGL( 0.99211574628306f / 8.0) }, { FL2FXCONST_SGL( 0.66614891079092f / 8.0), FL2FXCONST_SGL( 0.96590176169121f / 8.0) }, { FL2FXCONST_SGL( 0.74922239129237f / 8.0), FL2FXCONST_SGL(-0.89879858826087f / 8.0) }, { FL2FXCONST_SGL(-0.99571588506485f / 8.0), FL2FXCONST_SGL( 0.52785521494349f / 8.0) }, { FL2FXCONST_SGL( 0.97401082477563f / 8.0), FL2FXCONST_SGL(-0.16855870075190f / 8.0) }, { FL2FXCONST_SGL( 0.72683747733879f / 8.0), FL2FXCONST_SGL(-0.48060774432251f / 8.0) }, { FL2FXCONST_SGL( 0.95432193457128f / 8.0), FL2FXCONST_SGL( 0.68849603408441f / 8.0) }, { FL2FXCONST_SGL(-0.72962208425191f / 8.0), FL2FXCONST_SGL(-0.76608443420917f / 8.0) }, { FL2FXCONST_SGL(-0.85359479233537f / 8.0), FL2FXCONST_SGL( 0.88738125901579f / 8.0) }, { FL2FXCONST_SGL(-0.81412430338535f / 8.0), FL2FXCONST_SGL(-0.97480768049637f / 8.0) }, { FL2FXCONST_SGL(-0.87930772356786f / 8.0), FL2FXCONST_SGL( 0.74748307690436f / 8.0) }, { FL2FXCONST_SGL(-0.71573331064977f / 8.0), FL2FXCONST_SGL(-0.98570608178923f / 8.0) }, { FL2FXCONST_SGL( 0.83524300028228f / 8.0), FL2FXCONST_SGL( 0.83702537075163f / 8.0) }, { FL2FXCONST_SGL(-0.48086065601423f / 8.0), FL2FXCONST_SGL(-0.98848504923531f / 8.0) }, { FL2FXCONST_SGL( 0.97139128574778f / 8.0), FL2FXCONST_SGL( 0.80093621198236f / 8.0) }, { FL2FXCONST_SGL( 0.51992825347895f / 8.0), FL2FXCONST_SGL( 0.80247631400510f / 8.0) }, { FL2FXCONST_SGL(-0.00848591195325f / 8.0), FL2FXCONST_SGL(-0.76670128000486f / 8.0) }, { FL2FXCONST_SGL(-0.70294374303036f / 8.0), FL2FXCONST_SGL( 0.55359910445577f / 8.0) }, { FL2FXCONST_SGL(-0.95894428168140f / 8.0), FL2FXCONST_SGL(-0.43265504344783f / 8.0) }, { FL2FXCONST_SGL( 0.97079252950321f / 8.0), FL2FXCONST_SGL( 0.09325857238682f / 8.0) }, { FL2FXCONST_SGL(-0.92404293670797f / 8.0), FL2FXCONST_SGL( 0.85507704027855f / 8.0) }, { FL2FXCONST_SGL(-0.69506469500450f / 8.0), FL2FXCONST_SGL( 0.98633412625459f / 8.0) }, { FL2FXCONST_SGL( 0.26559203620024f / 8.0), FL2FXCONST_SGL( 0.73314307966524f / 8.0) }, { FL2FXCONST_SGL( 0.28038443336943f / 8.0), FL2FXCONST_SGL( 0.14537913654427f / 8.0) }, { FL2FXCONST_SGL(-0.74138124825523f / 8.0), FL2FXCONST_SGL( 0.99310339807762f / 8.0) }, { FL2FXCONST_SGL(-0.01752795995444f / 8.0), FL2FXCONST_SGL(-0.82616635284178f / 8.0) }, { FL2FXCONST_SGL(-0.55126773094930f / 8.0), FL2FXCONST_SGL(-0.98898543862153f / 8.0) }, { FL2FXCONST_SGL( 0.97960898850996f / 8.0), FL2FXCONST_SGL(-0.94021446752851f / 8.0) }, { FL2FXCONST_SGL(-0.99196309146936f / 8.0), FL2FXCONST_SGL( 0.67019017358456f / 8.0) }, { FL2FXCONST_SGL(-0.67684928085260f / 8.0), FL2FXCONST_SGL( 0.12631491649378f / 8.0) }, { FL2FXCONST_SGL( 0.09140039465500f / 8.0), FL2FXCONST_SGL(-0.20537731453108f / 8.0) }, { FL2FXCONST_SGL(-0.71658965751996f / 8.0), FL2FXCONST_SGL(-0.97788200391224f / 8.0) }, { FL2FXCONST_SGL( 0.81014640078925f / 8.0), FL2FXCONST_SGL( 0.53722648362443f / 8.0) }, { FL2FXCONST_SGL( 0.40616991671205f / 8.0), FL2FXCONST_SGL(-0.26469008598449f / 8.0) }, { FL2FXCONST_SGL(-0.67680188682972f / 8.0), FL2FXCONST_SGL( 0.94502052337695f / 8.0) }, { FL2FXCONST_SGL( 0.86849774348749f / 8.0), FL2FXCONST_SGL(-0.18333598647899f / 8.0) }, { FL2FXCONST_SGL(-0.99500381284851f / 8.0), FL2FXCONST_SGL(-0.02634122068550f / 8.0) }, { FL2FXCONST_SGL( 0.84329189340667f / 8.0), FL2FXCONST_SGL( 0.10406957462213f / 8.0) }, { FL2FXCONST_SGL(-0.09215968531446f / 8.0), FL2FXCONST_SGL( 0.69540012101253f / 8.0) }, { FL2FXCONST_SGL( 0.99956173327206f / 8.0), FL2FXCONST_SGL(-0.12358542001404f / 8.0) }, { FL2FXCONST_SGL(-0.79732779473535f / 8.0), FL2FXCONST_SGL(-0.91582524736159f / 8.0) }, { FL2FXCONST_SGL( 0.96349973642406f / 8.0), FL2FXCONST_SGL( 0.96640458041000f / 8.0) }, { FL2FXCONST_SGL(-0.79942778496547f / 8.0), FL2FXCONST_SGL( 0.64323902822857f / 8.0) }, { FL2FXCONST_SGL(-0.11566039853896f / 8.0), FL2FXCONST_SGL( 0.28587846253726f / 8.0) }, { FL2FXCONST_SGL(-0.39922954514662f / 8.0), FL2FXCONST_SGL( 0.94129601616966f / 8.0) }, { FL2FXCONST_SGL( 0.99089197565987f / 8.0), FL2FXCONST_SGL(-0.92062625581587f / 8.0) }, { FL2FXCONST_SGL( 0.28631285179909f / 8.0), FL2FXCONST_SGL(-0.91035047143603f / 8.0) }, { FL2FXCONST_SGL(-0.83302725605608f / 8.0), FL2FXCONST_SGL(-0.67330410892084f / 8.0) }, { FL2FXCONST_SGL( 0.95404443402072f / 8.0), FL2FXCONST_SGL( 0.49162765398743f / 8.0) }, { FL2FXCONST_SGL(-0.06449863579434f / 8.0), FL2FXCONST_SGL( 0.03250560813135f / 8.0) }, { FL2FXCONST_SGL(-0.99575054486311f / 8.0), FL2FXCONST_SGL( 0.42389784469507f / 8.0) }, { FL2FXCONST_SGL(-0.65501142790847f / 8.0), FL2FXCONST_SGL( 0.82546114655624f / 8.0) }, { FL2FXCONST_SGL(-0.81254441908887f / 8.0), FL2FXCONST_SGL(-0.51627234660629f / 8.0) }, { FL2FXCONST_SGL(-0.99646369485481f / 8.0), FL2FXCONST_SGL( 0.84490533520752f / 8.0) }, { FL2FXCONST_SGL( 0.00287840603348f / 8.0), FL2FXCONST_SGL( 0.64768261158166f / 8.0) }, { FL2FXCONST_SGL( 0.70176989408455f / 8.0), FL2FXCONST_SGL(-0.20453028573322f / 8.0) }, { FL2FXCONST_SGL( 0.96361882270190f / 8.0), FL2FXCONST_SGL( 0.40706967140989f / 8.0) }, { FL2FXCONST_SGL(-0.68883758192426f / 8.0), FL2FXCONST_SGL( 0.91338958840772f / 8.0) }, { FL2FXCONST_SGL(-0.34875585502238f / 8.0), FL2FXCONST_SGL( 0.71472290693300f / 8.0) }, { FL2FXCONST_SGL( 0.91980081243087f / 8.0), FL2FXCONST_SGL( 0.66507455644919f / 8.0) }, { FL2FXCONST_SGL(-0.99009048343881f / 8.0), FL2FXCONST_SGL( 0.85868021604848f / 8.0) }, { FL2FXCONST_SGL( 0.68865791458395f / 8.0), FL2FXCONST_SGL( 0.55660316809678f / 8.0) }, { FL2FXCONST_SGL(-0.99484402129368f / 8.0), FL2FXCONST_SGL(-0.20052559254934f / 8.0) }, { FL2FXCONST_SGL( 0.94214511408023f / 8.0), FL2FXCONST_SGL(-0.99696425367461f / 8.0) }, { FL2FXCONST_SGL(-0.67414626793544f / 8.0), FL2FXCONST_SGL( 0.49548221180078f / 8.0) }, { FL2FXCONST_SGL(-0.47339353684664f / 8.0), FL2FXCONST_SGL(-0.85904328834047f / 8.0) }, { FL2FXCONST_SGL( 0.14323651387360f / 8.0), FL2FXCONST_SGL(-0.94145598222488f / 8.0) }, { FL2FXCONST_SGL(-0.29268293575672f / 8.0), FL2FXCONST_SGL( 0.05759224927952f / 8.0) }, { FL2FXCONST_SGL( 0.43793861458754f / 8.0), FL2FXCONST_SGL(-0.78904969892724f / 8.0) }, { FL2FXCONST_SGL(-0.36345126374441f / 8.0), FL2FXCONST_SGL( 0.64874435357162f / 8.0) }, { FL2FXCONST_SGL(-0.08750604656825f / 8.0), FL2FXCONST_SGL( 0.97686944362527f / 8.0) }, { FL2FXCONST_SGL(-0.96495267812511f / 8.0), FL2FXCONST_SGL(-0.53960305946511f / 8.0) }, { FL2FXCONST_SGL( 0.55526940659947f / 8.0), FL2FXCONST_SGL( 0.78891523734774f / 8.0) }, { FL2FXCONST_SGL( 0.73538215752630f / 8.0), FL2FXCONST_SGL( 0.96452072373404f / 8.0) }, { FL2FXCONST_SGL(-0.30889773919437f / 8.0), FL2FXCONST_SGL(-0.80664389776860f / 8.0) }, { FL2FXCONST_SGL( 0.03574995626194f / 8.0), FL2FXCONST_SGL(-0.97325616900959f / 8.0) }, { FL2FXCONST_SGL( 0.98720684660488f / 8.0), FL2FXCONST_SGL( 0.48409133691962f / 8.0) }, { FL2FXCONST_SGL(-0.81689296271203f / 8.0), FL2FXCONST_SGL(-0.90827703628298f / 8.0) }, { FL2FXCONST_SGL( 0.67866860118215f / 8.0), FL2FXCONST_SGL( 0.81284503870856f / 8.0) }, { FL2FXCONST_SGL(-0.15808569732583f / 8.0), FL2FXCONST_SGL( 0.85279555024382f / 8.0) }, { FL2FXCONST_SGL( 0.80723395114371f / 8.0), FL2FXCONST_SGL(-0.24717418514605f / 8.0) }, { FL2FXCONST_SGL( 0.47788757329038f / 8.0), FL2FXCONST_SGL(-0.46333147839295f / 8.0) }, { FL2FXCONST_SGL( 0.96367554763201f / 8.0), FL2FXCONST_SGL( 0.38486749303242f / 8.0) }, { FL2FXCONST_SGL(-0.99143875716818f / 8.0), FL2FXCONST_SGL(-0.24945277239809f / 8.0) }, { FL2FXCONST_SGL( 0.83081876925833f / 8.0), FL2FXCONST_SGL(-0.94780851414763f / 8.0) }, { FL2FXCONST_SGL(-0.58753191905341f / 8.0), FL2FXCONST_SGL( 0.01290772389163f / 8.0) }, { FL2FXCONST_SGL( 0.95538108220960f / 8.0), FL2FXCONST_SGL(-0.85557052096538f / 8.0) }, { FL2FXCONST_SGL(-0.96490920476211f / 8.0), FL2FXCONST_SGL(-0.64020970923102f / 8.0) }, { FL2FXCONST_SGL(-0.97327101028521f / 8.0), FL2FXCONST_SGL( 0.12378128133110f / 8.0) }, { FL2FXCONST_SGL( 0.91400366022124f / 8.0), FL2FXCONST_SGL( 0.57972471346930f / 8.0) }, { FL2FXCONST_SGL(-0.99925837363824f / 8.0), FL2FXCONST_SGL( 0.71084847864067f / 8.0) }, { FL2FXCONST_SGL(-0.86875903507313f / 8.0), FL2FXCONST_SGL(-0.20291699203564f / 8.0) }, { FL2FXCONST_SGL(-0.26240034795124f / 8.0), FL2FXCONST_SGL(-0.68264554369108f / 8.0) }, { FL2FXCONST_SGL(-0.24664412953388f / 8.0), FL2FXCONST_SGL(-0.87642273115183f / 8.0) }, { FL2FXCONST_SGL( 0.02416275806869f / 8.0), FL2FXCONST_SGL( 0.27192914288905f / 8.0) }, { FL2FXCONST_SGL( 0.82068619590515f / 8.0), FL2FXCONST_SGL(-0.85087787994476f / 8.0) }, { FL2FXCONST_SGL( 0.88547373760759f / 8.0), FL2FXCONST_SGL(-0.89636802901469f / 8.0) }, { FL2FXCONST_SGL(-0.18173078152226f / 8.0), FL2FXCONST_SGL(-0.26152145156800f / 8.0) }, { FL2FXCONST_SGL( 0.09355476558534f / 8.0), FL2FXCONST_SGL( 0.54845123045604f / 8.0) }, { FL2FXCONST_SGL(-0.54668414224090f / 8.0), FL2FXCONST_SGL( 0.95980774020221f / 8.0) }, { FL2FXCONST_SGL( 0.37050990604091f / 8.0), FL2FXCONST_SGL(-0.59910140383171f / 8.0) }, { FL2FXCONST_SGL(-0.70373594262891f / 8.0), FL2FXCONST_SGL( 0.91227665827081f / 8.0) }, { FL2FXCONST_SGL(-0.34600785879594f / 8.0), FL2FXCONST_SGL(-0.99441426144200f / 8.0) }, { FL2FXCONST_SGL(-0.68774481731008f / 8.0), FL2FXCONST_SGL(-0.30238837956299f / 8.0) }, { FL2FXCONST_SGL(-0.26843291251234f / 8.0), FL2FXCONST_SGL( 0.83115668004362f / 8.0) }, { FL2FXCONST_SGL( 0.49072334613242f / 8.0), FL2FXCONST_SGL(-0.45359708737775f / 8.0) }, { FL2FXCONST_SGL( 0.38975993093975f / 8.0), FL2FXCONST_SGL( 0.95515358099121f / 8.0) }, { FL2FXCONST_SGL(-0.97757125224150f / 8.0), FL2FXCONST_SGL( 0.05305894580606f / 8.0) }, { FL2FXCONST_SGL(-0.17325552859616f / 8.0), FL2FXCONST_SGL(-0.92770672250494f / 8.0) }, { FL2FXCONST_SGL( 0.99948035025744f / 8.0), FL2FXCONST_SGL( 0.58285545563426f / 8.0) }, { FL2FXCONST_SGL(-0.64946246527458f / 8.0), FL2FXCONST_SGL( 0.68645507104960f / 8.0) }, { FL2FXCONST_SGL(-0.12016920576437f / 8.0), FL2FXCONST_SGL(-0.57147322153312f / 8.0) }, { FL2FXCONST_SGL(-0.58947456517751f / 8.0), FL2FXCONST_SGL(-0.34847132454388f / 8.0) }, { FL2FXCONST_SGL(-0.41815140454465f / 8.0), FL2FXCONST_SGL( 0.16276422358861f / 8.0) }, { FL2FXCONST_SGL( 0.99885650204884f / 8.0), FL2FXCONST_SGL( 0.11136095490444f / 8.0) }, { FL2FXCONST_SGL(-0.56649614128386f / 8.0), FL2FXCONST_SGL(-0.90494866361587f / 8.0) }, { FL2FXCONST_SGL( 0.94138021032330f / 8.0), FL2FXCONST_SGL( 0.35281916733018f / 8.0) }, { FL2FXCONST_SGL(-0.75725076534641f / 8.0), FL2FXCONST_SGL( 0.53650549640587f / 8.0) }, { FL2FXCONST_SGL( 0.20541973692630f / 8.0), FL2FXCONST_SGL(-0.94435144369918f / 8.0) }, { FL2FXCONST_SGL( 0.99980371023351f / 8.0), FL2FXCONST_SGL( 0.79835913565599f / 8.0) }, { FL2FXCONST_SGL( 0.29078277605775f / 8.0), FL2FXCONST_SGL( 0.35393777921520f / 8.0) }, { FL2FXCONST_SGL(-0.62858772103030f / 8.0), FL2FXCONST_SGL( 0.38765693387102f / 8.0) }, { FL2FXCONST_SGL( 0.43440904467688f / 8.0), FL2FXCONST_SGL(-0.98546330463232f / 8.0) }, { FL2FXCONST_SGL(-0.98298583762390f / 8.0), FL2FXCONST_SGL( 0.21021524625209f / 8.0) }, { FL2FXCONST_SGL( 0.19513029146934f / 8.0), FL2FXCONST_SGL(-0.94239832251867f / 8.0) }, { FL2FXCONST_SGL(-0.95476662400101f / 8.0), FL2FXCONST_SGL( 0.98364554179143f / 8.0) }, { FL2FXCONST_SGL( 0.93379635304810f / 8.0), FL2FXCONST_SGL(-0.70881994583682f / 8.0) }, { FL2FXCONST_SGL(-0.85235410573336f / 8.0), FL2FXCONST_SGL(-0.08342347966410f / 8.0) }, { FL2FXCONST_SGL(-0.86425093011245f / 8.0), FL2FXCONST_SGL(-0.45795025029466f / 8.0) }, { FL2FXCONST_SGL( 0.38879779059045f / 8.0), FL2FXCONST_SGL( 0.97274429344593f / 8.0) }, { FL2FXCONST_SGL( 0.92045124735495f / 8.0), FL2FXCONST_SGL(-0.62433652524220f / 8.0) }, { FL2FXCONST_SGL( 0.89162532251878f / 8.0), FL2FXCONST_SGL( 0.54950955570563f / 8.0) }, { FL2FXCONST_SGL(-0.36834336949252f / 8.0), FL2FXCONST_SGL( 0.96458298020975f / 8.0) }, { FL2FXCONST_SGL( 0.93891760988045f / 8.0), FL2FXCONST_SGL(-0.89968353740388f / 8.0) }, { FL2FXCONST_SGL( 0.99267657565094f / 8.0), FL2FXCONST_SGL(-0.03757034316958f / 8.0) }, { FL2FXCONST_SGL(-0.94063471614176f / 8.0), FL2FXCONST_SGL( 0.41332338538963f / 8.0) }, { FL2FXCONST_SGL( 0.99740224117019f / 8.0), FL2FXCONST_SGL(-0.16830494996370f / 8.0) }, { FL2FXCONST_SGL(-0.35899413170555f / 8.0), FL2FXCONST_SGL(-0.46633226649613f / 8.0) }, { FL2FXCONST_SGL( 0.05237237274947f / 8.0), FL2FXCONST_SGL(-0.25640361602661f / 8.0) }, { FL2FXCONST_SGL( 0.36703583957424f / 8.0), FL2FXCONST_SGL(-0.38653265641875f / 8.0) }, { FL2FXCONST_SGL( 0.91653180367913f / 8.0), FL2FXCONST_SGL(-0.30587628726597f / 8.0) }, { FL2FXCONST_SGL( 0.69000803499316f / 8.0), FL2FXCONST_SGL( 0.90952171386132f / 8.0) }, { FL2FXCONST_SGL(-0.38658751133527f / 8.0), FL2FXCONST_SGL( 0.99501571208985f / 8.0) }, { FL2FXCONST_SGL(-0.29250814029851f / 8.0), FL2FXCONST_SGL( 0.37444994344615f / 8.0) }, { FL2FXCONST_SGL(-0.60182204677608f / 8.0), FL2FXCONST_SGL( 0.86779651036123f / 8.0) }, { FL2FXCONST_SGL(-0.97418588163217f / 8.0), FL2FXCONST_SGL( 0.96468523666475f / 8.0) }, { FL2FXCONST_SGL( 0.88461574003963f / 8.0), FL2FXCONST_SGL( 0.57508405276414f / 8.0) }, { FL2FXCONST_SGL( 0.05198933055162f / 8.0), FL2FXCONST_SGL( 0.21269661669964f / 8.0) }, { FL2FXCONST_SGL(-0.53499621979720f / 8.0), FL2FXCONST_SGL( 0.97241553731237f / 8.0) }, { FL2FXCONST_SGL(-0.49429560226497f / 8.0), FL2FXCONST_SGL( 0.98183865291903f / 8.0) }, { FL2FXCONST_SGL(-0.98935142339139f / 8.0), FL2FXCONST_SGL(-0.40249159006933f / 8.0) }, { FL2FXCONST_SGL(-0.98081380091130f / 8.0), FL2FXCONST_SGL(-0.72856895534041f / 8.0) }, { FL2FXCONST_SGL(-0.27338148835532f / 8.0), FL2FXCONST_SGL( 0.99950922447209f / 8.0) }, { FL2FXCONST_SGL( 0.06310802338302f / 8.0), FL2FXCONST_SGL(-0.54539587529618f / 8.0) }, { FL2FXCONST_SGL(-0.20461677199539f / 8.0), FL2FXCONST_SGL(-0.14209977628489f / 8.0) }, { FL2FXCONST_SGL( 0.66223843141647f / 8.0), FL2FXCONST_SGL( 0.72528579940326f / 8.0) }, { FL2FXCONST_SGL(-0.84764345483665f / 8.0), FL2FXCONST_SGL( 0.02372316801261f / 8.0) }, { FL2FXCONST_SGL(-0.89039863483811f / 8.0), FL2FXCONST_SGL( 0.88866581484602f / 8.0) }, { FL2FXCONST_SGL( 0.95903308477986f / 8.0), FL2FXCONST_SGL( 0.76744927173873f / 8.0) }, { FL2FXCONST_SGL( 0.73504123909879f / 8.0), FL2FXCONST_SGL(-0.03747203173192f / 8.0) }, { FL2FXCONST_SGL(-0.31744434966056f / 8.0), FL2FXCONST_SGL(-0.36834111883652f / 8.0) }, { FL2FXCONST_SGL(-0.34110827591623f / 8.0), FL2FXCONST_SGL( 0.40211222807691f / 8.0) }, { FL2FXCONST_SGL( 0.47803883714199f / 8.0), FL2FXCONST_SGL(-0.39423219786288f / 8.0) }, { FL2FXCONST_SGL( 0.98299195879514f / 8.0), FL2FXCONST_SGL( 0.01989791390047f / 8.0) }, { FL2FXCONST_SGL(-0.30963073129751f / 8.0), FL2FXCONST_SGL(-0.18076720599336f / 8.0) }, { FL2FXCONST_SGL( 0.99992588229018f / 8.0), FL2FXCONST_SGL(-0.26281872094289f / 8.0) }, { FL2FXCONST_SGL(-0.93149731080767f / 8.0), FL2FXCONST_SGL(-0.98313162570490f / 8.0) }, { FL2FXCONST_SGL( 0.99923472302773f / 8.0), FL2FXCONST_SGL(-0.80142993767554f / 8.0) }, { FL2FXCONST_SGL(-0.26024169633417f / 8.0), FL2FXCONST_SGL(-0.75999759855752f / 8.0) }, { FL2FXCONST_SGL(-0.35712514743563f / 8.0), FL2FXCONST_SGL( 0.19298963768574f / 8.0) }, { FL2FXCONST_SGL(-0.99899084509530f / 8.0), FL2FXCONST_SGL( 0.74645156992493f / 8.0) }, { FL2FXCONST_SGL( 0.86557171579452f / 8.0), FL2FXCONST_SGL( 0.55593866696299f / 8.0) }, { FL2FXCONST_SGL( 0.33408042438752f / 8.0), FL2FXCONST_SGL( 0.86185953874709f / 8.0) }, { FL2FXCONST_SGL( 0.99010736374716f / 8.0), FL2FXCONST_SGL( 0.04602397576623f / 8.0) }, { FL2FXCONST_SGL(-0.66694269691195f / 8.0), FL2FXCONST_SGL(-0.91643611810148f / 8.0) }, { FL2FXCONST_SGL( 0.64016792079480f / 8.0), FL2FXCONST_SGL( 0.15649530836856f / 8.0) }, { FL2FXCONST_SGL( 0.99570534804836f / 8.0), FL2FXCONST_SGL( 0.45844586038111f / 8.0) }, { FL2FXCONST_SGL(-0.63431466947340f / 8.0), FL2FXCONST_SGL( 0.21079116459234f / 8.0) }, { FL2FXCONST_SGL(-0.07706847005931f / 8.0), FL2FXCONST_SGL(-0.89581437101329f / 8.0) }, { FL2FXCONST_SGL( 0.98590090577724f / 8.0), FL2FXCONST_SGL( 0.88241721133981f / 8.0) }, { FL2FXCONST_SGL( 0.80099335254678f / 8.0), FL2FXCONST_SGL(-0.36851896710853f / 8.0) }, { FL2FXCONST_SGL( 0.78368131392666f / 8.0), FL2FXCONST_SGL( 0.45506999802597f / 8.0) }, { FL2FXCONST_SGL( 0.08707806671691f / 8.0), FL2FXCONST_SGL( 0.80938994918745f / 8.0) }, { FL2FXCONST_SGL(-0.86811883080712f / 8.0), FL2FXCONST_SGL( 0.39347308654705f / 8.0) }, { FL2FXCONST_SGL(-0.39466529740375f / 8.0), FL2FXCONST_SGL(-0.66809432114456f / 8.0) }, { FL2FXCONST_SGL( 0.97875325649683f / 8.0), FL2FXCONST_SGL(-0.72467840967746f / 8.0) }, { FL2FXCONST_SGL(-0.95038560288864f / 8.0), FL2FXCONST_SGL( 0.89563219587625f / 8.0) }, { FL2FXCONST_SGL( 0.17005239424212f / 8.0), FL2FXCONST_SGL( 0.54683053962658f / 8.0) }, { FL2FXCONST_SGL(-0.76910792026848f / 8.0), FL2FXCONST_SGL(-0.96226617549298f / 8.0) }, { FL2FXCONST_SGL( 0.99743281016846f / 8.0), FL2FXCONST_SGL( 0.42697157037567f / 8.0) }, { FL2FXCONST_SGL( 0.95437383549973f / 8.0), FL2FXCONST_SGL( 0.97002324109952f / 8.0) }, { FL2FXCONST_SGL( 0.99578905365569f / 8.0), FL2FXCONST_SGL(-0.54106826257356f / 8.0) }, { FL2FXCONST_SGL( 0.28058259829990f / 8.0), FL2FXCONST_SGL(-0.85361420634036f / 8.0) }, { FL2FXCONST_SGL( 0.85256524470573f / 8.0), FL2FXCONST_SGL(-0.64567607735589f / 8.0) }, { FL2FXCONST_SGL(-0.50608540105128f / 8.0), FL2FXCONST_SGL(-0.65846015480300f / 8.0) }, { FL2FXCONST_SGL(-0.97210735183243f / 8.0), FL2FXCONST_SGL(-0.23095213067791f / 8.0) }, { FL2FXCONST_SGL( 0.95424048234441f / 8.0), FL2FXCONST_SGL(-0.99240147091219f / 8.0) }, { FL2FXCONST_SGL(-0.96926570524023f / 8.0), FL2FXCONST_SGL( 0.73775654896574f / 8.0) }, { FL2FXCONST_SGL( 0.30872163214726f / 8.0), FL2FXCONST_SGL( 0.41514960556126f / 8.0) }, { FL2FXCONST_SGL(-0.24523839572639f / 8.0), FL2FXCONST_SGL( 0.63206633394807f / 8.0) }, { FL2FXCONST_SGL(-0.33813265086024f / 8.0), FL2FXCONST_SGL(-0.38661779441897f / 8.0) }, { FL2FXCONST_SGL(-0.05826828420146f / 8.0), FL2FXCONST_SGL(-0.06940774188029f / 8.0) }, { FL2FXCONST_SGL(-0.22898461455054f / 8.0), FL2FXCONST_SGL( 0.97054853316316f / 8.0) }, { FL2FXCONST_SGL(-0.18509915019881f / 8.0), FL2FXCONST_SGL( 0.47565762892084f / 8.0) }, { FL2FXCONST_SGL(-0.10488238045009f / 8.0), FL2FXCONST_SGL(-0.87769947402394f / 8.0) }, { FL2FXCONST_SGL(-0.71886586182037f / 8.0), FL2FXCONST_SGL( 0.78030982480538f / 8.0) }, { FL2FXCONST_SGL( 0.99793873738654f / 8.0), FL2FXCONST_SGL( 0.90041310491497f / 8.0) }, { FL2FXCONST_SGL( 0.57563307626120f / 8.0), FL2FXCONST_SGL(-0.91034337352097f / 8.0) }, { FL2FXCONST_SGL( 0.28909646383717f / 8.0), FL2FXCONST_SGL( 0.96307783970534f / 8.0) }, { FL2FXCONST_SGL( 0.42188998312520f / 8.0), FL2FXCONST_SGL( 0.48148651230437f / 8.0) }, { FL2FXCONST_SGL( 0.93335049681047f / 8.0), FL2FXCONST_SGL(-0.43537023883588f / 8.0) }, { FL2FXCONST_SGL(-0.97087374418267f / 8.0), FL2FXCONST_SGL( 0.86636445711364f / 8.0) }, { FL2FXCONST_SGL( 0.36722871286923f / 8.0), FL2FXCONST_SGL( 0.65291654172961f / 8.0) }, { FL2FXCONST_SGL(-0.81093025665696f / 8.0), FL2FXCONST_SGL( 0.08778370229363f / 8.0) }, { FL2FXCONST_SGL(-0.26240603062237f / 8.0), FL2FXCONST_SGL(-0.92774095379098f / 8.0) }, { FL2FXCONST_SGL( 0.83996497984604f / 8.0), FL2FXCONST_SGL( 0.55839849139647f / 8.0) }, { FL2FXCONST_SGL(-0.99909615720225f / 8.0), FL2FXCONST_SGL(-0.96024605713970f / 8.0) }, { FL2FXCONST_SGL( 0.74649464155061f / 8.0), FL2FXCONST_SGL( 0.12144893606462f / 8.0) }, { FL2FXCONST_SGL(-0.74774595569805f / 8.0), FL2FXCONST_SGL(-0.26898062008959f / 8.0) }, { FL2FXCONST_SGL( 0.95781667469567f / 8.0), FL2FXCONST_SGL(-0.79047927052628f / 8.0) }, { FL2FXCONST_SGL( 0.95472308713099f / 8.0), FL2FXCONST_SGL(-0.08588776019550f / 8.0) }, { FL2FXCONST_SGL( 0.48708332746299f / 8.0), FL2FXCONST_SGL( 0.99999041579432f / 8.0) }, { FL2FXCONST_SGL( 0.46332038247497f / 8.0), FL2FXCONST_SGL( 0.10964126185063f / 8.0) }, { FL2FXCONST_SGL(-0.76497004940162f / 8.0), FL2FXCONST_SGL( 0.89210929242238f / 8.0) }, { FL2FXCONST_SGL( 0.57397389364339f / 8.0), FL2FXCONST_SGL( 0.35289703373760f / 8.0) }, { FL2FXCONST_SGL( 0.75374316974495f / 8.0), FL2FXCONST_SGL( 0.96705214651335f / 8.0) }, { FL2FXCONST_SGL(-0.59174397685714f / 8.0), FL2FXCONST_SGL(-0.89405370422752f / 8.0) }, { FL2FXCONST_SGL( 0.75087906691890f / 8.0), FL2FXCONST_SGL(-0.29612672982396f / 8.0) }, { FL2FXCONST_SGL(-0.98607857336230f / 8.0), FL2FXCONST_SGL( 0.25034911730023f / 8.0) }, { FL2FXCONST_SGL(-0.40761056640505f / 8.0), FL2FXCONST_SGL(-0.90045573444695f / 8.0) }, { FL2FXCONST_SGL( 0.66929266740477f / 8.0), FL2FXCONST_SGL( 0.98629493401748f / 8.0) }, { FL2FXCONST_SGL(-0.97463695257310f / 8.0), FL2FXCONST_SGL(-0.00190223301301f / 8.0) }, { FL2FXCONST_SGL( 0.90145509409859f / 8.0), FL2FXCONST_SGL( 0.99781390365446f / 8.0) }, { FL2FXCONST_SGL(-0.87259289048043f / 8.0), FL2FXCONST_SGL( 0.99233587353666f / 8.0) }, { FL2FXCONST_SGL(-0.91529461447692f / 8.0), FL2FXCONST_SGL(-0.15698707534206f / 8.0) }, { FL2FXCONST_SGL(-0.03305738840705f / 8.0), FL2FXCONST_SGL(-0.37205262859764f / 8.0) }, { FL2FXCONST_SGL( 0.07223051368337f / 8.0), FL2FXCONST_SGL(-0.88805001733626f / 8.0) }, { FL2FXCONST_SGL( 0.99498012188353f / 8.0), FL2FXCONST_SGL( 0.97094358113387f / 8.0) }, { FL2FXCONST_SGL(-0.74904939500519f / 8.0), FL2FXCONST_SGL( 0.99985483641521f / 8.0) }, { FL2FXCONST_SGL( 0.04585228574211f / 8.0), FL2FXCONST_SGL( 0.99812337444082f / 8.0) }, { FL2FXCONST_SGL(-0.89054954257993f / 8.0), FL2FXCONST_SGL(-0.31791913188064f / 8.0) }, { FL2FXCONST_SGL(-0.83782144651251f / 8.0), FL2FXCONST_SGL( 0.97637632547466f / 8.0) }, { FL2FXCONST_SGL( 0.33454804933804f / 8.0), FL2FXCONST_SGL(-0.86231516800408f / 8.0) }, { FL2FXCONST_SGL(-0.99707579362824f / 8.0), FL2FXCONST_SGL( 0.93237990079441f / 8.0) }, { FL2FXCONST_SGL(-0.22827527843994f / 8.0), FL2FXCONST_SGL( 0.18874759397997f / 8.0) }, { FL2FXCONST_SGL( 0.67248046289143f / 8.0), FL2FXCONST_SGL(-0.03646211390569f / 8.0) }, { FL2FXCONST_SGL(-0.05146538187944f / 8.0), FL2FXCONST_SGL(-0.92599700120679f / 8.0) }, { FL2FXCONST_SGL( 0.99947295749905f / 8.0), FL2FXCONST_SGL( 0.93625229707912f / 8.0) }, { FL2FXCONST_SGL( 0.66951124390363f / 8.0), FL2FXCONST_SGL( 0.98905825623893f / 8.0) }, { FL2FXCONST_SGL(-0.99602956559179f / 8.0), FL2FXCONST_SGL(-0.44654715757688f / 8.0) }, { FL2FXCONST_SGL( 0.82104905483590f / 8.0), FL2FXCONST_SGL( 0.99540741724928f / 8.0) }, { FL2FXCONST_SGL( 0.99186510988782f / 8.0), FL2FXCONST_SGL( 0.72023001312947f / 8.0) }, { FL2FXCONST_SGL(-0.65284592392918f / 8.0), FL2FXCONST_SGL( 0.52186723253637f / 8.0) }, { FL2FXCONST_SGL( 0.93885443798188f / 8.0), FL2FXCONST_SGL(-0.74895312615259f / 8.0) }, { FL2FXCONST_SGL( 0.96735248738388f / 8.0), FL2FXCONST_SGL( 0.90891816978629f / 8.0) }, { FL2FXCONST_SGL(-0.22225968841114f / 8.0), FL2FXCONST_SGL( 0.57124029781228f / 8.0) }, { FL2FXCONST_SGL(-0.44132783753414f / 8.0), FL2FXCONST_SGL(-0.92688840659280f / 8.0) }, { FL2FXCONST_SGL(-0.85694974219574f / 8.0), FL2FXCONST_SGL( 0.88844532719844f / 8.0) }, { FL2FXCONST_SGL( 0.91783042091762f / 8.0), FL2FXCONST_SGL(-0.46356892383970f / 8.0) }, { FL2FXCONST_SGL( 0.72556974415690f / 8.0), FL2FXCONST_SGL(-0.99899555770747f / 8.0) }, { FL2FXCONST_SGL(-0.99711581834508f / 8.0), FL2FXCONST_SGL( 0.58211560180426f / 8.0) }, { FL2FXCONST_SGL( 0.77638976371966f / 8.0), FL2FXCONST_SGL( 0.94321834873819f / 8.0) }, { FL2FXCONST_SGL( 0.07717324253925f / 8.0), FL2FXCONST_SGL( 0.58638399856595f / 8.0) }, { FL2FXCONST_SGL(-0.56049829194163f / 8.0), FL2FXCONST_SGL( 0.82522301569036f / 8.0) }, { FL2FXCONST_SGL( 0.98398893639988f / 8.0), FL2FXCONST_SGL( 0.39467440420569f / 8.0) }, { FL2FXCONST_SGL( 0.47546946844938f / 8.0), FL2FXCONST_SGL( 0.68613044836811f / 8.0) }, { FL2FXCONST_SGL( 0.65675089314631f / 8.0), FL2FXCONST_SGL( 0.18331637134880f / 8.0) }, { FL2FXCONST_SGL( 0.03273375457980f / 8.0), FL2FXCONST_SGL(-0.74933109564108f / 8.0) }, { FL2FXCONST_SGL(-0.38684144784738f / 8.0), FL2FXCONST_SGL( 0.51337349030406f / 8.0) }, { FL2FXCONST_SGL(-0.97346267944545f / 8.0), FL2FXCONST_SGL(-0.96549364384098f / 8.0) }, { FL2FXCONST_SGL(-0.53282156061942f / 8.0), FL2FXCONST_SGL(-0.91423265091354f / 8.0) }, { FL2FXCONST_SGL( 0.99817310731176f / 8.0), FL2FXCONST_SGL( 0.61133572482148f / 8.0) }, { FL2FXCONST_SGL(-0.50254500772635f / 8.0), FL2FXCONST_SGL(-0.88829338134294f / 8.0) }, { FL2FXCONST_SGL( 0.01995873238855f / 8.0), FL2FXCONST_SGL( 0.85223515096765f / 8.0) }, { FL2FXCONST_SGL( 0.99930381973804f / 8.0), FL2FXCONST_SGL( 0.94578896296649f / 8.0) }, { FL2FXCONST_SGL( 0.82907767600783f / 8.0), FL2FXCONST_SGL(-0.06323442598128f / 8.0) }, { FL2FXCONST_SGL(-0.58660709669728f / 8.0), FL2FXCONST_SGL( 0.96840773806582f / 8.0) }, { FL2FXCONST_SGL(-0.17573736667267f / 8.0), FL2FXCONST_SGL(-0.48166920859485f / 8.0) }, { FL2FXCONST_SGL( 0.83434292401346f / 8.0), FL2FXCONST_SGL(-0.13023450646997f / 8.0) }, { FL2FXCONST_SGL( 0.05946491307025f / 8.0), FL2FXCONST_SGL( 0.20511047074866f / 8.0) }, { FL2FXCONST_SGL( 0.81505484574602f / 8.0), FL2FXCONST_SGL(-0.94685947861369f / 8.0) }, { FL2FXCONST_SGL(-0.44976380954860f / 8.0), FL2FXCONST_SGL( 0.40894572671545f / 8.0) }, { FL2FXCONST_SGL(-0.89746474625671f / 8.0), FL2FXCONST_SGL( 0.99846578838537f / 8.0) }, { FL2FXCONST_SGL( 0.39677256130792f / 8.0), FL2FXCONST_SGL(-0.74854668609359f / 8.0) }, { FL2FXCONST_SGL(-0.07588948563079f / 8.0), FL2FXCONST_SGL( 0.74096214084170f / 8.0) }, { FL2FXCONST_SGL( 0.76343198951445f / 8.0), FL2FXCONST_SGL( 0.41746629422634f / 8.0) }, { FL2FXCONST_SGL(-0.74490104699626f / 8.0), FL2FXCONST_SGL( 0.94725911744610f / 8.0) }, { FL2FXCONST_SGL( 0.64880119792759f / 8.0), FL2FXCONST_SGL( 0.41336660830571f / 8.0) }, { FL2FXCONST_SGL( 0.62319537462542f / 8.0), FL2FXCONST_SGL(-0.93098313552599f / 8.0) }, { FL2FXCONST_SGL( 0.42215817594807f / 8.0), FL2FXCONST_SGL(-0.07712787385208f / 8.0) }, { FL2FXCONST_SGL( 0.02704554141885f / 8.0), FL2FXCONST_SGL(-0.05417518053666f / 8.0) }, { FL2FXCONST_SGL( 0.80001773566818f / 8.0), FL2FXCONST_SGL( 0.91542195141039f / 8.0) }, { FL2FXCONST_SGL(-0.79351832348816f / 8.0), FL2FXCONST_SGL(-0.36208897989136f / 8.0) }, { FL2FXCONST_SGL( 0.63872359151636f / 8.0), FL2FXCONST_SGL( 0.08128252493444f / 8.0) }, { FL2FXCONST_SGL( 0.52890520960295f / 8.0), FL2FXCONST_SGL( 0.60048872455592f / 8.0) }, { FL2FXCONST_SGL( 0.74238552914587f / 8.0), FL2FXCONST_SGL( 0.04491915291044f / 8.0) }, { FL2FXCONST_SGL( 0.99096131449250f / 8.0), FL2FXCONST_SGL(-0.19451182854402f / 8.0) }, { FL2FXCONST_SGL(-0.80412329643109f / 8.0), FL2FXCONST_SGL(-0.88513818199457f / 8.0) }, { FL2FXCONST_SGL(-0.64612616129736f / 8.0), FL2FXCONST_SGL( 0.72198674804544f / 8.0) }, { FL2FXCONST_SGL( 0.11657770663191f / 8.0), FL2FXCONST_SGL(-0.83662833815041f / 8.0) }, { FL2FXCONST_SGL(-0.95053182488101f / 8.0), FL2FXCONST_SGL(-0.96939905138082f / 8.0) }, { FL2FXCONST_SGL(-0.62228872928622f / 8.0), FL2FXCONST_SGL( 0.82767262846661f / 8.0) }, { FL2FXCONST_SGL( 0.03004475787316f / 8.0), FL2FXCONST_SGL(-0.99738896333384f / 8.0) }, { FL2FXCONST_SGL(-0.97987214341034f / 8.0), FL2FXCONST_SGL( 0.36526129686425f / 8.0) }, { FL2FXCONST_SGL(-0.99986980746200f / 8.0), FL2FXCONST_SGL(-0.36021610299715f / 8.0) }, { FL2FXCONST_SGL( 0.89110648599879f / 8.0), FL2FXCONST_SGL(-0.97894250343044f / 8.0) }, { FL2FXCONST_SGL( 0.10407960510582f / 8.0), FL2FXCONST_SGL( 0.77357793811619f / 8.0) }, { FL2FXCONST_SGL( 0.95964737821728f / 8.0), FL2FXCONST_SGL(-0.35435818285502f / 8.0) }, { FL2FXCONST_SGL( 0.50843233159162f / 8.0), FL2FXCONST_SGL( 0.96107691266205f / 8.0) }, { FL2FXCONST_SGL( 0.17006334670615f / 8.0), FL2FXCONST_SGL(-0.76854025314829f / 8.0) }, { FL2FXCONST_SGL( 0.25872675063360f / 8.0), FL2FXCONST_SGL( 0.99893303933816f / 8.0) }, { FL2FXCONST_SGL(-0.01115998681937f / 8.0), FL2FXCONST_SGL( 0.98496019742444f / 8.0) }, { FL2FXCONST_SGL(-0.79598702973261f / 8.0), FL2FXCONST_SGL( 0.97138411318894f / 8.0) }, { FL2FXCONST_SGL(-0.99264708948101f / 8.0), FL2FXCONST_SGL(-0.99542822402536f / 8.0) }, { FL2FXCONST_SGL(-0.99829663752818f / 8.0), FL2FXCONST_SGL( 0.01877138824311f / 8.0) }, { FL2FXCONST_SGL(-0.70801016548184f / 8.0), FL2FXCONST_SGL( 0.33680685948117f / 8.0) }, { FL2FXCONST_SGL(-0.70467057786826f / 8.0), FL2FXCONST_SGL( 0.93272777501857f / 8.0) }, { FL2FXCONST_SGL( 0.99846021905254f / 8.0), FL2FXCONST_SGL(-0.98725746254433f / 8.0) }, { FL2FXCONST_SGL(-0.63364968534650f / 8.0), FL2FXCONST_SGL(-0.16473594423746f / 8.0) }, { FL2FXCONST_SGL(-0.16258217500792f / 8.0), FL2FXCONST_SGL(-0.95939125400802f / 8.0) }, { FL2FXCONST_SGL(-0.43645594360633f / 8.0), FL2FXCONST_SGL(-0.94805030113284f / 8.0) }, { FL2FXCONST_SGL(-0.99848471702976f / 8.0), FL2FXCONST_SGL( 0.96245166923809f / 8.0) }, { FL2FXCONST_SGL(-0.16796458968998f / 8.0), FL2FXCONST_SGL(-0.98987511890470f / 8.0) }, { FL2FXCONST_SGL(-0.87979225745213f / 8.0), FL2FXCONST_SGL(-0.71725725041680f / 8.0) }, { FL2FXCONST_SGL( 0.44183099021786f / 8.0), FL2FXCONST_SGL(-0.93568974498761f / 8.0) }, { FL2FXCONST_SGL( 0.93310180125532f / 8.0), FL2FXCONST_SGL(-0.99913308068246f / 8.0) }, { FL2FXCONST_SGL(-0.93941931782002f / 8.0), FL2FXCONST_SGL(-0.56409379640356f / 8.0) }, { FL2FXCONST_SGL(-0.88590003188677f / 8.0), FL2FXCONST_SGL( 0.47624600491382f / 8.0) }, { FL2FXCONST_SGL( 0.99971463703691f / 8.0), FL2FXCONST_SGL(-0.83889954253462f / 8.0) }, { FL2FXCONST_SGL(-0.75376385639978f / 8.0), FL2FXCONST_SGL( 0.00814643438625f / 8.0) }, { FL2FXCONST_SGL( 0.93887685615875f / 8.0), FL2FXCONST_SGL(-0.11284528204636f / 8.0) }, { FL2FXCONST_SGL( 0.85126435782309f / 8.0), FL2FXCONST_SGL( 0.52349251543547f / 8.0) }, { FL2FXCONST_SGL( 0.39701421446381f / 8.0), FL2FXCONST_SGL( 0.81779634174316f / 8.0) }, { FL2FXCONST_SGL(-0.37024464187437f / 8.0), FL2FXCONST_SGL(-0.87071656222959f / 8.0) }, { FL2FXCONST_SGL(-0.36024828242896f / 8.0), FL2FXCONST_SGL( 0.34655735648287f / 8.0) }, { FL2FXCONST_SGL(-0.93388812549209f / 8.0), FL2FXCONST_SGL(-0.84476541096429f / 8.0) }, { FL2FXCONST_SGL(-0.65298804552119f / 8.0), FL2FXCONST_SGL(-0.18439575450921f / 8.0) }, { FL2FXCONST_SGL( 0.11960319006843f / 8.0), FL2FXCONST_SGL( 0.99899346780168f / 8.0) }, { FL2FXCONST_SGL( 0.94292565553160f / 8.0), FL2FXCONST_SGL( 0.83163906518293f / 8.0) }, { FL2FXCONST_SGL( 0.75081145286948f / 8.0), FL2FXCONST_SGL(-0.35533223142265f / 8.0) }, { FL2FXCONST_SGL( 0.56721979748394f / 8.0), FL2FXCONST_SGL(-0.24076836414499f / 8.0) }, { FL2FXCONST_SGL( 0.46857766746029f / 8.0), FL2FXCONST_SGL(-0.30140233457198f / 8.0) }, { FL2FXCONST_SGL( 0.97312313923635f / 8.0), FL2FXCONST_SGL(-0.99548191630031f / 8.0) }, { FL2FXCONST_SGL(-0.38299976567017f / 8.0), FL2FXCONST_SGL( 0.98516909715427f / 8.0) }, { FL2FXCONST_SGL( 0.41025800019463f / 8.0), FL2FXCONST_SGL( 0.02116736935734f / 8.0) }, { FL2FXCONST_SGL( 0.09638062008048f / 8.0), FL2FXCONST_SGL( 0.04411984381457f / 8.0) }, { FL2FXCONST_SGL(-0.85283249275397f / 8.0), FL2FXCONST_SGL( 0.91475563922421f / 8.0) }, { FL2FXCONST_SGL( 0.88866808958124f / 8.0), FL2FXCONST_SGL(-0.99735267083226f / 8.0) }, { FL2FXCONST_SGL(-0.48202429536989f / 8.0), FL2FXCONST_SGL(-0.96805608884164f / 8.0) }, { FL2FXCONST_SGL( 0.27572582416567f / 8.0), FL2FXCONST_SGL( 0.58634753335832f / 8.0) }, { FL2FXCONST_SGL(-0.65889129659168f / 8.0), FL2FXCONST_SGL( 0.58835634138583f / 8.0) }, { FL2FXCONST_SGL( 0.98838086953732f / 8.0), FL2FXCONST_SGL( 0.99994349600236f / 8.0) }, { FL2FXCONST_SGL(-0.20651349620689f / 8.0), FL2FXCONST_SGL( 0.54593044066355f / 8.0) }, { FL2FXCONST_SGL(-0.62126416356920f / 8.0), FL2FXCONST_SGL(-0.59893681700392f / 8.0) }, { FL2FXCONST_SGL( 0.20320105410437f / 8.0), FL2FXCONST_SGL(-0.86879180355289f / 8.0) }, { FL2FXCONST_SGL(-0.97790548600584f / 8.0), FL2FXCONST_SGL( 0.96290806999242f / 8.0) }, { FL2FXCONST_SGL( 0.11112534735126f / 8.0), FL2FXCONST_SGL( 0.21484763313301f / 8.0) }, { FL2FXCONST_SGL(-0.41368337314182f / 8.0), FL2FXCONST_SGL( 0.28216837680365f / 8.0) }, { FL2FXCONST_SGL( 0.24133038992960f / 8.0), FL2FXCONST_SGL( 0.51294362630238f / 8.0) }, { FL2FXCONST_SGL(-0.66393410674885f / 8.0), FL2FXCONST_SGL(-0.08249679629081f / 8.0) }, { FL2FXCONST_SGL(-0.53697829178752f / 8.0), FL2FXCONST_SGL(-0.97649903936228f / 8.0) }, { FL2FXCONST_SGL(-0.97224737889348f / 8.0), FL2FXCONST_SGL( 0.22081333579837f / 8.0) }, { FL2FXCONST_SGL( 0.87392477144549f / 8.0), FL2FXCONST_SGL(-0.12796173740361f / 8.0) }, { FL2FXCONST_SGL( 0.19050361015753f / 8.0), FL2FXCONST_SGL( 0.01602615387195f / 8.0) }, { FL2FXCONST_SGL(-0.46353441212724f / 8.0), FL2FXCONST_SGL(-0.95249041539006f / 8.0) }, { FL2FXCONST_SGL(-0.07064096339021f / 8.0), FL2FXCONST_SGL(-0.94479803205886f / 8.0) }, { FL2FXCONST_SGL(-0.92444085484466f / 8.0), FL2FXCONST_SGL(-0.10457590187436f / 8.0) }, { FL2FXCONST_SGL(-0.83822593578728f / 8.0), FL2FXCONST_SGL(-0.01695043208885f / 8.0) }, { FL2FXCONST_SGL( 0.75214681811150f / 8.0), FL2FXCONST_SGL(-0.99955681042665f / 8.0) }, { FL2FXCONST_SGL(-0.42102998829339f / 8.0), FL2FXCONST_SGL( 0.99720941999394f / 8.0) }, { FL2FXCONST_SGL(-0.72094786237696f / 8.0), FL2FXCONST_SGL(-0.35008961934255f / 8.0) }, { FL2FXCONST_SGL( 0.78843311019251f / 8.0), FL2FXCONST_SGL( 0.52851398958271f / 8.0) }, { FL2FXCONST_SGL( 0.97394027897442f / 8.0), FL2FXCONST_SGL(-0.26695944086561f / 8.0) }, { FL2FXCONST_SGL( 0.99206463477946f / 8.0), FL2FXCONST_SGL(-0.57010120849429f / 8.0) }, { FL2FXCONST_SGL( 0.76789609461795f / 8.0), FL2FXCONST_SGL(-0.76519356730966f / 8.0) }, { FL2FXCONST_SGL(-0.82002421836409f / 8.0), FL2FXCONST_SGL(-0.73530179553767f / 8.0) }, { FL2FXCONST_SGL( 0.81924990025724f / 8.0), FL2FXCONST_SGL( 0.99698425250579f / 8.0) }, { FL2FXCONST_SGL(-0.26719850873357f / 8.0), FL2FXCONST_SGL( 0.68903369776193f / 8.0) }, { FL2FXCONST_SGL(-0.43311260380975f / 8.0), FL2FXCONST_SGL( 0.85321815947490f / 8.0) }, { FL2FXCONST_SGL( 0.99194979673836f / 8.0), FL2FXCONST_SGL( 0.91876249766422f / 8.0) }, { FL2FXCONST_SGL(-0.80692001248487f / 8.0), FL2FXCONST_SGL(-0.32627540663214f / 8.0) }, { FL2FXCONST_SGL( 0.43080003649976f / 8.0), FL2FXCONST_SGL(-0.21919095636638f / 8.0) }, { FL2FXCONST_SGL( 0.67709491937357f / 8.0), FL2FXCONST_SGL(-0.95478075822906f / 8.0) }, { FL2FXCONST_SGL( 0.56151770568316f / 8.0), FL2FXCONST_SGL(-0.70693811747778f / 8.0) }, { FL2FXCONST_SGL( 0.10831862810749f / 8.0), FL2FXCONST_SGL(-0.08628837174592f / 8.0) }, { FL2FXCONST_SGL( 0.91229417540436f / 8.0), FL2FXCONST_SGL(-0.65987351408410f / 8.0) }, { FL2FXCONST_SGL(-0.48972893932274f / 8.0), FL2FXCONST_SGL( 0.56289246362686f / 8.0) }, { FL2FXCONST_SGL(-0.89033658689697f / 8.0), FL2FXCONST_SGL(-0.71656563987082f / 8.0) }, { FL2FXCONST_SGL( 0.65269447475094f / 8.0), FL2FXCONST_SGL( 0.65916004833932f / 8.0) }, { FL2FXCONST_SGL( 0.67439478141121f / 8.0), FL2FXCONST_SGL(-0.81684380846796f / 8.0) }, { FL2FXCONST_SGL(-0.47770832416973f / 8.0), FL2FXCONST_SGL(-0.16789556203025f / 8.0) }, { FL2FXCONST_SGL(-0.99715979260878f / 8.0), FL2FXCONST_SGL(-0.93565784007648f / 8.0) }, { FL2FXCONST_SGL(-0.90889593602546f / 8.0), FL2FXCONST_SGL( 0.62034397054380f / 8.0) }, { FL2FXCONST_SGL(-0.06618622548177f / 8.0), FL2FXCONST_SGL(-0.23812217221359f / 8.0) }, { FL2FXCONST_SGL( 0.99430266919728f / 8.0), FL2FXCONST_SGL( 0.18812555317553f / 8.0) }, { FL2FXCONST_SGL( 0.97686402381843f / 8.0), FL2FXCONST_SGL(-0.28664534366620f / 8.0) }, { FL2FXCONST_SGL( 0.94813650221268f / 8.0), FL2FXCONST_SGL(-0.97506640027128f / 8.0) }, { FL2FXCONST_SGL(-0.95434497492853f / 8.0), FL2FXCONST_SGL(-0.79607978501983f / 8.0) }, { FL2FXCONST_SGL(-0.49104783137150f / 8.0), FL2FXCONST_SGL( 0.32895214359663f / 8.0) }, { FL2FXCONST_SGL( 0.99881175120751f / 8.0), FL2FXCONST_SGL( 0.88993983831354f / 8.0) }, { FL2FXCONST_SGL( 0.50449166760303f / 8.0), FL2FXCONST_SGL(-0.85995072408434f / 8.0) }, { FL2FXCONST_SGL( 0.47162891065108f / 8.0), FL2FXCONST_SGL(-0.18680204049569f / 8.0) }, { FL2FXCONST_SGL(-0.62081581361840f / 8.0), FL2FXCONST_SGL( 0.75000676218956f / 8.0) }, { FL2FXCONST_SGL(-0.43867015250812f / 8.0), FL2FXCONST_SGL( 0.99998069244322f / 8.0) }, { FL2FXCONST_SGL( 0.98630563232075f / 8.0), FL2FXCONST_SGL(-0.53578899600662f / 8.0) }, { FL2FXCONST_SGL(-0.61510362277374f / 8.0), FL2FXCONST_SGL(-0.89515019899997f / 8.0) }, { FL2FXCONST_SGL(-0.03841517601843f / 8.0), FL2FXCONST_SGL(-0.69888815681179f / 8.0) }, { FL2FXCONST_SGL(-0.30102157304644f / 8.0), FL2FXCONST_SGL(-0.07667808922205f / 8.0) }, { FL2FXCONST_SGL( 0.41881284182683f / 8.0), FL2FXCONST_SGL( 0.02188098922282f / 8.0) }, { FL2FXCONST_SGL(-0.86135454941237f / 8.0), FL2FXCONST_SGL( 0.98947480909359f / 8.0) }, { FL2FXCONST_SGL( 0.67226861393788f / 8.0), FL2FXCONST_SGL(-0.13494389011014f / 8.0) }, { FL2FXCONST_SGL(-0.70737398842068f / 8.0), FL2FXCONST_SGL(-0.76547349325992f / 8.0) }, { FL2FXCONST_SGL( 0.94044946687963f / 8.0), FL2FXCONST_SGL( 0.09026201157416f / 8.0) }, { FL2FXCONST_SGL(-0.82386352534327f / 8.0), FL2FXCONST_SGL( 0.08924768823676f / 8.0) }, { FL2FXCONST_SGL(-0.32070666698656f / 8.0), FL2FXCONST_SGL( 0.50143421908753f / 8.0) }, { FL2FXCONST_SGL( 0.57593163224487f / 8.0), FL2FXCONST_SGL(-0.98966422921509f / 8.0) }, { FL2FXCONST_SGL(-0.36326018419965f / 8.0), FL2FXCONST_SGL( 0.07440243123228f / 8.0) }, { FL2FXCONST_SGL( 0.99979044674350f / 8.0), FL2FXCONST_SGL(-0.14130287347405f / 8.0) }, { FL2FXCONST_SGL(-0.92366023326932f / 8.0), FL2FXCONST_SGL(-0.97979298068180f / 8.0) }, { FL2FXCONST_SGL(-0.44607178518598f / 8.0), FL2FXCONST_SGL(-0.54233252016394f / 8.0) }, { FL2FXCONST_SGL( 0.44226800932956f / 8.0), FL2FXCONST_SGL( 0.71326756742752f / 8.0) }, { FL2FXCONST_SGL( 0.03671907158312f / 8.0), FL2FXCONST_SGL( 0.63606389366675f / 8.0) }, { FL2FXCONST_SGL( 0.52175424682195f / 8.0), FL2FXCONST_SGL(-0.85396826735705f / 8.0) }, { FL2FXCONST_SGL(-0.94701139690956f / 8.0), FL2FXCONST_SGL(-0.01826348194255f / 8.0) }, { FL2FXCONST_SGL(-0.98759606946049f / 8.0), FL2FXCONST_SGL( 0.82288714303073f / 8.0) }, { FL2FXCONST_SGL( 0.87434794743625f / 8.0), FL2FXCONST_SGL( 0.89399495655433f / 8.0) }, { FL2FXCONST_SGL(-0.93412041758744f / 8.0), FL2FXCONST_SGL( 0.41374052024363f / 8.0) }, { FL2FXCONST_SGL( 0.96063943315511f / 8.0), FL2FXCONST_SGL( 0.93116709541280f / 8.0) }, { FL2FXCONST_SGL( 0.97534253457837f / 8.0), FL2FXCONST_SGL( 0.86150930812689f / 8.0) }, { FL2FXCONST_SGL( 0.99642466504163f / 8.0), FL2FXCONST_SGL( 0.70190043427512f / 8.0) }, { FL2FXCONST_SGL(-0.94705089665984f / 8.0), FL2FXCONST_SGL(-0.29580042814306f / 8.0) }, { FL2FXCONST_SGL( 0.91599807087376f / 8.0), FL2FXCONST_SGL(-0.98147830385781f / 8.0) } }; //@} /* static const FIXP_SGL harmonicPhase [2][4] = { { 1.0, 0.0, -1.0, 0.0}, { 0.0, 1.0, 0.0, -1.0} }; */ /* The CLDFB-80 is not linear phase (unsymmetric), but the exact phase difference between adjacent bands, at exact positions (in this case exactly in the frequency band centre), can of course be determined anyway. While the standard symmetric QMF bank has a phase difference of 0.5*pi, the CLDFB-80 bank has the difference 0.2337*pi. */ const FIXP_SGL harmonicPhaseX [2][4] = { { FL2FXCONST_SGL( 7.423735494778151e-001), FL2FXCONST_SGL(-6.699862036159475e-001), FL2FXCONST_SGL(-7.423735494778152e-001), FL2FXCONST_SGL( 6.699862036159474e-001) }, { FL2FXCONST_SGL( 7.423735494778151e-001), FL2FXCONST_SGL( 6.699862036159476e-001), FL2FXCONST_SGL(-7.423735494778151e-001), FL2FXCONST_SGL(-6.699862036159476e-001) } }; /* tables for SBR and AAC LD */ /* table for 8 time slot index */ const int FDK_sbrDecoder_envelopeTable_8 [8][5] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* borders from left to right side; -1 = not in use */ /*[|T-|------]*/ { 2, 0, 0, 1, -1 }, /*[|-T-|-----]*/ { 2, 0, 0, 2, -1 }, /*[--|T-|----]*/ { 3, 1, 1, 2, 4 }, /*[---|T-|---]*/ { 3, 1, 1, 3, 5 }, /*[----|T-|--]*/ { 3, 1, 1, 4, 6 }, /*[-----|T--|]*/ { 2, 1, 1, 5, -1 }, /*[------|T-|]*/ { 2, 1, 1, 6, -1 }, /*[-------|T|]*/ { 2, 1, 1, 7, -1 }, }; /* table for 15 time slot index */ const int FDK_sbrDecoder_envelopeTable_15 [15][6] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* length from left to right side; -1 = not in use */ /*[|T---|------------]*/ { 2, 0, 0, 4, -1, -1}, /*[|-T---|-----------]*/ { 2, 0, 0, 5, -1, -1}, /*[|--|T---|---------]*/ { 3, 1, 1, 2, 6, -1}, /*[|---|T---|--------]*/ { 3, 1, 1, 3, 7, -1}, /*[|----|T---|-------]*/ { 3, 1, 1, 4, 8, -1}, /*[|-----|T---|------]*/ { 3, 1, 1, 5, 9, -1}, /*[|------|T---|-----]*/ { 3, 1, 1, 6, 10, -1}, /*[|-------|T---|----]*/ { 3, 1, 1, 7, 11, -1}, /*[|--------|T---|---]*/ { 3, 1, 1, 8, 12, -1}, /*[|---------|T---|--]*/ { 3, 1, 1, 9, 13, -1}, /*[|----------|T----|]*/ { 2, 1, 1,10, -1, -1}, /*[|-----------|T---|]*/ { 2, 1, 1,11, -1, -1}, /*[|------------|T--|]*/ { 2, 1, 1,12, -1, -1}, /*[|-------------|T-|]*/ { 2, 1, 1,13, -1, -1}, /*[|--------------|T|]*/ { 2, 1, 1,14, -1, -1}, }; /* table for 16 time slot index */ const int FDK_sbrDecoder_envelopeTable_16 [16][6] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* length from left to right side; -1 = not in use */ /*[|T---|------------|]*/ { 2, 0, 0, 4, -1, -1}, /*[|-T---|-----------|]*/ { 2, 0, 0, 5, -1, -1}, /*[|--|T---|----------]*/ { 3, 1, 1, 2, 6, -1}, /*[|---|T---|---------]*/ { 3, 1, 1, 3, 7, -1}, /*[|----|T---|--------]*/ { 3, 1, 1, 4, 8, -1}, /*[|-----|T---|-------]*/ { 3, 1, 1, 5, 9, -1}, /*[|------|T---|------]*/ { 3, 1, 1, 6, 10, -1}, /*[|-------|T---|-----]*/ { 3, 1, 1, 7, 11, -1}, /*[|--------|T---|----]*/ { 3, 1, 1, 8, 12, -1}, /*[|---------|T---|---]*/ { 3, 1, 1, 9, 13, -1}, /*[|----------|T---|--]*/ { 3, 1, 1,10, 14, -1}, /*[|-----------|T----|]*/ { 2, 1, 1,11, -1, -1}, /*[|------------|T---|]*/ { 2, 1, 1,12, -1, -1}, /*[|-------------|T--|]*/ { 2, 1, 1,13, -1, -1}, /*[|--------------|T-|]*/ { 2, 1, 1,14, -1, -1}, /*[|---------------|T|]*/ { 2, 1, 1,15, -1, -1}, }; /*! \name FrameInfoDefaults Predefined envelope positions for the FIX-FIX case (static framing) */ //@{ const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_15 = { 0, 1, {0, 15, 0, 0, 0, 0}, {1, 0, 0, 0, 0}, -1, 1, {0, 15, 0} }; const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_15 = { 0, 2, {0, 8, 15, 0, 0, 0}, {1, 1, 0, 0, 0}, -1, 2, {0, 8, 15} }; const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_15 = { 0, 4, {0, 4, 8, 12, 15, 0}, {1, 1, 1, 1, 0}, -1, 2, {0, 8, 15} }; #if (MAX_ENVELOPES >= 8) const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_15 = { 0, 8, {0, 2, 4, 6, 8, 10, 12, 14, 15}, {1, 1, 1, 1, 1, 1, 1, 1}, -1, 2, {0, 8, 15} }; #endif const FRAME_INFO FDK_sbrDecoder_sbr_frame_info1_16 = { 0, 1, {0, 16, 0, 0, 0, 0}, {1, 0, 0, 0, 0}, -1, 1, {0, 16, 0} }; const FRAME_INFO FDK_sbrDecoder_sbr_frame_info2_16 = { 0, 2, {0, 8, 16, 0, 0, 0}, {1, 1, 0, 0, 0}, -1, 2, {0, 8, 16} }; const FRAME_INFO FDK_sbrDecoder_sbr_frame_info4_16 = { 0, 4, {0, 4, 8, 12, 16, 0}, {1, 1, 1, 1, 0}, -1, 2, {0, 8, 16} }; #if (MAX_ENVELOPES >= 8) const FRAME_INFO FDK_sbrDecoder_sbr_frame_info8_16 = { 0, 8, {0, 2, 4, 6, 8, 10, 12, 14, 16}, {1, 1, 1, 1, 1, 1, 1, 1}, -1, 2, {0, 8, 16} }; #endif //@} /*! \name SBR_HuffmanTables SBR Huffman Table Overview: \n \n o envelope level, 1.5 dB: \n 1) sbr_huffBook_EnvLevel10T[120][2] \n 2) sbr_huffBook_EnvLevel10F[120][2] \n \n o envelope balance, 1.5 dB: \n 3) sbr_huffBook_EnvBalance10T[48][2] \n 4) sbr_huffBook_EnvBalance10F[48][2] \n \n o envelope level, 3.0 dB: \n 5) sbr_huffBook_EnvLevel11T[62][2] \n 6) sbr_huffBook_EnvLevel11F[62][2] \n \n o envelope balance, 3.0 dB: \n 7) sbr_huffBook_EnvBalance11T[24][2] \n 8) sbr_huffBook_EnvBalance11F[24][2] \n \n o noise level, 3.0 dB: \n 9) sbr_huffBook_NoiseLevel11T[62][2] \n -) (sbr_huffBook_EnvLevel11F[62][2] is used for freq dir)\n \n o noise balance, 3.0 dB: \n 10) sbr_huffBook_NoiseBalance11T[24][2]\n -) (sbr_huffBook_EnvBalance11F[24][2] is used for freq dir)\n \n (1.5 dB is never used for noise) */ //@{ const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10T[120][2] = { { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, { 5, 6 }, { -62, -67 }, { 7, 8 }, { -61, -68 }, { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, { 17, 18 }, { -73, -56 }, { 19, 21 }, { -74, 20 }, { -55, -75 }, { 22, 26 }, { 23, 24 }, { -54, -76 }, { -77, 25 }, { -53, -78 }, { 27, 34 }, { 28, 29 }, { -52, -79 }, { 30, 31 }, { -80, -51 }, { 32, 33 }, { -83, -82 }, { -81, -50 }, { 35, 57 }, { 36, 40 }, { 37, 38 }, { -88, -84 }, { -48, 39 }, { -90, -85 }, { 41, 46 }, { 42, 43 }, { -49, -87 }, { 44, 45 }, { -89, -86 }, {-124,-123 }, { 47, 50 }, { 48, 49 }, {-122,-121 }, {-120,-119 }, { 51, 54 }, { 52, 53 }, {-118,-117 }, {-116,-115 }, { 55, 56 }, {-114,-113 }, {-112,-111 }, { 58, 89 }, { 59, 74 }, { 60, 67 }, { 61, 64 }, { 62, 63 }, {-110,-109 }, {-108,-107 }, { 65, 66 }, {-106,-105 }, {-104,-103 }, { 68, 71 }, { 69, 70 }, {-102,-101 }, {-100, -99 }, { 72, 73 }, { -98, -97 }, { -96, -95 }, { 75, 82 }, { 76, 79 }, { 77, 78 }, { -94, -93 }, { -92, -91 }, { 80, 81 }, { -47, -46 }, { -45, -44 }, { 83, 86 }, { 84, 85 }, { -43, -42 }, { -41, -40 }, { 87, 88 }, { -39, -38 }, { -37, -36 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, { 93, 94 }, { -35, -34 }, { -33, -32 }, { 96, 97 }, { -31, -30 }, { -29, -28 }, { 99, 102 }, { 100, 101 }, { -27, -26 }, { -25, -24 }, { 103, 104 }, { -23, -22 }, { -21, -20 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, { -19, -18 }, { -17, -16 }, { 111, 112 }, { -15, -14 }, { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel10F[120][2] = { { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, { 5, 6 }, { -67, -62 }, { 7, 8 }, { -68, -61 }, { 9, 10 }, { -69, -60 }, { 11, 13 }, { -70, 12 }, { -59, -71 }, { 14, 16 }, { -58, 15 }, { -72, -57 }, { 17, 19 }, { -73, 18 }, { -56, -74 }, { 20, 23 }, { 21, 22 }, { -55, -75 }, { -54, -53 }, { 24, 27 }, { 25, 26 }, { -76, -52 }, { -77, -51 }, { 28, 31 }, { 29, 30 }, { -50, -78 }, { -79, -49 }, { 32, 36 }, { 33, 34 }, { -48, -47 }, { -80, 35 }, { -81, -82 }, { 37, 47 }, { 38, 41 }, { 39, 40 }, { -83, -46 }, { -45, -84 }, { 42, 44 }, { -85, 43 }, { -44, -43 }, { 45, 46 }, { -88, -87 }, { -86, -90 }, { 48, 66 }, { 49, 56 }, { 50, 53 }, { 51, 52 }, { -92, -42 }, { -41, -39 }, { 54, 55 }, {-105, -89 }, { -38, -37 }, { 57, 60 }, { 58, 59 }, { -94, -91 }, { -40, -36 }, { 61, 63 }, { -20, 62 }, {-115,-110 }, { 64, 65 }, {-108,-107 }, {-101, -97 }, { 67, 89 }, { 68, 75 }, { 69, 72 }, { 70, 71 }, { -95, -93 }, { -34, -27 }, { 73, 74 }, { -22, -17 }, { -16,-124 }, { 76, 82 }, { 77, 79 }, {-123, 78 }, {-122,-121 }, { 80, 81 }, {-120,-119 }, {-118,-117 }, { 83, 86 }, { 84, 85 }, {-116,-114 }, {-113,-112 }, { 87, 88 }, {-111,-109 }, {-106,-104 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, { 93, 94 }, {-103,-102 }, {-100, -99 }, { 96, 97 }, { -98, -96 }, { -35, -33 }, { 99, 102 }, { 100, 101 }, { -32, -31 }, { -30, -29 }, { 103, 104 }, { -28, -26 }, { -25, -24 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, { -23, -21 }, { -19, -18 }, { 111, 112 }, { -15, -14 }, { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10T[48][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, { -68, 9 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, { -70, -58 }, { 14, 28 }, { 15, 21 }, { 16, 18 }, { -57, 17 }, { -71, -56 }, { 19, 20 }, { -88, -87 }, { -86, -85 }, { 22, 25 }, { 23, 24 }, { -84, -83 }, { -82, -81 }, { 26, 27 }, { -80, -79 }, { -78, -77 }, { 29, 36 }, { 30, 33 }, { 31, 32 }, { -76, -75 }, { -74, -73 }, { 34, 35 }, { -72, -55 }, { -54, -53 }, { 37, 41 }, { 38, 39 }, { -52, -51 }, { -50, 40 }, { -49, -48 }, { 42, 45 }, { 43, 44 }, { -47, -46 }, { -45, -44 }, { 46, 47 }, { -43, -42 }, { -41, -40 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance10F[48][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 11 }, { -69, -59 }, { -70, 12 }, { -58, 13 }, { 14, 17 }, { -71, 15 }, { -57, 16 }, { -56, -73 }, { 18, 32 }, { 19, 25 }, { 20, 22 }, { -72, 21 }, { -88, -87 }, { 23, 24 }, { -86, -85 }, { -84, -83 }, { 26, 29 }, { 27, 28 }, { -82, -81 }, { -80, -79 }, { 30, 31 }, { -78, -77 }, { -76, -75 }, { 33, 40 }, { 34, 37 }, { 35, 36 }, { -74, -55 }, { -54, -53 }, { 38, 39 }, { -52, -51 }, { -50, -49 }, { 41, 44 }, { 42, 43 }, { -48, -47 }, { -46, -45 }, { 45, 46 }, { -44, -43 }, { -42, 47 }, { -41, -40 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11T[62][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, { -60, 9 }, { 10, 11 }, { -69, -59 }, { 12, 14 }, { -70, 13 }, { -71, -58 }, { 15, 18 }, { 16, 17 }, { -72, -57 }, { -73, -74 }, { 19, 22 }, { -56, 20 }, { -55, 21 }, { -54, -77 }, { 23, 31 }, { 24, 25 }, { -75, -76 }, { 26, 27 }, { -78, -53 }, { 28, 29 }, { -52, -95 }, { -94, 30 }, { -93, -92 }, { 32, 47 }, { 33, 40 }, { 34, 37 }, { 35, 36 }, { -91, -90 }, { -89, -88 }, { 38, 39 }, { -87, -86 }, { -85, -84 }, { 41, 44 }, { 42, 43 }, { -83, -82 }, { -81, -80 }, { 45, 46 }, { -79, -51 }, { -50, -49 }, { 48, 55 }, { 49, 52 }, { 50, 51 }, { -48, -47 }, { -46, -45 }, { 53, 54 }, { -44, -43 }, { -42, -41 }, { 56, 59 }, { 57, 58 }, { -40, -39 }, { -38, -37 }, { 60, 61 }, { -36, -35 }, { -34, -33 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvLevel11F[62][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, { 17, 19 }, { -56, 18 }, { -55, -73 }, { 20, 24 }, { 21, 22 }, { -74, -54 }, { -53, 23 }, { -75, -76 }, { 25, 30 }, { 26, 27 }, { -52, -51 }, { 28, 29 }, { -77, -79 }, { -50, -49 }, { 31, 39 }, { 32, 35 }, { 33, 34 }, { -78, -46 }, { -82, -88 }, { 36, 37 }, { -83, -48 }, { -47, 38 }, { -86, -85 }, { 40, 47 }, { 41, 44 }, { 42, 43 }, { -80, -44 }, { -43, -42 }, { 45, 46 }, { -39, -87 }, { -84, -40 }, { 48, 55 }, { 49, 52 }, { 50, 51 }, { -95, -94 }, { -93, -92 }, { 53, 54 }, { -91, -90 }, { -89, -81 }, { 56, 59 }, { 57, 58 }, { -45, -41 }, { -38, -37 }, { 60, 61 }, { -36, -35 }, { -34, -33 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11T[24][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 16 }, { 11, 13 }, { -69, 12 }, { -76, -75 }, { 14, 15 }, { -74, -73 }, { -72, -71 }, { 17, 20 }, { 18, 19 }, { -70, -59 }, { -58, -57 }, { 21, 22 }, { -56, -55 }, { -54, 23 }, { -53, -52 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_EnvBalance11F[24][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 13 }, { -69, 11 }, { -59, 12 }, { -58, -76 }, { 14, 17 }, { 15, 16 }, { -75, -74 }, { -73, -72 }, { 18, 21 }, { 19, 20 }, { -71, -70 }, { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseLevel11T[62][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, { 9, 30 }, { 10, 15 }, { -60, 11 }, { -69, 12 }, { 13, 14 }, { -59, -53 }, { -95, -94 }, { 16, 23 }, { 17, 20 }, { 18, 19 }, { -93, -92 }, { -91, -90 }, { 21, 22 }, { -89, -88 }, { -87, -86 }, { 24, 27 }, { 25, 26 }, { -85, -84 }, { -83, -82 }, { 28, 29 }, { -81, -80 }, { -79, -78 }, { 31, 46 }, { 32, 39 }, { 33, 36 }, { 34, 35 }, { -77, -76 }, { -75, -74 }, { 37, 38 }, { -73, -72 }, { -71, -70 }, { 40, 43 }, { 41, 42 }, { -58, -57 }, { -56, -55 }, { 44, 45 }, { -54, -52 }, { -51, -50 }, { 47, 54 }, { 48, 51 }, { 49, 50 }, { -49, -48 }, { -47, -46 }, { 52, 53 }, { -45, -44 }, { -43, -42 }, { 55, 58 }, { 56, 57 }, { -41, -40 }, { -39, -38 }, { 59, 60 }, { -37, -36 }, { -35, 61 }, { -34, -33 } }; const SCHAR FDK_sbrDecoder_sbr_huffBook_NoiseBalance11T[24][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { 4, 9 }, { -66, 5 }, { -62, 6 }, { 7, 8 }, { -76, -75 }, { -74, -73 }, { 10, 17 }, { 11, 14 }, { 12, 13 }, { -72, -71 }, { -70, -69 }, { 15, 16 }, { -68, -67 }, { -61, -60 }, { 18, 21 }, { 19, 20 }, { -59, -58 }, { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } }; //@} /*! \name parametric stereo \brief constants used by the parametric stereo part of the decoder */ /* constants used in psbitdec.cpp */ /* FIX_BORDER can have 0, 1, 2, 4 envelopes */ const UCHAR FDK_sbrDecoder_aFixNoEnvDecode[4] = {0, 1, 2, 4}; /* IID & ICC Huffman codebooks */ const SCHAR aBookPsIidTimeDecode[28][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, { -60, 9 }, { -69, 10 }, { -59, 11 }, { -70, 12 }, { -58, 13 }, { -57, 14 }, { -71, 15 }, { 16, 17 }, { -56, -72 }, { 18, 21 }, { 19, 20 }, { -55, -78 }, { -77, -76 }, { 22, 25 }, { 23, 24 }, { -75, -74 }, { -73, -54 }, { 26, 27 }, { -53, -52 }, { -51, -50 } }; const SCHAR aBookPsIidFreqDecode[28][2] = { { -64, 1 }, { 2, 3 }, { -63, -65 }, { 4, 5 }, { -62, -66 }, { 6, 7 }, { -61, -67 }, { 8, 9 }, { -68, -60 }, { -59, 10 }, { -69, 11 }, { -58, 12 }, { -70, 13 }, { -71, 14 }, { -57, 15 }, { 16, 17 }, { -56, -72 }, { 18, 19 }, { -55, -54 }, { 20, 21 }, { -73, -53 }, { 22, 24 }, { -74, 23 }, { -75, -78 }, { 25, 26 }, { -77, -76 }, { -52, 27 }, { -51, -50 } }; const SCHAR aBookPsIccTimeDecode[14][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, { -68, 9 }, { -59, 10 }, { -69, 11 }, { -58, 12 }, { -70, 13 }, { -71, -57 } }; const SCHAR aBookPsIccFreqDecode[14][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, { -59, 9 }, { -68, 10 }, { -58, 11 }, { -69, 12 }, { -57, 13 }, { -70, -71 } }; /* IID-fine Huffman codebooks */ const SCHAR aBookPsIidFineTimeDecode[60][2] = { { 1, -64 }, { -63, 2 }, { 3, -65 }, { 4, 59 }, { 5, 7 }, { 6, -67 }, { -68, -60 }, { -61, 8 }, { 9, 11 }, { -59, 10 }, { -70, -58 }, { 12, 41 }, { 13, 20 }, { 14, -71 }, { -55, 15 }, { -53, 16 }, { 17, -77 }, { 18, 19 }, { -85, -84 }, { -46, -45 }, { -57, 21 }, { 22, 40 }, { 23, 29 }, { -51, 24 }, { 25, 26 }, { -83, -82 }, { 27, 28 }, { -90, -38 }, { -92, -91 }, { 30, 37 }, { 31, 34 }, { 32, 33 }, { -35, -34 }, { -37, -36 }, { 35, 36 }, { -94, -93 }, { -89, -39 }, { 38, -79 }, { 39, -81 }, { -88, -40 }, { -74, -54 }, { 42, -69 }, { 43, 44 }, { -72, -56 }, { 45, 52 }, { 46, 50 }, { 47, -76 }, { -49, 48 }, { -47, 49 }, { -87, -41 }, { -52, 51 }, { -78, -50 }, { 53, -73 }, { 54, -75 }, { 55, 57 }, { 56, -80 }, { -86, -42 }, { -48, 58 }, { -44, -43 }, { -66, -62 } }; const SCHAR aBookPsIidFineFreqDecode[60][2] = { { 1, -64 }, { 2, 4 }, { 3, -65 }, { -66, -62 }, { -63, 5 }, { 6, 7 }, { -67, -61 }, { 8, 9 }, { -68, -60 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, { -70, -58 }, { 14, 18 }, { -57, 15 }, { 16, -72 }, { -54, 17 }, { -75, -53 }, { 19, 37 }, { -56, 20 }, { 21, -73 }, { 22, 29 }, { 23, -76 }, { 24, -78 }, { 25, 28 }, { 26, 27 }, { -85, -43 }, { -83, -45 }, { -81, -47 }, { -52, 30 }, { -50, 31 }, { 32, -79 }, { 33, 34 }, { -82, -46 }, { 35, 36 }, { -90, -89 }, { -92, -91 }, { 38, -71 }, { -55, 39 }, { 40, -74 }, { 41, 50 }, { 42, -77 }, { -49, 43 }, { 44, 47 }, { 45, 46 }, { -86, -42 }, { -88, -87 }, { 48, 49 }, { -39, -38 }, { -41, -40 }, { -51, 51 }, { 52, 59 }, { 53, 56 }, { 54, 55 }, { -35, -34 }, { -37, -36 }, { 57, 58 }, { -94, -93 }, { -84, -44 }, { -80, -48 } }; /* constants used in psdec.cpp */ const FIXP_DBL decayScaleFactTable[64] = { FL2FXCONST_DBL(1.000000), FL2FXCONST_DBL(1.000000), FL2FXCONST_DBL(1.000000), FL2FXCONST_DBL(1.000000), FL2FXCONST_DBL(0.950000), FL2FXCONST_DBL(0.900000), FL2FXCONST_DBL(0.850000), FL2FXCONST_DBL(0.800000), FL2FXCONST_DBL(0.750000), FL2FXCONST_DBL(0.700000), FL2FXCONST_DBL(0.650000), FL2FXCONST_DBL(0.600000), FL2FXCONST_DBL(0.550000), FL2FXCONST_DBL(0.500000), FL2FXCONST_DBL(0.450000), FL2FXCONST_DBL(0.400000), FL2FXCONST_DBL(0.350000), FL2FXCONST_DBL(0.300000), FL2FXCONST_DBL(0.250000), FL2FXCONST_DBL(0.200000), FL2FXCONST_DBL(0.150000), FL2FXCONST_DBL(0.100000), FL2FXCONST_DBL(0.050000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000), FL2FXCONST_DBL(0.000000) }; /* the values of the following 3 tables are shiftet right by 1 ! */ const FIXP_DBL ScaleFactors[NO_IID_LEVELS] = { 0x5a5ded00, 0x59cd0400, 0x58c29680, 0x564c2e80, 0x52a3d480, 0x4c8be080, 0x46df3080, 0x40000000, 0x384ba5c0, 0x304c2980, 0x24e9f640, 0x1b4a2940, 0x11b5c0a0, 0x0b4e2540, 0x0514ea90 }; const FIXP_DBL ScaleFactorsFine[NO_IID_LEVELS_FINE] = { 0x5a825c00, 0x5a821c00, 0x5a815100, 0x5a7ed000, 0x5a76e600, 0x5a5ded00, 0x5a39b880, 0x59f1fd00, 0x5964d680, 0x5852ca00, 0x564c2e80, 0x54174480, 0x50ea7500, 0x4c8be080, 0x46df3080, 0x40000000, 0x384ba5c0, 0x304c2980, 0x288dd240, 0x217a2900, 0x1b4a2940, 0x13c5ece0, 0x0e2b0090, 0x0a178ef0, 0x072ab798, 0x0514ea90, 0x02dc5944, 0x019bf87c, 0x00e7b173, 0x00824b8b, 0x00494568 }; const FIXP_DBL Alphas[NO_ICC_LEVELS] = { 0x00000000, 0x0b6b5be0, 0x12485f80, 0x1da2fa40, 0x2637ebc0, 0x3243f6c0, 0x466b7480, 0x6487ed80 }; #if defined(ARCH_PREFER_MULT_32x16) #define FIXP_PS FIXP_SGL #define FXP_CAST(a) FX_DBL2FX_SGL((FIXP_DBL)a) #define FL2FXCONST_PS FL2FXCONST_SGL #else #define FIXP_PS FIXP_DBL #define FXP_CAST #define FL2FXCONST_PS FL2FXCONST_DBL #endif const FIXP_PS aAllpassLinkDecaySer[NO_SERIAL_ALLPASS_LINKS] = { FXP_CAST(0x53625b00), FXP_CAST(0x4848af00), FXP_CAST(0x3ea94d00) }; const FIXP_PS aaFractDelayPhaseFactorReQmf[NO_QMF_CHANNELS] = { FXP_CAST(0x68b92180), FXP_CAST(0xde396900), FXP_CAST(0x80650380), FXP_CAST(0xcb537e40), FXP_CAST(0x5beb8f00), FXP_CAST(0x72f29200), FXP_CAST(0xf1f43c50), FXP_CAST(0x83896280), FXP_CAST(0xb9b99c00), FXP_CAST(0x4cda8f00), FXP_CAST(0x7a576e00), FXP_CAST(0x060799e0), FXP_CAST(0x89be5280), FXP_CAST(0xa9dab600), FXP_CAST(0x3be51b00), FXP_CAST(0x7eb91900), FXP_CAST(0x19f4f540), FXP_CAST(0x92dcb380), FXP_CAST(0x9c1ad700), FXP_CAST(0x29761940), FXP_CAST(0x7ffbf500), FXP_CAST(0x2d3eb180), FXP_CAST(0x9eab0a00), FXP_CAST(0x90d0aa80), FXP_CAST(0x1601bcc0), FXP_CAST(0x7e180e80), FXP_CAST(0x3f6b3940), FXP_CAST(0xacdeeb00), FXP_CAST(0x88435b00), FXP_CAST(0x0202a768), FXP_CAST(0x79194f80), FXP_CAST(0x5007fd00), FXP_CAST(0xbd1ecf00), FXP_CAST(0x82a8d100), FXP_CAST(0xedf6e5e0), FXP_CAST(0x711f3500), FXP_CAST(0x5eac4480), FXP_CAST(0xcf0447c0), FXP_CAST(0x80245f80), FXP_CAST(0xda5cd4c0), FXP_CAST(0x665c0800), FXP_CAST(0x6afbc500), FXP_CAST(0xe21e85e0), FXP_CAST(0x80c5e500), FXP_CAST(0xc7b003c0), FXP_CAST(0x59139f80), FXP_CAST(0x74a8e400), FXP_CAST(0xf5f51f40), FXP_CAST(0x84896680), FXP_CAST(0xb6662b00), FXP_CAST(0x4999b600), FXP_CAST(0x7b76a300), FXP_CAST(0x0a0b0650), FXP_CAST(0x8b572b80), FXP_CAST(0xa6ec4580), FXP_CAST(0x384fda80), FXP_CAST(0x7f3a1f00), FXP_CAST(0x1de19ec0), FXP_CAST(0x95045000), FXP_CAST(0x99a3e180), FXP_CAST(0x25a30740), FXP_CAST(0x7fdb9e80), FXP_CAST(0x30fbdb00), FXP_CAST(0xa153d500) }; const FIXP_PS aaFractDelayPhaseFactorImQmf[NO_QMF_CHANNELS] = { FXP_CAST(0xb6663a80), FXP_CAST(0x84896200), FXP_CAST(0xf5f50c70), FXP_CAST(0x74a8dc80), FXP_CAST(0x5913ad00), FXP_CAST(0xc7b01480), FXP_CAST(0x80c5e300), FXP_CAST(0xe21e73a0), FXP_CAST(0x6afbba80), FXP_CAST(0x665c1380), FXP_CAST(0xda5ce6c0), FXP_CAST(0x80246080), FXP_CAST(0xcf043640), FXP_CAST(0x5eac3800), FXP_CAST(0x711f3e00), FXP_CAST(0xedf6f8a0), FXP_CAST(0x82a8d500), FXP_CAST(0xbd1ebe80), FXP_CAST(0x5007ee00), FXP_CAST(0x79195580), FXP_CAST(0x0202ba40), FXP_CAST(0x88436180), FXP_CAST(0xacdedc80), FXP_CAST(0x3f6b28c0), FXP_CAST(0x7e181180), FXP_CAST(0x1601cf40), FXP_CAST(0x90d0b380), FXP_CAST(0x9eaafd80), FXP_CAST(0x2d3e9fc0), FXP_CAST(0x7ffbf580), FXP_CAST(0x29762b00), FXP_CAST(0x9c1ae280), FXP_CAST(0x92dca980), FXP_CAST(0x19f4e2c0), FXP_CAST(0x7eb91680), FXP_CAST(0x3be52b80), FXP_CAST(0xa9dac400), FXP_CAST(0x89be4b80), FXP_CAST(0x06078710), FXP_CAST(0x7a576880), FXP_CAST(0x4cda9e00), FXP_CAST(0xb9b9ac00), FXP_CAST(0x83895e00), FXP_CAST(0xf1f42990), FXP_CAST(0x72f28a00), FXP_CAST(0x5beb9c00), FXP_CAST(0xcb538f40), FXP_CAST(0x80650200), FXP_CAST(0xde3956c0), FXP_CAST(0x68b91680), FXP_CAST(0x68b92c00), FXP_CAST(0xde397b40), FXP_CAST(0x80650500), FXP_CAST(0xcb536d00), FXP_CAST(0x5beb8180), FXP_CAST(0x72f29a80), FXP_CAST(0xf1f44f10), FXP_CAST(0x83896700), FXP_CAST(0xb9b98c80), FXP_CAST(0x4cda8000), FXP_CAST(0x7a577380), FXP_CAST(0x0607acb8), FXP_CAST(0x89be5a00), FXP_CAST(0xa9daa800) }; const FIXP_PS aaFractDelayPhaseFactorReSubQmf20[NO_SUB_QMF_CHANNELS] = { FXP_CAST(0x7e807380), FXP_CAST(0x72b9bb00), FXP_CAST(0x5c44ee80), FXP_CAST(0x3d3938c0), FXP_CAST(0x80000000), FXP_CAST(0x80000000), FXP_CAST(0x72b9bb00), FXP_CAST(0x7e807380), FXP_CAST(0xba914700), FXP_CAST(0x050677b0), FXP_CAST(0x895cc380), FXP_CAST(0x834e4900) }; const FIXP_PS aaFractDelayPhaseFactorImSubQmf20[NO_SUB_QMF_CHANNELS] = { FXP_CAST(0xec791720), FXP_CAST(0xc73ca080), FXP_CAST(0xa748ea00), FXP_CAST(0x8f976980), FXP_CAST(0x00000000), FXP_CAST(0x00000000), FXP_CAST(0x38c35f80), FXP_CAST(0x1386e8e0), FXP_CAST(0x9477d000), FXP_CAST(0x80194380), FXP_CAST(0xcff26140), FXP_CAST(0x1ce70d40) }; const FIXP_PS aaFractDelayPhaseFactorSerReQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS] = { {FXP_CAST(0x63e52480), FXP_CAST(0x30fbc540), FXP_CAST(0x6d73af00)}, {FXP_CAST(0xc7b01280), FXP_CAST(0x89be5100), FXP_CAST(0xf7c31cb0)}, {FXP_CAST(0x83896200), FXP_CAST(0x7641af00), FXP_CAST(0x8aee2700)}, {FXP_CAST(0x0202b330), FXP_CAST(0xcf043ac0), FXP_CAST(0x9bfab500)}, {FXP_CAST(0x7d572c80), FXP_CAST(0xcf043ac0), FXP_CAST(0x1893b960)}, {FXP_CAST(0x34ac7fc0), FXP_CAST(0x7641af00), FXP_CAST(0x7abf7980)}, {FXP_CAST(0x99a3ee00), FXP_CAST(0x89be5100), FXP_CAST(0x58eead80)}, {FXP_CAST(0x9eab0580), FXP_CAST(0x30fbc540), FXP_CAST(0xd77dae40)}, {FXP_CAST(0x3be52140), FXP_CAST(0x30fbc540), FXP_CAST(0x819b8500)}, {FXP_CAST(0x7b769d80), FXP_CAST(0x89be5100), FXP_CAST(0xb3a12280)}, {FXP_CAST(0xf9f86878), FXP_CAST(0x7641af00), FXP_CAST(0x37c519c0)}, {FXP_CAST(0x81e7ef80), FXP_CAST(0xcf043ac0), FXP_CAST(0x7ff16880)}, {FXP_CAST(0xcf043cc0), FXP_CAST(0xcf043ac0), FXP_CAST(0x3e8b2340)}, {FXP_CAST(0x68b92280), FXP_CAST(0x7641af00), FXP_CAST(0xb9e4a900)}, {FXP_CAST(0x5eac3980), FXP_CAST(0x89be5100), FXP_CAST(0x80a05200)}, {FXP_CAST(0xc094cd00), FXP_CAST(0x30fbc540), FXP_CAST(0xd051dc80)}, {FXP_CAST(0x85a89400), FXP_CAST(0x30fbc540), FXP_CAST(0x53483b00)}, {FXP_CAST(0x0a0af5e0), FXP_CAST(0x89be5100), FXP_CAST(0x7cb1b680)}, {FXP_CAST(0x7eb91900), FXP_CAST(0x7641af00), FXP_CAST(0x2006e8c0)}, {FXP_CAST(0x2d3ea680), FXP_CAST(0xcf043ac0), FXP_CAST(0xa0ec1c00)}, {FXP_CAST(0x95044180), FXP_CAST(0xcf043ac0), FXP_CAST(0x880d2180)}, {FXP_CAST(0xa4147300), FXP_CAST(0x7641af00), FXP_CAST(0xf0282870)}, {FXP_CAST(0x42e13f80), FXP_CAST(0x89be5100), FXP_CAST(0x694c4a00)}, {FXP_CAST(0x79195200), FXP_CAST(0x30fbc540), FXP_CAST(0x71374780)}, {FXP_CAST(0xf1f43550), FXP_CAST(0x30fbc540), FXP_CAST(0xff6593ea)}, {FXP_CAST(0x80c5e280), FXP_CAST(0x89be5100), FXP_CAST(0x8e39ec00)}, {FXP_CAST(0xd689e480), FXP_CAST(0x7641af00), FXP_CAST(0x97648100)}, {FXP_CAST(0x6d235300), FXP_CAST(0xcf043ac0), FXP_CAST(0x110a20c0)}, {FXP_CAST(0x5913a800), FXP_CAST(0xcf043ac0), FXP_CAST(0x785d4f80)}, {FXP_CAST(0xb9b99a00), FXP_CAST(0x7641af00), FXP_CAST(0x5e440880)}, {FXP_CAST(0x88436100), FXP_CAST(0x89be5100), FXP_CAST(0xdece7000)}, {FXP_CAST(0x12091320), FXP_CAST(0x30fbc540), FXP_CAST(0x8309f800)}, {FXP_CAST(0x7f9afd00), FXP_CAST(0x30fbc540), FXP_CAST(0xada33f00)}, {FXP_CAST(0x25a31700), FXP_CAST(0x89be5100), FXP_CAST(0x30cc3600)}, {FXP_CAST(0x90d0ab80), FXP_CAST(0x7641af00), FXP_CAST(0x7f7cbe80)}, {FXP_CAST(0xa9dabf00), FXP_CAST(0xcf043ac0), FXP_CAST(0x45182580)}, {FXP_CAST(0x4999cb80), FXP_CAST(0xcf043ac0), FXP_CAST(0xc0681c80)}, {FXP_CAST(0x7641ac80), FXP_CAST(0x7641af00), FXP_CAST(0x80194380)}, {FXP_CAST(0xe9fe3300), FXP_CAST(0x89be5100), FXP_CAST(0xc95184c0)}, {FXP_CAST(0x80246000), FXP_CAST(0x30fbc540), FXP_CAST(0x4d55d800)}, {FXP_CAST(0xde396fc0), FXP_CAST(0x30fbc540), FXP_CAST(0x7e324000)}, {FXP_CAST(0x711f3f00), FXP_CAST(0x89be5100), FXP_CAST(0x275ce480)}, {FXP_CAST(0x53211700), FXP_CAST(0x7641af00), FXP_CAST(0xa6343580)}, {FXP_CAST(0xb3256780), FXP_CAST(0xcf043ac0), FXP_CAST(0x85997b80)}, {FXP_CAST(0x8b572680), FXP_CAST(0xcf043ac0), FXP_CAST(0xe89ba660)}, {FXP_CAST(0x19f4f780), FXP_CAST(0x7641af00), FXP_CAST(0x64c4e100)}, {FXP_CAST(0x7ffbf580), FXP_CAST(0x89be5100), FXP_CAST(0x7493a380)}, {FXP_CAST(0x1de18100), FXP_CAST(0x30fbc540), FXP_CAST(0x070897f0)}, {FXP_CAST(0x8d0d6a80), FXP_CAST(0x30fbc540), FXP_CAST(0x91ed6f00)}, {FXP_CAST(0xaff81380), FXP_CAST(0x89be5100), FXP_CAST(0x932db000)}, {FXP_CAST(0x5007fb00), FXP_CAST(0x7641af00), FXP_CAST(0x0970feb0)}, {FXP_CAST(0x72f28d00), FXP_CAST(0xcf043ac0), FXP_CAST(0x758d6500)}, {FXP_CAST(0xe21e6cc0), FXP_CAST(0xcf043ac0), FXP_CAST(0x63436f80)}, {FXP_CAST(0x80040b00), FXP_CAST(0x7641af00), FXP_CAST(0xe63d7600)}, {FXP_CAST(0xe60b1ae0), FXP_CAST(0x89be5100), FXP_CAST(0x84ea5c80)}, {FXP_CAST(0x74a8e100), FXP_CAST(0x30fbc540), FXP_CAST(0xa7f07500)}, {FXP_CAST(0x4cda8980), FXP_CAST(0x30fbc540), FXP_CAST(0x29a6d340)}, {FXP_CAST(0xacdeda80), FXP_CAST(0x89be5100), FXP_CAST(0x7e93d600)}, {FXP_CAST(0x8ee0c980), FXP_CAST(0x7641af00), FXP_CAST(0x4b662680)}, {FXP_CAST(0x21c6a280), FXP_CAST(0xcf043ac0), FXP_CAST(0xc7258c80)}, {FXP_CAST(0x7fdb9f00), FXP_CAST(0xcf043ac0), FXP_CAST(0x8006d500)}, {FXP_CAST(0x1601ba60), FXP_CAST(0x7641af00), FXP_CAST(0xc2830940)}, {FXP_CAST(0x89be4c80), FXP_CAST(0x89be5100), FXP_CAST(0x471cf100)}, {FXP_CAST(0xb6664400), FXP_CAST(0x30fbc540), FXP_CAST(0x7f3fb800)}}; const FIXP_PS aaFractDelayPhaseFactorSerImQmf[NO_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS] = { {FXP_CAST(0xaff80c80), FXP_CAST(0x89be5100), FXP_CAST(0xbda29e00)}, {FXP_CAST(0x8d0d6f00), FXP_CAST(0x30fbc540), FXP_CAST(0x8043ee80)}, {FXP_CAST(0x1de18a20), FXP_CAST(0x30fbc540), FXP_CAST(0xcc3e7840)}, {FXP_CAST(0x7ffbf500), FXP_CAST(0x89be5100), FXP_CAST(0x4fdfc180)}, {FXP_CAST(0x19f4ee40), FXP_CAST(0x7641af00), FXP_CAST(0x7d9e4c00)}, {FXP_CAST(0x8b572300), FXP_CAST(0xcf043ac0), FXP_CAST(0x244a2940)}, {FXP_CAST(0xb3256f00), FXP_CAST(0xcf043ac0), FXP_CAST(0xa3f0a500)}, {FXP_CAST(0x53211e00), FXP_CAST(0x7641af00), FXP_CAST(0x86944500)}, {FXP_CAST(0x711f3a80), FXP_CAST(0x89be5100), FXP_CAST(0xebc72040)}, {FXP_CAST(0xde3966c0), FXP_CAST(0x30fbc540), FXP_CAST(0x66b87e00)}, {FXP_CAST(0x80246080), FXP_CAST(0x30fbc540), FXP_CAST(0x73362c00)}, {FXP_CAST(0xe9fe3c40), FXP_CAST(0x89be5100), FXP_CAST(0x03d1d110)}, {FXP_CAST(0x7641b000), FXP_CAST(0x7641af00), FXP_CAST(0x90520c80)}, {FXP_CAST(0x4999c380), FXP_CAST(0xcf043ac0), FXP_CAST(0x94e80a80)}, {FXP_CAST(0xa9dab800), FXP_CAST(0xcf043ac0), FXP_CAST(0x0ca570e0)}, {FXP_CAST(0x90d0b000), FXP_CAST(0x7641af00), FXP_CAST(0x76c9bc80)}, {FXP_CAST(0x25a32000), FXP_CAST(0x89be5100), FXP_CAST(0x61338500)}, {FXP_CAST(0x7f9afc80), FXP_CAST(0x30fbc540), FXP_CAST(0xe318f060)}, {FXP_CAST(0x120909c0), FXP_CAST(0x30fbc540), FXP_CAST(0x84124e00)}, {FXP_CAST(0x88435d80), FXP_CAST(0x89be5100), FXP_CAST(0xaa4d2f80)}, {FXP_CAST(0xb9b9a200), FXP_CAST(0x7641af00), FXP_CAST(0x2cae1800)}, {FXP_CAST(0x5913ae80), FXP_CAST(0xcf043ac0), FXP_CAST(0x7f040680)}, {FXP_CAST(0x6d234e00), FXP_CAST(0xcf043ac0), FXP_CAST(0x48c6a100)}, {FXP_CAST(0xd689db80), FXP_CAST(0x7641af00), FXP_CAST(0xc44860c0)}, {FXP_CAST(0x80c5e380), FXP_CAST(0x89be5100), FXP_CAST(0x80005d00)}, {FXP_CAST(0xf1f43eb0), FXP_CAST(0x30fbc540), FXP_CAST(0xc55a3a00)}, {FXP_CAST(0x79195500), FXP_CAST(0x30fbc540), FXP_CAST(0x49c3de00)}, {FXP_CAST(0x42e13700), FXP_CAST(0x89be5100), FXP_CAST(0x7edc5b00)}, {FXP_CAST(0xa4146c80), FXP_CAST(0x7641af00), FXP_CAST(0x2b8c2c00)}, {FXP_CAST(0x95044680), FXP_CAST(0xcf043ac0), FXP_CAST(0xa968c100)}, {FXP_CAST(0x2d3eaf40), FXP_CAST(0xcf043ac0), FXP_CAST(0x8460fd80)}, {FXP_CAST(0x7eb91780), FXP_CAST(0x7641af00), FXP_CAST(0xe44621e0)}, {FXP_CAST(0x0a0aec80), FXP_CAST(0x89be5100), FXP_CAST(0x61fb5c00)}, {FXP_CAST(0x85a89100), FXP_CAST(0x30fbc540), FXP_CAST(0x76555780)}, {FXP_CAST(0xc094d500), FXP_CAST(0x30fbc540), FXP_CAST(0x0b71f790)}, {FXP_CAST(0x5eac4000), FXP_CAST(0x89be5100), FXP_CAST(0x94401a80)}, {FXP_CAST(0x68b91d80), FXP_CAST(0x7641af00), FXP_CAST(0x90ea3980)}, {FXP_CAST(0xcf043440), FXP_CAST(0xcf043ac0), FXP_CAST(0x05067a08)}, {FXP_CAST(0x81e7f180), FXP_CAST(0xcf043ac0), FXP_CAST(0x73bb6d00)}, {FXP_CAST(0xf9f871e0), FXP_CAST(0x7641af00), FXP_CAST(0x65ff0e00)}, {FXP_CAST(0x7b76a000), FXP_CAST(0x89be5100), FXP_CAST(0xea9664c0)}, {FXP_CAST(0x3be518c0), FXP_CAST(0x30fbc540), FXP_CAST(0x8633e880)}, {FXP_CAST(0x9eaaff00), FXP_CAST(0x30fbc540), FXP_CAST(0xa4c84500)}, {FXP_CAST(0x99a3f400), FXP_CAST(0x89be5100), FXP_CAST(0x2571eac0)}, {FXP_CAST(0x34ac8840), FXP_CAST(0x7641af00), FXP_CAST(0x7dd82b00)}, {FXP_CAST(0x7d572a80), FXP_CAST(0xcf043ac0), FXP_CAST(0x4eed8400)}, {FXP_CAST(0x0202a9c4), FXP_CAST(0xcf043ac0), FXP_CAST(0xcb249700)}, {FXP_CAST(0x83896000), FXP_CAST(0x7641af00), FXP_CAST(0x80318200)}, {FXP_CAST(0xc7b01b00), FXP_CAST(0x89be5100), FXP_CAST(0xbeab7580)}, {FXP_CAST(0x63e52a80), FXP_CAST(0x30fbc540), FXP_CAST(0x4364b700)}, {FXP_CAST(0x63e51f00), FXP_CAST(0x30fbc540), FXP_CAST(0x7fa6bd00)}, {FXP_CAST(0xc7b00a00), FXP_CAST(0x89be5100), FXP_CAST(0x32a67940)}, {FXP_CAST(0x83896400), FXP_CAST(0x7641af00), FXP_CAST(0xaf2fd200)}, {FXP_CAST(0x0202bc9c), FXP_CAST(0xcf043ac0), FXP_CAST(0x829e6e80)}, {FXP_CAST(0x7d572e80), FXP_CAST(0xcf043ac0), FXP_CAST(0xdcde6b80)}, {FXP_CAST(0x34ac7700), FXP_CAST(0x7641af00), FXP_CAST(0x5ce4e280)}, {FXP_CAST(0x99a3e880), FXP_CAST(0x89be5100), FXP_CAST(0x79089c00)}, {FXP_CAST(0x9eab0b80), FXP_CAST(0x30fbc540), FXP_CAST(0x1307ae80)}, {FXP_CAST(0x3be52980), FXP_CAST(0x30fbc540), FXP_CAST(0x98906880)}, {FXP_CAST(0x7b769b00), FXP_CAST(0x89be5100), FXP_CAST(0x8d51b300)}, {FXP_CAST(0xf9f85f10), FXP_CAST(0x7641af00), FXP_CAST(0xfd62ee24)}, {FXP_CAST(0x81e7ee00), FXP_CAST(0xcf043ac0), FXP_CAST(0x70439680)}, {FXP_CAST(0xcf044580), FXP_CAST(0xcf043ac0), FXP_CAST(0x6a6d9600)}, {FXP_CAST(0x68b92800), FXP_CAST(0x7641af00), FXP_CAST(0xf2275f80)}}; const FIXP_PS aaFractDelayPhaseFactorSerReSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS] = { {FXP_CAST(0x7e2df000), FXP_CAST(0x7a7d0580), FXP_CAST(0x7ed03e00)}, {FXP_CAST(0x6fec9a80), FXP_CAST(0x5133cc80), FXP_CAST(0x7573df00)}, {FXP_CAST(0x55063900), FXP_CAST(0x0c8bd360), FXP_CAST(0x636c0400)}, {FXP_CAST(0x3084ca00), FXP_CAST(0xc3a94580), FXP_CAST(0x4a0d6700)}, {FXP_CAST(0x80000000), FXP_CAST(0x80000000), FXP_CAST(0x80000000)}, {FXP_CAST(0x80000000), FXP_CAST(0x80000000), FXP_CAST(0x80000000)}, {FXP_CAST(0x6fec9a80), FXP_CAST(0x5133cc80), FXP_CAST(0x7573df00)}, {FXP_CAST(0x7e2df000), FXP_CAST(0x7a7d0580), FXP_CAST(0x7ed03e00)}, {FXP_CAST(0xa4c84280), FXP_CAST(0xb8e31300), FXP_CAST(0xd5af0140)}, {FXP_CAST(0xf0f488a0), FXP_CAST(0x8275a100), FXP_CAST(0x1a72e360)}, {FXP_CAST(0x80aaa680), FXP_CAST(0x471ced00), FXP_CAST(0x9d2ead80)}, {FXP_CAST(0x9477d100), FXP_CAST(0x7d8a5f00), FXP_CAST(0x8151df80)}}; const FIXP_PS aaFractDelayPhaseFactorSerImSubQmf20[NO_SUB_QMF_CHANNELS][NO_SERIAL_ALLPASS_LINKS] = { {FXP_CAST(0xea7d08a0), FXP_CAST(0xdad7f3c0), FXP_CAST(0xee9c9f60)}, {FXP_CAST(0xc1e54140), FXP_CAST(0x9d0dfe80), FXP_CAST(0xcd1e7300)}, {FXP_CAST(0xa051a580), FXP_CAST(0x809dc980), FXP_CAST(0xaf61c400)}, {FXP_CAST(0x898d4e00), FXP_CAST(0x8f1d3400), FXP_CAST(0x97988280)}, {FXP_CAST(0x00000000), FXP_CAST(0x00000000), FXP_CAST(0x00000000)}, {FXP_CAST(0x00000000), FXP_CAST(0x00000000), FXP_CAST(0x00000000)}, {FXP_CAST(0x3e1abec0), FXP_CAST(0x62f20180), FXP_CAST(0x32e18d00)}, {FXP_CAST(0x1582f760), FXP_CAST(0x25280c40), FXP_CAST(0x116360a0)}, {FXP_CAST(0xa6343800), FXP_CAST(0x6a6d9880), FXP_CAST(0x87327a00)}, {FXP_CAST(0x80e32200), FXP_CAST(0xe70747c0), FXP_CAST(0x82c32b00)}, {FXP_CAST(0xf2f42420), FXP_CAST(0x6a6d9880), FXP_CAST(0xaea47080)}, {FXP_CAST(0x456eba00), FXP_CAST(0xe70747c0), FXP_CAST(0xedaa8640)}}; const FIXP_PS p8_13_20[13] = { FL2FXCONST_PS(0.00746082949812f), FL2FXCONST_PS(0.02270420949825f), FL2FXCONST_PS(0.04546865930473f), FL2FXCONST_PS(0.07266113929591f), FL2FXCONST_PS(0.09885108575264f), FL2FXCONST_PS(0.11793710567217f), FL2FXCONST_PS(0.125f ), FL2FXCONST_PS(0.11793710567217f), FL2FXCONST_PS(0.09885108575264f), FL2FXCONST_PS(0.07266113929591f), FL2FXCONST_PS(0.04546865930473f), FL2FXCONST_PS(0.02270420949825f), FL2FXCONST_PS(0.00746082949812f) }; const FIXP_PS p2_13_20[13] = { FL2FXCONST_PS(0.0f), FL2FXCONST_PS( 0.01899487526049f), FL2FXCONST_PS(0.0f), FL2FXCONST_PS(-0.07293139167538f), FL2FXCONST_PS(0.0f), FL2FXCONST_PS( 0.30596630545168f), FL2FXCONST_PS(0.5f), FL2FXCONST_PS( 0.30596630545168f), FL2FXCONST_PS(0.0f), FL2FXCONST_PS(-0.07293139167538f), FL2FXCONST_PS(0.0f), FL2FXCONST_PS( 0.01899487526049f), FL2FXCONST_PS(0.0f) }; const UCHAR aAllpassLinkDelaySer[] = { 3, 4, 5}; const UCHAR delayIndexQmf[NO_QMF_CHANNELS] = { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; const UCHAR groupBorders20[NO_IID_GROUPS + 1] = { 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands - 0th qmf subband */ 9, 8, /* 2 subqmf subbands - 1st qmf subband */ 10, 11, /* 2 subqmf subbands - 2nd qmf subband */ 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 }; const UCHAR groupBorders34[NO_IID_GROUPS_HI_RES + 1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands - 0th qmf subband */ 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands - 1st qmf subband */ 20, 21, 22, 23, /* 4 subqmf subbands - 2nd qmf subband */ 24, 25, 26, 27, /* 4 subqmf subbands - 3nd qmf subband */ 28, 29, 30, 31, /* 4 subqmf subbands - 4nd qmf subband */ 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 }; const UCHAR bins2groupMap20[NO_IID_GROUPS] = { 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; const UCHAR quantizedIIDs[NO_IID_STEPS] = { 2, 4, 7, 10, 14, 18, 25 }; const UCHAR quantizedIIDsFine[NO_IID_STEPS_FINE] = { 2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50 }; const UCHAR FDK_sbrDecoder_aNoIidBins[3] = {NO_LOW_RES_IID_BINS, NO_MID_RES_IID_BINS, NO_HI_RES_IID_BINS}; const UCHAR FDK_sbrDecoder_aNoIccBins[3] = {NO_LOW_RES_ICC_BINS, NO_MID_RES_ICC_BINS, NO_HI_RES_ICC_BINS}; /************************************************************************/ /*! \brief Create lookup tables for some arithmetic functions The tables would normally be defined as const arrays, but initialization at run time allows to specify their accuracy. */ /************************************************************************/ /* 1/x-table: (example for INV_TABLE_BITS 8) The table covers an input range from 0.5 to 1.0 with a step size of 1/512, starting at 0.5 + 1/512. Each table entry corresponds to an input interval starting 1/1024 below the exact value and ending 1/1024 above it. The table is actually a 0.5/x-table, so that the output range is again 0.5...1.0 and the exponent of the result must be increased by 1. Input range Index in table result ------------------------------------------------------------------- 0.500000...0.500976 - 0.5 / 0.500000 = 1.000000 0.500976...0.502930 0 0.5 / 0.501953 = 0.996109 0.502930...0.500488 1 0.5 / 0.503906 = 0.992248 ... 0.999023...1.000000 255 0.5 / 1.000000 = 0.500000 for (i=0; i> dynamicScale; accu2 = fMultAddDiv2(real2,a1r,imag2); real2 = real1; imag2 = imag1; accu2 = fMultAddDiv2(accu2,a0i,real1); real1 = lowBandReal[i]; accu2 = fMultAddDiv2(accu2,a0r,imag1); imag1 = lowBandImag[i]; accu2 = accu2 >> dynamicScale; accu1 <<= 1; accu2 <<= 1; qmfBufferReal[i][hiBand] = accu1 + (real1>>descale); qmfBufferImag[i][hiBand] = accu2 + (imag1>>descale); } } #endif /* #ifdef FUNCTION_LPPTRANSPOSER_func1 */ #endif /* __arm__ */ fdk-aac-0.1.3/libSBRdec/src/huff_dec.cpp0000644000175000017500000001257212372261464020250 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Huffman Decoder */ #include "huff_dec.h" /***************************************************************************/ /*! \brief Decodes one huffman code word Reads bits from the bitstream until a valid codeword is found. The table entries are interpreted either as index to the next entry or - if negative - as the codeword. \return decoded value \author ****************************************************************************/ int DecodeHuffmanCW (Huffman h, /*!< pointer to huffman codebook table */ HANDLE_FDK_BITSTREAM hBs) /*!< Handle to Bitbuffer */ { SCHAR index = 0; int value, bit; while (index >= 0) { bit = FDKreadBits (hBs, 1); index = h[index][bit]; } value = index+64; /* Add offset */ return value; } fdk-aac-0.1.3/libSBRdec/src/sbr_dec.cpp0000644000175000017500000011440012372261464020077 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr decoder This module provides the actual decoder implementation. The SBR data (side information) is already decoded. Only three functions are provided: \li 1.) createSbrDec(): One time initialization \li 2.) resetSbrDec(): Called by sbr_Apply() when the information contained in an SBR_HEADER_ELEMENT requires a reset and recalculation of important SBR structures. \li 3.) sbr_dec(): The actual decoder. Calls the different tools such as filterbanks, lppTransposer(), and calculateSbrEnvelope() [the envelope adjuster]. \sa sbr_dec(), \ref documentationOverview */ #include "sbr_dec.h" #include "sbr_ram.h" #include "env_extr.h" #include "env_calc.h" #include "scale.h" #include "genericStds.h" #include "sbrdec_drc.h" static void assignLcTimeSlots( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ FIXP_DBL **QmfBufferReal, int noCols ) { int slot, i; FIXP_DBL *ptr; /* Number of QMF timeslots in the overlap buffer: */ ptr = hSbrDec->pSbrOverlapBuffer; for(slot=0; slotLppTrans.pSettings->overlap; slot++) { QmfBufferReal[slot] = ptr; ptr += (64); } /* Assign timeslots to Workbuffer1 */ ptr = hSbrDec->WorkBuffer1; for(i=0; i> 1) + hSbrDec->LppTrans.pSettings->overlap; int totCols = noCols + hSbrDec->LppTrans.pSettings->overlap; /* Number of QMF timeslots in the overlap buffer: */ ptr = hSbrDec->pSbrOverlapBuffer; for(slot=0; slotLppTrans.pSettings->overlap; slot++) { QmfBufferReal[slot] = ptr; ptr += (64); QmfBufferImag[slot] = ptr; ptr += (64); } /* Assign first half of timeslots to Workbuffer1 */ ptr = hSbrDec->WorkBuffer1; for(; slotWorkBuffer2; for(; slotuseLP = useLP; if (useLP) { hSbrDec->SynthesisQMF.flags |= QMF_FLAG_LP; hSbrDec->AnalysiscQMF.flags |= QMF_FLAG_LP; } else { hSbrDec->SynthesisQMF.flags &= ~QMF_FLAG_LP; hSbrDec->AnalysiscQMF.flags &= ~QMF_FLAG_LP; } if (!useLP) assignHqTimeSlots( hSbrDec, hSbrDec->QmfBufferReal, hSbrDec->QmfBufferImag, noCols ); else { assignLcTimeSlots( hSbrDec, hSbrDec->QmfBufferReal, noCols ); } } static void changeQmfType( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ int useLdTimeAlign ) { UINT synQmfFlags = hSbrDec->SynthesisQMF.flags; UINT anaQmfFlags = hSbrDec->AnalysiscQMF.flags; int resetSynQmf = 0; int resetAnaQmf = 0; /* assign qmf type */ if (useLdTimeAlign) { if (synQmfFlags & QMF_FLAG_CLDFB) { /* change the type to MPSLD */ synQmfFlags &= ~QMF_FLAG_CLDFB; synQmfFlags |= QMF_FLAG_MPSLDFB; resetSynQmf = 1; } if (anaQmfFlags & QMF_FLAG_CLDFB) { /* change the type to MPSLD */ anaQmfFlags &= ~QMF_FLAG_CLDFB; anaQmfFlags |= QMF_FLAG_MPSLDFB; resetAnaQmf = 1; } } else { if (synQmfFlags & QMF_FLAG_MPSLDFB) { /* change the type to CLDFB */ synQmfFlags &= ~QMF_FLAG_MPSLDFB; synQmfFlags |= QMF_FLAG_CLDFB; resetSynQmf = 1; } if (anaQmfFlags & QMF_FLAG_MPSLDFB) { /* change the type to CLDFB */ anaQmfFlags &= ~QMF_FLAG_MPSLDFB; anaQmfFlags |= QMF_FLAG_CLDFB; resetAnaQmf = 1; } } if (resetAnaQmf) { int qmfErr = qmfInitAnalysisFilterBank ( &hSbrDec->AnalysiscQMF, hSbrDec->anaQmfStates, hSbrDec->AnalysiscQMF.no_col, hSbrDec->AnalysiscQMF.lsb, hSbrDec->AnalysiscQMF.usb, hSbrDec->AnalysiscQMF.no_channels, anaQmfFlags | QMF_FLAG_KEEP_STATES ); if (qmfErr != 0) { FDK_ASSERT(0); } } if (resetSynQmf) { int qmfErr = qmfInitSynthesisFilterBank ( &hSbrDec->SynthesisQMF, hSbrDec->pSynQmfStates, hSbrDec->SynthesisQMF.no_col, hSbrDec->SynthesisQMF.lsb, hSbrDec->SynthesisQMF.usb, hSbrDec->SynthesisQMF.no_channels, synQmfFlags | QMF_FLAG_KEEP_STATES ); if (qmfErr != 0) { FDK_ASSERT(0); } } } /*! \brief SBR decoder core function for one channel \image html BufferMgmtDetailed-1632.png Besides the filter states of the QMF filter bank and the LPC-states of the LPP-Transposer, processing is mainly based on four buffers: #timeIn, #timeOut, #WorkBuffer2 and #OverlapBuffer. The #WorkBuffer2 is reused for all channels and might be used by the core decoder, a static overlap buffer is required for each channel. Du to in-place processing, #timeIn and #timeOut point to identical locations. The spectral data is organized in so-called slots, each slot containing 64 bands of complex data. The number of slots per frame is dependend on the frame size. For mp3PRO, there are 18 slots per frame and 6 slots per #OverlapBuffer. It is not necessary to have the slots in located consecutive address ranges. To optimize memory usage and to minimize the number of memory accesses, the memory management is organized as follows (Slot numbers based on mp3PRO): 1.) Input time domain signal is located in #timeIn, the last slots (0..5) of the spectral data of the previous frame are located in the #OverlapBuffer. In addition, #frameData of the current frame resides in the upper part of #timeIn. 2.) During the cplxAnalysisQmfFiltering(), 32 samples from #timeIn are transformed into a slot of up to 32 complex spectral low band values at a time. The first spectral slot -- nr. 6 -- is written at slot number zero of #WorkBuffer2. #WorkBuffer2 will be completely filled with spectral data. 3.) LPP-Transposition in lppTransposer() is processed on 24 slots. During the transposition, the high band part of the spectral data is replicated based on the low band data. Envelope Adjustment is processed on the high band part of the spectral data only by calculateSbrEnvelope(). 4.) The cplxSynthesisQmfFiltering() creates 64 time domain samples out of a slot of 64 complex spectral values at a time. The first 6 slots in #timeOut are filled from the results of spectral slots 0..5 in the #OverlapBuffer. The consecutive slots in timeOut are now filled with the results of spectral slots 6..17. 5.) The preprocessed slots 18..23 have to be stored in the #OverlapBuffer. */ void sbr_dec ( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ INT_PCM *timeIn, /*!< pointer to input time signal */ INT_PCM *timeOut, /*!< pointer to output time signal */ HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ INT_PCM *timeOutRight, /*!< pointer to output time signal */ const int strideIn, /*!< Time data traversal strideIn */ const int strideOut, /*!< Time data traversal strideOut */ HANDLE_SBR_HEADER_DATA hHeaderData,/*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, /*!< Some control data of last frame */ const int applyProcessing, /*!< Flag for SBR operation */ HANDLE_PS_DEC h_ps_d, const UINT flags ) { int i, slot, reserve; int saveLbScale; int ov_len; int lastSlotOffs; FIXP_DBL maxVal; /* 1+1/3 frames of spectral data: */ FIXP_DBL **QmfBufferReal = hSbrDec->QmfBufferReal; FIXP_DBL **QmfBufferImag = hSbrDec->QmfBufferImag; /* Number of QMF timeslots in the overlap buffer: */ ov_len = hSbrDec->LppTrans.pSettings->overlap; /* Number of QMF slots per frame */ int noCols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; /* assign qmf time slots */ if ( ((flags & SBRDEC_LOW_POWER ) ? 1 : 0) != ((hSbrDec->SynthesisQMF.flags & QMF_FLAG_LP) ? 1 : 0) ) { assignTimeSlots( hSbrDec, hHeaderData->numberTimeSlots * hHeaderData->timeStep, flags & SBRDEC_LOW_POWER); } if (flags & SBRDEC_ELD_GRID) { /* Choose the right low delay filter bank */ changeQmfType( hSbrDec, (flags & SBRDEC_LD_MPS_QMF) ? 1 : 0 ); } /* low band codec signal subband filtering */ { C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2*(64)); qmfAnalysisFiltering( &hSbrDec->AnalysiscQMF, QmfBufferReal + ov_len, QmfBufferImag + ov_len, &hSbrDec->sbrScaleFactor, timeIn, strideIn, qmfTemp ); C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2*(64)); } /* Clear upper half of spectrum */ { int nAnalysisBands = hHeaderData->numberOfAnalysisBands; if (! (flags & SBRDEC_LOW_POWER)) { for (slot = ov_len; slot < noCols+ov_len; slot++) { FDKmemclear(&QmfBufferReal[slot][nAnalysisBands],((64)-nAnalysisBands)*sizeof(FIXP_DBL)); FDKmemclear(&QmfBufferImag[slot][nAnalysisBands],((64)-nAnalysisBands)*sizeof(FIXP_DBL)); } } else for (slot = ov_len; slot < noCols+ov_len; slot++) { FDKmemclear(&QmfBufferReal[slot][nAnalysisBands],((64)-nAnalysisBands)*sizeof(FIXP_DBL)); } } /* Shift spectral data left to gain accuracy in transposer and adjustor */ maxVal = maxSubbandSample( QmfBufferReal, (flags & SBRDEC_LOW_POWER) ? NULL : QmfBufferImag, 0, hSbrDec->AnalysiscQMF.lsb, ov_len, noCols+ov_len ); reserve = fixMax(0,CntLeadingZeros(maxVal)-1) ; reserve = fixMin(reserve,DFRACT_BITS-1-hSbrDec->sbrScaleFactor.lb_scale); /* If all data is zero, lb_scale could become too large */ rescaleSubbandSamples( QmfBufferReal, (flags & SBRDEC_LOW_POWER) ? NULL : QmfBufferImag, 0, hSbrDec->AnalysiscQMF.lsb, ov_len, noCols+ov_len, reserve); hSbrDec->sbrScaleFactor.lb_scale += reserve; /* save low band scale, wavecoding or parametric stereo may modify it */ saveLbScale = hSbrDec->sbrScaleFactor.lb_scale; if (applyProcessing) { UCHAR * borders = hFrameData->frameInfo.borders; lastSlotOffs = borders[hFrameData->frameInfo.nEnvelopes] - hHeaderData->numberTimeSlots; FIXP_DBL degreeAlias[(64)]; /* The transposer will override most values in degreeAlias[]. The array needs to be cleared at least from lowSubband to highSubband before. */ if (flags & SBRDEC_LOW_POWER) FDKmemclear(°reeAlias[hHeaderData->freqBandData.lowSubband], (hHeaderData->freqBandData.highSubband-hHeaderData->freqBandData.lowSubband)*sizeof(FIXP_DBL)); /* Inverse filtering of lowband and transposition into the SBR-frequency range */ lppTransposer ( &hSbrDec->LppTrans, &hSbrDec->sbrScaleFactor, QmfBufferReal, degreeAlias, // only used if useLP = 1 QmfBufferImag, flags & SBRDEC_LOW_POWER, hHeaderData->timeStep, borders[0], lastSlotOffs, hHeaderData->freqBandData.nInvfBands, hFrameData->sbr_invf_mode, hPrevFrameData->sbr_invf_mode ); /* Adjust envelope of current frame. */ calculateSbrEnvelope (&hSbrDec->sbrScaleFactor, &hSbrDec->SbrCalculateEnvelope, hHeaderData, hFrameData, QmfBufferReal, QmfBufferImag, flags & SBRDEC_LOW_POWER, degreeAlias, flags, (hHeaderData->frameErrorFlag || hPrevFrameData->frameErrorFlag)); /* Update hPrevFrameData (to be used in the next frame) */ for (i=0; ifreqBandData.nInvfBands; i++) { hPrevFrameData->sbr_invf_mode[i] = hFrameData->sbr_invf_mode[i]; } hPrevFrameData->coupling = hFrameData->coupling; hPrevFrameData->stopPos = borders[hFrameData->frameInfo.nEnvelopes]; hPrevFrameData->ampRes = hFrameData->ampResolutionCurrentFrame; } else { /* Reset hb_scale if no highband is present, because hb_scale is considered in the QMF-synthesis */ hSbrDec->sbrScaleFactor.hb_scale = saveLbScale; } for (i=0; iLppTrans.lpcFilterStatesReal[i], QmfBufferReal[noCols-LPC_ORDER+i], hSbrDec->AnalysiscQMF.lsb*sizeof(FIXP_DBL)); FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesImag[i], QmfBufferImag[noCols-LPC_ORDER+i], hSbrDec->AnalysiscQMF.lsb*sizeof(FIXP_DBL)); } else FDKmemcpy(hSbrDec->LppTrans.lpcFilterStatesReal[i], QmfBufferReal[noCols-LPC_ORDER+i], hSbrDec->AnalysiscQMF.lsb*sizeof(FIXP_DBL)); } /* Synthesis subband filtering. */ if ( ! (flags & SBRDEC_PS_DECODED) ) { { int outScalefactor = 0; if (h_ps_d != NULL) { h_ps_d->procFrameBased = 1; /* we here do frame based processing */ } sbrDecoder_drcApply(&hSbrDec->sbrDrcChannel, QmfBufferReal, (flags & SBRDEC_LOW_POWER) ? NULL : QmfBufferImag, hSbrDec->SynthesisQMF.no_col, &outScalefactor ); qmfChangeOutScalefactor(&hSbrDec->SynthesisQMF, outScalefactor ); { C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2*(64)); qmfSynthesisFiltering( &hSbrDec->SynthesisQMF, QmfBufferReal, (flags & SBRDEC_LOW_POWER) ? NULL : QmfBufferImag, &hSbrDec->sbrScaleFactor, hSbrDec->LppTrans.pSettings->overlap, timeOut, strideOut, qmfTemp); C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2*(64)); } } } else { /* (flags & SBRDEC_PS_DECODED) */ INT i, sdiff, outScalefactor, scaleFactorLowBand, scaleFactorHighBand; SCHAR scaleFactorLowBand_ov, scaleFactorLowBand_no_ov; HANDLE_QMF_FILTER_BANK synQmf = &hSbrDec->SynthesisQMF; HANDLE_QMF_FILTER_BANK synQmfRight = &hSbrDecRight->SynthesisQMF; /* adapt scaling */ sdiff = hSbrDec->sbrScaleFactor.lb_scale - reserve; /* Scaling difference */ scaleFactorHighBand = sdiff - hSbrDec->sbrScaleFactor.hb_scale; /* Scale of current high band */ scaleFactorLowBand_ov = sdiff - hSbrDec->sbrScaleFactor.ov_lb_scale; /* Scale of low band overlapping QMF data */ scaleFactorLowBand_no_ov = sdiff - hSbrDec->sbrScaleFactor.lb_scale; /* Scale of low band current QMF data */ outScalefactor = 0; /* Initial output scale */ if (h_ps_d->procFrameBased == 1) /* If we have switched from frame to slot based processing copy filter states */ { /* procFrameBased will be unset later */ /* copy filter states from left to right */ FDKmemcpy(synQmfRight->FilterStates, synQmf->FilterStates, ((640)-(64))*sizeof(FIXP_QSS)); } /* scale ALL qmf vales ( real and imag ) of mono / left channel to the same scale factor ( ov_lb_sf, lb_sf and hq_sf ) */ scalFilterBankValues( h_ps_d, /* parametric stereo decoder handle */ QmfBufferReal, /* qmf filterbank values */ QmfBufferImag, /* qmf filterbank values */ synQmf->lsb, /* sbr start subband */ hSbrDec->sbrScaleFactor.ov_lb_scale, hSbrDec->sbrScaleFactor.lb_scale, &scaleFactorLowBand_ov, /* adapt scaling values */ &scaleFactorLowBand_no_ov, /* adapt scaling values */ hSbrDec->sbrScaleFactor.hb_scale, /* current frame ( highband ) */ &scaleFactorHighBand, synQmf->no_col); /* use the same synthese qmf values for left and right channel */ synQmfRight->no_col = synQmf->no_col; synQmfRight->lsb = synQmf->lsb; synQmfRight->usb = synQmf->usb; int env=0; outScalefactor += (SCAL_HEADROOM+1); /* psDiffScale! */ { C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, 2*(64)); int maxShift = 0; if (hSbrDec->sbrDrcChannel.enable != 0) { if (hSbrDec->sbrDrcChannel.prevFact_exp > maxShift) { maxShift = hSbrDec->sbrDrcChannel.prevFact_exp; } if (hSbrDec->sbrDrcChannel.currFact_exp > maxShift) { maxShift = hSbrDec->sbrDrcChannel.currFact_exp; } if (hSbrDec->sbrDrcChannel.nextFact_exp > maxShift) { maxShift = hSbrDec->sbrDrcChannel.nextFact_exp; } } /* copy DRC data to right channel (with PS both channels use the same DRC gains) */ FDKmemcpy(&hSbrDecRight->sbrDrcChannel, &hSbrDec->sbrDrcChannel, sizeof(SBRDEC_DRC_CHANNEL)); for (i = 0; i < synQmf->no_col; i++) { /* ----- no_col loop ----- */ INT outScalefactorR, outScalefactorL; outScalefactorR = outScalefactorL = outScalefactor; /* qmf timeslot of right channel */ FIXP_DBL* rQmfReal = pWorkBuffer; FIXP_DBL* rQmfImag = pWorkBuffer + 64; { if ( i == h_ps_d->bsData[h_ps_d->processSlot].mpeg.aEnvStartStop[env] ) { initSlotBasedRotation( h_ps_d, env, hHeaderData->freqBandData.highSubband ); env++; } ApplyPsSlot( h_ps_d, /* parametric stereo decoder handle */ (QmfBufferReal + i), /* one timeslot of left/mono channel */ (QmfBufferImag + i), /* one timeslot of left/mono channel */ rQmfReal, /* one timeslot or right channel */ rQmfImag); /* one timeslot or right channel */ } scaleFactorLowBand = (i<(6)) ? scaleFactorLowBand_ov : scaleFactorLowBand_no_ov; sbrDecoder_drcApplySlot ( /* right channel */ &hSbrDecRight->sbrDrcChannel, rQmfReal, rQmfImag, i, synQmfRight->no_col, maxShift ); outScalefactorR += maxShift; sbrDecoder_drcApplySlot ( /* left channel */ &hSbrDec->sbrDrcChannel, *(QmfBufferReal + i), *(QmfBufferImag + i), i, synQmf->no_col, maxShift ); outScalefactorL += maxShift; /* scale filter states for left and right channel */ qmfChangeOutScalefactor( synQmf, outScalefactorL ); qmfChangeOutScalefactor( synQmfRight, outScalefactorR ); { qmfSynthesisFilteringSlot( synQmfRight, rQmfReal, /* QMF real buffer */ rQmfImag, /* QMF imag buffer */ scaleFactorLowBand, scaleFactorHighBand, timeOutRight+(i*synQmf->no_channels*strideOut), strideOut, pWorkBuffer); qmfSynthesisFilteringSlot( synQmf, *(QmfBufferReal + i), /* QMF real buffer */ *(QmfBufferImag + i), /* QMF imag buffer */ scaleFactorLowBand, scaleFactorHighBand, timeOut+(i*synQmf->no_channels*strideOut), strideOut, pWorkBuffer); } } /* no_col loop i */ /* scale back (6) timeslots look ahead for hybrid filterbank to original value */ rescalFilterBankValues( h_ps_d, QmfBufferReal, QmfBufferImag, synQmf->lsb, synQmf->no_col ); C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, 2*(64)); } } sbrDecoder_drcUpdateChannel( &hSbrDec->sbrDrcChannel ); /* Update overlap buffer Even bands above usb are copied to avoid outdated spectral data in case the stop frequency raises. */ if (hSbrDec->LppTrans.pSettings->overlap > 0) { if (! (flags & SBRDEC_LOW_POWER)) { for ( i=0; iLppTrans.pSettings->overlap; i++ ) { FDKmemcpy(QmfBufferReal[i], QmfBufferReal[i+noCols], (64)*sizeof(FIXP_DBL)); FDKmemcpy(QmfBufferImag[i], QmfBufferImag[i+noCols], (64)*sizeof(FIXP_DBL)); } } else for ( i=0; iLppTrans.pSettings->overlap; i++ ) { FDKmemcpy(QmfBufferReal[i], QmfBufferReal[i+noCols], (64)*sizeof(FIXP_DBL)); } } hSbrDec->sbrScaleFactor.ov_lb_scale = saveLbScale; /* Save current frame status */ hPrevFrameData->frameErrorFlag = hHeaderData->frameErrorFlag; } // sbr_dec() /*! \brief Creates sbr decoder structure \return errorCode, 0 if successful */ SBR_ERROR createSbrDec (SBR_CHANNEL * hSbrChannel, HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ TRANSPOSER_SETTINGS *pSettings, const int downsampleFac, /*!< Downsampling factor */ const UINT qmfFlags, /*!< flags -> 1: HQ/LP selector, 2: CLDFB */ const UINT flags, const int overlap, int chan) /*!< Channel for which to assign buffers etc. */ { SBR_ERROR err = SBRDEC_OK; int timeSlots = hHeaderData->numberTimeSlots; /* Number of SBR slots per frame */ int noCols = timeSlots * hHeaderData->timeStep; /* Number of QMF slots per frame */ HANDLE_SBR_DEC hs = &(hSbrChannel->SbrDec); /* Initialize scale factors */ hs->sbrScaleFactor.ov_lb_scale = 0; hs->sbrScaleFactor.ov_hb_scale = 0; hs->sbrScaleFactor.hb_scale = 0; /* create envelope calculator */ err = createSbrEnvelopeCalc (&hs->SbrCalculateEnvelope, hHeaderData, chan, flags); if (err != SBRDEC_OK) { return err; } /* create QMF filter banks */ { int qmfErr; /* Adapted QMF analysis post-twiddles for down-sampled HQ SBR */ const UINT downSampledFlag = (downsampleFac==2) ? QMF_FLAG_DOWNSAMPLED : 0; qmfErr = qmfInitAnalysisFilterBank ( &hs->AnalysiscQMF, hs->anaQmfStates, noCols, hHeaderData->freqBandData.lowSubband, hHeaderData->freqBandData.highSubband, hHeaderData->numberOfAnalysisBands, (qmfFlags & (~QMF_FLAG_KEEP_STATES)) | downSampledFlag ); if (qmfErr != 0) { return SBRDEC_UNSUPPORTED_CONFIG; } } if (hs->pSynQmfStates == NULL) { hs->pSynQmfStates = GetRam_sbr_QmfStatesSynthesis(chan); if (hs->pSynQmfStates == NULL) return SBRDEC_MEM_ALLOC_FAILED; } { int qmfErr; qmfErr = qmfInitSynthesisFilterBank ( &hs->SynthesisQMF, hs->pSynQmfStates, noCols, hHeaderData->freqBandData.lowSubband, hHeaderData->freqBandData.highSubband, (64) / downsampleFac, qmfFlags & (~QMF_FLAG_KEEP_STATES) ); if (qmfErr != 0) { return SBRDEC_UNSUPPORTED_CONFIG; } } initSbrPrevFrameData (&hSbrChannel->prevFrameData, timeSlots); /* create transposer */ err = createLppTransposer (&hs->LppTrans, pSettings, hHeaderData->freqBandData.lowSubband, hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, hs->SynthesisQMF.usb, timeSlots, hs->AnalysiscQMF.no_col, hHeaderData->freqBandData.freqBandTableNoise, hHeaderData->freqBandData.nNfb, hHeaderData->sbrProcSmplRate, chan, overlap ); if (err != SBRDEC_OK) { return err; } /* The CLDFB does not have overlap */ if ((qmfFlags & QMF_FLAG_CLDFB) == 0) { if (hs->pSbrOverlapBuffer == NULL) { hs->pSbrOverlapBuffer = GetRam_sbr_OverlapBuffer(chan); if (hs->pSbrOverlapBuffer == NULL) { return SBRDEC_MEM_ALLOC_FAILED; } } else { /* Clear overlap buffer */ FDKmemclear( hs->pSbrOverlapBuffer, sizeof(FIXP_DBL) * 2 * (6) * (64) ); } } /* assign qmf time slots */ assignTimeSlots( &hSbrChannel->SbrDec, hHeaderData->numberTimeSlots * hHeaderData->timeStep, qmfFlags & QMF_FLAG_LP); return err; } /*! \brief Delete sbr decoder structure \return errorCode, 0 if successful */ int deleteSbrDec (SBR_CHANNEL * hSbrChannel) { HANDLE_SBR_DEC hs = &hSbrChannel->SbrDec; deleteSbrEnvelopeCalc (&hs->SbrCalculateEnvelope); /* delete QMF filter states */ if (hs->pSynQmfStates != NULL) { FreeRam_sbr_QmfStatesSynthesis(&hs->pSynQmfStates); } if (hs->pSbrOverlapBuffer != NULL) { FreeRam_sbr_OverlapBuffer(&hs->pSbrOverlapBuffer); } return 0; } /*! \brief resets sbr decoder structure \return errorCode, 0 if successful */ SBR_ERROR resetSbrDec (HANDLE_SBR_DEC hSbrDec, HANDLE_SBR_HEADER_DATA hHeaderData, HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, const int useLP, const int downsampleFac ) { SBR_ERROR sbrError = SBRDEC_OK; int old_lsb = hSbrDec->SynthesisQMF.lsb; int new_lsb = hHeaderData->freqBandData.lowSubband; int l, startBand, stopBand, startSlot, size; int source_scale, target_scale, delta_scale, target_lsb, target_usb, reserve; FIXP_DBL maxVal; /* overlapBuffer point to first (6) slots */ FIXP_DBL **OverlapBufferReal = hSbrDec->QmfBufferReal; FIXP_DBL **OverlapBufferImag = hSbrDec->QmfBufferImag; /* assign qmf time slots */ assignTimeSlots( hSbrDec, hHeaderData->numberTimeSlots * hHeaderData->timeStep, useLP); resetSbrEnvelopeCalc (&hSbrDec->SbrCalculateEnvelope); hSbrDec->SynthesisQMF.lsb = hHeaderData->freqBandData.lowSubband; hSbrDec->SynthesisQMF.usb = fixMin((INT)hSbrDec->SynthesisQMF.no_channels, (INT)hHeaderData->freqBandData.highSubband); hSbrDec->AnalysiscQMF.lsb = hSbrDec->SynthesisQMF.lsb; hSbrDec->AnalysiscQMF.usb = hSbrDec->SynthesisQMF.usb; /* The following initialization of spectral data in the overlap buffer is required for dynamic x-over or a change of the start-freq for 2 reasons: 1. If the lowband gets _wider_, unadjusted data would remain 2. If the lowband becomes _smaller_, the highest bands of the old lowband must be cleared because the whitening would be affected */ startBand = old_lsb; stopBand = new_lsb; startSlot = hHeaderData->timeStep * (hPrevFrameData->stopPos - hHeaderData->numberTimeSlots); size = fixMax(0,stopBand-startBand); /* keep already adjusted data in the x-over-area */ if (!useLP) { for (l=startSlot; lLppTrans.pSettings->overlap; l++) { FDKmemclear(&OverlapBufferReal[l][startBand], size*sizeof(FIXP_DBL)); FDKmemclear(&OverlapBufferImag[l][startBand], size*sizeof(FIXP_DBL)); } } else for (l=startSlot; lLppTrans.pSettings->overlap ; l++) { FDKmemclear(&OverlapBufferReal[l][startBand], size*sizeof(FIXP_DBL)); } /* reset LPC filter states */ startBand = fixMin(old_lsb,new_lsb); stopBand = fixMax(old_lsb,new_lsb); size = fixMax(0,stopBand-startBand); FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesReal[0][startBand], size*sizeof(FIXP_DBL)); FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesReal[1][startBand], size*sizeof(FIXP_DBL)); if (!useLP) { FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImag[0][startBand], size*sizeof(FIXP_DBL)); FDKmemclear(&hSbrDec->LppTrans.lpcFilterStatesImag[1][startBand], size*sizeof(FIXP_DBL)); } /* Rescale already processed spectral data between old and new x-over frequency. This must be done because of the separate scalefactors for lowband and highband. */ startBand = fixMin(old_lsb,new_lsb); stopBand = fixMax(old_lsb,new_lsb); if (new_lsb > old_lsb) { /* The x-over-area was part of the highband before and will now belong to the lowband */ source_scale = hSbrDec->sbrScaleFactor.ov_hb_scale; target_scale = hSbrDec->sbrScaleFactor.ov_lb_scale; target_lsb = 0; target_usb = old_lsb; } else { /* The x-over-area was part of the lowband before and will now belong to the highband */ source_scale = hSbrDec->sbrScaleFactor.ov_lb_scale; target_scale = hSbrDec->sbrScaleFactor.ov_hb_scale; /* jdr: The values old_lsb and old_usb might be wrong because the previous frame might have been "upsamling". */ target_lsb = hSbrDec->SynthesisQMF.lsb; target_usb = hSbrDec->SynthesisQMF.usb; } /* Shift left all samples of the x-over-area as much as possible An unnecessary coarse scale could cause ov_lb_scale or ov_hb_scale to be adapted and the accuracy in the next frame would seriously suffer! */ maxVal = maxSubbandSample( OverlapBufferReal, (useLP) ? NULL : OverlapBufferImag, startBand, stopBand, 0, startSlot); reserve = CntLeadingZeros(maxVal)-1; reserve = fixMin(reserve,DFRACT_BITS-1-source_scale); rescaleSubbandSamples( OverlapBufferReal, (useLP) ? NULL : OverlapBufferImag, startBand, stopBand, 0, startSlot, reserve); source_scale += reserve; delta_scale = target_scale - source_scale; if (delta_scale > 0) { /* x-over-area is dominant */ delta_scale = -delta_scale; startBand = target_lsb; stopBand = target_usb; if (new_lsb > old_lsb) { /* The lowband has to be rescaled */ hSbrDec->sbrScaleFactor.ov_lb_scale = source_scale; } else { /* The highband has be be rescaled */ hSbrDec->sbrScaleFactor.ov_hb_scale = source_scale; } } FDK_ASSERT(startBand <= stopBand); if (!useLP) { for (l=0; lLppTrans, hHeaderData->freqBandData.lowSubband, hHeaderData->freqBandData.v_k_master, hHeaderData->freqBandData.numMaster, hHeaderData->freqBandData.freqBandTableNoise, hHeaderData->freqBandData.nNfb, hHeaderData->freqBandData.highSubband, hHeaderData->sbrProcSmplRate); if (sbrError != SBRDEC_OK) return sbrError; sbrError = ResetLimiterBands ( hHeaderData->freqBandData.limiterBandTable, &hHeaderData->freqBandData.noLimiterBands, hHeaderData->freqBandData.freqBandTable[0], hHeaderData->freqBandData.nSfb[0], hSbrDec->LppTrans.pSettings->patchParam, hSbrDec->LppTrans.pSettings->noOfPatches, hHeaderData->bs_data.limiterBands); return sbrError; } fdk-aac-0.1.3/documentation/0000755000175000017500000000000012372262444016262 5ustar00tootstoots00000000000000fdk-aac-0.1.3/documentation/aacDecoder.pdf0000644000175000017500000207524412144411136020774 0ustar00tootstoots00000000000000%PDF-1.4 %ĐÔĹŘ 1 0 obj << /S /GoTo /D (chapter.1) >> endobj 4 0 obj (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) endobj 5 0 obj << /S /GoTo /D (section.1.1) >> endobj 8 0 obj (\376\377\000S\000c\000o\000p\000e) endobj 9 0 obj << /S /GoTo /D (section.1.2) >> endobj 12 0 obj (\376\377\000D\000e\000c\000o\000d\000e\000r\000\040\000B\000a\000s\000i\000c\000s) endobj 13 0 obj << /S /GoTo /D (chapter.2) >> endobj 16 0 obj (\376\377\000L\000i\000b\000r\000a\000r\000y\000\040\000U\000s\000a\000g\000e) endobj 17 0 obj << /S /GoTo /D (section.2.1) >> endobj 20 0 obj (\376\377\000A\000P\000I\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 21 0 obj << /S /GoTo /D (section.2.2) >> endobj 24 0 obj (\376\377\000C\000a\000l\000l\000i\000n\000g\000\040\000S\000e\000q\000u\000e\000n\000c\000e) endobj 25 0 obj << /S /GoTo /D (section.2.3) >> endobj 28 0 obj (\376\377\000B\000u\000f\000f\000e\000r\000\040\000S\000y\000s\000t\000e\000m) endobj 29 0 obj << /S /GoTo /D (chapter.3) >> endobj 32 0 obj (\376\377\000D\000e\000c\000o\000d\000e\000r\000\040\000a\000u\000d\000i\000o\000\040\000o\000u\000t\000p\000u\000t) endobj 33 0 obj << /S /GoTo /D (section.3.1) >> endobj 36 0 obj (\376\377\000O\000b\000t\000a\000i\000n\000i\000n\000g\000\040\000c\000h\000a\000n\000n\000e\000l\000\040\000m\000a\000p\000p\000i\000n\000g\000\040\000i\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n) endobj 37 0 obj << /S /GoTo /D (section.3.2) >> endobj 40 0 obj (\376\377\000C\000h\000a\000n\000g\000i\000n\000g\000\040\000t\000h\000e\000\040\000a\000u\000d\000i\000o\000\040\000o\000u\000t\000p\000u\000t\000\040\000f\000o\000r\000m\000a\000t) endobj 41 0 obj << /S /GoTo /D (section.3.3) >> endobj 44 0 obj (\376\377\000C\000h\000a\000n\000n\000e\000l\000\040\000m\000a\000p\000p\000i\000n\000g\000\040\000e\000x\000a\000m\000p\000l\000e\000s) endobj 45 0 obj << /S /GoTo /D (subsection.3.3.1) >> endobj 48 0 obj (\376\377\000S\000t\000e\000r\000e\000o) endobj 49 0 obj << /S /GoTo /D (subsection.3.3.2) >> endobj 52 0 obj (\376\377\000S\000u\000r\000r\000o\000u\000n\000d\000\040\0005\000.\0001) endobj 53 0 obj << /S /GoTo /D (subsection.3.3.3) >> endobj 56 0 obj (\376\377\000A\000R\000I\000B\000\040\000c\000o\000d\000i\000n\000g\000\040\000m\000o\000d\000e\000\040\0002\000/\0001) endobj 57 0 obj << /S /GoTo /D (chapter.4) >> endobj 60 0 obj (\376\377\000C\000o\000m\000m\000a\000n\000d\000-\000l\000i\000n\000e\000\040\000U\000s\000a\000g\000e) endobj 61 0 obj << /S /GoTo /D (section.4.1) >> endobj 64 0 obj (\376\377\000A\000r\000g\000u\000m\000e\000n\000t\000s) endobj 65 0 obj << /S /GoTo /D (subsection.4.1.1) >> endobj 68 0 obj (\376\377\000M\000a\000n\000d\000a\000t\000o\000r\000y\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000s) endobj 69 0 obj << /S /GoTo /D (subsection.4.1.2) >> endobj 72 0 obj (\376\377\000O\000p\000t\000i\000o\000n\000a\000l\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000s) endobj 73 0 obj << /S /GoTo /D (chapter.5) >> endobj 76 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) endobj 77 0 obj << /S /GoTo /D (section.5.1) >> endobj 80 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t) endobj 81 0 obj << /S /GoTo /D (chapter.6) >> endobj 84 0 obj (\376\377\000F\000i\000l\000e\000\040\000I\000n\000d\000e\000x) endobj 85 0 obj << /S /GoTo /D (section.6.1) >> endobj 88 0 obj (\376\377\000F\000i\000l\000e\000\040\000L\000i\000s\000t) endobj 89 0 obj << /S /GoTo /D (chapter.7) >> endobj 92 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 93 0 obj << /S /GoTo /D (section.7.1) >> endobj 96 0 obj (\376\377\000C\000S\000t\000r\000e\000a\000m\000I\000n\000f\000o\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 97 0 obj << /S /GoTo /D (subsection.7.1.1) >> endobj 100 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 101 0 obj << /S /GoTo /D (subsection.7.1.2) >> endobj 104 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 105 0 obj << /S /GoTo /D (subsubsection.7.1.2.1) >> endobj 108 0 obj (\376\377\000a\000a\000c\000S\000a\000m\000p\000l\000e\000R\000a\000t\000e) endobj 109 0 obj << /S /GoTo /D (subsubsection.7.1.2.2) >> endobj 112 0 obj (\376\377\000a\000a\000c\000S\000a\000m\000p\000l\000e\000s\000P\000e\000r\000F\000r\000a\000m\000e) endobj 113 0 obj << /S /GoTo /D (subsubsection.7.1.2.3) >> endobj 116 0 obj (\376\377\000a\000o\000t) endobj 117 0 obj << /S /GoTo /D (subsubsection.7.1.2.4) >> endobj 120 0 obj (\376\377\000b\000i\000t\000R\000a\000t\000e) endobj 121 0 obj << /S /GoTo /D (subsubsection.7.1.2.5) >> endobj 124 0 obj (\376\377\000c\000h\000a\000n\000n\000e\000l\000C\000o\000n\000f\000i\000g) endobj 125 0 obj << /S /GoTo /D (subsubsection.7.1.2.6) >> endobj 128 0 obj (\376\377\000e\000p\000C\000o\000n\000f\000i\000g) endobj 129 0 obj << /S /GoTo /D (subsubsection.7.1.2.7) >> endobj 132 0 obj (\376\377\000e\000x\000t\000A\000o\000t) endobj 133 0 obj << /S /GoTo /D (subsubsection.7.1.2.8) >> endobj 136 0 obj (\376\377\000e\000x\000t\000S\000a\000m\000p\000l\000i\000n\000g\000R\000a\000t\000e) endobj 137 0 obj << /S /GoTo /D (subsubsection.7.1.2.9) >> endobj 140 0 obj (\376\377\000f\000l\000a\000g\000s) endobj 141 0 obj << /S /GoTo /D (subsubsection.7.1.2.10) >> endobj 144 0 obj (\376\377\000f\000r\000a\000m\000e\000S\000i\000z\000e) endobj 145 0 obj << /S /GoTo /D (subsubsection.7.1.2.11) >> endobj 148 0 obj (\376\377\000n\000u\000m\000B\000a\000d\000A\000c\000c\000e\000s\000s\000U\000n\000i\000t\000s) endobj 149 0 obj << /S /GoTo /D (subsubsection.7.1.2.12) >> endobj 152 0 obj (\376\377\000n\000u\000m\000B\000a\000d\000B\000y\000t\000e\000s) endobj 153 0 obj << /S /GoTo /D (subsubsection.7.1.2.13) >> endobj 156 0 obj (\376\377\000n\000u\000m\000C\000h\000a\000n\000n\000e\000l\000s) endobj 157 0 obj << /S /GoTo /D (subsubsection.7.1.2.14) >> endobj 160 0 obj (\376\377\000n\000u\000m\000L\000o\000s\000t\000A\000c\000c\000e\000s\000s\000U\000n\000i\000t\000s) endobj 161 0 obj << /S /GoTo /D (subsubsection.7.1.2.15) >> endobj 164 0 obj (\376\377\000n\000u\000m\000T\000o\000t\000a\000l\000A\000c\000c\000e\000s\000s\000U\000n\000i\000t\000s) endobj 165 0 obj << /S /GoTo /D (subsubsection.7.1.2.16) >> endobj 168 0 obj (\376\377\000n\000u\000m\000T\000o\000t\000a\000l\000B\000y\000t\000e\000s) endobj 169 0 obj << /S /GoTo /D (subsubsection.7.1.2.17) >> endobj 172 0 obj (\376\377\000p\000C\000h\000a\000n\000n\000e\000l\000I\000n\000d\000i\000c\000e\000s) endobj 173 0 obj << /S /GoTo /D (subsubsection.7.1.2.18) >> endobj 176 0 obj (\376\377\000p\000C\000h\000a\000n\000n\000e\000l\000T\000y\000p\000e) endobj 177 0 obj << /S /GoTo /D (subsubsection.7.1.2.19) >> endobj 180 0 obj (\376\377\000p\000r\000o\000f\000i\000l\000e) endobj 181 0 obj << /S /GoTo /D (subsubsection.7.1.2.20) >> endobj 184 0 obj (\376\377\000s\000a\000m\000p\000l\000e\000R\000a\000t\000e) endobj 185 0 obj << /S /GoTo /D (chapter.8) >> endobj 188 0 obj (\376\377\000F\000i\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 189 0 obj << /S /GoTo /D (section.8.1) >> endobj 192 0 obj (\376\377\000a\000a\000c\000d\000e\000c\000o\000d\000e\000r\000\137\000l\000i\000b\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 193 0 obj << /S /GoTo /D (subsection.8.1.1) >> endobj 196 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 197 0 obj << /S /GoTo /D (subsection.8.1.2) >> endobj 200 0 obj (\376\377\000D\000e\000f\000i\000n\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 201 0 obj << /S /GoTo /D (subsubsection.8.1.2.1) >> endobj 204 0 obj (\376\377\000A\000A\000C\000D\000E\000C\000\137\000C\000L\000R\000H\000I\000S\000T) endobj 205 0 obj << /S /GoTo /D (subsubsection.8.1.2.2) >> endobj 208 0 obj (\376\377\000A\000A\000C\000D\000E\000C\000\137\000C\000O\000N\000C\000E\000A\000L) endobj 209 0 obj << /S /GoTo /D (subsubsection.8.1.2.3) >> endobj 212 0 obj (\376\377\000A\000A\000C\000D\000E\000C\000\137\000F\000L\000U\000S\000H) endobj 213 0 obj << /S /GoTo /D (subsubsection.8.1.2.4) >> endobj 216 0 obj (\376\377\000A\000A\000C\000D\000E\000C\000\137\000I\000N\000T\000R) endobj 217 0 obj << /S /GoTo /D (subsubsection.8.1.2.5) >> endobj 220 0 obj (\376\377\000I\000S\000\137\000D\000E\000C\000O\000D\000E\000\137\000E\000R\000R\000O\000R) endobj 221 0 obj << /S /GoTo /D (subsubsection.8.1.2.6) >> endobj 224 0 obj (\376\377\000I\000S\000\137\000I\000N\000I\000T\000\137\000E\000R\000R\000O\000R) endobj 225 0 obj << /S /GoTo /D (subsubsection.8.1.2.7) >> endobj 228 0 obj (\376\377\000I\000S\000\137\000O\000U\000T\000P\000U\000T\000\137\000V\000A\000L\000I\000D) endobj 229 0 obj << /S /GoTo /D (subsection.8.1.3) >> endobj 232 0 obj (\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 233 0 obj << /S /GoTo /D (subsubsection.8.1.3.1) >> endobj 236 0 obj (\376\377\000H\000A\000N\000D\000L\000E\000\137\000A\000A\000C\000D\000E\000C\000O\000D\000E\000R) endobj 237 0 obj << /S /GoTo /D (subsection.8.1.4) >> endobj 240 0 obj (\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000\040\000T\000y\000p\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 241 0 obj << /S /GoTo /D (subsubsection.8.1.4.1) >> endobj 244 0 obj (\376\377\000A\000A\000C\000\137\000D\000E\000C\000O\000D\000E\000R\000\137\000E\000R\000R\000O\000R) endobj 245 0 obj << /S /GoTo /D (subsubsection.8.1.4.2) >> endobj 248 0 obj (\376\377\000A\000A\000C\000D\000E\000C\000\137\000P\000A\000R\000A\000M) endobj 249 0 obj << /S /GoTo /D (subsection.8.1.5) >> endobj 252 0 obj (\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 253 0 obj << /S /GoTo /D (subsubsection.8.1.5.1) >> endobj 256 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000A\000n\000c\000D\000a\000t\000a\000G\000e\000t) endobj 257 0 obj << /S /GoTo /D (subsubsection.8.1.5.2) >> endobj 260 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000A\000n\000c\000D\000a\000t\000a\000I\000n\000i\000t) endobj 261 0 obj << /S /GoTo /D (subsubsection.8.1.5.3) >> endobj 264 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000C\000l\000o\000s\000e) endobj 265 0 obj << /S /GoTo /D (subsubsection.8.1.5.4) >> endobj 268 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000C\000o\000n\000f\000i\000g\000R\000a\000w) endobj 269 0 obj << /S /GoTo /D (subsubsection.8.1.5.5) >> endobj 272 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000D\000e\000c\000o\000d\000e\000F\000r\000a\000m\000e) endobj 273 0 obj << /S /GoTo /D (subsubsection.8.1.5.6) >> endobj 276 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000F\000i\000l\000l) endobj 277 0 obj << /S /GoTo /D (subsubsection.8.1.5.7) >> endobj 280 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000G\000e\000t\000F\000r\000e\000e\000B\000y\000t\000e\000s) endobj 281 0 obj << /S /GoTo /D (subsubsection.8.1.5.8) >> endobj 284 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000G\000e\000t\000L\000i\000b\000I\000n\000f\000o) endobj 285 0 obj << /S /GoTo /D (subsubsection.8.1.5.9) >> endobj 288 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000G\000e\000t\000S\000t\000r\000e\000a\000m\000I\000n\000f\000o) endobj 289 0 obj << /S /GoTo /D (subsubsection.8.1.5.10) >> endobj 292 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000O\000p\000e\000n) endobj 293 0 obj << /S /GoTo /D (subsubsection.8.1.5.11) >> endobj 296 0 obj (\376\377\000a\000a\000c\000D\000e\000c\000o\000d\000e\000r\000\137\000S\000e\000t\000P\000a\000r\000a\000m) endobj 297 0 obj << /S /GoTo /D (section.8.2) >> endobj 300 0 obj (\376\377\000m\000a\000i\000n\000.\000c\000p\000p\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 301 0 obj << /S /GoTo /D (subsection.8.2.1) >> endobj 304 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 305 0 obj << /S /GoTo /D (subsection.8.2.2) >> endobj 308 0 obj (\376\377\000D\000e\000f\000i\000n\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 309 0 obj << /S /GoTo /D (subsubsection.8.2.2.1) >> endobj 312 0 obj (\376\377\000A\000N\000C\000\137\000B\000U\000F\000\137\000S\000I\000Z\000E) endobj 313 0 obj << /S /GoTo /D (subsubsection.8.2.2.2) >> endobj 316 0 obj (\376\377\000F\000I\000L\000E\000\137\000N\000A\000M\000E\000\137\000M\000A\000X) endobj 317 0 obj << /S /GoTo /D (subsubsection.8.2.2.3) >> endobj 320 0 obj (\376\377\000I\000N\000\137\000B\000U\000F\000\137\000S\000I\000Z\000E) endobj 321 0 obj << /S /GoTo /D (subsubsection.8.2.2.4) >> endobj 324 0 obj (\376\377\000N\000\137\000F\000L\000U\000S\000H\000\137\000F\000R\000A\000M\000E\000S) endobj 325 0 obj << /S /GoTo /D (subsubsection.8.2.2.5) >> endobj 328 0 obj (\376\377\000N\000O\000\137\000F\000I\000L\000E\000N\000A\000M\000E) endobj 329 0 obj << /S /GoTo /D (subsubsection.8.2.2.6) >> endobj 332 0 obj (\376\377\000O\000U\000T\000\137\000B\000U\000F\000\137\000S\000I\000Z\000E) endobj 333 0 obj << /S /GoTo /D (subsection.8.2.3) >> endobj 336 0 obj (\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 337 0 obj << /S /GoTo /D (subsubsection.8.2.3.1) >> endobj 340 0 obj (\376\377\000m\000a\000i\000n) endobj 341 0 obj << /S /GoTo /D (subsection.8.2.4) >> endobj 344 0 obj (\376\377\000V\000a\000r\000i\000a\000b\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 345 0 obj << /S /GoTo /D (subsubsection.8.2.4.1) >> endobj 348 0 obj (\376\377\000a\000n\000c\000B\000u\000f\000f\000e\000r) endobj 349 0 obj << /S /GoTo /D (subsubsection.8.2.4.2) >> endobj 352 0 obj (\376\377\000a\000n\000c\000F\000i\000l\000e\000n\000a\000m\000e) endobj 353 0 obj << /S /GoTo /D (subsubsection.8.2.4.3) >> endobj 356 0 obj (\376\377\000c\000o\000n\000f) endobj 357 0 obj << /S /GoTo /D (subsubsection.8.2.4.4) >> endobj 360 0 obj (\376\377\000c\000o\000n\000f\000\137\000m\000e\000m) endobj 361 0 obj << /S /GoTo /D (subsubsection.8.2.4.5) >> endobj 364 0 obj (\376\377\000c\000o\000n\000f\000S\000i\000z\000e) endobj 365 0 obj << /S /GoTo /D (subsubsection.8.2.4.6) >> endobj 368 0 obj (\376\377\000c\000o\000n\000f\000S\000t\000r\000i\000n\000g) endobj 369 0 obj << /S /GoTo /D (subsubsection.8.2.4.7) >> endobj 372 0 obj (\376\377\000i\000n\000B\000u\000f\000f\000e\000r) endobj 373 0 obj << /S /GoTo /D (subsubsection.8.2.4.8) >> endobj 376 0 obj (\376\377\000i\000n\000B\000u\000f\000f\000e\000r\000\137\000m\000e\000m) endobj 377 0 obj << /S /GoTo /D (subsubsection.8.2.4.9) >> endobj 380 0 obj (\376\377\000i\000n\000p\000u\000t\000F\000i\000l\000e\000n\000a\000m\000e) endobj 381 0 obj << /S /GoTo /D (subsubsection.8.2.4.10) >> endobj 384 0 obj (\376\377\000o\000u\000t\000p\000u\000t\000F\000i\000l\000e\000n\000a\000m\000e) endobj 385 0 obj << /S /GoTo /D (subsubsection.8.2.4.11) >> endobj 388 0 obj (\376\377\000T\000i\000m\000e\000D\000a\000t\000a) endobj 389 0 obj << /S /GoTo /D [390 0 R /Fit ] >> endobj 394 0 obj << /Length 956 /Filter /FlateDecode >> stream xÚ…VKsŰ6ľëWđHÎTľÄŢ\KIÜq;i­[Ó‚"Z`AĐŠűë»x’5Ď‹}|űÄÂ(8(xżB˙óMŕI˘$΢¬â*ÉÚŻţYˇe8µň+ŇŠr„3Ě’jfožú$ŘÉŐođ7Ă®îú ř§Ăjóăgqą-“ŕĐ ňmçIęŕŹđˇ~ŤAY­qŽÂ‡~¦šKw|”5'Gď•5SŃź‡źÁ%8ŚQę`žůQőf$ŕ1…`ă4+°ńŠyWŘ;üĺăţý;<"ĽOËĚf\śB>Ľ‡(śÖłŚpž×ʞ:%yř™ë7'ű„rä•×ĎŹpJ~¸óxř©]ďó !L9Ôy”wŻřýażţBöµ‹oDĽcąčΡ,ĹřÜ^´WŤúřޡ߫B}飝Źm\E曕¤yś¦ľ[ď™D+P¶žÄ¨ąžô|Ňě¤8Sš9Ć mI§'qbÂk<˝,EJP\ĺŐ·q=ŽmT×^žó~ä*J¶!ť¸/ËäÝćrĺ˛Őzřqł9źĎQ‘‡1çcÜ\˘ČUł éűűU)ЏŘz¤iGxżTđKŻ xÍťî“h¤ę‰ć*’–iČýW·|tT-éÔ3ˇ˝ÜsÇéřŁž©ĄűByŁ$„ňşă™ëVN^GHÍ)‹#łBsEŕl„áĘP Ň/´˝ui‰Ăšhâl§‘Ő·áąëEĚE—^ĺŐ2ŸmrĹaŻô‘ËitśI€˝§ĄŁ3˝2ÄËj7ĹEřQÉz˘ÚĂą­‡TŞAšĆ{“#{7đyxô2­HÍz˘ţž})÷U6Ź5Ä[Ą{'1Ůd.ZGŇą¦¸Ű$<´Ěď #µŮâRÄFzKWš#b™@Ý›AŰŽÜ6Ń „ś{ ý8dľóđ{ůşÎń,4=zšŤL˝—¶°FďWo>Ąo˛-®˛ĹxžFś„Ătě8ťĂ‘­µ!L­Ť†bm—Íř6YŕOšwüߙ˽9s­@ĹÜ…k#ő’+5pÉ0ÓšÂ"c M“‚Ó[ŰžÁ}.éŚnZOÚMöąşÓء•ZR9çîmyŇ–'¨çTI3Ŕ]ďňr»Ěa`Şçăh«bÎÜĎ Ć}k”ěĂăíL9ÇÖo×ň˙€]đVćil\Â+YŔŽËŢzôďĚlÂW~qŚcxĚéă|afýq^Ą¸ô|Ś|ăpXý[ŔG4 endstream endobj 390 0 obj << /Type /Page /Contents 394 0 R /Resources 393 0 R /MediaBox [0 0 595.276 841.89] /Parent 398 0 R /Group 392 0 R >> endobj 391 0 obj << /Type /XObject /Subtype /Image /Width 5000 /Height 1419 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 399 0 R /Length 111531 /Filter /FlateDecode >> stream xÚěÝ{pÖőďńß+MI¦É@BBGÇŮî®ăŘžngÝž¶{ěi»;mÇqę´łNwěgŻ€L€$$䆲őÂ%@®OňvŽšŃXÜżľ0¨ÉżfîCw=˙č„WVą:˝śŐ‰$IŇź—Ű\‘ŃXŇŻ®ŕşE57Ż}ý’xÓ«k]ţ`—*I’ôge6ŤÍh,ţŢÂęoΛ¸îĐwE€?g~"I’zy9ÍىňA‰˛đĎ~xŇ•3Ç<ů["Ŕ_2E‘$I˝|”š—¬Ľrćř+fÜwŐśÎwt¸ü5Ö(’$©w–Ű\1(QÔŚüů˛äésí]ą|›I’Ô«ĘKVŤé__Lş;őcNž8~şÍť Ć)’$©÷Ô§vT0ńŽŻŻß~ěЦ#űʶťtHť}Š$IŠvąÍeAu~0mÄăoo[ńű§Îµ»|¶*’$)’ĺ%+3‹;ç¨SďÉN”?ňćć0w?€ĎĂhE’$Eo‘šÖPLúżU×m}iĘć缱ѭŕó3]‘$IŃ(·ą˘}ażş‚`Ęđ–&ňW?¶rßN—=€ ȆE’$őôrš+ŇŠúŐüę™9w=˙čMËgn9zŔ5ŕ‚łd‘$I=ôí¨eŤ%é±âń˛_<5ý§O6v¸Ű\LV-’$©Ç•ť(˙JcÉ•3Ç_·¨ć;ŹN˝qY˛ű\®vĽŘ *ĂI’ÔSĘI”g'ĘĆË®ś9>·ą˘tí˛nrˇ:}®ýHۇGŰNn9z ¨é† D•…‹$Ię)ĺ%+‡$Çő­ݰmM7ąJťďč8×q~ÖŽ Á´ŮÍfĂż§&U.’$©ű—ŃXTçŻ;´§ĺěégNť9®›\ĄĆ˙ƒ+fÜ—ť(Ďi®Čůčoë† D•ť‹$IęŽ%+łâĄýę úÔŽJŹď<~äíďťë8ß}.Qw=˙č5súűY˙ťŮ4¶ë5©Ę *łI’Ô­ĘKV¦ÇŠIwwá´Ť‡ß Űtd·ş>ýňéY?y˘ńňé÷†ĎA‰˛Üżřn@TżH’¤n2Gí[7:¨Î&Ü~Óň™Oî~µ[ÍQʶťüŮŇć[žť–Ů46­ˇčc©v©@´YÁH’¤/Ľ fd0éîҵËfíŘаmÍŽ÷wźËŇ–Łn{îá›W̦Ť¸¬ľ ,ço}7L Ş a$IŇP˛2+^Ú§vTç"µfä˝ëź®|ůéÖö3ÝęšôÂţ·ÂżŐŤË’Áäˇýë ó’•)~:7L Şěb$IŇ%+/Y™ŃXrY}AP3ňŠ÷­YR¸ćɰîvAZľ÷őäö—˙maM0éî´†˘Ô©v©@´ČH’¤Kó‚ÔŚĆ’>µŁţő‘)·<;ď¦ĺ3Úř\w»=µgűň˝Ż‡]9s|P5,ü ÚEŞ]*mf2’$颖Ů46,­ˇč;ŹN˝vAŐŇÝŻu·ëĐ©ööµ÷,ßűz0őž &?,+^:ř3-RíR€h3–‘$IŁśćŠń˛A‰˛kT}ű‘)WÎżĺčîvj9{úíďÍycC0éÎËę r/ĐgwâĘjF’$]đEjN˘nP˘,;Qžsqľ7L ŞLi$IŇç©oÝč`ŇťłvlŘyüČöc‡Ž¶ťě†žÓçÚŻ]PuݢšśDyVĽ4üó˘~'n@TYÓH’¤OűvÔ¬xiPťßŮ´KwżöÂţ·Nµ·wĂ{ÎşC{®[X󋧦˙ôÉƱ1Ť%9—ä+râʸF’$ĄŇ丱1ť[ÔŞa_›őëÇß޶x×ÖîyĂ ˙n7-źůĂÇęÂżpZCQř7Ď˝„ß•&UV6’$é“ËKVöŻ/ &Ýyý’xÓ«kk¶üféî׺íÝfĆëë ×<ůŻŹL ¦Ţ“+˙ň—ţsâĘÖF’$ýµúŐô­Lţ«gć®yrĂá}ÝöJSłĺ7u[_ »rćř`ę=Ť%_Č"Ő.6‹I’ô§r›+ĆËú׆Ą5ÝőüŁ#V/ţ?ĎĚŮ÷áńîy“im?3kdžÄkë‚i#‚ęü°¬xéŕ/n‘j— D›Ž$Iś¬ĚŠ—¦ÇŠżT_xĹŚű~ůô¬›–ĎüŻłşíf߇ÇWü~Ç űßš˛ůĹ`âAÍČnő}şaQe‰#I’¤¦ÇŠŻ™űĐŹŻ˙ö#SŠÖ,éÎW—˝-ďo9zŕ¶ç&ÜÔŚĽ¬ľ ď‹~;Ş]*Đ{ŘăH’Ô;ËN”‡eĹKŻšó@^˘bŢ»ůĄĺHۇO~đŹ7S†g6Ťí†sT»T ň¬r$Ięť]1ăľ°ţő…/ŘÝm/*ç;:Nťk?ýQWĎ}p@lLv˘Ľű·n@TYĺH’ÔKĘýč©™Mc3KÂ˙yěTk[űٰóÝö˘˛óř‘Ż4–\9s|Xř÷Ďé!_µ&UF:’$E»ĽdeFcÉeőÁ”á˙ţxĂ“'žü ›_QV˝óćW›+Ż™űPVĽ4;QŢ#^“j— DžµŽ$IŃ,YŮŻ® ¨<±ţÝ˝Ek–ÝÔŚě[;z°·Ł~\9ÍáďžŃXüĹu˙˛`ňöc‡\&€^ĹŔD’¤Ô”( ËlűŹłďżvAŐUsČ_ýXĎ˝<ůÁŢ–÷÷}xü—OĎ &Ýť+Î3Gýë‹Ôń˛đĎđwżzî-gO»F˝™‰$I©l;K”_9sü×fý:=V<ăőő=ôŃľŁŁĺěé®®šó@˙úÂŚĆ’ń˛\?ô'€Dy^˛ňŠ÷]» ĘíčÍ,M$Iú› Ś—…ő­˝ĺčöóçĎś?wľŁŁ‡>úwĽx@lĚW§Ź ó˦Rv˘Ľ_]ÁőKâáOćöôfĆ&’$}LÉʬxiZCQźÚQ_›őë#m†˝ŰÚŇs稡•űvćÄË®šóŔŔDYv˘<Ěý  =V€`ňС/, úă§ŰÜ O$IúSyÉĘ®-j0éÎ˙\>cÇű‡·;ôö‰÷zôł~Â+«ľ1Â÷×~cţÄŚĆâń2?ô'”Ű\Ń·nt0ńŽÄkë°í˝GŰNş1t1?‘$),¨TçÝ6ţwĎĽtŕíUYűc=úŰs߸,ůźËgüăěűű×f4g5•ćú­˙úuP˘¬ó L˝gń®­+÷ílm?ă˘đ˙±C‘$őÎ÷˘~Ą±¤s„ř˙šµcĂâ][çľ±ářé¶žţpżuĺüˇ/,Ěl{Y}AZCQVĽtp˛ŇŹţ ‡!ü®‚©÷„†g`á[[ÜţkIRŻZ ¦5uľµjŘ·žÜ°mÍźęéôťÇŹäŻ~¬ňĺ§Ă?ęüľuŁłĺ~ńżyŇcĹáa¸zîu[_šóĆF7C€Of“"IŠ|ąÍW_Đ·vt0eřŤË’÷­_Q´fÉ“»_ŤŔs|ĺľť“6=ß°mÍÍ+f“îjF†ÓŰQS[(Ź ĎĂu‹jÂĂđČ››Ý Ra™"IŠęuP˘ěKő…aýę nyvŢđÝĽbööc‡˘ń_ńű ŢÜt킪`ň]Au~ř1‡$ÇůÝ˙fi Eáw~c?}˛1<+÷ítHť}Š$)J[Ô¬xiFcqXZCŃ丛–Ď űŮŇćh<µĎwt¬zçÍŐűw……6zOfÓŘµŁ˛âĄ^ŤúŮF©C’ăŇcĹw¬ZŕľpˇŘ­H’zĐu`Ľě+Ť%aýë ż>oBkű™®ÎwtDééü˝…Ő_ť~o^˛2'Qîw˙ ç$+^T ˙»gÂłqú\»űŔ…b˝"Ięî%+ÓŠúŐď(\óä;žŰ÷áńC­-Qz"<ůÁßĎúďY09lđG Ü?ý§ě˛ú‚Îs2éÎäö—÷¶Ľßrö´›Ŕ…eĂ"IꞯĽĚN”5#;›t笶=°áđľŁm'#ö ^şűµo=<ůÇOÄ®[T“+Îlf‘úiߢTç÷­˝ćŕî®sŇÚ~Öŕb°g‘$u“†$ÇĄÇŠęüΦޓŃX˛rßΰ§öl?sţ\Äžż^Yuă˛äŻž™óŻŹLé[;z@lLřysOS^˛2üŇ‚)Ăż:ýŢ®Łâ^p±YµH’ľđuażş‚Î-ę¤;ňDăüťŻ„ÍycĂâ][#ůä­|ůé«_9s|P3˛}aFcIř 8źvÂü冢`ň]ßytꬖď}ÝŤŕҰm‘$]âr›+˛ĺAÍČ?6yč]Ď?:eó‹ă÷Ěúw÷FňiŰÚ~¶tí˛7>ÖůNŘšü¬xé`sÔĎ´bî__ž™–&îßđěŞwŢt—¸”,\$I—lQŮ4¶_]AźÚQYńŇҵ˺úÂÂŁm'#ůÝńţáš-żIn9üÁäˇAM~Xv˘<×yř”ĺ4W„'§ó˝şSďąyĹěđĚl:˛ß-ŕŇ3u‘$]Ä’•ŤĹ_n( ëS;ęšąÝöÜĂ·<;Żä·K#ül]{pĎăoo[şűµ_>=+p{Pťß·vtž·Ł~ÖWë¦5…§čÖ•óĂĂóóeÉC­-îo_›IŇĹx»eFcIXZCŃ÷×ް4ö˝…ŐMŻ®Ťđ#uݡ=ëßÝvőÜŞaAuţ€ŘsÔĎĽH”(KŹIŽ»~Iü¦ĺ3ÝŮşËIŇ);Q>0^–/ ˙ű» §…ýÓěűwp,Ѷöł;ŹyűÄ{ëßÝTŹě[;:,ür‰Ďw–2›Ć^9sü7çOĽcŐ·5€îĂřE’ô9_ŤšóŃ«-/ź~ďUsűÚ¬_ű‘)Ń~z¶¶ź9vŞőřé¶ŻŻ&“+v.ÔYşrćřń˛ŠuËÝÓş+IŇçŻOí¨’ß.í=OĎá/.ę[;Úď~1 ŞóŻ­sCčžě_$IźöĄ–bcş ކ-|kËńÓmÇNµ¶µźí ĎÍź/K^>ýŢŻNż7;QŢő~OGₜ¨ :Ăá}]géôąv74€îÉF’ôÉĺ%+3KúÖŽ Şósš+Ţ>ń^W;Źé Â3çĎ}ëáÉß]8-lHr\VĽ4;Qî`|Ţ’•á7TŹĚl»ëÄŃđ,ťďčp1čćěb$ImŽÚŻ® ¨Î&Ü~óŠŮëßݶîĐžMGö÷’GdřyżóčÔ–&~üD,=VśŃXf‘z–ÎĹÁäˇ_ź7!ٸx×Öu‡öDćŘl9zŕçË’7.Kö­ž7L ŞĚd$©—żąr@lLP“ßŮ´YńŇäö—»ŞŮň›–ł§{Ďńţ Ď­YRşvŮ5s żŠ~ué±âđűqH.ČäąOí¨`Ňť#V/î:ZQzGęĘ};‡ż¸čú%ń`ę=i E?:3n@TËHR/ ö«+čS;Şs*X5ěGŹ×?¸ńą°ńż{¦éŐµ˝ę!ŘÚ~&üÔS6żֹϭÎjFf6Ť5G˝Pe'Ę;ŹYu~×ć÷hŰÉ(ťźĹ»¶>´ńąëŐ„˙ŽŇŠţüظaQe2#I˝d‹šť(ď__ÔŚĽuĺüQży<,üŹŐűwő¶gßÎăGŻ­›żó•Ę—ź&ÝÝ9G­Îżç䔬̊—†'­_]AfÓŘđ }aaĎТ][漱ńfý:¨–Ńř1ďŐuâĘ|F’˘<l*–ÖPţ?żzfNŘĎ—%ĎwtôÂGކĂű–ď}}ĺľť7ŻL¸=¨Îď[7Ú«Q/ě‘ËlŰŻ®ŕŞ9„'í—OĎţâ˘(ˇđźM×úrCQ0mDVĽtđ_9?n@TŃHRÄĘj*Íl6 6ćëó&üř‰XŘ÷×ޱjAď|Ňm:˛ËŃaWĎ}0¨ÔŚLŹ›Ł^đňfĹ;GĐß?ńÚUÓ6ŻŽŘ)jm?łáđľÇßŢÖu„ţćŰuÝ0€¨2Ą‘¤ž^NsĹ DYWăeßś?ń_L»|ú˝ówľŇ;źn§ÚŰ÷¶Ľ˙·'6~'¨ŮŻ® ,ürr ]×ÁËŠ—^3÷ˇđČ-޵5bg©ĺěéđ,5˝ş6xÇ—ę S¨ö•ƒ̦±ÉĹD‡vĽôXńĆĂďDň8U¬[Lž/ýTŁf7L ŞĚj$©Ç•űŃK*łâĄa}kG߸,yćüą?ŐŃ‹jĂ_\ô冢˧ß;$9.ÇQąČŁÔŻ4–\1ăľÖöł]ď|GÔŽŢ-ĎÎKʶłä† D•eŤ$ő”`˙ú®‚Iw7˝şöÝÖ–°C­-ÇO·őňgŮ×]=÷ÁoĚźxĹŚűĆ˲ĺ9‰rg梔¬Ěj* ¦ŤřźŹN Źß‘¶#y˘~ňDăUsřęô{ĂăôŮÎn@T™ŘHR÷,/Y™ŃXÔŚü¨üôXń¶÷n?v(lËŃ­ígzůóëPkË7çOüácuaىň̦±YńŇlsÔ‹vżT_Řy'ŢqÓň™áQÜÓr,’çę{ «Ă~äđD}žăä† D•­Ť$u«ő_ßşŃAu~gď¸~I|őţ]a/ěßµćŕnϬЊßďřŃâş›–Ďüń±ţő…ŤĹa9ĎĹ|AjźÚQÁ„ŰÇ˙î™đ(®Ü·s÷\¤ľóá‰=^˙łĄÍbc.ȉňO*‹IúËm®/űă5lŇť÷oxvá[[ÂfíŘ°í˝žS]¦m^}ëĘůĂ_\ôÝ…ÓÂ/ęKő…bc'+ˇ‹w2łĺťg˛jXÝÖ—ÂÓxüt[$ŹÖşC{n^1űĆeÉđæ5]¨/ĐżY ŞLo$éŇżu@lLP3˛łi#Â˙§aŰš®&mzľ­ý¬gS¨ă(ůíŇűÖŻčęŠ÷Őů}kGg4癣^ĚĂ™Ů4¶ódV燧4<“S6żŐ3öÔžíEk–üä‰Ć`Ę𴆢 {®ü˘ĘG’.ÍŰ'/«/č[7:,2ü?o¨|ůé°ŇµË¶­ń0ú“·NĽ7iÓóáw~9áőÇőnÍȬx©·Ł^ěEjFcq0mÄ×çMżüŠuËĂ"ŞÇlá[[j¶üćÚUAŐ°±1céěß2U–8’t‘†¨ăei E]ő«+¸ĺŮyC_Xö˧g­9¸ŰčĎ­;´çáť›ďÚzëĘůÁ„Űęü>µŁĽő•¬Lʇßů÷V˙ę™9sŢŘŐcöČ››Ă36$9.2<ٱäâť1˙¨€¨˛Ç‘¤ 5DÍl›ŃXÜUZCŃ•3Ç˙çň]ݰ4á‰ó—ÖÜóŇ·Ă:ß\9éî :?üކ$Ç9N—¦ŚĆ’đ¬öŻ/üß‹ë~°¨vĺľť‘űöĺË6l "‚Dʦl2˛Ă0ôwĆŻw.*Ea¶×+ďęśóů|ćś3çÓF9ÝřŇ ë¶G4÷®ÉOß7}T ®·ŞsgÂzË\=?ńX|YÚ-7|ëYË-•=‘/´Ů×#š{ë¸Aa:G˛ţĎĚ|?G® ş¦¦.éŻÎ ňúu®ČŞÝçUKŤWşťĘ3~>§´ĹWÝU¶)Đ5’ÝX\ű-•U‘+'ľ,˝.Á¨>˙şčřůł±śŞ>ççČÜ7}ÔmăźüúÄż„ąuÜ]#ŮÝTÔ O÷±9ťĘ3‚Ń}Ó_ť«ŰÓŐç[pŐýřą˘[Ç ęÔK©öR€ĚÂŽČĄéÍíTžŃ®()LŰÂ_.NŢúáÁ='ŽĹ˛óŁŁÇĎźőłă v˙đk˙|ßôQaşŤÍ‰} 5L·F]lµ©í‹“á˝J6Ż K·ęÜ™–]{ßš62¬şîW]Ło@@KemGD¤G4·]QRPĐż6#ůĺܲ ‡öŐĹOŠ«1kÇ˙:}dxčţmf~‡ŇÔNĺa|µQvQ»D˛>)ć‘˝Ăó˛öÝ-{™zo?3ú§łKšTŐ™ @Ke…GDZ]˘ą ™A~â˙˰‡‡®_˛đo[ĂĚŰůÖÖúép•žZ÷Ňľ0î—¦Ü7}TŰÂJSăËŇ»«±ĆűÔo0ćńncsbĹü®-[tů­>°ëWĎWürnYۢKÓšÔé0€–Ę"Ź´†ôŚŠ+Iůd utßŰ' ®|g}]Ęß\ݲ?(YŹŞ/Öô^6#iĺśXľ: ˙MĹI7—Ą÷檴Ƭ푽ż5mäÄ­ëćí|«Ĺ×áě÷6÷Z:ý§łK‚Ľ~JS›`í™@KeŁGDZdşE˛Ű¨K0˛÷ĚŹŽŘđr§Ö˝4mŰó˙ ŮúáÁś5 ÂŁ—´jn0ćńş›P‘é먍řÔ›Š“ÂÚţí‚ńá©yrí»ßnŮuXţćęˇë—„˙Řű¦Ź Főiš©öR€–Í^Ź´Ś˝ř˛ô›Š“biW”ţĎ”UĎ×ĺˇ%Ó69`ćQËöm/sőÄ­ëţkáÄ`xŻ ?±má@ßEmôťëXť‡§ăO‹*ĂÚŢrôý_Šăß^ÖáÍeéA^żđßäżĎkz-•iľéXšÖˇ45L›Âßyfô/M‰ĺO‹*ű.źiÂ_›vmY°űíXîť:<ńXźW’Ň3:HÉ5bşŹÍéÉ ODBEf¬Î3?ZuîLË®ĆSŐçfż·ąňťuÁÇĂ: Ź@sů>ŻI´T6}D¤-ĺu*ϨK|YÚOg—üęůŠ0÷Mő®-Fú5«:wfő]ëîť·ó­`tß  1–đ8ű:jŁW~çŠÚĘďXšvŰř'>§ôŹ‹*[CM>}2¬É‚MŻĂnS8 {s;q¦ ĐRYů‘&›.‘¬Îź¤SyĆíç™ŃuągĘ𳪍ńköÁ©ă;?:şűř‡aFlx9Ţ«]QŇMĹIÝŐ^“I×HvXůßśôTXđwNÚoŬÖP™‡Oź|ŻęHú«óšŚ+Ii¦›Ń& ĐRŮú‘¦“n—¤k$űk˙üĎ˙K§ňŚôWçÚ×ďřůł±üdvqPر4-Lxxoń]Ô&Öa Ü>apxvĆż˝¶•ç©ęsUçÎüaᤠŻ_BEfł®IŁh©¬˙HÓŮĹëÉ®Ë—Š“¶}˙ÂĹšşÔ\Ľhh_§ăçĎöŚęÍ ˙ô]Ô¦ü™Ô0A~ââ=ŰZUĺß?«0ˇ<łeT¦i´TÖD¤qÍíXšW’K0ćń_Ď‹>}˛.‡Nź°Z_VîßŮą"ë®ÉOß9yhÝćŻ"lRé>6§K$«}qrBEćţ“U±¨®©i%%z÷”aaqö憕ŮÍ^*@fHDnĚjBEf›Âu F<öĚ»·;Ë–Łď8ů‘™\ŹrÖ,¸gęđÎ,sďÔáńeéá)Ł›TzDsăËŇj;btß»&?öÂöŞĂ­¤D7ŢGĺ°>0#?VśÝZĐ™5‚€–ĘN4ж]»˘¤ ?ń“Śě}ĎÔá«ě¬Ë˛}ŰĎŐ\0„ëÝNúÍüčľ0îö ăJRâËŇĂt*Ďč®,›XzFµ/N†=ü§E•aG¬Ü˙Ţć#ZI•ÎŰůVlc:<±myç×,Z*›A"R_źCý[¨a†÷ĘYł`ö{›cyćÝŤ«ě2rÂÖţnÁ„G_~6LŻĄÓ;–¦µ/NŽ+Ié\‘eµi&(č_Ű#ĂN^5wę¶×·Wi=ĺÝňÚNúîłc‚‚Äř˛´pt´ÔIh4-•ý ą¶ĎˇÖ~ę± ˙'óř­ăž(su]FmXVuîŚŰpćí|+qĹs9küç ă‚Ń}Ű%ĹŇM}6Ét›Ó%’Ôn,†Ýë‘§O´žŠÍ۸"ýŐywT ňúĹ—Ą÷hY©á?'üG…“đö c3ĐŚZ*»B"r5+u]#Ům Ö%Őç÷/Nü×E±ä¬Y0ţíµ&jC+ŮĽŞ`Ó+Eo¬ sßôQáY úÇ•¤´°ż¶®xsYzmË$†Më—ÖV·yW„[ű!ŃĽ~ťĘ3ZŢFj‡ŇÔ`tßď<3:sőü‰[×™T@ËfiHD>˝fŐ±4­}qr]Ú%uŤd÷[1«.ZTů^Ő#´ˇ˝ęřř·×>óîĆ0·®«ý4m^ż żö››-ď‹“-ŻŹj? ™źř­i#Ă–yôĺgźZ÷R«ŞŢSŐç¢-su¬h»D˛ş·ÄłÜ¦pŔOg—<đŇ”ą;ß4˛€ÖŔętŤdw,M«Ë— ţhVŃď_śX—ßĚŹxe¶yĂlýđŕÂżm]¶o{ŇŞąÁÓĹQ‚DµÚ,_–ëŁďĎČűůśŇiŰ6´ŞęÝ}üĂXőŽÚ°,Ţ+(čßRż"žčđ,ß5ůéµě6µ€ÖĂ‘H«J÷±9ť+˛Ę3ëŇ©<ŁG4÷'ł‹ër÷”a[Žľo<Ţ`›Źů0?›]Śx,(čW’⣨Í%ÝĆćÄę‡3 b}´r˙{­Ş†w˙pÓáýĽ4%öpX˝í‹“[jő†':ľ,ýßfć›–@+d“H¤5|µ. ™wTąwęđş„˙ó· ƆŤâě…ę}'ŞŢ?u|ËŃ÷Ű%}©8©}qrđ4Ýbµů¬Ł†ťŐ%’ţ=l¨oNzęTőąÖVÉOź8pňŁÍ* Ć<[uoÁ§;v˘ż1驪sg 1 ˛R$Ҳ7ćn‰ćŢ6ţÉş|ą8yő]F_#:WsáĚ…ęłç™w7ĆöřjQUlól±·Xřç}ÓGµ¶bľřńnuoNzŞciZ×Hv‹?Ýť+˛ţeÚs hÍl‰´t›“P‘Ů©<Ł.튒îźUxşúüĄ©ąxŃčkD.žžšŰ' óŐqOtké«|-¸Ý:Wdů‰á ŤuÖ™ Ő­­ť>ŃmlNXÉumÁ§»k$»}qň}ÓGµÂ p)»E"Í2ŃÜ„ŠĚ›Š“.M0˛÷Üťoî?YU—}'Şź>iĐ5®3Şďšüô·¦ŤŚĺÖqO„ç®k$;ĹÜěZ/®$Ą¶ÝF<ňÄÚ÷ž¨:vöt+¬ęő÷öŚşgęđÎY-»Ś{DsăËŇQ}ţc~4ś¨‡Nź0Ó€VÎ’‘HsŮŤjW”ô˙$#űŮě’ÍG\šő÷ž«ą`¬5kŢßuď”ááişVáÍeéu±µ‹ÚLÓmlNmëŤě=cű¦X»µÂŤÔČ[kţeÚ°ŞżýĚ襩 ™-{ę¶/Nž~(qĹsíŰ{˘ĘXř»˝T‘&űyľüÄ˙‘Ź”l^µtď»±,ŘýöÖš`MÍĐőK~=/ň‡…“ÂüpfA»˘¤ŽĄińeiŞşů6c§ňŚÚĚë׾8yáß¶†©ąx±ÖöSë^ú÷ycďž2,VŐáaéŢŇO}0â±°Ł_صĺŔÉŹ 7€:ÖŽD=µaü+¨ŹýŰĚüiŰ6\šńoŻő-Ô¦éŃ—źM\ń\,·OžÍöĹÉaâËŇzDs•wsLĎč ¸’”ÚfŮűŢ©ĂĂśşíőŰ7µÎ Ď\=żďň™·Ť2¬íNĺ-ľŞ?ţ0ní©ĎYłŕřůłFŔeě‰ÜČđu,M«ÝB˝4ů‰O­{)o㊺ Y·xŮľ¦S“µţŕŢôWç…§)LŇĘ9A^ż6…bI¨ČĽĹ.j3oŇ›Š“‚ŹývÁř°ź^żdÁî·[m©ç¬YN§Ą©á¤jńµÝ}lN犬đ_Ú®(iĆ—ĂSß:?Ś đŮBiý¦.‘¬vEI—%óřýł 3WĎż4éŻÎ3šľgŢÝXţćęČ[kÂüz^$ńHl­¸Mየ-ᙑěOš4Żß/MéłlĆ–Łď·ÎRßůŃŃĽŤ+Â:ü×EÁčľa‘wŤd·üřř˙4 gtP8“źXű˘‰pÖ‘D®ˇ)ľ,-®$Ą.7'…˙˝×Ňé—ĺ?_·tď»ĆNłpŞúÜ3ďnś»óÍXj?¤8ćń ?1L‡ŇÔžŃA*żĹ¬·/NîTžkŇß-pěěéÖYó[ŽľÖüCK¦Ă뼵ě\GsĂłß¶p`ŘÔCÖ-6úţ!{I"_h…-ľ,ý˛|ą8ů‡3 ~3?Z—_Î-K\ńśńŇí?Yµlߎ5ďď*ŘôJ0ĽWl5Lxę»ë‚ÔË ™aóĆ•¤~uÜżžyŕĄ)­ąě79°ęŔÎ_=_Ö|\IJ+Y»®-ňĚp€ß=eŘŹź+zzýŕjXPůĽt®ČJ¨Č¬ËÍeé_›řçĚČż,ßśôÔÖ&Í×ÎŹŽn;vh{Őá0˝–N†÷jS8 }qrŹÖđ±ČVŮÔńeéwT ›÷Ţ©Ăű­Őš‹{Ő‘°řďž2,óx§ňŚVUóáż7ü‡‡|üŰkŤA€«gMI¤[HöeéÉľŁrČť“‡Ö%ü/9k-@uMÍáÓ'Źž9Ëí·+JúJIJ„ňĚ[¬Ł¶Č6Źdw‰d}cŇSa/˙ŻňŚÖĽŠXW˙N~”P‘Ůľ89nÝ[_1t,M[ş÷]óŕ‹˛¬$R»Í˝,ÝĆć=sĘh1.ţýď5/Ʋx϶ ?±nY ´ŠDsŰ'o>r@,Ýűn]ý·Úbh[4pő]#Ŕ5°¬$­gů4öĽËŚě]ôĆĘŞsg>óˇ%đĘěÎYßśôTŰ' îÉîűT®îhé-W’Ú©<ăýSÇŹť=]sńbk[×Ý\šviý·Ş’˙ŐJSĂzŘůŃѰ.\¬1®Ý%i‘űh튒Ú Ľ4Áčľ?‘żóŁŁ—e{ŐáSŐ猂é{ĎŽůîłcľ÷qn˙d§ňŚÎYaşD˛´IKMŹhnÇŇ´Ú–ŐçGłŠę:˝•÷Âŕż.ú椧î¨vA««˙hnByfźxű„ÁŠŕúYb’f˝€W’$^ž1Źż°kËş{.Íš÷wm;vHË·l+öířÎ3Ł=/ćsĘn.KŻK×Hvw]ÓŇB»˘¤ŕ釼2;lůŐvmŻ:ÜĘ;âO‹*ĂFŰáź'ţ%®$µsEV÷ÖWá…űg®ý`÷ć# I€ëg•IšţVŃÍeéA~âgäé‡z-ťľ`÷Ű—eŢη´vë1dÝâßż8ńÁĹSĂüpfAPĐ?®$5L‡ŇTíÓŇ-’ýÉ@Ţkčú%łvĽqŕäGú"Ö ĺ™q%)­s#µgtĐ—‹“ĂŞřńsE›ďWőĹN“4©ý/˙řéČŢßš6rüŰk?ť˘7Vî>ţˇ.nUŽž9őčËϦż:Ż.·Ž{",›vEIaâËŇzDsőQkXWďTžQ;ňúµ/IŽny-%›WťŞ>×ĘäŔÉŹÂ kŠn‘ěÖűĺÜŹ<đŇ”°*6ÚgrÔ#űMră7†Ú'·)pYb[T˙şhŘëK/Mîk/.Řý¶VmÍ–î}7,ŚQ–…©]¸ŐçŇĘi…‚lĺ¤ciZ0ćń»§ çĂĐuKň6®Đ#ˇM‡÷?±öŇ–L Fögi«mŠđ–Gßĺ33WĎß^uDaÔ;[NŇ@»c7—ĄßTśôéů‰żqbŇĘ9—eŔ+łSV=Ż%‰™şíő‰[×Uľł>Ě÷gä# +'L»˘$_DmŤ‰ćĆ•¤ÖĽ~?śYđčËφ˘MB‹÷l‹ny-l“˙ †÷ QĎč ÖY$Ý"ٵRĐ?üăËą Çş“\ĎgéşD˛:”¦~:m Ţ7}Ô/Můt~ő|ŧŽk=.sřôÉą;ß\ř·­afż·9(čäő‹í˘Ć—ĄŰEmĄ›†csb#Ą]QR8:bdńžmúĺďG8l–;*‡Łú„mW’Ú:7Rc?‰âJR*2Ă ůí‚ńj AŮ{’«I§ňŚO§ciÚmăźüĺܲOç_§Źśµă ýĹ•mŻ:Ľîŕž ‡ö…ÉYł xúˇÚuÔŹŁéZóÂ{×Hv8aâËŇĂżÄFĘwźsđô -Şąx1ěš0JSĽ~ ™·´Ö­íŘFjě'ŃOg—üaá$ĺpŘ’XşD˛>3ť+˛şF˛ď›>ęÓąŁrHźe34Wé\Í…ťÝsâX]ľóĚč`Ěă튒Ât,MóQT §MByćmăź 'ĚżLń‹9e'ćTőąXű,Ýűn0şoŘ2ÝZ}µ$Td~mâźĂźD}—ĎT!7Ś5¨V•nź—Höí}â_>ťđżß9y¨NáÚś˝P}üüŮXďŮŚy<ľ,˝.]#ŮÝ5¦ü÷ ëá«ăžčTž‘´rŽŢଉFo\ŚęvMx|tMl…ů¦â¤§×/Q!7Ý–VµĹÓą"ë3Ó®(iËŃ÷«kj>/:…k“´rÎMĹI·Ž¦gt6”Ďű^s8‚Ľ~yWś«ąPsń˘Ţ©3ŕ•Ůí‹“{Ds} őŇ‚‰U‹R¸ń¬·´śDso.KŹ+IůĚ#­|gýˇÓ'>3ś:n»‡úňígFß9yčÝS†…ąmü“ť+˛şF˛Ăt‹dëSątSţ“é4ćńeűvÄŃéęó:¨ÎďL¸}ÂŕXYJŤĺăg˝gîؤZ‹%—f”ož¶)đ™ †=śĽjîÖ~f69`…‡†0wç›wNz˙¬ÂX~8ł sEVBEf,]í˘Ęg ± Ż_Ďč ŘtÚrôý }”ů5/~ďŮ1±n Q§ň MÔýă-ćX٬ط#üqvöBµRh,ö¤šÔĆV§ňŚ ?ńs3Ľ×/ç–­Ü˙Ţgfńžmś:®¤ą’VÍýŐóż]0>Ě}ÓGÝTś_–ößI×ËňéôŚŞýŇĺ±űv¬;¸G+]j÷ń4«(쬥©±n˛‘űxÇŇÚC+uĐčěĽ4ˇµÓŹ}ç™ŃłvĽńy™ňÎúÍG(Zn°='Žýţʼn˝—ͨK÷±9튒âJR„U}K4WËç-Ö~ć2śoĂ~hÉ4Cě3­:°3l±_Ď‹‰q%©Ę¦î‡f|Yz0ŞĎWÇ=±đo[Ő @aóĄ>wN ú_)ŁűŢQ9¤dóŞĎËčŤË—íŰ®&i fíx#yŐÜÜ×^ ó‡…“Âęm[4°.]"YÝ5ľ|NÂÚ+¤nî=±öĹpľŤŘđň{UGtÖĄ*ßYź˛ęů°Ĺ~6»$ýĄÝ6…ţó…qX8iá}Ş ijÁë- ™ńeiWNűâä;*‡ünÁ„+äçsJ‹ŢX©ThîVîoŮľ+ţ;˙µpb0ěáŘj›Âöăä_–~SqŇ˙ťUŽĘźÎ.™şíuŤöi‡Oź\Ľg[Řtáń‰-€wŤdwW?—¤[m-ĄĹ•¤|ďŮ1OźP3MYłŰ6í\‘•P‘ůÓ±4íÎÉCü\Ń•sĎ”ác6-W´Ó§Ž‡młfAíxA˙vEIÖQ//§HvXH]"Y?šUtßôQ§«Ď+€&®‰l¦tŤd_M*2ď¨rĎÔá˙0Ý"Ůăß^ëüŇz:}âSÇëR» 7â±öĹɱ|ą8Ůś\ç:j8„»D˛zDsccö“ž:~ţ¬Öű´Ă§OĆÚđÁĹS‘˝ăËŇí€fEu®Čęt×ä§˙ĎĚ|eM_pÝC€–ˇ‰ě§Ü:^En*NZu`§łˇš‹ĎŐ\¨Ë×&ţ9ľ,˝î“Á]#ŮľĚ(ő¸BŘ#šáÎY?›]˘ű>O¬ďť:ĽCij¬ Ď*ŞSyĆĚŹ*h ‚&Éyhšpë$’}sYú?Ě?•ĄýSiúŢU§ŞĎ]Mj.^tÖ ´tď»_)Ną}ÂŕXb«^öݤÓ}lNByf8¨Ń}SV=Âg.TëľĎtüüŮŻŽ{"lĆîšńŐUź¸â9ĺ7^в8ˇŤâ*·HzDsăËŇÚ%]e‚Ľ~wM~z«Ś˙Đ‹§ŢQ9ä_§ŹŚĺÎÉCĘ3»D˛b±ě&őř-ËO&ůG¦ż»!Ń»ŹXuîŚü<[?©~ áŘWhH‹÷l»šĚŰůÖÁÓ'.h8Ł6,űÍüčUĆňó9ĄíŠ’:”¦ÖĄk$Ű"ŞÔozFĹ•¤ů‰ÁÇľýĚčŘŔ_¶o»~Ľ˛Ń—˙űĽ±˙2mDۢaoĆ—ĄëÍĎ[G WmŤî[ůÎúđZâřůłę‚…S›Ş@ËvŞúüCK¦ xev]ľ6ńĎAA˙öĹɱt(Mí͵×& ÷ÔvEIÁđ^Ľ4eę¶×Çż˝vŐťóĘRV=ź¸âą°[ż>ń/a·v*ĎФW^J˝ą,=ľ,=,°‰[ש¨wVJ­©-Ř »¶ä¬Y0tý’Xú.źŚîۦp@]*2o±ă& śÚŹWôŻÍ¨>ýVĚzríÂU‡µç•ť«ą6ox¬j7y úëÖ«ŮzîTžäőë66'ňÖ%őËę¨MU …9U}®`Ó+Ń-Ż]šoMŚě$ĆŇ®(É—ĺ%š›Pž–\ŰÂńei™«ç‡é»|ćńóguë•í;QörΚ7o˙njé*6RĂ ňúÝ3uxŇĘ9Eo¬TEPżl‰ZMZ€ő÷ÎÚńĆĽťoĹ2tý’`xŻ ?ńŇÜ\–nUnđ:jXu_)Ii[8đŽĘ!-™öŕ⩉+žÓ°˙ЦĂűcÝoŬ`ŘĂm hŢ«©·ÚŤÔ‚ţ?‘˙Űă+ßYŻ ~Yµš 4SjjVŘąöÝuůŢłc‚ŹŐ­ úŞ4n:•gÄ—Ąą8ůŰĎŚţőĽČýł ó6®ĐąWcó‘«ěúѬ˘`Ä#a/‡ÇP/_MşŹÍéPšúĂ™á0\ş÷]…ŤË»âŢ0ŔE>î€FtŕäGŰŽzŻęH]ćí|+Ő§máŔş$TdŢbyM5ÝĆćt®Č Vă·źýýy˙<áĎËöm×Â˙PÍŋ۫Çşűk˙äőëTžaőęV]xÄn˙dx•4Ţ÷†9.ďq×Ü05/=sęŘŮÓuůŮě’ ?±Cij]âËŇş[F“&łŽ¦k$»G4÷ŽĘ!an˙dŐą3zůjT×Ô„ýľţŕŢ ŕ“ʤ˘úĺ÷ńá «î–hî“©(h"Ľ+î s\Ř㮸aÖÜŰ®(Éş™4ŻÄ—Ąýřą"ýűEŐ~ű8?Qý\sşD˛ľ>ń/Ő55j šďŠ{Ă—ô¸eNżłş}ü˝żXľ>ń/]#ŮÝţű3”ݬžIÓK÷ÚEÔôĄ©Á¨>I+ç;{úč™SÇĎźŐÎW鉵/v®Č űýk˙Ü%’ĄÍżhů%Td‰?‘ű¨´Š€¦Ćëâ^2Ŕ•¬çmÇŮ üB}ůŮ{¦˙ÚÄ?Çş^żŃôćc˙Ż…·W޲JE@Óäuq/™ŕ· Ŕ5HZ5÷głK~=/R—űgĆ•¤Ä—Ą_š®‘ěîÖͤ Żv*ĎňĽ~aő®>°kí»WîďĚ…j=~ő~9·,6n7¨Cij—H–®ż†Rl_ś {řO‹*÷ś8¦¨ )󺸗ĚpőŽ[ŕÚ˛ę?ćGZ2­.=ŁÚ%}Ą$Ą.ńei·Dsí—IÓOX˝q%)µë¨#˝oú¨y;ß łđo[uúňţ©ăáXřĂÂI_.NŽ ©×’hn›ÂÁ°‡3WĎćÝŤ»Ź¨´ ‰óş¸—ĚpéŽ[ŕ2yW$­ś“ąz~]ţkáÄ`Ěă튒ębMšë`Ab0â‘?-ŞŚny­čŤ•ËöíĐň_ČŇ˝ďö^6# X8) í‹“•Ö5$śź]#ٵŐ8şďĐőK 6˝rôĚ)ŐÍ‚×Ĺ˝d€‹vÜ2@kö^Ő‘'×.˝qůĄąelN×/(č_—öĹÉ=| Ušçö_—HV›Âµ©yý’WÍş~Iú«ó¶;¤ýż¨ą;ß ŹŢýł ‘˝Ť…ëŮŹN¨Č ;–¦…Çó‰µ/*-h^Ľ.î%s\±ă–ZŹŰ7Uľł~ę¶×ëňŕâ©Áđ^A~âĄé\á[¨ŇĽÓ#šŰ©<Ł}qr›Âá˙đĘě0˝—Í0®Á´mbsăŽĘ!Á¨>KÓ¬Ł^ĎRj‡ŇÔŰ' î·bVîk6R Yňş¸—Ěp­Ž[h‘v~ttŢηďŮV—…ŰÚľ8ąöC¨—¬ Ć•¤ôڞ,&-féďć˛ôĄ©m‹Ţ3uřUţvÁřôWç×ŕ\Í…vm™»óÍÚŹ&<7:•gŘH˝®Ď¤–g¶+J Gî°×—*°kS]S–eř͡ y]ÜKć¸PÇ-4kŐ55ëîÝtx˙eůÓ˘Ę`Řõ e—¤[$Űv´Čt*ĎÓˇ4ő»ĎŽůůśŇoM9që:óá>}rÝÁ=á `0â‘ŘgĺzŇ}lNBEfXśwOöígFŹŢ¸\™]›ÓŐçÇż˝6ńXřăĚŃ y]ÜKć¸DÇ-4#‡NźŘsâŘŢUuya×–`TźvEI—ĺć˛t_6”–ťncsşD˛ÂtŤdkÚČť>ň«ăžŘ|ä€AqmŽž9µűř‡É«ćĂ{…3$®$ĺ3äşgByć]“ź‹sú»”ٵ9~ţlXśµK©#{ÇĘŇ1 y]ÜKć¸>Ç-4M.ÖśŞ>wY~:»¤MရËŇëŇ©<Ł»ĺ/i…K©‘ěžŃA·O|Űř'ďšü´‰qÍNWźŹŤ—ß-ä'v®Č2Ręqu:,Ѹ’ÔŐv©´kv®ćÂŕż. FőI(Ϭ+N‡€Fäuq/™ŕâ÷ Đ4-Řýö— ~uÜ—Ćľ´ňt˙ř© ™m üvÁřs5b11®Ůť“‡öć†ă%üł›«×t(MÝuühXź5/Ş´k–łfA»˘¤ËŠÓa ycÜ{ć¸,Çý4şď>;ćî)Ăî™:üŇ|cŇS ™]#Ů—Ćž—´ÚuÔŻ”¤´/NF<6tý’N˙ÔńcgO›×ěđé“·O|ĎÔaÝĆćÄĆ‹ĄÔz\ťnW”_–ľóŁŁöQŻÇ‹§†Uú˙ŤŇ[ěĄĐdxcÜ{ć¸&ÇýÜ0Ă^_zďÔá?~®čŇÜ?«°sEVByfBĹ˙Hř}UZo˘ąaý?ɨ>/ěÚ˛ĺčű›ďŻ:wĆ0ąf ˙¶ő®ÉO‡“çű3ňâËŇìŘę+=˘ą7—ĄŁűŢQ9$¬Ő­To×ă—¦tŤd‡‡4üóÓ? ‘7Ć˝g€ rÜ/@˝Ű^uä'łŠ~·`Âeů椧Ú'Ç—Ą]ű\"±ôŚęPšä'#{ß9yčŠ};bYş÷]ßťĽNŃ-ŻýlvÉ·ź}SqŇÇ“'Ýć{=Öm\IJ0Ľ×Ď甆µşáĐ>őv=~»`|đŔ&Td~^•:J4"oŚ{ĎWă¸_€ë‘ĽjîŁ/?ŰwůĚKóëy‘ ?ńËĹÉ—ĄöÓ„Ń\;\"źţĐd۵ë¨ĂţÝ‚ 3¶ošşíő•űß3a®_Κ±u÷”aAA˙ř˛ô¦P˝–n»˘¤°nxiJĺ;ë6ŢŻä®YŐą3\TůĐ’ií‹“Ă|ćgRíĄĐxcÜ{ć¸Çý\Ť…ŰšĽjî“k^š'ÖľXűmÇ‚ţm ^š¸’›_"WN÷±9]#ŮaűÔfTź”UĎ—l^őôú%[ŽľoŕÔ‹ś5 Â1Ő©<#6ŁÂżKőśhn0şoâŠçÂşÝQuXÉ]Ź}'Ş~»`|0ćńvEIWsđ1‘7Ć˝g€ëpÜ/ŔĄŽť==bĂË%›W]–ď=;&Ůű“şKŇ-’m9Kä }_˛SyFۢaűÜ\–žűÚ‹a’VÍ=S]mţ\ż}'ŞblČşĹA^żđ _ůŁ“rm 'ígRóúýiQeŐą3 ďzl>r ,Ú^K§Łú\ýę´ă@#ňƸ÷ĚpŽűZ­vm™±}Ó¬o\šĚŐóὂüÄË_–îS"×óeɰ‰âJR‚‚ţwM~ş÷˛˝–NŰÍ Ş훺íőp‚ő]>3öpíÔ*čoµ!>ňŰ%’Őľ89,ćG_~ö—¦\T|×gó‘żś[ţŘ ŹjĎč «?ŤČăŢ3Ŕ8îhٶ~xpéŢwWîďÓ‰/K«ýžŕ˙Ü?mW”ô…VcDä ‰/K-ĚMĹI?‘˙Űă2»¸üÍŐFS}Ůph߲};~4«(ńH8Áľčrź\ýFj犬¸’”ŻŽ{â7óŁĽ4Eí]§M‡÷/ß·˝v)uĚă×P´ ŤČăŢ3Ŕĺ7îhŞÎťŮ|äŔÖ~:?™]Ś|´Má€O§k$۲•H˝'쬄ŠĚ0ť+˛îźUËť“‡®y—aU/.ţýď[Žľq_›řç`ĚăťĘ3|ĐąAż‘_–ţĎ˙rßôQýVĚR×o{Ő‘p&ŁűŢ|­ß"w hDŢ÷ž9®˝qż@sqábͧŽ:}âÓ˛nq0ⱸ’”O'ˇ"ł»Ő*‘†O·Ź7R;G˛n÷ÄÝS†Ý9yčwžmpŐŻs5Â1¸îŕž ?16âÂcnÄ5h:Wd}}â_Âż<˝~‰ Ľ~?ţ©}ű„Á˙T–v=ĄëHĐĽ1î=s\xăf€¦¦ş¦ć3łţŕŢ  犬OÇ—OE})µG4÷Öq:”¦>đŇs¬~Ő\Ľx®ćB8çî|3Čë×%’ĄänXa·-8uŰëŠđú]üűß÷ž¨ęXšţÔľţSăxĐĽ4îUs\uăf€¦ć_§ŹĽmü“_źř—Ërű„Á]#ŮÝ>^ş,–§D+7—ĄÇ—ĄŁúlzĺřůłaÎ\¨6ÇęWîk/†9álŚŤA…wcj;ÝwĆöMŐ55Šđúíüčh§ňŚúú©íxĐĽ4îUs\răf€ďÁĹSďś<ôľéŁ>3ÝĆćt®Čęą<>Š*ŇŇ}lN؏튒Âc_±oÇžÇv~tôTő9Ă­~ýf~ôž©ĂĂ©xű„ÁťĘ3ŚÁ“đ ×Öv^żUv†…}Öžőu §ÄWÇ=sBEf}ť&G€FäĄqŻšŕz7 4ĘwÖÝ7}Ô/ç–}:·Ž_–Ö©<ă3ăS€"M-=˘ąJS‚ţµÝ÷¶ńOn8´/Ěş{j.^4îęÝĎf—übNYxäăËŇc©ÝŐaC'š›Pžäő x¬¶Őa˝X°űípbÄ•¤†‡·ËŘ yiÜ«ć¸ŘĆÍ×fńžmżzľâ—¦|^îť:ĽmáŔĄ©źN×H¶+‘f±ŽÚ¦p@ź<ýPŘÔ ˙¶5Ě‚ÝoŻ>°Ë ¬w[?<Şż[0!®ä“Q©o@zFu,M Föľ{ʰ°Â—íۡëEtËkżžůîłcÚ'ßÍ­ßłćđĐĽ4îUs\iăf€ĎłóŁŁ.žš´rÎgć‡3 ‚Ľ~7'}^:•gô¨ď=ičt›Ó5’]»‹fdďÁ]TůÎúň7Wď¨:l*6Ą{ß}hÉ´_ϋĆjíźRĽQ©áŃF<ň‹9eŃ-Ż-Ű·]5Ö‹Ń—÷]>óî)ĂÂ1_–Ţ2ŤČKă^5Ŕe6nZ­ŁgNe®ž?ěőĄź—?.Ş FönS8ŕ3Ó±4ÍÚ©HKú4j§ňŚŘ×Qo.KµaYÁ]t®ć‚iŮ@*ßYápŘŢ?«0Ő'®$ĹP˝Á5Śyü '=±öŵěVőĄčŤ•±Ýöýż§pśhD^÷Ş9®±qłĐRťąP]˛yŐř·×~^’VÎ F<$~^Ú'[’iŮ{yq%©íŠ’Âyýî™:<ýŐyI«ć]żÄm8‘·ÖĆđ˙7(óx8l­ůßřÔ~&5Żß/ć”ůp=*suXŘa=w*ĎčŢŔgĐŃ yiÜ«ć¸ĆĆÍ@stşúü¬o,Řýö2bĂ˵k§ů‰ź—vEI=Łl'‰´¶t›Óˇ45®$µMá€_=_ńŕâ©aţc~´ňťő¦kĂ9~ţl8·Çż˝6Ý76„*2»+Č\ü‘ě°ňż\śü_ 'ţűĽ±OźP™őâ\Í…’Í«‚Q}ÂÂîÉľ…íĐĽ4îUs\`ăf ©9U}~ŐťëîąBj·?†÷şÂ§NĂ´+Jň>‰ĄűŘś®‘ě›ËŇăËŇ*2ő|ĹŻçEľ?#oď‰*S·Aí;QéŁ7.†=ܦp€]ÔĆŞ˙ř˛´n‘ě°ň>§TeÖ—cgO‡ÝňZ0ňŃ[nŕU‡#@#ňҸWÍpuŤ›€éĚ…ęíU‡w~tô ©ýšŢGÚ ĽBâJR윊Č?L×Hv犬0ťĘ3n˙ä÷žóígF˙tv‰iÜĐöť¨zŻęH8Ň\<56ŇÍíFě‚XýkÚČßĚŹ*ÎzTuîĚŕż. †÷j_ś|ËŰÁ yiܫ渴Ɲ@Ş:wćŇLÝöz0˛wÇŇ´+äć˛t_Ó‘ëI·ŹÓ5’}ű„ÁßśôTđď}—Ď4“oŘŘżgę°¶…Ă‘žP‘i¤7îRęmăźěÉ~ôĺgg=:U}ţŘŮÓąŻ˝Śî{Kc,\;4"ďŤ{Ű—Ö¸ShPµË—Äv’Ü˝ÔHv ?ń…][j.^Śĺ˘‰ÜđŞÎťąĹGQ›R‚‚ţO­{Iý×»Om_’ÜW5NŤČ{ăŢ6Ŕu5îTl;ě˙Ĺ–ÔwşŹÍI¨ČüJIJ¸’”Ą©»Ž=zćÔáÓ'ĎŐ\0‡o€•űßű_ĺwNzGĺŘ´W–Ťśhn|YZ0â±aŻ/=]}^‰ÖŻ?.ŞěTžŃ%’ŐÍ^*xhř] ´Jž…z‚ €‹jÜ)4(ËA"Ň@éÍŤ+ImS8 ŮűWĎWlŻ:\ł÷Ć˝qů•C~0#˙ž©ĂăËŇ*2;Wd©ĚFO»˘¤`Ä#S·˝ľőĂÇĎźU¨őčsĘľűě[Ç ęiäRw.Ŕs{đ» yę *.Şq§Đ ě‰H˝µv5?1xúˇĚŐó׼żkĹľďU1oo¤ôWçý|Né•CâJRj7RË3»+ÎĆî‹ÎYµ}‘ź¸`÷ŰaSś˝P­PëËąš ?ť]ňďóĆ&TdĆ—ĄuŤd7zÁ;)ŕą=ř] Đ< őWÔ¸ShPv…Däúż‹Ú©<#¶pW›1ŹG·Ľ6wç›ÓßÝpčô cöFzpńÔ^K§‡ůßăµ+JJ¨ČĽ%š«D˝An.Kű"ü{Řajý:|úäĎ甆W’Ň­Éśwç<şż+‘gˇž ŕrw ĘĆ\ó¶ÝWJR‚‚ţÁ¨>wM~:ňÖšXĘß\m´ŢH;?:ÚgŮŚĚŐóW<צp@»˘¤0ť+˛| µ)ôH‡ŇÔ`dďoMY˛yŐĚ›”kýÚrôý°řxiJźŘÔ ŢŮOďÁďJ€FäY¨'¨¸śĆť@˛7$"_(튒ÚŚęó«ç+†¬[śązţ¬o§7ز}ŰĂź·qEíRŢÇ‚‚ţm ŞĎ&µ”äőűŮě’°Aćí|KĹÖ» ‡ö…‡7,ţöĹÉ=šŢwť đôü®hDž…z‚ €kiÜ)4(«C"rĺt›Óą"«}qr/'=úňł‰+ž óŔKS6ÚgŠŢx ˙¶µňťu?‘_»Žšźž—žŃA µ %ö™ÔĽ~÷MµęŔN[ďÂŁ:ţíµżž Ć<Ţd‹ßiđÁďJ€FäY¨'¨¸Ćť@˛@$"źąXש<ŁciZö%É_÷ÄNúŻ…˙âDcł±,ŢłméŢwĂÜ6ţÉ`tßř˛ô&řŤH [ćKĹIżś[öó9Ą›ďW·őnÝÁ=÷NŚx¬CijSŢČv¦Ŕ3|đ» yę *.¤q§Đ ě‰ČĄI¨ČěTžŃˇ4őŢ©Ă6»$Ě÷gä%­ścZ6ŠŞsgÖÜ»ůČ…ŰŚîôÓą"«»Zmbé66'lś°}~ü\Ń}ÓG>}RőÖ»°6ŢGĺöĹÉM)ŰůĎđÁďJ€FäY¨'¨¸ŠĆm@˛L$bź®k$;–ÎYwOö­i#o›»`÷Ű&dc9vöôŢUűOVŤÚ°,ńČMĹI_.N¶‹Úd;(lśŃÜ{§˙ö3ŁUo˝«ąx1l‡íUG:–¦µ+Jęi{ŮNxŚ~]4"ĎB=AŔ%4n”•"‘VľR×#š{ű„Á±tŤdpę¸ÁŘÎ^¨>]}ţ 'ů‰ťĘ3|µéwPĎč đĎ_Ě)S˝ ˇćâŵě jۡyŐ†sžä_—ŤČłPOPp ŤŰ€e«H¤¦űŘś.‘¬Nĺm ţęůŠłŞërŃXlT÷Ď*Ś- wS¨Íˇ‰‚üć–L ç\ÍŐŰVîßySqRslç<Éż.‘gˇž ŕú· Ęn‘HëI\IJűâä0ÁGr_{ńýSÇ÷ź¬:zć”IظÂSđő‰ąwęđ0·Ds»D˛,Ą6ĺôćv(M ›č‰µ/î;QUuîŚnÓ¶mčÉąŁrHBEć-öRÁĂ|ŔŻK€/ÂłPOPpýŚŰ€eĂH¤eŇ1ˇ"3(č_›Ľ~Ëömßrôý0í;vö´ظďŮv÷”a?™]üůńeé ĺ™al¤6ýĄÔ`Äc‘·Öh˘ÝňZ·HvÇŇ´ÎYÝ›g©8‰ŕa>řu Đ< őϸMhP–ŚDZXzFĹ•¤ů‰µŐ瓞Z¶o{Ą{ß5ńš‚Ń—˙ęůŠßż8ń»ĎŽůRáŔŽĄińeéÝ•n“O·±9µ=5Ɫ7Vž®>Ż’ČĐőKÂą{ʰ¸’Ô[˘ąÍ·`śJđ<üşhDž…z‚ €‹gÜ&4(«F"-#µ_DŤí˘{řÁĹSźywcĘwÖ[Gm"’VÍí»|fżłţyâ_“վ89ľ,˝Gs^»k-‰ćÖ~t8Ż_»˘¤©Ű^ź¸uÝEŐÜ`†®_6E›ÂťĘ3š{w8›ŕy>řu Đ< őϸMhPvŽDš÷ş\A˙  1üsŘëK‹ŢXfČşĹďU1Üšs5Ň_ť—űÚ‹_.NnS8 máŔđ¬Ýbµ9¤G47ľ,=óřmăźĚ۸˘üÍŐęąá ţë˘0áaŹ/Kk âś‚çůŕ×%@#ň,ÔT\9ă6 AŮ<i^‹rJSŰ%… ňoź08gÍ‚XLł&e۱CŁ6,+sućęůÁ¨>AA˙n ¸Y5ZÇŇ´`Ěă˙:}dĘŞçÇnY٤Čąš Ł7.łiyě‹Ďť+˛ş·”*rrÁ#}đë yę *®śq›Đ ě‰4‹t(MŤ+I ň2»řŃ—ź ó§E•yWbMĘ껞ywăě÷6˙qQe0ěáđ|µ)ĐĂ×Q›Őgk7RóďźUřű'ÎŘľIU7ścgOç¬YŚx$(čßňjÉůŹôÁŻK€FäY¨'¨¸lĆm@˛…$ŇÓ}lN×Hv|Yz,JS9·ě?_÷Ăëî1¸ššŐv­:°3Ě=S‡#{ů‰q%©=ŁTróJŘkí‹“ü\QŘháŮTŘ˙?{÷de}ç‰˙) bzĄşÜ8VnVʤśTś$ăoÍÎ%•™JYcmjR™ĘnY•RTDŞiúJwJąCß/‡ä"QQDA@Q@D.á* ĐrǦ;żN†IíîtTxNźÓĽ^ő.‹ÚýCç|żźďůžĎ“Otť9ąl߇#×/ Ć>ÔQ·­2čęÇ%@;Ň ŐAŔµż"eI$yŇ+V’Q_¦GÝ[§>qĎüňx~8gBsK‹ó*©śmţl˱CŰOYxoçĘÁAů N9áÚÝěí¨)¬ÉCõ»{^Ůwžyzď©¶w¤Žś=őđs1ýŇŞó;đŰ„-4čę'&@;Ň ŐAŔťż"eI¤}“+Ť§g}É7źĽă™QaţŰ”áż1וśÎ6väě©lĆ=śVťźV]`§z fMÖ]Kk«í©¦ 玞=ýŔëłI;ü·ĺŤ}đÄhGzˇ:¨¸3ă7@¤L$‰´oú6 ʧsĹŕ…;7;”’VKkëĹÖ–0#×/ ʲ3cĄvoHďË/K˝ă™QvxĘçgĎפUçg][ˢĆ>xb´#˝PTÜ™ń R†’D?×+VŇ˝¦0­:?üó±sgN~v>LÓ…sÍ--Ą¤őËĹÓÂőúfă“_›ňxü ›6sJ—aĎú’ <űVĹ ĐŹÔ_Ď{Ű´}†]?Ý4öÁ é…ę ŕÂŚß‘2ť$’€ôi–V]ĐĄ27L0ţŃź=_łçäń='Źí=uÂ)”ĚZ˙řÇďĎ÷7ĎNřáłn™2<Łľ¸g}‰7Ą¦z1v«)Ć>ô›Ąłv}zěă3'íóQX5aí\WÓÜ–ôöÁ é…ę ŕÂŚß‘2Ł$ŃŰ3cĄAyöź2úÁ±ßŘpx_uďŮőé1‡O2Űxd˙]sĆ˙üĹúź.¬NŻ-ęQ7$ŚqÔ0‘zi0|ÔC×.^{h÷ÓM¶z¤öźjúŃ܉ń"şß/l€Ţ>xb´#˝PTÜ–ń R&•D®Uú6 ď^S”e_ĘÄÇÂ?/Ţł5ž…;77]8çŔIrŤŰÖ˙ˢÉ÷ż6óďź«ěT‘Ó­¦ \D»$kňĐKU9ö‘ňMo†Ĺxôěi»=jŰŽţáś ť+_·Ed€ö>xb´#˝PTÜ–ń Rć•D®ÍK/M˝=ôłçk·­3uëşg?|Ç “F®_šóćÂüŐ/~oÖ`ŇŔŞr»×†Ëjo§|†ő¬/ kłSENÝ{kÂ\hąhĂGmĹţý–ÍąwQ,üäŻç:˛@{<1Ú‘^¨*nËřŤ)K"_4˝'ÍŚ•vŞČ‰'˙hżesĆn|cčÚĹkîvޤ„ -_÷J¸jazÔ Ę/Ť.†0ŽÚ‘Ć»Őôm>ú÷Ë&ĽłÂžOŚĄ{·ß5g|x*¦Uç_çŐd3€ö>xb´#˝PT\•ń Rf—D>çŚŰMµE7Tĺ†é\18Ł®8ő‹ńô[6çđŮS“”°ŁéhőćŐŤŰÖ?ľî•`\˙Koą-ËÎŚ•ö¶É;\µ†+{Ë”ÇË7˝iŰ'ĆË»·4lyűÇs'ĺŮć»ÍĄ‚?xb´/˝PT\•ń R&GDÚx/j÷šÂn5a:Uä|ö¸ű_›ć×K¦ç®zŢé‘BÖŢ»h×ű‹÷l —/ő@Pvéí¨Fç:`.O¤Ć«ő/O©|w•ÍźKţ°-,®ŻMy<0 ˝¶He™K~đĐhwzˇ:¨¸*ă@¤LŽüy2cĄ=ę†ÄÓ˝¦đďTţüĹú0óě„g?|lj‘Z6ŢĎťłĆ\z;jyv·šCs5aͦUç˙đŮ Ş5‘–ď˙¨SENP–ÝłľÄ{‡ÍĄ‚?xh$ ˝PT\•ń R&GD2cĄ=ëKÂdÔß2eřźťĎwžyúÄůłN‰”ÓÜҲłé“MGt©Ěí\98üg¸˛7Gí¸‰ď_Ď{ŰÔkîV pţbsXe«î & ´ÍĄ‚?xh$˝PTÜ“;Ě%Ü€ädrD®Ďdý{2cĄ·N}⛍O† ˙ßőJŁc!EťżŘÜtáÜÉĎÎ/Ű÷a0ń±ôÚBűüz(äđźań†ŘŞI$Ć…–‹óvl & HŻ-˛ ÍĄ‚&?ř_UIH/T÷äĺö }™‘ëö©ń“NÝşîbkK<-­­Ž…5ú÷Ë:W îŰ0ĽŹWŁ^7C©=ę†|˝ń·Z.†Ĺ«fööŤť*rě@s© ÉńIK/T÷äëíší@‚™‘ë" Ă2ę‹ÓŞóĂt­Ęë^S¸ëÓcGĎžsäě©ó›©ëß–4Ţ:ő‰;žuŰ´=ëK2cĄY±R{ľĂ—sP–}÷Ľ˛°„Źť;Ł fÔ†×Ăűzăo{ĹJlEs© É÷IK/T—äëů‚í@‘Žš> ĂşVĺuŞČ Ś}äŢE±í'Ž\‰ÚOu?ž;ńžůĺan™2ĽGÝŚúâLă¨×AQw«)Ć>ôoK·?Ľ÷Ô …0Ů+źűţěqßl|2˝¶ČPŞąTĐç}€$§Ş €K˛{őU®»Şh›Éé0é=yhŻXIP–ý§Ś~pÂ;+VÜfůţ;š>Qď©nÓŃ÷Ě+˙ĹËS~ţb}÷šÂôÚ˘0ĆQŻ“‰ÔΕQäŻ~1,ç='Ź+‡D¸rAÖäˇiŐ=ëKzŰćRˇ˝ű˝€˙Uđé…ę ŕ’ěR}•«ŻjÚfrDR:}†_zb|uâcuĹ wnŽgÖößźüěĽďÂĄüŐ+Ťż1÷§ «Ă…N«ÎO«.°ůŻŁ4 Ćőµáőp':sRE$RżesÂŇËš<´GÝ©ćRˇÝ;˝€˙Uđ9é…ę ŕ†ě:}•;Aá´Íä¤âZçŠÁAů KűČ?żP[÷Ţš0Ő›WĎŢľQQwc7ľQĽćĄˇkß9kL0i`—ĘÜn5}†)ëç Č™±ŇKe>ń±p'śżŘ¬(ěŃĺóÂösĺŕp! ĄšK…vlđţWUŔĄŞ €ë±»ôUn µĐ6“#’¨őĹ—ĆŁ.'40{ĺs#~÷jĽŐ/¬űxŹBî0Î_lýűe•ď® “^[té5¸ĺnŞ-2Žz–|¸ôáË|čÚĹJ#‘>>sräúĄáÇL|Ěn4— íŰÚ< ľ˝PT\Ź]¤ŻfW(€żČä$gú4 KŻ-ęZ•¦SEέSź¸rA<Ľ>»Uév,;›>™şuÝłľ3rýŇ`ě#—ĆQ˲˝˘ńú,üuCÂ’żmÚţËçŻyIu$ŇŽ¦Ła%fŻ|.ý`¸ 7›7— í××< ®†^¨*®ÇnŃWł7Ŕ_drD’*éµ…Ýk.ĺ+˙vޤ_˝ŇćŢE±ż{Uµv<›ŽXşwűňý;~łtV0ę ,»sĹ`ŻF˝nߑڣnH—ĘÜďÎýóëźŢđşI°MGńň”`ô]«ňú6 ·'ÍĄB{utĎ€«§Ş €ë±űóŐl…đ™‘vLďÉC3cĄuĹazÔ É¨/ţ»•˙°°*ĚwgŽ^u`§ í6r0Ě–c‡ţzöŘ`üŁAů î5…ĆQŻç„µîp?„…?uë:5’`;›>ŮtôŔ}/5S‰ćRˇ}Űą€§BŔ5ˇŞ €»±ËóŐěµđ™‘Ä'3VOF}ń­Sź¸sÖ0ß›9ć®9ă•dGuţbóţSM‡ÎśÜrěP—ĘÜŻTĺv­ĘëY_Ň[E\÷§A¸ îxfTźŘĐĄ{·«”űřĚɧ?ýţěqÁ¤=ę†J5— íŘČ<®!˝PTÜŤÝśŻf·¨€żČä$8Y“‡Ţ2ĺń[§>¦[MAΛ •aÖÜŇrîbóů‹ÍĎ~řN0ń±ř[qU\Ix¤×m?qD±$Xë˙Řtá\߆ááçź+µÍĄB;¶pφ€kN/Twc×ć«Ů0jŕ/29" xbŹş!WL¸tďöłÍźĹsˇĺ˘2ěŔŠŢZÔ­¦ŕ¶i#ľ6ĺqłoňóé±ŇôÚ˘> ĂNś?ž-­­Š%ÁÂOŢŰQÍĄB2ôoʇ€(č…ę ŕněÚ @¤LŽČ5Oź†aéµ…7Tĺ† & ü›g'8Ýt%{Oť0‹Ú±Ý=Żě{łĆ|ö¸05uDF}qf¬4ÓPŞ\>âĂéáŢO§?U/‰·ĺءľ ĂĂ"í+±'Żyz_ţŰÂŻ?; Ú¦?‘Ň ŐAŔÝŘť€H!‘k•N9Aů Kő@ńš—6r0ĚĆ#űw6}˘Đ:ĽŹšŽŢ9kĚOV˙ăÂęžő%W^Ź›+í­:äňDjZuA0¦ß}/5„ÇB¸aTM»X÷ńžŰ¦ŽčVSQ_l[F2v=ń±ľ ĂĂŻ?› Ú¦Ež‘Ň ŐAŔĹŘ…€H$‘«x)jQP–})“ĺŮ/ězoپüĽ{Ë‘ł§×ő`ÁGďţěůš_/™ţÓ…Ő]*s»×†QňśáŢF=đčňy‹÷lÝ~âÂiÇj˝g~yת<ÓâQěóđ{đGs'.Ý»}íˇÝöüEşôŕ!)˝PT\Ś]”YůüC7ť+˙i5ĚŘG~4wâěíă™óáFŐtýýűeż17{ĺswÍn†®UyÝj ¢Lä˙Lð`\˙aożŇ°ĺí˝§N¨ťv{mżesâŐš^[¨TŻmú6 O«ÎĆ>ô·ó&™H…ĎO—<$"ĄŞ €‹±Ű2‘2Q"˙YzOÚłľ$(ô§LżúĹI﬌çé Ż/Ű÷ˇ ş® {ű•‘ë—† ÷FP–Ý©"'˝¶ČŚ›ü?“+˝tnL|,{ĺsgš/(źöҰĺí[§>L¨ZŁzMęÄÇ~ąxZx0®9¸Ű~ĎOŁ<'"ĄŞ €‹±«2‘2T"˙ÇM÷šÂ.•ąa‚˛ěľ Ë׼OöĘç.´\T2×›˝§NLzgeěýµOox=0 >¤Üłľ¤·z‘˙|ž˝SENx’„çFΛ Q{iŘňvXąá©Ţ­¦ŕf© Ą–e˙taő¶ă‡í7ř˘ôęÁŁ" Rzˇ:¨¸»*)s%×ű; 'M«Îż’ |Đ=óËű-›ćż:cäúĄjäú´ńČţy;6˝°ë˝ţËçŁ ʲýa´MÚJðŚúâ.•ą·N}â×g›Hm_3>ŘpiŠ|Ň@Sä%­ş SEÎOTě=uÂ~/AŻ<*"ĄŞ €‹±{2‘2Zr}ľÍ0˝¶čr 3ę‹˙eŃäű^jçîyeË÷¤.®[ëď]sp÷ÚC»ď™_Ś}((ËN«ÎďŰ0\áHۧJx’„[ĺ;Ď<ýÓ…ŐC×.VJíĺLó…űw,řčÝ`Â;3ŞżĎ!V~ţüĹúź,¨8vîŚ]_Žv=xZDJ/T÷[÷d"eŔäzHĎú’ŚúâxnŞ-úFă“wĎ+ óŁą˙éůZUpť»ĐrqŰńĂ;šŽ†˙LŻ- ʲ;Uäô¨ŇÇŰQĺó/á¶ąă™Q·ĎY˝yµ‚j/MÎ…%\÷Ţš`Lż.•ąŢ‘ŃĆĂŻŃĚXé=óËm9¸JÚőŕi)˝PTÜo]’”1“üB·x2cĄ·ĎůťgžŽ§g¬ä©őŻŮů׹3ÍŽž=}ěÜ™0/ďŢŚô«ŐůiŐYjGľČ!Ó+Vň­éOý׺!‹v˝Ż¬Ú·˘‹×ĽŚ}$˝¶čfĺŃ$ü2íŰ0ü›—˙b[®žŽ=x`DJ/T÷[7d"eҤæaX<éµE{Oť°Ő µ´¶Ć3`ĹüN9^V,ňe™ŻTĺn:z@eµŁÖËuť»ęů |=iŇŞóď{©Á–kEÓ<3"ĄŞ €ű­2‘2iŇŇ{ňĐ›j‹ş×Ć”e˙ěůš¦ çâ9qţl«ŤÎe÷Ě/żmÚoOę–)Źg^žHŤGÉzkdZuAŹş!O/-­öôoKű4 ‹W´ÍŃüuF]q0iŕŻ^i<Ó|Á–kEÓ<3"ĄŞ €ű­ë1‘2r’˘¨™±ŇΕă Ć>4ăő»>=ĎGMGť9ion†ŰgŚüń܉aÂÍ“Q_Üłľ$Ë›|ÁôiÖŁnH0iŕwžy:~Ô(®öőÓ…ŐwÍË”áaQJŤnŰăúçŻ~qGÓŃŁgOŰup éŰÇF@¤ôBuPpżu= R¦NRe4&­:?(ĎţS&>–+]xo<«î:Űü™ÍĚź{y÷–>;áŢE±˙± 2­şŕ¦Ú˘0^Ť*_öü)Ć>ôOĎ×®űxĎ–c‡ÔW»űçj3ę‹Ók‹L¤F;”:ö‘˘·9{Ę–kNß<6"ĄŞ €ű­ë1‘2x’Ě ĘeŮ—2ę~Ëć,Ţł5žE»Ţ_ľ‡ÝË˙měĆ7~ąxÚo–ÎúŃ܉áţI«.HŻ-ě­šäËÎĺu©Ě ĎźpG-ÜąŮDj»;zöô}/5üzÉô´ę|c摾”üŇ÷ďč‹ŢZtěܢ o‘Ň ŐAp%Ćő€H?IžůŻôÚÂ˙x#jůĄqÔňMoNÝş.L廫öśüQď‘Ndw©ĚíÓ0ěńu^“ ‰Łuž‘Ň ŐAp%ĆĹ€H™Ią†ÉŠ•ö¨r%iŐ;oŇ?żPĎÝóʆ˝mć…Ďĺägç×}Ľgă‘ýaÂ?ÜX•”eĺÂ}ŐÇŰQĺZżÇą[MAÖäˇO­Mé%‰MG„µ˙­éOu­ĘSň‘î˙ôÚ˘ď<ótř=âwŻÚxHş÷ŕá)˝PTWb\Ś”±”«If¬´W¬$žŚúâľ Ăďš3ţJnťúĶă‡í1>żcçÎěúôŘŢS'Ę7˝Śéץ27ž,ĺ&Ńś`=ę†Ü>cämÓFŚÝř†lw-­­»OŰ~âH·š‚Î{Ö—ô¶Q#Ţ˙abﯵ÷ ńtďÁĂ# Rzˇ:¨®Ä¸)“)_řĄ¨˙žĚXé­SźřFă“ń„˙_˙óĄ;Š/áLó…“źťs˙k3IÓk‹2ęŠÍŁI¤çXx‚Ý6mD÷šÂŮŰ7ŞÁdp±µeÍÁÝAYvxآ Jý«ËűĆ®í:¶´¶ĆĎs[Ú¦{‘Ň ŐAp%Ć­€HNů˘éY_O0iŕÂť››[Z®äbk‹Ĺ—đ׳ÇfMzË”á77 Sb’s,(´úŕ® -[Z[Ő`2Xą˙ŁÎmÎÄ$(Ď?đ(ö˙ćO¦Uç‡çą- mÓŔĎŹ€Hé…ę ¸ăV @¤ §´•†a=ꆤUçÇÓĄ2·÷äˇGΞŠçă3'/´\´…řrv}z¬oĂđďÎ&ţňľ0YŠN"KďË۬ku^xšm?q$<ÁŚŇ'‰¬ĎŞ/ůÖô§z֗ب‰Jť4pŐ]Í-×~˙Ż?Ľ7Ľ6„ëÖšŤ mÓŔĎŹ€Hé…ę ¸ăV @¤Ě§üy˛&íT‘s%ÁčsŢ\¸ířá+Ů~â=Ă—V˝yőĎŚúÉ‚Š0óě„ôÚ˘Śúâ0JO"MźË#öÁÄÇn›6"~”)Ć$1jĂëß›5ć;Ď<ť^[Řłľ¤·íĺ\vŻXIP>(ĚŞ;ŁxMđňýý·)ĂĂ=ţo´˝ˇmřŕů)˝PTWbÜŠÔő<ĄŇ·ax·š‚ ,űO™4°sĹŕĄ{·Ż:°3žđχΜ´I¸JŮ+ź»wQě_O˝ă™Q]«ňŇk Ăô¨bMpĘĄUcúÉ‚Šĺű?ÚpxźzL#~÷jź†aá™Q_ě4úíçÝk Ă9ţĺ~Í—rööŤ· ňGs'¦Uç_YJ;Ú¦ž‘Ň ŐApĆ­€H]oĂ)—Ţ•veuLżű^jXđŃ»W˛pçf[‚k˘Ąµőţ×fö_>/LV¬´KenZu~F]ńÍ ĂĚIb&RĂ]Ś~đß–4ÎÚţ{©I%ő‹ý–Íů«i#ş×:˘~Ypzma0ţŃۦŤXşw{«Ů¸mý7ź o—Ţ”úg«iźCŰ4đÁó# Rzˇ:¨îø©Ž>ŤRtiőJʲÇn|ŁzóęxÂ?o:zŔŕZY{hwΛ ‡˝ýJ+ć_zoĺŕ0˝b%^†( K¸Ů:Uäc 7axĘm;~Xm&Ź˘·…çĂĄIÉňAőŐ#ż„ßű÷Ě/źôÎĘE»ŢŹbA·­˙zăo»Tćöůż–Ňn‡¶éáGH@¤ôBuP܇q% Rl놪ÜÎă &>öĂg'<±nI<ŹŻ{%Śçš[đŃ»ŢYQ˝yő?=_Śë‚î\9ŘÄ™$řĚŚ•^:úʲsW=ćčŮÓĘ3yśmţ,ő‹áSx>„+eV=ę‰Ô´ęü`€»ćŚ_¶ďĂ(´aËŰ•ď®úzăo»Vĺőůťöö<´MŚ+1‘JáÁ“†aőĹ7Vĺ]IçŠÁ÷ż6sŔŠůńüŻWgĽ°ë=KLDžýđťy;6…ąuęÁřG˛ěn5}†›“ÄO¤ö¬/ůJUnx$†G_żes”gR9xúÓĆmëźZ˙Z0®żqőÄ\‚ňA÷.ŠýzÉôŐwEtţ‡·Ž`ŇŔ6^zkçCŰôđÁ#$ Rzˇ:¨îø©š4IŻ-JŻ-Ľ’®UyßžţÔ/O»’{ĹZ­(‘ůřĚÉĄ{·ŻÜ˙Q˝{齇eŮaÚK‰z"5>žŰ´÷˝ÔĐůŠ„\ÂëÁ÷gŹŰŃôIkÚzůŮÁ¤™±Ň¶˙Kěh›>x„DJ/TŔ}Wb"•´ĂV™±ŇŚúâ+éQ7äżĎ/űűç*ŻäÎYcF˙~™$j{NßüÉÁ-Çĺ®~!ý`P>(LçŠÁ˝Ť€I{ż#5˝¶đö#0g\ńš—”j˛ŮŞé/O ĆôK«.0‘š€d]ÓţÉ‚Šđzpřě©kľ gš?ŰtôŔË»·|ž˙%mÓĂŹ€Hé…ę ¸ăJ @¤’g˘$3Vz%=ëKnťúÄ÷fŤą’ŰgŚ<±Ůz‘­üăˇ3'?ţ÷üŹ•ÁÄÇşVĺÝT[d¸L’ä´Ě¨/ţÖô§Â?Wľ»JÍ&›ŁgO‡GÇĎ_¬Ęy™r†RĂşřţěq­éąććş÷ÖcůjuţçüK ´MŚ+1‘Jžˇ’[¦<ţµĎŤUyy«_°:$RKkë…–‹av4íZ•wĺ]˝Y±R3_’Tówáiů•ŠÁ‹v˝Żl“Px†Ü9kL·š‚LGGÓłľäŻgŹŤhM/¶¶Tľ»*4đ ˝&[-@ŰôđÁ#$ Rzˇ:¨îø©v™é}ů˝f7Ő]I§ŠśÍź<Ó|áJ.´\´:$ŇĽ›ľZ•Ű´a˛ĚyIR&<-ňAŹěÉ‹­-Ę6 }wćčđ Î’°ëDŻXÉ UąwͶůłÖtÂ;+ÂĹý; Ô´MŚ+1‘JĚŘHתĽ.•ąWŚôŢE±}§š®dď©-­­–Ä+zkŃ×ű9ănź12Ł®¸W¬Ä[%Ů&ďzÖ—tŞČéQ7dϧÇ÷ś<î´LBGĎžţÖô§Â“$ËPj˘Ň§aXP–ý‹—§„WŹĎśŚbYsW=˙ŤĆ'ĂdÔŃ˙ @¤˘‰żŃď?2aŔâ=[7=p%ďŰsň¸źöňŹ «ö|M<·MŃ˝¦°GÝžő%˝ŤzI’ŤÝĄ‡ÇéřGďxfÔĆ#ű7rPń&ˇpiľ?{Ü=óËÓk/ť$ömbJ#­:?ýŕŻ^iÜwŞ)˘•Í^ů\V¬4ü‚čű2ßJÚ¦Ťž"‘Ň ŐApĆ}€H]ý‹ü.Mž–e˙GĆ>ôw *—îÝ~%Kţ°ÍçL»Űvüđ?=_űż^ťńŻ‹§v«)¸㨒„éŰ0üŇŘÝ~˙üBíâ=[7ާ„“Óę»îxfTçŠÁéµEN’„UG0ö‘üŐ/.Úőţ®OŹE´˛9o.ĚŠ•ö¨ňĄ—Uu@Ű´ńÁS$ Rzˇ:¨îø©/óňľ?źBť4°ňÝUł¶˙ţJ¶Ľ˝ţđ^,É`ęÖuý–ÍÉysa{ĹÂíÚµ*ďĆŞ<]’Ě/‚ěR™Śé÷›Ął&oY»éč…śś|ôîŻĎţűç*;Uä„«fë& ú«0Ć>4p傏ϜŚhe¬~eô¬/ąšˇTs©điă{@¤tŃőŢ܇q RmOUtŞČą4r%ăýń܉ŢYq%ă7.÷’lĆn|cäúĄOoxýö#‰Ź…Ű8LZuľŮ1Iň\:r' Č^ůÜë–ělúD-'§ĆmëĂúÁśqábu«)p°$&Y“‡eŮŹŻ{eÄď^mşp.Š•mim «/ü·„•+˝ĘŕŞh›6ľDJ#]űŔ}÷a"őç/éëQ7¤Keîź'çÍ…Ĺk^ş’+ć/ŢłŐ‡F˛9xúÓňMo6ly;LőćŐť+_z™oyv¸ĄŤŚIňż˛W¬$/˘•ÝŞéŮßybÝ’`ě#×pÖXÉ@Ű´ń= RéÚďîø©{Ĺâą{^ŮŚÖű@Hrë>ŢłöĐîđźaţqau0öˇ ,űĆŞTŕÉŻxÍKábٱíS&eٱ÷×Fşľ÷Ě/OŻ-Šô˙ EmÓĆ÷ €Hi¤kż¸ă> \?~0gÜ7źĽ}ĆČ[¦ ĎŚ•f]~Ĺd–A-IéפĆJ»Őt©ĚÝrěбsgš[ZTz2»˙µ™}†mĘă˝b%źD¦÷äˇÝk qý·­żĐr1ş%ľ{^Y¸¸áWŚąThGÚř)Ťtíw÷a܇€lÍÁÝßśöŰżť7)žĚXiF}qĎú’¬'†D"Oðp3“Ţ2ĺńťMźěh:ŞŢ“߯—LĎźuC2A‰Mę„K÷nß~âČą‹ÍQ,îů‹ÍwÎ~ŃdMš€őUMĐ6m|”Fşö;€ű0îĂ@3âwŻţÝ‚Ę{ĹÂühîÄ«ňŇk‹ÂÜT[d2K:@ú4 ëVSŚ}äÇs'®=´{ÓŃŞ>ůĹO¤Ţ“‡ö¬/±‡ůŽÔđʲüĽ{Kkdë{ěÜ™»ćŚď^S~×$ć5¸j Ú¦ŤďA‘ŇH×~pĆ}č~cîo–ÎzŕőŮ·MŃĄ2÷«ŐůaŇk‹nnf8K:Fú6 żˇ*7ýŕż.žşŕŁw7ާđ“\Ó…sżxyĘýŻÍ ŹŁ´ęüĚXio;9ďîVSţaŃ®÷ĂD·Ę{Nżg~yř˝“ČĹU\Đ6m|”Fşö;€ű0îĂ@ŠÚ~âH˙ĺóŠ×Ľ&wő ]«ňşTć†É¨/6ů%o®SEN0öˇ‡ß[ľéÍ-Ç9’ßľSM˙˛hr0iŕ Uąöp‚ß)ś^[LpëÔ'|ôntKĽţđŢđkč—‹§eŮ ţ;Ô´Mß"Ą‘®ýŕ>Śű0B|ôî¨ ŻOxgE_˝ŇŚë” Ó©"Ç(–tČdĹJ/M¤N»ęů˘·<ý©s ům<˛Äď^ýÍŇYÁ„}Ľ˛9áC©á—ÂßΛ4ěíWć|¸1şU^sp÷˙7ż,üş±*/ń«¬Ę mÚř)Ťtíw÷a܇€ä7ó afm˙ý7ź Ć?”e‡ą±*ŻoĂpCXŇ!Ó{ňĐžő%]*sÓk sŢ\řđs[©`ÍÁÝS·®»ďĄ†`LżŞrťQ žHíVSLřÝ™ŁďŮőBß=Ż,üwµ×«5h›6ľDJ#]űŔ}÷a }|ćä˘]ď/Ý»=Ě‚ŹŢ & ŚĎ˘fÔßěĺŇŃ'RĂ}޵*ďkS˙Ő+Ťż1×*ÖŢűýŮケŹt«)0‘šřÂąˇ*÷V˙ÓóµËö}Ý*Ż9¸{ɶýxîÄ <»_†«Ü mÚř)Ťtíw÷a܇€$±ýÄ‘ ‡÷m:z LţęQĺÂtŞČ1r%×Ď;R»ŐÜ>cäÝóĘÂ*p,¤ŠÍźÜxd˙wžyú+Uą}ĚÎ'<=ę†tŻ)üöô§¶?őB÷mL|,ü7¶ďB+:h›6ľDJ#]űŔ}÷a }í?ŐtŕôĄ\zĎŕ¤7Tĺ†IŻ-4Ű%×U2cĄőĹßžţÔ-SźđÎ 'CJhimÝwŞi÷Éă7Őu®Ü3VŇŰfnŹÚąsÖżš:"\‹H—{ď©a‘fÔ'Ă*«>h›6ľDJ#]űŔ}÷a Áš[ZÎ6Ď®OŹ}µ:żGÝ0Y±RVr}&kňĐ[§>qcUŢĽ›)ábëĄslĂá}Aů đř˛‡Ű«p2cĄßl|2üZ‰n­[Z[õŢęDzmQVŇüß®ˇmÚř)Ťtíw÷a܇€‹˝ż¶kUŢ­SźÇh•\çɨ+Ę­=´űÜĹć–ÖVGDJX¸ssxŽ}mĘăYöpű˝&µ{Má·§?uţbs¤k˝áđľ´ęüdű¶RĐ6m|”Fşö;€ű0îĂ@üëâ©·Ďyç¬1aľŃřdF}qf¬4ÓUr¦÷䡽b%]*s»ŐěhúäŔ馋­-ŠT1{űĆ˙RS?ÇlćvHðΕ˙nAĺÁÓź>{*ҵ^u`ç­’„k­ ˇmÚř)Ťtíw÷a܇€\hąřăą˙aaU> ĂzÔ É¨+Ó+VŇŰ\•\Ż ká¦Ú˘`âcßšţÔćOn9vČY‘BĆn|ăűłÇ}wćčôÚ"çX{UP0iŕ?żP»çäńH×zööŤáB‡Ëý_j “p­#´Mß"Ą‘®ýŕ>Śű0p -ůöź.¬ţŐ+Ťaî]K«Îď^SĆ[Eú6 +"űĐ?,¬Zşwű†Ăűś)¤č­E÷˝ÔđíéOÝP•›Q_|sĂ0[:ńÔµ*/ýŕż,šĽýÄ‘H—»qŰú[§>ŃĄ2·GÝä\k% mÓĆ÷ €Hi¤kż¸ă> \Ą§Öżöđs®\ćîyeÁ¤]«ň¤Uç{ź Hü Ź]*sŃţŻWg4n[o"5ĺŻy©W¬¤sĺ`©íůšÔqýĂo™©[×m;~8ŇĺnŘňömÓF„ßb}’x­U%´Mß"Ą‘®ýŕ>Śű0đE5]8—żúĹż{5ž^±’ <»sĹŕ0éµ…} m‰üY:UäăúX1äúĄQżä‘knčÚĹá)—^[”QWlĐľ}‹č7Kg<ýi¤Ë]ľéÍaożňíéO%ůPŞąTř‹´ń= RéÚďîøźÇš»'Ľł˘î˝5arW=Śë”ЧW¬Ä¸–Čź'¬ĚXi—ĘÜN99o.¸rÁ±sg#)äÄůłă7.ą~i0ń±đ” WÓ)×.Éş<”~édŻ|®éÂąH˝aËŰéµEÁ¤=ę†$˙_° HˇmÚř)Ťtíw÷a܇€6,ůö˝»pçćź,¨Ć>”e‡éR™ëĄ¨"˙ŮDjĎú’Şr{ĹJ~cîŻĎvڤśCgNfŻ|.ý`P>čfg];ŐQXA]«ňŇk SDł¶˙ľsĹŕ°xSeYťBŰ´ń= RéÚďîøîLógËö}¸úŕ®xzÖ—\z]`Yvzm‘YT‘¶'é2ę‹ÓŞóo›6âç/Ö÷_>Ďy’röś<ľ|˙ŽüŐ/céŰ0Ü®nŻRęQ7ä–)Źß÷RĂ˙~uF¤+~öňWŢÂť›Ăoş¬”ú”T+´Mß"Ą‘®ýŕ>Śű0pčĚÉ-Çm?q$Ěä-k1ý:UäÄ“+ímNJä/ĄW¬$˝¶čö#ż7kĚе‹ť*)gß©¦mÇ˙Ű’Ć`ěCÝj Śá·WÂ/ť›j‹Â‚°b~Ô‹~¦ůBőćŐáW^—ĘÜú¦Ëş<ŻfˇmÚř)Ťtíw÷a܇ŕútôěé+ůĺâiÁ„iŐůaŇk o6%ňůgÄbĄ=ëKľŃřdřĎş÷Ö8[RщógďžW”egÔ;Űwľű¶i#ú6 Ď^ů\Ô‹~®ąąňÝUÁřGSkĹł.żOöŽgF)[h›6ľDJ#]űŔ}÷a¸N´ţńŹ[[â9vîLÖäˇ=ëK2cĄa˛ĚC‰|ŮôiÖąbđâ=[2©(~$Ţ5g|zm‘ÍÜîéT‘3~ăň¨˝Ąµ5\ô ď¬& LąŹ¨GÝÍť¨rá/ŇĆ÷ €Hi¤kż¸ă> ׉y;6uŻ)üfă“aľŃřdÖĺ×®ĹcJäKĽµ0,¨ |ЦŁš.śkniqȤśs›żŢřŰđ<ěí$lׄź˙MµEÁřGË7˝yˇĺbÔëžóćÂŚúâ[§>‘+M­OéĆŞĽ{ć—źiľ xá/ŇĆ÷ €Hi¤kż¸ă> XżesîxfÔźťćö#{Ô éY_¦W¬Ä$”Č—IðŚúâ |PXG{Nßőé±–ÖVGMĘŮŃtô덿˝kÎřř‘hc·ď¸e0ţŃ…;7ďlú$—VĚK8Ł®8…†Rű4 Kż<·űӅՇΜTżđyhă{@¤4ҵß܇q€ŽäLó…{ć—˙üĹúxţŰ”áÝk {Ô “Q_ÜŰ ”ČUŤ†ăúß9kĚúĂ{7=ŕŔIEË÷ď¸kÎř»ç•ĄU„ŁŤÝŽă¨™±Ň <;˙輛đšÔ_/™ţłçknťúDF]*}†'Ořő[6gÝÇ{v}zL Ă礍ďA‘ŇH×~pĆ}RÝË»·Ü»(v˙k3ĂÜ÷RC—ĘÜn5ńdĆJ͢Š\eú6 ďZ•Ś~0,´E»Ţ_xŻc'uOËŰgŚěT‘“^[ällߡԛj‹ş×.Ţł5¬©,ýo–ÎęQ7$­:żW¬¤wJ>Á¸ţáüž“ÇŐ/|!Úř)Ťtíw÷a܇ Ť\ż4çÍ…ů«_ óăąIo¨Ę “VťoŘJäľ©°sĺŕ`Lż^ź]˝yµw¤¦®Ćmëű/ź÷·ó&uŞČ —ŐŢnÇšş©¶(řXf¬ôŮßIĚę÷[6§kU^řoLĄĎŞaX¸Wă‡ĎţSMJľ(m|”Fşö;€ű0îĂŽť;3tíâ±ß§GÝ <»SEÎĺ˙łą¶Éš<ôŇPŘ„Ů+ź Ko·—¦¬ş÷Ö<˝áőŰgŚ &>ć´l˙AďŠÁ={ěČőK·­Źz鏞=oŃ[‹‚ISîł ˙›Ă˙ňđż?üżBĂ— ŤďA‘ŇH×~pĆ}’Öš»ëŢ[Ó¸m}ÜUĎc ʲăÉŚ•z/ŞČ5OXV˝b%]*/˝z8çÍ…ż1÷\słł(uÍü`CzmQ0i`Źş!&RŰw"µ{Ma¸ßyćéy;6%`é÷ž:ńŔëł1ý:UäÜśRK~żw­Ęë·lŽú…«ˇŤďA‘ŇH×~pĆ}’Ęâ=[ŻäîyeÁŘGâ¨]*sű6 7Ü$ÝDjF}qתĽ°ĐîmćŻĎvĄ®ć––v˝·pçćÎ{Ö—âoç4 »ˇ*÷' *î] ×%ęŐß~âH¸ôVĚĆőOˇďÍřP|Zu~Źş!żY:KĂUŇĆ÷ €Hi¤kż¸ă> íëŘą3kîŢpx_eű> ĘłŻÄ ţD3Öłľ$­şŕ›ŤOţýs•Ů+źs.Ą®¦ çÂuĆ. ő—ʲĂŰ;áYZu~X\ë>Ţ“€ °ëÓc÷.Šcú…˙Ňú˝4_W|ëÔ'~ö|ÍŻ—LWČpő´ń= RéÚďîø@â:sr×§Çöś<fÄď^ ĆôëR™Ź!&‘D&3VÚŁnČí3F~ŁńÉ‘ë—:ťRÚÉĎÎŹţý˛đDíZ•włˇţ$HĎú’ĚwŰ´ŰŽNĚwëOVĺŮ)÷W:„TF}ń€óU1\+Úř)Ťtíw÷a܇ ZZ[›.ś;ůŮůxîžW”ę^S&Ł®Řü”H‚“u9™±ŇۦŤËpĆS)í\ssxĆ>µţµ`Â'j’”XřĎŻMy<\—l€řwë=óËo¬Ęëť‚ÓńiŐ9o.TČp iă{@¤4ҵß܇q€ŘvüpZuA߆áńô6µ$ŇŢ`a‚ňA+öď¸ŘÚŇŇÚęJiż1×;R“í ·Lyüägç°úaý~{úSáż4Eż[˛ě˘·9…ŕÚŇĆ÷ €Hi¤kż¸ă> ™đΊžő%w<3*Ěí3FöŠ•ÄGáÂYI|zO–á Uąá??>sňčŮÓGΞjniqXĄ´Y4ů덿˝eĘăá˛fŮçIPe7Vĺý`θ°ľŽť;“€ pˇĺâ·§?ýqŠ}\ ĂŇk ±Ź {ű•3ÍÔ2\[Úř)Ťtíw÷a܇ŕşďĄ†ĎťxĎüň0ßšţTzmQF}qžő%ć•DÚ+}.ÍÜ9k̶ă‡w4uXu?YPńßç—…‹ŰŁny˙䨲Â`\˙»ç•í9y<1{ŕÄůłßť9:ü’MĹŹ+űČä-k·;Ôtáśr†kNß"Ą‘®ýŕ>Śű0\Ťí'ŽÜ3żü/O‰§g}I÷šÂôÚ˘0áź{Vi×ômžVťŚéwď˘ŘĘýmţä S«himýÇ…Ő—OÚÂ,©ÉQhÁřG˝dúňým;~8{`˱C÷Ě+˙Ůó5Ýj Rń­˛Á¸ţuď­9Óü™r†hă{@¤4ҵß܇q€/dÂ;+îmćĂoĚŤçź_¨ ĘłÓŞóăÉ2 $’4Ż#ě\18ý`X§ł·oÜrěă«Řsňř/Oűő’é]*smň$J×˙ß–4&ěMÄë>ŢsלńAYv·š‚Ţ)5ŽÚ+Vţg«|wUKk«Š†čhă{Đż›|třű•O·ecüTÔ~§]öˇĎHő/P/¸»®ďŕő‘¦şÖ?ţ1wő C×.ŽçÖ©OeŮ]*săI«.čÓ0Ě\’HR%(ŚëźżúĹń—ď9yÜ9Ö¬?ĽwŕĘżzĄ1řXת®Ëî“ǰ ^Ţ˝%{ĺs˙ô|mřEśb_ľ ĂnŞ- S÷ŢšęÍ«U4hţ{ŕ;ČéŤkĎŕÎě2ŚŃ~'µvšĺ:Ć7ŁĹ÷aG8‹”?@8‡}ţÉlă‘ý#×/­|wUâ5/\s»śŚúbóP"Iű.ÂN9ť+‡e›żúĹ3ÍśfĂš»ď™_Ś{¸kUžż ‰Ŕ˲łW>—·ú…§?MŔ6XĽgëwgŽĆ?Ú­¦ ĺ†R»×†(ßô¦r 7ť@_@pěX{wf—aÔö;)şÍ, Đ1ľ-¸;ŔAäčç°UH*/ďŢ2{űĆg?|'Ěż,šŚé”e‡éT‘c J$Égľ2ę‹;W˙<`Ĺü+8Đ:ŚĺűwĚř`Ă?,¬ & ěŰ0ÜnO†đĚXiתĽ0ż^2˝Ąµ51;aéŢíßžţTXć©őŤţ×ö¨” wďřŤËU4čąiřĆqžc‹Ú˙¸?»Łjü\Ąm*k+ßSŕ4Ŕ9'ŕ@vś^oÎ4_Xň‡mË÷ď'Ł®8řX|µ[M(‘T™HíZ•÷­éOÝ÷RCţęťlĆŞ;—íűđŰÓź Ć?š^[čďH’ˇÔ°â˛&ýŐ+Ťż\<-1;aůţŹÂťpëÔ'nLą·ĺ6 űjuţťłĆüüĹú ď¬PÔŕ§źv€/G:¶Ą˘ŔýŮĄäg)~ Y\pR9ÓŔS/Ž Ŕ±ěíxöś<ľéč-ÇĹS˝yu0úÁ |P<™±ŇŢĆŽDRg>®g}I÷šÂ;žőýŮăF˙~™#®chim ę0Ýj ‚˛ěŚúb'sňĽ&5˝¶(üçýŻÍLŘ~X{hw—ĘÜp'„őŢ;Ő>±đă ˙9ó ęü ôłŔ÷‹#[Q™ŕ"íꋲâ:ŻD+8¦nŕĐŔ·‰Óp>;3SHKkëÁÓź:s2ž{ć—ëZ•O·š/ŕIĹdĆJ3ę‹oź1˛OĚĚW‡rˇĺâ˛}Ćę,[=™ŇłľäݦŤřF㓿Y:+1;a˙©¦ő‡÷eŮ©ű‰ÝT[´pçfu ~úY ŕ;Ĺ‘Ž‹ŤÂŔuÚŤ%Ću[€Ýń Î(‡8@ph€Äy8źť©âbkËą‹Íç/gŰńĂ]*s{Ô ‰'3Vj¶H¤äkSďZ•·ęŔ.'^;ş—îÝžşs8Y“‡†_¦C×.NĚfhim}a×{Á¤őĹ©ű‰}Ąbđâ=[•6řmčg)€ŻG:®1Š—j7^”×UŃYe;śQ7pžŕ ‡†łpJ;SÔ¤wV¦Uçß6mD[§>áŤ{"i8®GݰŔw6}r¶ůł–ÖV'^‡1uëş«ňľ6ĺq‡vRĄ÷äˇőĹÁ„#~÷ę…–‹‰Ů >z÷+łRöŻ’Ź©`ŇŔĄ{·_lmQÚ࢟ĄľD鸺((\ŞÝxQz\…fqm p@áĂŮ‚“śŔAí0L9˙}~Ů÷fŤůţěqń|˝ń·őĹ™±ŇxL‰¤|†]šŚ+ôµ)Ź8Ý´˙T“yÔŽdÄď^˝uęßl|2~tŰđIUzÁ¸ţS·®Ű{ęę㠉Ů3>XSmQŠľ)5sriçĘÁ›?9~bÍ-†RÁďD?KÁŮ⬰Ė ç‰3Ž‚R¨[Îłî¶ Î^śĆ8~Áé„SNÎF J …¬¬,±•Jď»sćź.¬óŹ «{Ö—ô¨r%˝b%˝ ‰tôiÖ˝¦0×˙îye›ŽŘvü°°şvqV¬4\ĺđ$wt'U:UäcšşuÝ™ćĎłFmxý®9ăďxfTzmQĘm†Ţ—_“Ú­¶`ă‘ýęü`ôłś-Î ‹k™p€8Qď("llµ`ËŮc–ŰžÁŮ‹Óg/8špĐ©GŔ‘ččCąˇ˘•’ŵRínčÚĹ˙óĄ†_/™ĎOTt©Ěí^SO–"‘7ŽÖxP–Ś~đWŻ4.ůö͟tv0VĚ˙×ĹSo›6"‡;pµčY_”Z´ëýĹ{¶&쥟O­­oĂđŞr/˝)µaXjťW=ę†ËŠ•®Ü˙‘Ň?ý,g‹łÂ˛Z&FÔ>jĺ l9{Ě*Ű98{ŃRĂVçÎ:… 8ťx¨;”¶ ˛¬VŞ]śmţě7KgeŻ|.žľ Ă;Uät­Ę‹'˝¶°OJ ­ČçOP>(űĐе‹goßذĺmďHíxú/źěőĹ]*s˝&5éć+' ěVSđě‡ď$l?ŻyiŔŠů·N}˘{MáÍ©öĺ~há‘ő9ăf|°ańž­Şüxôłś-Î j™ ôś(”Z°ĺě1ëk˙ŕěĹiŚ=Î%śu*pú9čP€¨q…cM­T"­:°łč­E#×/ 3`Ĺ˙ĎŢ˝YUŢůţ_DŇ}¤şmđı&1–sŚ•{N%'ɤ2S–ëXI%•IĄ*ĺ•[5ĐĐô "(tÓ@ß»7 4wąĘEQ1 Š(  wh ť_~ůMnFéŢkŻýz×S–óWŕyŢźĎÚë©ůşúu¨řŃ2¸dY±˙DcŹÄĺO4†ëŁ8qáśß31ăčŮÓaÉYűD0)/,öěD©bŹÔ|eçšÁ7L]±yUÓ¶ß·›Ł7<ýOµCÂŕ§ÜgR˙k(uRŢ­sĘWěÝ!ŕ€÷GŻĄ€nŃŽŇ1é@ˇ„â ”ă“et/â—#GĆ@/AÝATĄ'†tţ_ĹśTôHĽ˛ţO×­Ęî˙h0­Suľ/˘ZVZ¬¦áY Ĺaę{$JŠ×- —ź1±d˙ÉăżY1;,ůUŤŁFm¸2ł~h0±˙šlŢľˇ=­xxă3Á¤ĽěDi*nZ—ş‚ ˘ŻˇTŔ[¤×R@·č çč  Đ ’qĘq̱ şq ‘ó" — î ­€Ć~“D;R7/N*f8őţÜ×7=ľëĺpÍzmc0)ďOW׺ˇfQ-+­&R»5u¨xĂôŃż~zÖ°őËü€‰%Űß;ôČë›/»ĽwݦĚŹZ ;Uçgţ¤ź-›6㵍íŁÄńógõ[×ăű¤č÷ť;V úŹÇëď\:eőţ7dđ"éµĐ-şÂ!:&…#ô€@drs t‚îEĚâă¤(č%¨;Č, ë ÖDRŹÔŤ‰“Š ëîţăĘ_óXđđ]˙5Z9Ŕ@eĄçĘť<,«ˇřł5o™=îŹVWl^ĺ§K,Ůvôŕš·ßü鲩ÁŘ»Ăă6”µvk( Ďĺ Ó~Űž_üśy$|”“ŐXüÎéí&ĆĄ>řů“Íťk§î¦…;vó¬±I W¸‡ÍŰ7“ňţřGR8€WKŻĄ€nŃÎKĄÓ˘ M"YĺRÚ1'B3č^1qŽPż€:‚Ţj@›AwA`ˇÁy©¬ż ËJç•;yXŹDIçšÁ×MyüüŮcçÎ\ň3%¦l;z0«ˇř†éŁ ĄF6ŚW׆&1\í™Ä;—NéÖP”“(MŃ}ëRWpëśňÎ%1_‰WÖ¶fpöźěˇÎĽcz-t‹®pR*ť3X¨ňCd”KQǜ٠{Ä!B÷şÚO´č ­±…Z‡Ą¬ţ.F,+=WĎżŽTôýÎüI»Ţ?şçÄ{~źÄ•e{^ý×ćßŢ2{\·†˘îŤ%äŹ`ĂŁ &ô»yÖŘvţ`ń÷Vý‘Š^M#z$JR·Äľ5oÂţ“Ç“±ę—Öd5‡‡ř§<ÍxÍôZ č]áT:[ łĐ-̇8Č(—rŽ9ĘA÷ÂńA÷şÚOŔ¨/}á…r żcRSA–•npťŞóĘĽ`ěÝ?˛yýÁÝ;ŽöË$®L޶ţŰó'Ţ:§<ŁvHVCq®D2’Á„~·/N„aÜţޡöÔăG‹jł‹3ë łSđK©—÷­˘oJlü¦çÂd…ŰřßňĄ/›^Kݢ+ś‘Jç $J†óYĺRË1GŔ:č^hcč^@AŠ9ĹĄ© żPĚwF:ęăc&ȲŇdĺNTĆŢ=ęO-ŰóęÂ7^Úyüß$1¦vëÚ릎ěP5đňg›†‹@ÔVݦWŐ䇑Ľ}qbŰŃí&ơ3'˛xň/–7¶fpNĘn]PŢűçO6'·ÄŠ×-ůĺňé_ś>şK]ÁźGLŢ7˝–şEW8•NČ/´ Ű!˛ĘĄŠc6źxĐ˝H(ě?ÓŹ(@; ˛Ŕ=H1EŞ;ď,ŇŞťLYVěÇQ{$J. ub˙ŠÍ«Ş_ZsâÂ9?EâÍŘWćŻyěĆc2j‡ô4‘ŮĎ}–÷îýÜü0’íů™Ô]ďý÷ÇęĂ6č\38…·n|źź?Ůţ]’˛‘/,Ďj,îP50üç_śűVD€WNŻĄ€nŃŽFĄ3R ťĂs,€r)ᝇŠÓ˝Hzl;Ůč@< ¬   ËĐń°ÝA¤[/˛¬ľuk( &ĺe5Ź}qĺ +ü‰=áAŹßô\xâṇ§o(5š«cő  ˘ď/—O?pęýöÔcŰŃ·/NúĄ¨ą“‡uŞÎĆ÷ůٲiűNObĐĘ6=›Q;$«ˇ8÷Ż˙iŐŕ­Ók) [t…sQé Cíâ  \ôłíĐrşÚşPDĐR@Si'3ÔŐŤRúd˛¬XN¤^]_LĘűâôŃýW/|hă3~{Ä›Ó-ç^^Wąĺů`b˙đÜ{$Jr!’+{réU5ů}ž›ĎĘąíůĺâŢŮ“xeýĎźl*úöj‘Š[—óáPę}Ďλë™9GĎžNbÜ&n^¦,;Qú·˙Ŕz đâéµĐ-şÂˇ¨tn@–ˇqP.ĘŽŮp(:Ý‹ÁžS𼀄ě: |DCiÄŔsGžŤdJȲbµ>śHíX5č«sËďXŇTýŇż:bĎŃł§‡˙ţÉ`ěÝAĺ㨑ýĐgŹDIFmAĎ_=5Łť Ůtx˙·çO Ęîͨ’˘C©Ů‰ŇĚúÂź-›–ܬť˝Ř–j0ľĎÇů3«&Ŕ»§×R@·č űŻŇ‰‰†â6ÄA@ąČ:f·ˇët/´1Ô/ zP€vRJkč †;]ô)1.dY±YY ŵ_¤â«sËľń’ß±çŕé/ĽłgÔž ĘîďŮ4\";”šŐXüą)ühQm;OVn}÷ŔĆCűľ6w|‡Ş©hHî˙;‘Ú=QrÇ’¦$fíŘą3aÖ&o[f횏·“ đęµĐ-.ˇŇYˇ†."6ÄA@ą:fźˇît/"[ ő Ď@ę@/fnhʏmçÓĽ…L YV VŹDIVcńWć”}nĘ/ĽłÇ/ŤŘsřĚÉ='ŽŢ÷켠ěŢ.u†RŁüˇĎ¬†ân(«ť%Ů{ňXÎäaA倰RôCşÝKÂN»eö¸ź,žśÄ¸?öň'‰ÇÝ“Q;äăgMM^B˝–şĹe#T: ÚĐK”†8Č(5Çl2”žîEŇĺ·ĂĐ˝đ€4ˇ*”:$6bŰvdhȲRwĺ|¸Âů|óá?ž>á7Fě9ÝrţÄ…s·=ŃTčŢX’+ŃJýÜ”˛Šű®ZĐž’\úŕ§ŢďÖPţR¸ßĄ]ę îY97ą‰;w±ĄxÝ’`b˙4kĘ đęµĐ-.‘ć•îdżŮ´™!˛ĘEÍ1; ˝§{‘tóm/t/<e¨u-1‡‰ŤŇö\ů|`.Ő˛Ryh«{cÉŐő…źo~°Ąµ5\—üÂHľ2§,gň0ă¨)±‚‰ýÇľ¸2ĚćĹK­í)Éţ“Ç»5ĄüîUč»jA;oÝź“żć±NŐůźŕĎŻ¬Ż˘^KÝâ˛i^éNđłM;1â  \tł·P}şÚ$„' ˇE¤‚I×$|v šçŠcnȲRl5 ďÖPTô˝sé”ĂgN†ëČ™S~Z¤ _™S–ť(MéŹ`¦IH»Ôe÷Wl^u¦ĺB{ňÂ;{rĄ7Í|¨G˘$uw/ł~hPŢ{ŕó‹N\8—ÜÄő_˝0łľđ“m¦ľĽŤz-t‹ËF¤yĄ;YŔ/7íDc,€rqĚĆBűé^$Ýy» Ý Ź@*@ Qv¨”8Él·ŐÎ1@dY©˛z6 ď\38{÷Ŕçm;zđŔ©÷ý˘HŢ9}âËłÇ}wAeVcqŽ,D{ĺN”÷žżsËÖw´óXĺĘ}Ż˙Ď)#2뇆ž¤nËe÷Oز*Ü˝ŁgO'7w÷=;/;Qú‰7Sq^H˝–şĹe#ŇĽŇť,ŕ÷›v"0ÄA@ą¤;fKˇu/´1¨@+BEĘGíRŻU8l˙µMŰa†Č˛RcŇ­r@0öî±/®\±wÇÁÓ'ü–H6ÚűýU?ZTŰąfpf}ˇ,D9¤Ů‰Ň`R^PŃwĆkĎ·^lOOf˝¶ńű «ż9oBFíÜTţÎlPv٦gŹź?›ÜÜýçS3î\:ĺÚ)#˛Š?ń~Ş/Ŕ;©×R@·¸lDšWş“ü„ÓNě…8Č(—\Çě't x«ŤÁFx ZZĐ<:|ĹB`›ŻjÚĂD–•“n /Ż›ńÚĆvţü"’Čâ]Żübyóż-Ş čRWpMÓp‰rTŻ®/̬/\řĆKŹĽľąťU™úę ˙ÚüŰ rŔĺÉĺÔô俊n|ź±/®ÔKśěµÉzćĎ1OdY\=›†wk( &ĺeÖÖn][ąĺy?ŇŠEonýŇ̇ ýşÔô4‘í¨^]_žTřďÍŰ7´ł'a3Ż[rÓ̇®ŞÉOQOr'Ëj(ΨÝÄÍ«“›»ÖK—î{v^P9 çJüŐôŕÍÔk) [\6BĄ;\Ŕ9ŐÄ[,€ríďm„&„BçvşĘPŚęP8ŞĐĐ0qňÖkż©"ËŠÚ[f}a0±˙ ÓG[ż,éZhgćěŘú-łÇu¨h"5âQíZ74Đď+sĘŠ×-IĽ˛ľťUiÚöűn(»˘[CQŞŞňaÝe5Ź}qeŇŁwâÂąţ«†š{…ţvÚ đręµĐ-.ˇŇ.ŕ·śj"-ÄA@ąöwĚ6BB!hcĐšPŚĐ€¶Ń3€P2¤µçęĄ}0[dYQšHLĘűú#ż~zVĂËëü`H+ćďÜ®śÉĂ‚ ý®®/4”ń´v¬ôÝ•żzjĆÜ×7µż-á˙hçÚÁY Ĺą)ş‡~şCŐŔđĎ?zĂÓIOßá3'>ż((ď}s§Óď§^KÝâ˛*Ýá~Ω&ĆBd”kgÇě!ô!t‚63ˇóÝ˝č%č=ĂX®[Ú ăE–•ô•Y_Y?ôŞšü˙˝`ŇŐ,|ă%?҇s[Věݱx×+ÁÄţÁ¤ĽîŤ%ąBážÎŐő…aZż8}ôsűßHŠ-Źďz9´%;Qšş{ŘĄ®ŕK3ľí‰ĆQx*ąÜ{ňX¸Ą…ż[”Ýß«iÄük*7Ŕ+Ş×R@·¸l„Jw¸€_tމ®YĺÚÓ1•µt˝ít/> U dŔ訚řkouËßŔ‘e%kĺL–ŐXÜ­ˇč» *đhő—f>üÂ;{üHH+N·śoÚöű`Ü=ŞJDJ¬«ë ż5oBÖ ‡ö¶ż-‰WÖ§ş- öf'JŁđIč§Ţ˙ĺňéá–fÔąâ_(Öo€WTŻĄ€n‰qWŘX•N@¨&®Bd”‹šcvZš!énŰ:č^h{@=j@˝č@@áÄĎU«Uţ6†Ś,+)©=—?‹ůĺŮăľ4óáó­ý6H7N·ś?pęýËC©ĺ˝ŻąŇqV[¬ěDi¸®ťň@xpI±ĺňPjyďž©lK¸YŤĹ]ë†6oßô ;wć§Ë¦“ňÚhKµŕ-Ők) [âÚvUĄłPމ¨Yĺ˘ć­b„rHşŘö şzPŹ:Đ-ŠPĐ9ńŐ®Ş”ż‹Q#Ëj˙ˇÔžMĂsĄß™?ÉO‚4¤Ąµő|ëĹ^x2Ř˙ŁńdˇH‰Ż|~nĘá?Źž=ÝÎÂ\ĽÔ:lý˛ŘVßµSF|¦jĐ#ŻoNz Ă Ţľ8ŃąfpŰý}uŕEŐk) [bٶTĄĐމĄYĺ"ĺMb„ŠĐĆ`)”<ő¨FŢUť vřÓ'I´‘eµçh[÷Ć’`RŢO—M=ÝrţLË? Ň»ž™“ŐP|픲ĄB‘+łľđ¦™…™ ץvfČÚ'>[38¶„Ő·öŔ®p[Z[“ìľ[CQN[ţ}uŕ]Ők) [\6BĄ;\@¨&ŠBd”kSÇět#´„6QˇáhHM¨•¨ͶPÔ~*“ʉ#Ëj‡Őłix—ş‚ ěŢü5Źí9ń^űrQŕöʼn›gŤýÜ”˛‹s Ą¦Bl»5úÝ:§üŕéí/ĚŻžšqăŚ1˙2mT÷Ć’ Ą®;°; ©!?ZTŰ#QŇÖŁľđşęµĐ-.ˇŇ.  T?!˛Ęµťc¶ ęŠB¨P2ô‰>4ňA[ři35ÉÇÇä‘eµíjޱjP0öîŠÍ«6Ú{äĚ)?Ň“ź,žÜ=Qru}ˇĎ¤¦ĘPj0ˇßKš6Ú·óř‘öćWOÍUÉüPÜ˙BtÇęAkŢŢ•ô ¶^şôÝ•?~¬.ÜŇvˇŇĽ±z-t‹ËF¨t‡ (ŐDN,€rm佂†„®ĐĆ€–S씤J”‰2”ţA[Či'ŐČ?„á#Ëj»i¬Ëk|źćíďzĺřůł~¤!§[Îßľ8ń‹ĺÍ™&RSdőjqUM~0öî;—NŮqěpR´ůÍŠŮYŤĹaŤä¦ň`ďgk_7u䊽;Vî{=éIWŐä‡nHJ¬UĂ#ű͊هΜlmŽž=ýë§gúu¬”“úMřĄ™/ŢőJň¸ëýŁw,i 7¶ť“¨ ď­^KÝâ˛*ÝášA5qâ  Ü•uĚAOB÷FÄd»ő }čIÝ(@(˘ř9iµÇ'Ŕ ’e}ú9¬ŚÚ‚`Bż.Şé»jÁÂ7^ň O[VěÝQ»uíż-Ş Ęîͨb"5UVv˘´SuţŔç…>Ýrľťµyăř‘Ę-χ˙ëÁř>)íĚĺŻÍNĘűńcuá6Fd(uű{‡î\:%)«Ż®^KÝ›®°Ť*ť<€fPM`Ž8@(ÇlT%tŻ6tŻ2 *Ő  = (Ŕ˝6ŇŞŽO€q$Ëú4ëň—+ÜöDă˙]Ň´ćí7=âÓ™ŐűßřâôŃAyď®uC{5ŤŽčŻÜÉĂz$J>[3řęú»ž™“mv;üÓeS±wwŞÎOmmš†‡…[甯?¸; yÜräí…oĽô‹ĺÍÁř>IŮX•xuőZ č—ŤPéĐ Ş‰“Y宬c¶Şş7éۨ_hr@Uj@uhŠBĹUH{¨:>ć’,묜ÉĂ2ë 3ë‡ţř±şoĎź¸ëýŁîéĚ ďěYp÷uSGfÔąĆ7RSg(µ[CŃç¦F“,ëăŻěDi÷Ć’¬Ćâđßż=â×ćŽoimőXO[ÂÓßqěđ¦Ăű;VęP5°G˘$WLR'ËÝŠÂ8÷]µ )ňě;yüŹT}3ë S}(5ÜĆp3Ż›:ňÍăďF!{O»uNy§ęüän¬†Ľ˝z-t‹ËF¨t‡ čŐÄF,€rWĘ1›… Ý›tí t/8 -U  4ôŤˇ”âęˇÝÓźÓI–ő1?šť(˝vĘ7Îsý´Q˙gaµ§y:sľőâŃł§WěÝLčץ®@@Rn(őş©#ĂćŻy,)ţ?öÍšŹAć°Żi~ŕÔűQČf¸·7Í|(łľ0é{«'/°^KÝâ˛*Ýá*B5Qâ  ÜqĚÎ@gB÷&Ý^ŰÝ í hKmh Ą@i襸JhëÔŧÁ€’e}ĚŐ±jP˙Ő =Ä2őŐ‚IyB‘˘+<»ŠÍ«’čĎM3účłË©ľz$J>ßü`t>}ńRëšěŢX…ÍŃ“€wXŻĄ€nqŮ•îpˇš¨qPîÓ;f[ 3ˇ{“nŻ=ú…ę´ĄÂÔ…Ć 7TSŚ ´uşâÓ`@ɲţĆĘť<,łľ0(ď]¶éŮŁgOźnąŕ!ŽÚ­k3j‡ôH”äČHęĹyhçđĎ]lisÂůč›Ë}‚9Ýţ]Žť;‘`†gzĂôŃŃŮXU x‡őZ č—ŤPéĐމ‡Yĺ>Ťc6jş7"ęÚč^čm@aę@W¨ ŞC;ĹU?ű¦(>%&•,믭NŐůAŮ˝łwĽ¸ăŘáÎy|ŁxÝ’›f>ôĹ飻5 HĘÍQăű,zskçÓ-çŰ_ž˝'ŹýkóołŠ#ň5ĎOĽz6 żşľ0Đď–Ůăöśx/ ÁÜőţѦŹţĆ#‘ú ­ÂĽĆz-t‹ËF¨t‡ č ŐÄ@,€rźĆ1Í Ý«ŤÝ«´(Lµ( ]¨(¨¶ÓϦ)ŠOŹa%ËúoĂk=%Á¤Ľp-kűš·ßLĘw5î{vŢż?Vý´Q˙T;¤{cI®°¤N˘łĄ—]ŃwţÎ--­­í/Ďş»ż5oÂ˙YXÝĄ® Ő÷łgÓđ`Bżź,žţĄ¶żw( ŮÜvôŕM3ʨµiqµ x“őZ č–Tě ;¦ŇĄĐ~0€âY \tł!МнI÷Ön@ýBc SóZBQĐ:*®îŮ1-qE0µdYś·ęÖPLč—“(]Ľë•py^#ä7+fßőĚśěDiçšÁ&RSl5 Ϭ/ sĆyŃ›[“âĎĘ}Żßó«Nďł^KÝ’Z]aŻTşTĂpO ”‹cöúşWęWKP›ZĐ úP#PVm§ś˝RWsLVZ­ěDi—ş‚®uCţdómO4;wĆC±ĺČŰËöĽúÓeS±ww®Ü«i„Ľ¤Ö7=3ë ;V şyÖŘuv'ˢ{w„+ě™°d®IńˇÔ?¶ĺí‹ŃÉéš·wĄĘĚŻRĽŇz-t‹ËF¨t‡ ( ŐD<,€r˙¨c6*şWşWEĐśŠP ĘP#ĐWm§śŤRWÓLVšĚ¬e'J3ë {6 ˙ѢÚ˙xĽŢłdŰŃ›ď˙ćĽ Ń˙Łő×Vîď.¨ĽuNů–#o'ŢÖK—VěÝLěTč‘(ÉMńýěŢXr͇můďŹE¨-·ľ{ŕŁ&O‰™_Ő x«őZ č—ŤPéPމxYĺ¨PÝ @÷B?ĘS:A3š*+:ľŮ(Ípe1ÍdĹţ©=%YŤĹ×MůĄ™˙üÉfOa|ÄĄ>Ř{ňŘľ“ÇŻť2"¨JrŤ‰Ô\aŔĂőů揞=ť‘Î^lŮs⽕ű^&ô‹Í–vo,ůٲi‘ ěŽc‡»Ö ˝<0›"ۨcoµ^KÝâ˛*ÝázC5±â  -Ş{č^(g@yŞ#@!¨@™@kED6»¤®8fš¬xĄ~nĘ×O•Y_8đůEžżř#­—.mďPçšÁW×ćK* 9 řuSGžn9ź‘ZZ[›·oĆ÷éÖP”‹-ÍI”v­úËĺÓŁŐđpw?ňŮšÁ©µ“jđbëµĐ-.ˇŇ. :Tĺ ˛ĘТş€î…rô§:´Zô ´VDLłK:áŠc¬ÉŠëęŢXLč7㵍ç[/†«ĄµŐódŰѵb’Ň+łľđÖ9ĺÔ˝±D^RqőlŢ­ˇ(Ř˙[ó&9s*Y"=𓽚F|ľůÁxîj0ľĎđß?Öćńóg#’Ö{w\]_ŐXśť(5— ¸€«*@·¸lTé‚ ŔB˝Ä7,P€"…î {Ő2Ş”= •â ź@3[¤Ú#NÖ5qůŇßĺ¤VȨ˛éđţ­ď¸xÉRń˙#ńĘú›gŤýňěq]ë†f5KMŞŽONč÷ó'›ĂŚď9ń^˛\*^·$§±$łľ°G˘$7»Zv˙/óµ Ł7<”ÝTť”ţšçU5ůW×ö]µ ‰F:srŕó‹‚ňŢ=ăń˝Ý¦á]ę >ßüŕ=+çŻ[©đ.zskřgëÖP”Ť2ŕNŔk) [\6BĄ“ P#z‰fYĺhTÝ @ýęaZTG‚Żx;SbITËÎ(6Ĺ”ýń´ŚÚ!ź›ňŔKš~łb¶g(ţ"»Ţ?şrßë—Gľ«Su~L¦Ó8ň×MFţ®gć$˨='Ţ[±wǵOe÷÷jŹ˝íZ74ŚĆŘWF-ż‹w˝TŹ>7F2«eŔť€×R@·¸l„J' IôÇ ˛ĘPŞş€îU©š¤^ đ‚¦Ç’蕝ŃmŠ1(+˛łiYŤĹ™ő…_h~đksÇç­~ÔÓ‘='ŢŰvôŕO—M ĘîíRW`"5Ąß­ˇč†éŁoťS>díI”ęŔ©÷±Ľ9wĎ?Ő‰Q5jfýĐ🶬ŠNxĎ´\Řúîĺom&ô‹źĎĘp'ŕµĐ-‘í ۢŇĐ$~0€cY ĄŞ{¨_h`éܢNHçßNNĐ0Ş,­Ľ˛- ­1 eEme'J»7–Ü0}ôͳƆ˙g?í‡čpôěéŻ?RLĘËj,ľĆDj*Żśߥ® bóŞäučĚÉ;—N & ŤQáĆ~ˇůÁp‡k·®ŤNxĎ]liŢľ!(ż/ٶ 7ŽJëgŔť€×R@·Dł+ě‰JL@™řÁ‚AdrôŞî {ˇ~¤y‘:J ť;9Y@ɨ˛´’ʶ[cĘŠÚşvĘNŐů+÷˝îq‰żAKkk¸n™=®[C‘ÔÄ`őjѱjPr'CŁľţHEFmAN˘4N{něâ]ŻD*ż­—.%^YLěcĄµ4ŕNŔk) [˘ŮöDĄ &IśOü`Á ˛@9zU÷ннҼKť#¶żťkh'őŚ6KsŁl‹ě·5†ˇ¬¨|-qň°ĚúÂNŐůŰß;tâÂą‹—Z=.ń× ąnęČĎ7?+;©żÂC &ô[ş{[x¬ç[/&Ń«ŻÎ-ĎN”ćÄlo'ö_ţÖö–Öh5jőKk:× ÎŽ×üŻąTŔť€×R@·¸l„Jç[,5p:,ŇK 8@(@µę^şş@ĚşÔ!éůĂÉ™2Ť N_ˇĄ›QöDöŰ#QVŇǦ˛‹Ę×4 ß{ňŘžď]ňÄ_gű{‡®›:ňÖ9ĺÝKz$J$(Ő§Ń;Uçăű,Ý˝-‰©'.ś»ićC_›;>çĂ?R¬ö¶˘ďŠ˝;’;íűç”mz¶[CQŘüńÖ[]ş%‚]aCTş`:qÇĘ.đ„]Y ŐŞ{č^(^şÔ!éůĂÉ™R‹|Ph馓=üvŔ`”•”ŐłixFmAP9 (ďýőG*6Ú·őÝžŹř,kűWç–{ţÄĐśn EB”ęéÝK:× ^p÷ ďěi˝”´yô§O|yÖ¸ĚúˇˇT9qŮŰđďŇĄ®`á˝áŠÔ¤˙൏wA姏ά/ŚýÇŽ•6ŕNŔk) ["Ř6DĄ ¦#vĘdOŘqĘP­ş4¤Ö Kť †żš(ŁxB ť–n:ŮÁoŚGYí?‘zů+~ßuĎĘąËßÚľt÷¶M‡÷{2âoĐĽ}Ăí‹ßś7ˇcŐ ĚúÂkš†ËQJ7@·†˘`Bż¬Ćâ•ű^O˘Wí»í‰Ćp…Ťźɦá]ë†f'J“»·‘!kź˙„ťk‡Gź›Ş«nŔť€×R@·¸l„JOgëô0¸GTjAd”C»ĄĚľiWH’’A[§{!"C h-@ĚńÉŮ‘„ź)í’ÝúvÔ՞ëňRËî-üÝ↗×í>qÔ—¦mż˙×ćß“ň2ë {šHMýˇÔUož5¶yű†EonM˘WkŢ~óksÇűgÔÄĂ«đo‘Y?4¨čű/ÓF-ŢőJÔ‚\ĽnIVcq·†˘Ü´±]{şĹe#Tzş‰§‡uÉI-,€rNšl2 h˙¸Ůa2¨\g8ُ1—zÄň'·% -SŃ%»!őí†9)«­Wîäa=%—'R'ĺ=đ“á:~ţ¬G!ţ.µ[׎ٰâ†éŁ;× 6‘©É.uÁř>7Ď»t÷¶$zµx×+Ă˙äż-Ş )6^…‘°cż3R™ů;·D-ËŁ7<ťQ;¤{cIn:9ŻĂw^KÝâ˛*=öâ)^Đ’“Ô‚8Č(‡”HÍç†î…|1ę—íxś‹XȸČs†Hä!ݬHvCäŰ ÓRV®¦áYŤĹŞvo,˛ö‰Ák÷ÄÇ!ńĘú©ŻľY_Lěß­ˇČPj<¦&üXÝ}ĎÎKîPę˛=ŻŢ8cL0ľO—ş‚ ĄŢ2{Üň·¶G-Ë­—.Ť}qeäěDişiŻÉw^KÝâ˛*=Ţâi]0“Ô‚8Č(‡ŠŹ# ‡î…p‘ę—çx ś—(¸Ľ†NüŻ”H¶BäŰSV[ŚŁvk(ʨ-čTť˙…ć˙ó©…ż[ěهżË‰ çľńŇÔW_*ú“ň˛ĄąŇ”úźKîZ74¨pëśňŢŮ“\ÁVíßyý´QWŐäÇf"5ÜŢĚúËŰűĄ™?·g¤â|ěÜ™0ε[×ăű¤§ü*p'ŕÍĐ-.ˇĎc鞲%K©Č+,€rHőČ8¶č^ˇ{éÍ|^AŁ2 HźßKŽ’-¤"ÓĐ"[!ď퉱)ëĘI}8‘:ä«sËo_śřî‚ʱ/®ôÔĂßĺĐ™“kěżéą`ěÝŞGŤÁĘ™<ěęúÂ.u?\TóŤG*¶=DÁ^xgφC{ŻůpHöš}~7ÜŢď-¬ ·wýÁÝ‘JôŃł§‡­_<|WÇŞAiű˝cŸ\\č—ŤŘ8ąç÷+čĘ@^A ”CĚbâ°Ł{!G´ä (MxŽcZ| »čÄŔXZd+ä˝=1ääĚpľoŠ| ÇHĹ˝ŘXd佝1?e]‘#†ë†éŁł‹·żwČc“Ó-çşlj0±hÎ5&R㲲?JýÚÜńɵë|ëĹcçά?¸;”ËĘíŐ4âčŮÓQ ő™– ź_†Z˘5<ŕNpqˇ["e‚­XÁt(ôP, © ˛@9E‰¤{!2…îĺ0·ąâ)jY )LcńâíŹ}ôvĆ•u†¤KÂ;w¦őŇ%Ď8||n_śČ¨- ­˙Q?ôŹT$˝ ćďÜTČŤăwo,éŮ4<ą˘ýkô]µ SuľKÜ ..t‹ËFlĘéçI ĺ@*q€,Pi J'Ý a!*ť@]J“ 0G #|#ĺR]!ű ěíŚÉ듬¦áYŤĹ˙T;$¨pó¬±GĎžŽŕgűeľ9o ÓG÷j‘ť(¨ŘÔBXw.ť¶AŇG&gĽ¶1,¨‰’śípîäa]ę n™=.š•{Ç’¦™6ęÚ)µąTŔťŕâB·¸l„Ŕ¦P0ý0ă‰báH%ĘA¸J*>CL¸Ę+–ÉlLHëČĆ·xČcÄĽť19býC«gÓđŚÚ‚`Ü=ż~zÖÎăGv;ĽçÄ{žkřś¸pî–Ůăľ3Rv˘4«±8G¦âR ]ę ‚˛{ą|ú;§O$×±‡6>sÓ̇nś1¦[CQśv8łľ0ßç›ó&DłrďX҆:ÜsC©ćRw€‹ Ýⲛ*Áô“Ś-ş…i`”8@(A +»Č é -»ŔUs´ p˙ úńŤi±‘Ç&yűcrÄúřQ«ßUĽnÉsűßŘwň¸Ç>>ŰŽüÎüI?~¬.ٶ łľĐDjśš!(»żđw‹ĂZŘ{ňXr5ő‡§®ą<;?$«±87.;Ü«iDPŃ÷g˦­yűÍíďŠ`şď\:%Üđ‰q0— ¸\\č–hš`V0•$at hĆ(,P"@ZŽé^oA0–˛—ś §P€Ăü‡P0x4‹·96AĆŰ“#Öß]9“‡“ň‚ňű*6Żšűú¦ĂgNzáăłrßëw.ťňăÇę‚Ę]ę re*.+<ĘđLq÷ |~ѡd×Â൏˙fĹě맍ʬ'Ç.ĄŽďółeÓv;Í€˙byskźI5— ¸\\č—ŤŘčÓo0ÎčpŚQY řĎ[šqBÁ^ĐŚśÔe)ř)ŕ0ů!<äÇâjŽMńöÇäő׾حˇčňĐ٤ĽNŐůµ[×VnyľĄµŐ# ˙ËöĽúĺŮă‚ ýşÔ„RIVśV0±˙Ăꙏyőńóg“«Ů°őËşÖ íP50NźI˝ü‰ęęAAŮ˝?[6mçńwŁí#gNő]µ \ácBĚĄîşĹe#6âÁôë‹9ęě˘ÄA(ćS—l†Ddc&c‰ ˘ĘL~éG°x›cdĽý19býů0Tf}a0ˇß§ŹłaĹč OŹ}qĄ'ţQy}s٦gż9oBP™g"5NßHíŢXҡj`§ęüÂß-N®cç[/†TÇŞA=%qűíÄţýW/ 7yďÉcQKwřGúů“ÍAyďpç}Ů\*ŕNpqˇ[\6B`#L?˝ČŁ^@-:Adr ={)Ç^ȇÁ7ZŇ•« « €˝Ě‡,’„슽66AŔŰ“#ÖźN¤v­LĘűćĽ w=3§iŰď=°đ żsËě/^7udPŃ7łľĐPjLVÓđ¬ĆâUĂíżzaţšÇ’«Ů±sg ·8(»?~ßëĚ™<ě3U~ţdóůÖ‹ ř®÷Źţrůô Ľwݦra.p'¸¸Đ-.!°Q¦]üQ/ŕť ˛@9pžŔ¬Ł.¤€Ă`'ąJZ0VŔ^ćChÉC^ŢF±Â•Y?´kÝĐNŐůß[XőăÇęďzĹŁ ˙([[—żµ}ŮžWC‘‚‰ýł‹Ż1‘ŁĎw†qăŚ1˙wISńş%É5ííSÇ—îŢ6ęOe÷Ćię9ÜäěDi—ş‚«ë ď\:%š1ßőţŃŹľ”j(Ő\*ŕNpqˇ[RĹ› °é™M?·řA ť ˛@9žĂÄŁD€Ćŕ!) ęR—ü .ó!Ě$$©énSLޤóĘ™<¬[CQ¸ľż°úG‹jo™5nÓáýRřG9qáÜĆCűćďÜ”÷*äWĽ&R»7–t©+ʵbóޤËvđô‰{VÎ ľ«sÍŕ}Š7Üç^M#~đhőí‹ŃLúŢ“Çî\:%ĐĎGÍĄîş%…L° ›nńôC‹?FŃ â ”ŐiL?–˙L©HN˝ !uiţó““Ś¤»09’¶©Ý%ą“‡Ý:§üËłÇ]ňdÂ'âÄ…s{O«Üň|PvoFíHŤßĘj,ľqĆ^M#j·®M®lGÎśÚwňřoVĚ&öŹß\dŹDI¸ŐżzjF4“~čĚÉý'Źßľ8LĘ3”j.p'¸¸Đ-€ŔF0ž~_Q˘A'.Adrŕ9“Ć’źĚ !9 3´ç-íA~ŠŇ’N€t·'&GŇs(őň`QÓđď-¬ňHÂ'ć|ëĹÁk&ôËj,Ε¬XvE˘ôŞšüĹ»^Işlç.¶üpQMÇęA=>¨Ź_'gÔÜőĚśh&ýěĹ–ŻĚ)űlÍŕěD©¤›KÜ ..t Ň0ń=ôËJÉC@¸Ä%,P$'3AWÎóTd !Af2đĽ™ĎRrr ’’vĹ,Ź&GŇjĺ~řUľ rŔ/–7ź»Řrľő˘G>1y«í\38G˛âűĄÔ`b˙ĺomo˝”ü/*wAeřçɉc'wo, ÷ůľgçE¶ož56üCJşąTŔťŕNR·€ómdťxÚ:(y? ¸Ä%,P ç3¨ČUÂĎl¤ŘČjJę¤çiOTđ“Kr.Dű/br$-VÓđŚÚ‚Î5˛{ ·říSÇŹť;ăa„OĚO—M˝qĆ릎ě‘(‘ŻX~RąCŐŔ-GŢŢňxKkkM»ôáPä—gŹËýđă­1ŰçžMĂń}ĆlXîóńógŁö/Ď—=ąÔPŞąTŔťŕîE·€äm§˘xj9čy? Ä%,Pô¦4ŘHT¶ŇśäxHlVç¤ç9ĎU°”HH­ČőćRÓ`u¨”Ý;뵍ێÜtx˙Ńł§=†đ‰ůѢÚ1ÇÎťů÷Çęď\:%łľ°kÝP©ń›‘̬ŚďsĂôŃ+÷˝ľćí7“®Ü;§O|{ţÄŚÚ!±Üđ°™q÷<Ľń™ÎE0ď;ŽţѢÚŰžhŚëţ›KÜ îdt ()?ĹSąAŰ«P  â ”±Y Z˛”äŕ63ůF?0śá`8cAx“DĄŇAŃĺŃäHśVݦ]놓ň‚Šľáż?ňúćů;·xčŕÓ°őÝżzjĆĎźl*ó ©Ĺµ7‚‰ýżż°zĆkWî{=éĘm:Ľ?Tî§Ë¦•rc·ŰىҰ˘›¶ýľyű†s["ů-GŢţöü‰ˇµąb.p'¸śŃ-`rŰ‹*žj _—ň‡HY XMl0“˘ ·ÉI6îç<˝é ¶łťş +¨ž˘ĆěŻir$6ź;̨”÷ţţÂęę—ÖTl^5÷őM7ř4¬Ü÷úµOܱ¤)ß§sÍŕĐ1A‹_o|¶fpP~ß˙^0ií]Q°nýÁÝß]P*Z¬”kžŐXLş<Ü]ąĺůȦ~á˝—÷by7— ¸\Ńčp¸ÝtO……ŻQůC$,P”ć6ČÉOzŰü$ń@u¶Ű\Ő©N`0–<$Occö·39q§Î5Šľw,iężzásűßđ”Á§déîm•[žż<žVŢ;năÖź Ąű˙lŮ´°7^xgOŇ­[±wÇÄÍ«˙ý±úE^ţď\7udńş%c6¬lđ˙k(ŘPŞąTŔťŕ˘F·€Ŕík¬x’:_Ż’‡EY řLođ“śô˝ůI3Öí„·ą ŞóśŔŕ-yčťŇĆěŻfr$uWÎäaµC:T üٲiáÚţŢ!Ď|zVěÝqý´QÁř>™őCŤ§ĹuýSí rŔ÷Tíz˙h¬[˝˙Ť/Í|8(ďÝĄ® WÓř Ą~nĘ›WE6őkŢ~sţÎ-ß_XLě·ý7— ¸ÜŐčP7ňŢŠ' öµ+sXqĘĚôEÉÉm0śĄă8Ďy›«ŕ9Éi ę2‡Řé nĚţR&GRkĺNÖ#Q’Y_Y?´[CŃKšţmQí‰ çrćTŇ­[pwhÝç›ě\38fsĐa”˛‹ĂżWݦ•[žŹlđ7Úî˙‡Łč…FŃÍĄî76ş¤EâiÇ öu,sXqĘÉ '*Éj0ś¨#hĎ|°š¨ŕ9Ă™ ö҆Ň8&GRhe'J»5]7uäwT~gţ¤?VG`|zη^Üvôŕú»ĘŞöH”äŠ[L'Rł‹Ăó $"îm:Ľ?ăĂ/·voڎuW×Ţ$§7źÁaÎĐ©‚É‘”X=›†w¬ôđĆg‹+BëĄK/µÖn]Lěźť(±xŻÜÉĂşÖ ˝cISÜ»ôÁ+öî&ĺĹ[ĽUĂżf4ăA˙ý§ŽeÖJ‡ąTŔťŕG·€ĄHz<픿Ęĺ ‹ ˛@9pä +-É ž3–T4HČLQśŰ”Ť Ă^¤&G˘Ľ2ë »Ö Ć÷™őÚĆăçĎž»ŘÂX\Š×-éÖPtÝԑىŇY‹ńjLěßő°@N·śŹ‚{‹w˝ňŮšÁ1/ł~h¸çĎíăâĄÖhĆá˝áňóÍćI7— ¸ÜäčđÉŽ§Íň×˝śˇÄA(óŚĺ$™ÁsŇ’Š`AŤ) ’s›Ň 1a¨‹TÄäHżlŘ#QұzPÇŞA›ďßsâ˝7Źż{ÖD*®ż~zÖÍłĆ^?mT·†"_JŤ÷G–3j‡ăîÉ_óرsg˘ŕ^íÖµˇx7Í|(t/–{Ţ˝±¤síŕmG†Ą١Ô5oż™“( Ź |ЉąTŔťŕ2G·€śHn<í ôż&  ˛@9ç`,'™ Şó–Qě‚88ĚO0śŘ 6™ŮBZ¤(&G"5GÖ­ˇ(ĐďN±ńĐľpńWź,žüŹ×÷jѵnhŹDI®ĐĹşL‚˛ű'n^˝îŔî#gNEAżŠÍ«Bĺ2j‡d5çĆńż'Y_ŐPńŢ^±wÇőSG… ţćRw€űÝf"ąń´'Đ˙J0ü8ČĺŔ^Ş·„ä0¨N]:Q B! 0?ÁpVŘ|f c‘ŇIúęŐ4˘sÍŕ`R^Pv˙·ćMXş{Űš·ßd&®,?[6­kÝĐŚÚ‚ěD©‘´ŻśÉĂ>*“±/®:|ÜÄďĚĄî¸ŇŃ-´DjĹÓ†@˙ëaÂđâ ”u©ö’Ŕ`;uąÄ+…\€Ŕä˝Y zó™*\EŞcr$ąM«ăîůÍŠŮÍŰ74ĽĽní]śÄäťÓ'îY9÷ľgçu¨(qń^ą“‡uo, :l’p]ĽÔGýᩏţTYŤĹ±J *óľ5oBÓ¶ß/Ý˝-˛=0őŐú®ZđŤG*:V ęi(Ő\*ŕNp±Ł[ŔI$/ž¶Ş-ü8ČĺŔ[¶Ŕld/ŘÎ^"ń rvś 7ĄAoVS…Ą&G’µ:T *úć­~tŘúe»Ţ?JE\Y¶ľ{ Të®gćăűtŞÎ÷ŤÔ8ݦáYŤĹAe^f}aĹćU1pô†§Ë6=۵nh·†˘Ü8ţW2j‡„áúÚÜń+öîr4oßpÝÔ‘Á„~ˇ†RÍĄîw;ş„Dăiŕ ŠŮB!,PĽe;ĚFę‚í&Ż  ö’ôć3Îmžđ±ÁäH;аG˘¤Su~çÚÁy«˝ďŮy§[.W–uv7ĽĽîÎĄS‚q÷\U“o-Ţß\îÖPLĘű|óź_4fĂŠ(xöbËČ–}Ă?Xv˘4–C©á_íöʼn{VÎ]µg”Ű`ţÎ-á¸K]Á5zŔ\*ŕNp˝Ł[ŔF$5ž6 ™-ü8Čĺ@Z¶Ăl¤.O`‘ Ňé .3Ao>áÄć ?'LŽ´Ű× »Ôt®ÜłiřŻźžu×3s¸‡+ÎÚ»–îŢöťů“‚˛ű3j z5ŤľxËgkß:§üÎĄS&n^ź9ąčÍ­›Wĺ˝ă:™;yŘgŞ}cnŶŁ#^ËßÚ޵nčŐő…>—l.p'¸áŃ- "O¨eŞâ ”c,ŘNc6‚·„‡)Ä(Č€đĚä6™ArzóĚÄÄäH[O0e5gÔąićC·=ŃřG«űŻ^Č:\q6Ú®ĎMy ¨čŰ­ˇČ7RÓ¤X®ť2bÎŽM‘đĐ™“ź_<|W§ęŘ~Ą7 W—ş‚/Í|xßÉă‘m–ÖÖőwŻŢ˙F‡ŞÝK ĄšKÜ .yt xŔSš™*ä8Čĺ ÂÓŠ -çÁdţĐ 2" Ľ3ąÍdđśä$'qe19Ňv«G˘¤[CŃM3ş~Ú¨†—ב Wś–ÖÖ7Źż»ĺČŰťŞó;V •3–+«ˇřćYcŻź:ęń]/GÁĂ#gN…^J­č׉ԜÉòĄ_¤âĆcŽž=ŮN8w±eţÎ-Ayď°$Ĺ\*ŕNpĎŁ[@BžPÎT!ÄA(GWžÉTii&“‡K1!-hÉm&ç$' ‰¶ŔäH[Ś/}4ÁôŻÍżíZ7tŮžWi†¶ ĄµuĹŢÁ„~™őCĺ.}ę%ě–°X6ŢO·ś˙żKš‚‰ýł‹ă:ť“( ·ýËłÇEĽη^|äőÍa'O7— ¸ [Ŕ@ĐĎş…uŕY ®IÂ,P4Ł=±AB–‚ů¬& y >˛–’Ňů9O pí‰É‘ż;#–Y_رjP0)/{ré¨?<.Ú MŮqěđ +ú®Z”÷îP5P Ójţ=Ř˙ľgç ^űřÎăG""äš·ßüÖĽ ˇŤµCâ:”š“(ý¨çďzfNô˙›e›žť¸yuxY ņRÍĄî¸ůŃ-¬ĎuMć@dr (í‰ ˛äg5[Čń°”Ť”&0ČĎyb€{hgLŽüí‰Ô`RŢWç–÷_˝đľgçŤŮ°‚0hS6Ţ߼}Ă>5#{w§ęü8ŇúłąČÎ5;V şcIÓ‰ ç""䊽;f˝¶ń» *‰ý{5Ťń·°Ă¶{ţž•s#^g/¶ŚŢđt0ľOřl ťs©€;n~t ĺŔă@c3„9Y (Ę|bůąMÚ@$e#ĄŮ ţÓž Ú“#ľ2ë »Ö ýLŐ ďĚźôŁEµŹĽľ™'h¶ľ{ŕň`Ů˝µCâ:hýůPdv˘´K]AVcńĎźlţÉâÉŃrÝÝ×MTô +1–#Ň—'R%aÜz$J˘?‘rüüŮ1Ve÷›X7— ¸ŕňG·đ <”6=qʢĚ'6HQźŰTˇ „H‚@Q6Rěĺ?íYâ!‰ů˙ľW8yXVCq·†˘ď.¨üᢚ›gŤ]{`CĐlďĐÖw|sŢ„UMśĄŐĘj,ţÜ”ľ·°ęÎĄS˘#dhă¶ŁłĄ™ő…ąńťŰţúiŁľ3Ň]Ď̉xE9sjÓáýe›ž5”j.p'ŔĺŹnáx"(mz0â ”?™Ďm0ź ?˝©ÂČ‘źl¤4¨Ë°”CŇ19ňŃDjŹDIř/·ĚwăŚ1§[.íŔĄ>8pęý§O\;eD‡ŞÝKrĺ1}j'Qžx·†˘űžť'/^jÝpho0)ŻsÍŕěDiŚ÷?ÜüĚúÂÂß-Ž~Q?¶˙ę…AŮý]ë†J5— ¸ŕţG· <ô6=qʟ̧7HNđźŢ¬Ţ˙FFí릎4‘šžĺLč7öĹ•aíśo˝'˝ąőł5cďd¸ůYŤĹAEß1VDgó˙żY1;ٶ@QKÜ p¤[žŞ›Ě8Čĺ@Nţ3Üc&řĎp’Ň$J 'ů ŢJřďčɆ膣"=›†gÔe÷ŽúĂSoź:ľďäńŁgO3íĂŚ×6\;yřŤ3Ćd5g'JŤnĄ×ş\>CÂň©ŘĽętËů(iąńęúÂř;Ů4<(ďţe÷ž<©ý˙küçS3ţąˇ¸G˘DvĚĄî¸Ň-4ŹíÍć@dr`&˙Iî1üg8IŘ(0“‡do"ŕÜ™†čns"ŞăîiÚöűŤ‡ö;w†h7ĆlXńµąăż4óá.uYŤĹąć¶ŇiĺLTĘď{äőÍaůś¸p."ZŽ}qĺGZfÖćĆ~˙ËîoŢľáLË…č×ĹmO4ţpQMݦÝ ĄšKÜ p ¤[h ś´8Čĺ@KţóÜŁ%řOr†°2%P`&™ ŢŠD€4C´H‡f5“ň.݉ýľńҲ=Żžmiqôh7Ż}üÎĄSľĐüŕU5ůˇŤˇ“&¶ŇgĺNÖ˝±¤Su~Ř<ËßÚŢŇÚ3ÇlXŃ«iDĽµüh˙;T \ş{[x/µFż1îXŇ”Y_ŘĄ® ;Qj€Ý\*ŕN€‹ ÝÂ1đPĐáÜ  ÄA(fňźäŕ-!$çU Y2ZňÉ ­8@ ř@3DŤŹ„ôlžY?4¨čűůćçěŘ®Ů;^tâhOúŻ^®śDiÇęA&RÓm…Ô­ˇ(Đ/üçüť["efńş%}W-¸nęČ®uCă¬ĺĺ§@a¸y}ó˙ĂŢťy]ßůľ˙’}č>Đmc&ŽĄÉXVĚÍXăÄ{ÍÍV“”•ĘÔ±’Ę©d*U)W¶j ŢĹŤĄ÷ő×ýëZVADDDDAQ ([Xeii–n–¦ŰűÎMÍ™3“¨ü-Źg˝‹ňĎîţ<_Ż_ć]őž_\4ĆŮ®óży©ĄgM¶ř¸KěXé‚€5Î Ú@dr %ůÁsúŃ"@rnP’%V % É ŇB¤€CĚ’¨ç`˝ëFĄďś[9áíeó¶żëˇq5iď<›űĆÂüŐ/ô¨΀h/=LÂŁÔž5Ů·L˛tĂň)[ÖĆ”źO¬[Ú§~LP5497hqĘ“"ŞŹ“ž'.É-IHc!|`b›Ä¸ţČh*ę]7şgMö˙\Ür˙˛Ů÷Ľ8yă‘ýW™mGg°aôŞçI9.KĆąt‘Z5ü®gŞ~µhĘÜ7ĆŽśÇÎtżůR0éđÇKě'H‰ä†żă7Z‹©ŁŕżŔ¶c‡ĂϬ`Â}áGŘuÍcĺČ]*`'Ŕ:H·° |(hrnĐâ ”!El''!<'O _’N’Ć -„BČ@-Ä8qýí¨˘)‘Ü”HN˙Ć‚}ˇů_ž«ďęîö¦¸úl;vxĺţżyF0áľ^µŁ—%ád^ĽŽ˙Ἒ;çV®Ř·=vä<Ř~âµ}>±ni0éÄ>—źŕ«uŁż?·"|‚ů;6ĹEuěh;~xeC”†»TŔN€ŤnˇřPPćÜ  ÄA(BŠŘNi=ÝÎM-Ź]S=˛cA¦;¬¤śŚ‹˙Ţ2ýÉż›<öHÇ©ŘQ´íěéđçą÷•YAŰkýě1#Z-LmČŰÜz0. äŘ™Ž°=~ôlMĎšlŐá.° `)¤[x>ô97hqĘŤ"ÂŹŞS‚$2!é3B! dŕ⋸;ôČl* Ş†×Ľ»ŇŰዢ«»űŔ©ăý"ąŃB·WI>ý nžöD *úÓůu_­ť‘$Ń\ܧ~̇mGâĄ@BgRňÄÇ]*`AŔRH·đ |.čsbĐâ ”E„'!!T§C e2BҦ+DC"@*Ä#ńrßŃ·>'ś tđ‚ťď;Óq¶ëĽ·ĂÂşC{úErżŃňXF´0ĂíU˛NćŋԞ5Ů·ÎĐvöt¬YúŁgkŇóÓ“ŕnúż7ä‡oŃzş=ü\čęîŽýąt”zˇ=\µ»Kl‡X é^€Ď}N Ú@dr`Ł€đÄc#¤€đ”  RĆFúĂt…hH…ř$ö/ż‚Şá}ës¶~|hçńÖŰŽ¸HĹĹĽíďŢŘňč·gNLmČë-pu•ś3°ą8%’” úů‚ČŽ¶ŁűN¶ĹŽ˘]ÝÝ·Ď.ýŢśň°<ü(µą8­!?¨ĚşaʸÝ'>Ž—iď<ű­éăĂĎ59r— Ŕ˙ÍŘ éR€Ď•N Ú@dr ˘€ó¬Ł"¤€ó”  ‚ĆFîĂt…hH…ř%6ĎľúÔŹ Ş˛‚ŇÁ˙đÔăk?Ú˝ţĐ^/…/ŞŤŻß9·ň;3'ö®ťvńűť\%íQjP2čÁWç¬>°kçńÖŘQtď©cß›Sţ/ĎŐ§DrűEr3ţŞ˛~0Ż:ütŘtô@\tȶc‡ż;§ü'óëúÖçČ‘»Tv€˝n!ř\PéÄ  ÄA(*J8Ď:6B Ďn@Ö klä8LW†D0Nkbęăşć±_®Í&Ü÷ëESí޲`ç{«ěňFř)~óĄß.~ęćiO\S=2µ!ďÚćbÇVI{‘:Śż÷ţełcí :7·Ľăé˛Ő#úÔŹIř‡?&‚ňˇ?z¶fă‘ýńR#ďű§Ů%—ľűŰU»»Tv€Őnař\ĐęÄ  ÄA(*J8Ď:*B 8Ďn@ýBÖ¨Č=®‰`ťďÄĘGsqŹęÁ¤-ź[óîĘÍ­= ľXňWż0zŐó™MEAŐđ´†|©É<ˇAÉ â7_ ŰéŔ©ă±céŠ}Ű|uÎ/6•Y]ŃđĽđ˙¸`Ň?ť_·áđľxi’µíţŢśňdx ă.°¬†t ŁŔç‚V'm ˛ĘQRŔyÖńR@{>pę˛FEîŔ\…tȸ„$á <ŮČl*-čQ=âÂEjůĐQ«äŻ~!¦nľ´żůŇ…/ǬŢż±Ŕ÷&ó„Őł&{Ü[KB%NźďŚ)K—íýŕöŮĄAéŕŢuŁ“á(5üřýË3ÂŹ‰8ú¦Ô•űwÜ9·2¨ć(Ő]*;ŔjH·0 |.hubĐâ ”Ąśg!´ç1 ~!nTäLThĐ€KHľ¨oGMkĚďQ="=Z˝ňąp-źŰí1đEsěLGĂ{«ËŢy-(ę¨*™'ł©¨ă…‹Ô”HîčUĎÇš¨‹vo™˛eí÷çVUIń-ś˝jG•Yw?߸˙T[Ľ”ÉŇ=Űš7żůĂy5AŰëšÇĘ”»Tv€Őnař\ĐęÄ  ÄA(JhĎ:B hĎV@CčxH<«ą ‘0\ĺsÔÔ†Ľ>őczÖdó©Ç˝hjî =b='Ź-Řů^ń›/î Ş†_ëË “ű(5%’{ĂÔqż]üTÖŠgcÍŐű¶˙Ýä±AŮđ‡LřŁÔôhaßúś˙ą¸ĺ Ł'Îť‰—>Yu`çŤ-ŹĄS"9ľ)Ő]*;ŔvH·Đ |.(vbĐâ ŕÁ^ÚłŽ„ć3Pż:ć*D.h@$$WíÎ+­1żwÝŰf•ü|Aä{sĘ'Ľ˝Ě±Ŕî­k?Úýŕ«s‚ń÷öŞĺĚפö©“ŃTTüćK±ćęúC{7ŢviJ$73Ńß"=ZţšásÜý|c|UĘĆ#űĂ×é[źăĽÝ]*;ŔvH·Đ |.(vbĐâ  !´g !Ěg+ ~!t<$ĚU\Đ€HHH®ÂiĆ€hAZCţ·gNüú䇗îŮćoŽáŔ©ă»O||÷óŤżÖ0×Ej’Oz´0µ!ď›O=~cËŁŹŻ{9¦\íěęZągP1¬gMvřs&ü[„ź_›üđ?Κôłç"ńŐ*;ÚŽ†Ą5ćgĘ”»Tv€ínˇř\PěÄ  ÄA@9B hĎ:BĎJ@ýBîxH<¨Ń ‹ \ą‹ŚŚ‹ţÇŤ-ʦ6ämýřż6b„ç΄sëŚ ˝jG ¸ 3éŃÂżź:®o}Δ-kcĘŐή®ĐŐKG©Iňľ)5çß–L‹ŁJéęîźiçńÖŢuc2ʸKě "ÝÂ%đą Ű‰A,€r$„0źu$„ 0ź ”€ú…čńu`/K!#ŇA!ˇąrG©ý/|MjřßÇÎtśí:ßíoŤŘ íěék›‹ŻkëlĘüy‚ʬe{?›Ş«;¶şjÖ¶ ×TŹL*]{Tʏ÷•Yç»»â¨UÖÜőĄÚěŻMÖ*Ć]*`'Xé.€ĎőN Î@d”#!¤€ů¬c üL  z˘Ç@Ö˝,…Ś („Äç2b4§6äĂ~2żîpÇÉK㏌asëÁĐŇoMź- ÇŮ”Éh*ę]7:(ş|ßöή;„ś˛emßúśţŤÉ ksqJ$7(4hůÜçÎÄQ±„ňô‹ä†Ď¤UŚ»TŔN° Ň-\ź ęťś8Č(GBHóYÇ@ůi@ @úDʬ{Y đÉŔe9ľŘ\Ü«vTŹęÁÄű˙°tććÖ{O¶ůŰ"vXü§­·LňöŮĄ)‘Ü´Ć|S&ł©(4ˇwÝMG„•k_“úřş—ż=sb(mżHnféc ëŔ^–BL„ü>ů›ďR3›Š‚ŞáÁ„űĘŢymĺţK÷lŰsňż*b‡¦Ík~<żööŮĄ_®ÍNmČs;f^úZçňˇéŃÂŐvĹ ´Ż})ő+µŁŇó3“ŕ@ř҇Čë–;ÓGÝŇĽůÍKÝňպъŸKě;"ÝB$Ę ^¦8qPŽňSŽňÓ€€čI Yö˛b" ŕ’‡Ď}I4 ZTfĂš6Ż™öÇőíťgý1SLx{Ů–ÎĽuĆ„ jxżHîµÍĹ|®kۧ~LP2č¶Y%s?ܸřO[cMÚQ«ÜżlöőSI‰ä$±MEAůĐčűń÷!ŇđŢꦌÓ-Ć]*`'Řé"Đ]ĐđBÇ,€r „ źr „ ź|¤OH9°—Ąáy„|ÖďL‰ä^řn»ŠaiŤůu›VŐĽ»Ň߱Ƹ·–­Yt]óŘ 2+µ!o «1s±ľÂâúů‚HŮ;Ż-Ýł-˝ ĄíS?¦GőţŤ ęŮTţš_ŞÍź#î&úţšë§<ň•ÚQşĹ¸Kěk"ÝB$j ^9qPŽňSŽňÓ€€ ý(겒"  ’OŇŐ·>'(zűěŇGÖ..Zł¨jăëţz)şş»'mxµěť×zÖd•YÉpÜg>e}}ĄvTP6ä®gŞÖ~´;ÖĽ=ÝŮ9áíeáUYéŃÂÄ‘ćâ´Ćü jxjCŢ“ë_‰»žiŮş.ł©¨OýG©Ć]*`'XéĐQPňÂČ,€r „ źrô đź|PéG9P—ĄáyśüŐŻ´ë]7ćÂIWeÖŹž­ůÝ’ió¶żëʆäÄą3Ż})(y0¨ĘĘpeţ˙é]7:¨ţ«ES~»ř©MGÄš·­§ŰsßXLz ü!“âEš‹űÔŹůFËc÷/›]üćKńU2ł?Ř0÷ĂŤý"ą)‘ÜLá2îR;ŔšH·°€.‚’RÎ@d”c ü”Ł˙  2H?Ęş,…¤Čdĺżş§Čh*J‰äô®}÷óŤż^4őÇójVŘĺĎ…ä`ű‰Ą{¶]řşÉIůCóJě__hţÉüş#§bÍŰ˝'ŰBo/SOz ĽÍl*JkĚ˙rmöuÍcK7,ŹŻ’9ßÝ5íŹë˛!Aĺ…ď´u”jÜĄv€5‘naĺ%/łś8Č(G?˙)G?˙9@@e~”u) I‘ĐÉĚ8ŁHʦ5ć§6ä…˙ńŁgkîxş¬Łóśżb“§Žo:z`Äëó ÷őŞĺ(ŐüŻ‹ÔhaXb˘a‰Ĺ ·{O¶…Ţ>řęś`âý˝ëF'ÉQjżHî­3&„Sµńőřę™Óç;gn{;(äŐ¸Kěk"ÝÂ"ĘJ^Š9qPŽ~ţSŽ~ţs€ € Ę ý(ęR’"&  đÉż»KÍh*ęßXđőÉ{ćÄoM×3Uţ8YŽtś:Ř~âž'ĄűEr]¤š\˙µÉcc¶ÄZO·˙ËsőAŮÔ†Ľ$ńöŇ˙»~ő9ó¶ż_=ÓŢyîŔ©ăŽRK_«dŚ»TŔN°)Ň-üt  ę…š3YĺčAŕ?ĺčAŕ?ȡ rŹr .M®-i\äĎG©×5ŹíS?ćÁWçř› –9Űu>ś;ž.ë]7:=ZčôÉüoß”ÚTÔ·>çž'Ǭş?W6mR=Ę×&?üĄę‘‹vo‰ŻŞ9ßÝ5áíeAůĐţŤľ)Ő¸Kě›"ÝB!@źz^Ŕ9qm(G?˙)Ç=‚p€ €Š!÷řęĐäÚ’6ŔźéÉ '(üÄşĄíťgĎśďô7AĚr¶ëüM-ŹÝ0e\ćĹ DwOćĎ“yńźŠaż]üÔéě±oMý”G6'•ş=ŞGl:z üp9ßÝ_m3î­%_®ÍvünÜĄvö€nQ2€ôĽĽĂ'…8@(G?˙)Ç=‚p€ €Š!÷řęĐäÚ’6Ŕ`ďɶpvźřřÄą3ţYvoýű©ăn›U2 ZŽ‹'óçŘ\ܧ~L0ńţÜ7†UÖzş=Öě=sľó[ÓǧG Cu“ç(5˝©ŕšę‘ŹěďęÂ)Zł(µ!ŻŁŞ1îR;{@·(@oz^đádrô đźrÜ ˇ$rŹoŕ-M®09qĆň}Űo›UrçÜĘľő9© ynťĚ8J &=Tµńőu‡öé8köî<ŢÚűĂy5ý"ąÉň(ÍĹiŤůAŰ0°ď‹ÇÎÉ}caF´0l›L3îR;«@·(@Wz^ Ŕ˙6Čĺ¸AĘq‚ ` ‰’Č=ľ·4ąÂä Äł¶mřĹÂčťs+Ż©™Éu#fţýd4•YÁ¤&mx56żîyÓŃ˙4»$´·o}Nňś ÷¬ÉľyÚ‹˙´uůľă®s/źűŰĹO]?ĺ…cÜĄvV€nŃ0€ŠT˝6gIJ@9îAD€rÜ,€×g ‰’Č=ľ·”ąÂ$ Äu›V ^>÷¶Y%AeVJ$g`s±'si2›Šú7„bô¨Ń´yMôý5ç»»bMŕĄ{¶Ýűʬ»źo ކ'‰˝×5ŹíS?&(tëŚ áŻʵ“˝ňą°mzÖd‡‚9J5îR;«@·¨@-Ú^3€3âY ÷ "@9âA¤Ŕë3DIäßŔ[ú\a˛â‚ňŤŻ=ąţ•ë§<T ëÉu‘jţ·i.îS?ćşć±Ą–WĽł"6^ü§­NŞK÷®“$‡żfŘź/Ś{kIřëÇcóäľ±°Gőôhˇ”w©€ť€U [Ô   mŻ"Ŕq€,PŽ{ ń Rŕőˇ!Ś’H<ľ·ôąÂ¤ Ä>]ÝÝ ď­nŢüfŻÚQAeVZcţµ.RÍ˙~ůŘ/’şńőÉ׼»265^°ó˝čűkţůé˛äůšÔ0§˝ëFĺCďś[ąćஸkžÖÓíˇNă׿ţ RfÜĄv¶€nz*´˝–gIJ@9îAD€r ž, p— }a”Dâń Ľ Ď&O ći=Ý>oű»u›V%‚ʬ ßWhţŹËÇ~‘ÜŐ#n›UňëEScö(uéžm™MEAŮ”¤ůžßđ÷íY“ýË…Mál:z îĘçPÇÉŻĎĆßÚĺ޸Kě,Ýő%h{]ÎdrÜ ĺ@çöŮĄ­§Űă±>j?‘µâŮ`ŇCšÇ¸Kě,ÝőŮ´˝ŇgIJ@9îAD€r ž, ńRŕia”GâlĽ Ď&|îH0>j?±˝íČýËf“čS?Ć]ůO§cAjCŢŔhŃę»bÓäή®e{?ʇ^S32=iľę7#ZŃTô˝9ĺßž9ńl×ůx¬ ÖÓí—Ď Ę)ă.°°t t ¤PřŞśČĺAĘx˛€„Lw¤„Q‰˛ń€>Wđą a8qîLŰŮÓ?{.TfĄ5ćgş]2˙őńă7ZKmČŰxd š|¶ëü±3ŽR+†%•ĆME˘wέŚÓ jď<>Ü…ŁřĘ,ýcÜĄv€nnĽ _€3âY ń R@9O¨)đŽ4€0Ę#ń@6ŢĐç >÷$ ßž9±´Ŕ˝’ů«ÇŹ˙˝!˙Łö]ÝݱirËÖuAŐđ$őxZC~ZcľK%óźÎŔćâ~‘Ü lČ?Κ´íŘámGcSć˘5‹ú7„?ę€dúÚßđu§ą÷•Y[?>Ć9N‹č§óëŇŁ…î⍻TŔNŔNĐ-Đ-kŠś8ČĺAĘu˛€„‚G¤äQ‰˛‘€J×™đˇ ~YűŃî;çVţx~mďş1n”Ě5×5Ź Ę‡ţraÓĘ;6·ŚM™-źűó‘[íÉÍL¦‹Ôž5ŮÁř{ď_6{ßɶxlˇŽÎs?z¶&´+­!ßQŞq— Ř Ř şŠ p— Î@drÄ HĺŔ:Y@Á#Ň")ʬŮH @ĄëLřĐŹĚß±éW‹¦üp^MP5Ľo}N¦%ó_\¤^8{śpß/6ĹěEjȰóŇó{ŐŽęßXTG©Á¤‡Y»xöâô(őpÇɟ̯»¦zdďşŃgÜĄvv€nb,HúÎ÷úś8ČĺAĘu˛€$ ‚G¤DRY˛‘€Jי𡠾hŢüföĘçţů鲠|hßúśÍĹ®“Ě2ÍĹ=ŞG“´|nĹ;+¶~|(eîţ䓯ĎĎ_ýBźú1ýŁIt‘šŃTT JŹZµŕÄą3qÚE;ÚŽŢý|cP1ěZ-dÜĄvv€nb Đůz†3Y ń R@9°NLAđ4€HĘ#ë@6ŇPé:>ôÄ ď­.{çµ¦Ž ʇ¦Dr]¤šż0AeVöĘçrßXřQű‰ŘôůÄą3C^{&”9¨ž<_µ™ŮTÔż±ŕ+µŁĆ˝µ$ő ÝńŮEëí}|ÝËż[2-(˘Ś»TŔNŔNĐ-P,b:_Őpâ ”#A (ÖÉ’-‘IydČFZ*]g‡>€Ř§eëşYŰ6ô®T KkĚ÷í„ćżşyLŹ~ą6»Wݨ߿<#f}ŢsňXóć7‹Ö, J%ĎUcř:ax{Öd§5ćŤ^ő|üÖŃúC{8Ż&xŻÚQ×5Ź•;ă.°°t  ä€ÎW8ś8ČĺXAĘu˛€d ‚G¤DRY˛‘€J×™đˇ fi;{úĹ]›§lY” *łŇŁ…‘Ě_řÎŢuŁĂ˙řÍK-ż[2-f­Ţ}âă?,ťŚż·gMvRĄ¦DrolyôW‹¦Śx}~ü–ŇĆ#űďś[Ö‘‹Tă.°°t  $€ÎW;ś8Čĺ(AĘu tŇÁ#Ň")’¬ÓH @ĄëLřÄî8ąţĐŢI^ Ćß{MÍH_jţňÍcjCŢŤ-ŹŢőLŐýËfǬջO´n8ĽďÂQjéŕɤôĄJŹŽ{kI\÷Ҷc‡˙ivIŹę5’q— Ř X şŠb @çkÎ@dr” ČĺŔ:ČBÁ#Ň")’¬ÓH @ĄëLřÄS´žnß{˛mÄëóIő­Ďq˙eţň¤G ÓóS"ąEkŬŐµźŘw˛íGĎÖeCRň’Ęę??ĐřőŻÄo/8u|˙©¶[¦?Ů»nL¦Üw©€ť€µ [ X °tľţá ÄA(G9‚,P¬,$w<" ’"É:0Ť´TşÎ„O|1ÂéóťťçîyqrP5Ľcă/óW'#ZřµÉ÷®ýřş—cWěÎΛ§=ѧ~Lz´0 čë¨âťqÚKÝź|r¨ădŘH)‘ÜŚä{Aă.°° [´ ¤€ÚWAś8Čĺ(APŽuAđô€HJ%XÇ4Ň@ňTş÷Ą€¸ă{sĘ3›Š6g882źbŇóňˇ-[ם>ßŮŮŐ›Vwvw}Łĺ±ô¤Ľg ă>ĐĽíďĆňýU¶źčßX nĆ]*`'`-@·hČ)µŻ8qĘQ‚  ë ‚ŕé9‘”J°Ži¤€Ŕ]*|â ÎśďĽeú“ß™91ł©h@´ŔQŞů”ŹK÷lŰw˛íôůÎŘ;üŮ®źňČ·gNLÎŁÔ^µŁ‚’Aówl:Űu>~ŰiçńÖÍĹîRŤ»TŔNŔZ€nŃ*Rj_qâ ”ŁA@9ĘAdÁÓs")•`ÓH ÉPéŢ—bźímGnť1á®gŞRňŇň]¤šżzŽš- ކĂ˙iëůîŘý έş©ĺ±”HNZc~˛=ÓĄ7Z}`׆Ăűâ÷(uĺţťa;}wNyJ$WôŚ»TŔNŔZ€nŃ*Oj_#qâ ”ŁA@9ĘAdÁ»sR)•`ÓH ÉPéŢ—b™ĺű>üéüşĎŻíY“íěËüŐŘ\śÚ”MkČĺY¶÷u;üŮB·ôlMŻÚQ™IőLÍĹáëĂúÔŹ ß(® jéžmßhyěKŐ#űEr3иKě¬č­Ů ö•g ˛@9ĘAd”ŁdAĽ; •R Ö1Ť´­îqą 6™ýÁ†ßż<ă®gŞ‚Ša}ës6»-2ő(µGő[gLµmĂ‹»6DzދvoůÖôńIčvřË~©zä?<őxđ;ß‹ëŽ ţ𯩩ťŚ»TŔNŔZ€nŃ*Lj_/qâ ”ŁA@9ĘAdÁ»sR)•`ÓH IŐę—bŤčűkŠÖ,úÎ̉AůP©ćS^;ö®” úö̉‹vo‰e˝güq}ţęľ?·"¨žl©}ęÇĄo™ţdĽ_¤N»řw<]ÖŁz„‚2îR;°Đ-Z" @ík'Î@dr” Č(G9Č‚,xw@*Ą¬ci ŮZÝă@ě}MĂ{«3›Š‚ňˇý"ąľĚ§»H” ůů‚HÖŠg˙ikĚęݲu]ݦU7µ<ţ´)‘¤űšÔ 2ëÇókGĽ>?ŢŹRźţ໯O~8ě¨eÜĄv°t‹V<Pű Š3Y ĺ ˛ĘQ˛ ŢťJ©ëFZHĘV÷¸Äđ…s¶ëüě6Ěřăú jxP1¬cA¦K"ó)&ô¤Gő}ˇů׋¦®;´'–%źżcÓ…űŮŠai ů×&Ó1cřF}ës‚ʬŰf•¬Üż#ŢËęĹ]›Ă‚ Łk]¤w©€ťlݢU ŚÔľŽâ ÄA(G9‚,€r”,Č‚wç¤R*Á:¦‘’µŐ=.1|´žn_¶÷†÷V“ކ»2źr2šŠR"ą˝ëFß>»ôŔ©ă1křŮ®óË÷}¸h÷– 2k@´ _*|ŁźÎŻ»knŐ†Ăű⽯VěŰţ:© y獻TŔN6€nŃ*Dj_Mqâ ”ŁA@9ĘAdÁ»sR)•`ÓH ÉÜę—ľwśÜÜzpÜ[K‚ ÷őŞ5Đ—šO”-LŹŢőLŐ?ΚtâÜ™•ĽŁóÜ´?® &=tMőČä|©Ô†Ľ›§=q¨ăd\—ŐŮ®óaY­9¸+¨Š'€Ć]*`'›@·¨!ÍŻ©8qĘQ‚  ĺ ˛ŕÝ9©”J°Ži¤€$ouŹK W™¶ł§ŹtśşŮě tpżHîµ.RÍg™ô‹G©ßťSË’wtž;Üq˛eëşPňä4<|ŁŚ¦˘[ŤĺĂáOĂŮ®ó vľľcďş1ŇgÜĄv°t‹J ĐüĘŠ3Y ĺ ˛ĘQ˛ ŢťJ©ëFZĐę:“®&]ÝÝç»»~ö\¤Wݨ ·BćłOfSQ˙Ć‚ďĎ­qĎ_÷rP™•Ěß­ľÔ SĆť9ßď•őĚöŤAĹ0Ń3îR;Ř şEĄ@h~}Ĺ,PŽrYĺ(YďÎH%XÄ:¦‘´şÎ$€«ĎmłJn:n`sq2ßë™Ď3ÍĹiŤůAŰ_-šŇvöt{çŮXöĽh͢ŻÔŽşô…ˇIxŽúŐşŃw<]vâÜ™x˙¦Ô™ŰŢľô”2hÜĄv°t‹JôĐü*‹3Y ĺ ˛ĘQ˛ ŢťJ°uL#-huťI WŤcg:n™ţäO—ĄG ű7ř¦Tó™f`sqP:8{ĺs;ÚŽé8ËŞßűʬoMĂÔqiŤůIřL)‘ÜđĄîz¦ęŔ©ăńŢZŢ^vSËc7O{"­!_Ť»TŔ6€nQ)=š_kqâ ”Ł̡ĺ ˛ŕÝim ‘dÓ Z]mŔŐaă‘ý·Ď.ýἚľő9© yŽĚg=uěY“Śż7{Ő‚Ă'cYő{^śüłç"_›<6T}@´ 3)o‡˙ňڵíţ°íhĽ×ăë^©Ţucú7&ÝSw©€U*lݢR w4żââ ÄA(Ę dr”,Č‚w§´1D’uLc,huµI _/îÚü‹…ŃĎŻíQ=˘o}ŽŰ.óY'¨Ę &=PöÎkówlŠńŻIýíâ§R"ą˝ëF§G 3“ővřß–LŰyĽ5şë‘µ‹Ă_Jkw©€U*lݢR t4żîâ ÄA(Ę dr”,Č‚w§´1D’uLc,huµÉ W‡–­ë-źűýąAŰľő9›‹Ý™O?™MEý ‚Şá ď­çĚůÎUýŘ™Žű—ÍĽ|nĎšěŚdýBŰ tpî ë6­Ú}âăxď®üŐ/dŻZp]óŘ”HεŠË¸K¬Ra9蕉 ůŐg ˛@9PN ”ŁdAĽ;  Ť!’¬cc@««MV¸Â4Ľ·úÉőŻÜ<퉠|hJÄEŞůŚÓ\śÖTeő­Ď)ݰ<Ćmß{˛í.n J_S32 +Ł©¨Gő0éľ:§íě騯qo-ůRmvP5ĽcoJ5îR«TXşEĄ@Üh~ Ć,P”Čĺ(YďNhc$ëĆXĐęj“®(S¶¬mŮş®_$7¨–Úç"Ő|ÖŻÝ µ Ş˛nlytÄëóÇ˝µ$–mßÜz°nÓŞ_ť” JBŐ/|ˇm´ OýěU †ĽöLwü×WgWדë_ »+CŤ»TŔ*–€nQ)5š_‰qâ ”ĺ˛@9ĘAdÁ»ÓÚ"É:¦‘´şÎd€+I{çŮů;6Műăş |hP™5 ę{ÍgţŽÔÔ†ĽŐ#ľ3sâŻM){çµw~sëÁź/îëU;ęşć±Iw‘ÚXĐ»ntřďŻÎI€k=Ý6XÍ»+’AşË¸KěQa9č•A ůőg ˛@9PN ”ŁdAĽ;  Ť!’¬ci@«ëLV¸ré8µúŔ®ŞŤŻîëQ=ÂI—ů|wŽ}ësnź]úĎO—Műăúw~ëLJÖ~´űgĎE‚ŠaÉů5©© y7L÷“ůu÷ľ2+1J,ő Ář{Ż©é+žŤ»TŔ–€nQ)2š_•qâ ”ĺ˛@9ĘAdÁ»ÓÚ"É:¦~´şÎd€+Ä‘ŽS;ÚŽćľ±0xďşŃîąĚç›тԆĽŚháŠ}ŰcÜůÝ'>Ţ}˘ő–éOĂÂź9 ťOʆżxZc^üÄč±cg:F­Z” Ň`Ć]*˙§˝ĺ [T D €ć×fś,Čë@9A€,PŽrYđî4€6†H˛Ži -­®3Yŕ ŃŢy¶íěéß.~*¨–Ö­{.óą&ăâÜÔňŘ‹ä¬;´'–ťďţ䓧ާ6äő©“-LÎ÷ ńë§<Ň/’űđÚ—˘ÇÎ…=–µâٰǔq— ŔNŔrĐ-úň@ů+4Î@dx ś @(G9Č‚,xw@C$‰Ç4€V×™¬pĺřÁĽę´†üL7>ćr|ůćţSmç»»şcŰůđ‡ Ô$Ż bXÓć5ácuuw'@ŹÝóâäľő9.RŤ»Tv–€nŃ'/Ę_ˇq‚ Äĺ˛@9ĘAdÁ»ÓŞ"I<¦´»Î¤€+Ç­3&Ü2ýÉÍĹéŃ 7>ćsMfSQJ$ç-Źé8NŚ;żîĐžţŤ7O{"iż&5|Ż>őc‚’[¶®;sľ31Şě— ›ŇóD ôq— ŔNŔrĐ-úÂ@ůë4Î@dx ś @(G9Č‚,xw@C$‰Ç4€b×™”pŮŮ{Şí[ÓÇß9·2­1?—\ćóÍŔćâ~‘Ü lČ­3&ě<Ţűć/ß·ýkMĹ)‘ÜţŤÉű5©ĺC—îٶąőŕé:J-G$Ť»Tv–€nŃ',Ę_­q‚ Äĺ˛@9ĘAdÁ»ÓŞ"I<¦´»Î¤€ËËę»îš[őăůµ_©•ÉuÔc>ß\×<¶wÝč`âýw?߸bßöMGĸů3·˝ýyŐw<]öպљIů©ý ‚ŠaAŐđwmNŚ6ëţ䓟=ąçĹÉáŻć(Ő¸K`'`9č}± ü5g ˛@'ÓEŹůŽR’A÷/›=kۆͭc_ţ)[ÖŢŘňhP5üÂ-vsq~­mďş1áżówl '1 íÄą3w?ßŘł&»wÝhßřlÜĄ°°t‹>XPţšŤ3Y(AĘQ˛ ŢťPĹIâ1 ¤ Řu&%\Fš7ż9zŐó·Ď. ʇö­Ď|wyć˛Msń5Ő#IünÉ´ťÇ[c_ţŞŤŻçľ±đ[ÓÇą6{`R^¤¦Dr‚˛!7L7÷ĂŤ Ói‡:NŢóâä 2Ë}˝q— ŔNŔrĐ-ú2@ů+7Î@dÄŁA(G9Č‚,xw@C$‰Ç4€b×™”pixouĹ;+ţ~긠|hJ$×EŞůÜ“-Ľp‘Z™5âőůŁV-8Ôq2ĆĺŻÚřz8éŃ bXjC^rĄUĂďś[™żú…YŰ6$L­í<Ţú›—Z‚˛! Í˙;°°t‹>@PţúŤ3Yń(AĘQ˛ Ţť€4‰$ńŇPě:“. ]ÝÝÓţ¸~Ö¶ ˝jGĂŇóŻuŔe>ďd6őo,H‰ä[1ďţełă"u›V…ć•YáOž„_©9°ą¸o}Nř¸uĆ„E»·$Lłm:z eëş{_™” ş®y¬lăđv–€nŃ'&č&{hbp‚ ĺ ˛@9ĘAdÁ»3%y$Ó@ZŠ]gRŔßȱ3‹˙´uĘ–µAÉ  2+#ZčlÇüM©Ń‚ŢuŁD ââ"őÄą3ˇ˙-[ץ“ůŐzŐŽúńüڟί[ľďĂ„)·­ Ł`âýˇŽRŤq— Ř XşEź@š ňLf18AŹrY ĺ ˛ŕé™ČŁ<Źi -Ĺ®3)ŕoäpÇÉ ‡÷Mx{Y0ţŢž5Ůľ ŐüŤ·Ť˘)‘ś¦Ž»sn彯̊ý;Ó1~ý+üO‰ä~Łĺ±mÇ'Rżí<Ţz×3UAUÖ@ÍfŚ»TŔNŔrĐ-ú˘Ń&3CÁ‚,€x” Čĺ(YOĎ@ĺ‘xLi(vťI ­§Ű÷źj¶b^0顾ő9î¶Ěß>ý nlyôú)Źäľ±0ö#Đvöôľ“mO¬[”Nf˙ÓŁ…˘7yěSǦß>j?ţ:w<]öĺZçöƸKě,ݢO Gd>s†ś ČG9‚,PŽrYđôLäQ‰Ç4€b×™”đ7qć|g8ż\ŘÔŁzÄ€hA¦#s9&Ł©čšę‘u›VĹ~Îvť#đŕ«s‚Šaý“:áď~ý”GÂ˙8Ňq*a*®˝óě×'?üß"9ŃBÁ4Ć]*`'`9č}9‚Řň™EÄŕ A@<ĘAdr”,Č‚§g ŹňH<¦´»Î¤€ż‘ďÎ)ż®yěŔćâ ç9ć2Ý6¦5äeCš7żŮŮŐűřĹÂhz´0LA’G _$÷–éOvtž §;QúíÄą3_›ü°r3Ć]*`'`9č}!‚¨RšQÄŕ ¤@Ŕ=ĘAdr”,Č‚§g ŚňČ=¦´»Î䀿‘öÎs·Lň¶Y%×6 ¸Ű2—ezŐŽ J/ţÓÖ='Źť>ßűA¸űůĆţŤá$m6§6äĂţqÖ¤ŹÚO$RËé8uĂÔqaż ¦1îR;ű@·č$”ŇÔ"g ˛îQ‚ ”ŁdA<=aFî‘ ¤ Řu&|n¶;üť™0Żş_$7µ!ĎEŞą,ߑڿ± gMöÚŹvo8Ľ/.ľ&5ŚŔOç×e\ĽËľ6‰ŹRňˇ˙úBsřjŰŰŽ$LË…żÎwfLĽsneJ$W<Ťq— Ř ŘşEź@‚ •¬¦18)pŹrY ĺ ˛ŕ陣0rŹl -Ĺ®3ůŕó±t϶y®ţÇók{Öd§DrăËöm›ĺCĂ—ďű0.‚ĐŢyî'óëľZ7şo}NF´09îşć±_®Í&ÜwĎ‹“·;śHE·úŔ®oM±ĺr3…Ôw©€ť€ý [ô ÄÂHlľ3Y÷(AĘQ˛ žž €0 #÷ČŇPě:“>;3·˝ý‡Ą3ďz¦*¨Ö·>g`s±Kó·6†.%ľ5}|(ŘÂťďÇ~¶;üű—günÉ´Ő#’üš8|¸¬Ď6o~3ÁŽR—îŮöť™Ă÷ŐrƸKěěݢO >AbŹśČ¸G9‚,PŽrYđôd„QąG6€b×™|đ9hxouń›/Ý:cBP>ÔEŞą\WŤ˝ëF%~<żvüúW^ܵ9ö°úŔ®Ü7ţzŃÔ tpŻÚQÉ„Ő#Â?–Îü¨ýD"uÝĽíď­YôyŐAe–˘3Ć]*`'`?č}Ůôq›~Äŕ ¤@Ŕ=ĘAdr”,Č‚§' Ś’Č=˛´»Îä€ĎJôý5ád4ĺCSňj™ËöU›ĂţÇ ÍC^{fĺţq‘…UvŢ9·2ôĐW’ű"5˝©°gMö×ç[1Ż˝ól"ŐÝ‚ťď}Łĺ± t°ë{cÜĄvö€nŃ'·H Î@ dÜŁA(G9Č‚,xz2Â(‰Ü#H @±ëL>řLś9ßůôďĚřăú 2+śţŤ™înĚeš>őc‚ŞáwέÜvěp\ÄaĹľíó¶żűĎ­ łp]óŘä|µ°D zŐŽJ‰äŢűʬÄ+˝Ą{¶ýÝä±I~tlŚ»TŔNŔ~Đ-ú‚‰Ł7‰•"îQ‚ ”ŁdA<=I”Dú‘ ¤ Řu&|VZO·ż¶ďÆ÷V“ކ»µ1—k2šŠR"ą)‘ś»źoĽë™Ş§ŽÇE"ÖÚ{ý”G‚˛!áź´‹™ME© y_źüđ/F˙mÉ´+˝Uv®9¸+­1?|břƸKěěݢO 85z’ś@¸G9‚,PŽrYđôd$QéG6đ€bW|đ)9ŇqjëLJŠß|)p_/_h.ë¤G Ăďś[ůÝ9ĺq‡îO>Ůvěđ‡mGD ú%÷ąbřv© yý †­—`Ąwľ»kŮŢ‚Ša=ŞG„ż¦ŁTcÜĄvö€nŃ'H˝iI ¨€,ĐŹrY ĺ ˛ŕőɡ$ŇŹlŕ-Ĺ®0ůŕÓĐvöô‘ŽS÷ľ2+(śÚw­‹TsYż&5=ZŘż±ŕ§óëâ"ť]]a6ŢT˙jÝčŚä~ľŃ‚żź:.üŹŻĎO°Ţ úŇQŞă.°°t‹>ŕ@ľčMNb€3"Y ĺ ˛@9ĘAdÁëCŤ@ %‘~do(v…Éź’®îîp~:żÎýťąB“ŮTÔ·>çîçă"Ýź|˛h÷– 2K.Mř§({çµë˝î‹Ő·t϶ *Ëă.°°t‹>Ô@¸čÍOn€3"Y ĺ ˛@9ĘAdÁëC1B %‘~do) @ajQźžďĚśxSËc›‹ÓŁ…ÎjĚĺśćâÔ†Ľ lČŻÎ9v¦Ł˝ól\$bŢöwżZ;:ŚCFŇ_§Dr’A5ď®Ô@¦čMTn€3"Y ĺ ˛@9ĘAdÁëC7B e~|o) @ajQź†#§n™ţäwç”§G ű7řjHsyg`sqP2čńu/Řv¤őt{\„˘jăë7µ<ć"µ!ĎWÜĄçďŘ>_Ľzę6­ ź8śŃQ5Ć]*`'`?č}‘@1ś«ÜgD˛@?ĘAdr”,Ȃׇn„Ę ýřŢR€ÂÔ˘ţ2ëí˝ăé˛=[Ó§~Śű;s%ľ&µGő`Â}ăŢZ/©!“6Ľ:°ą¸wÝč´ĆüĚ$>GMŹUYAŮyŰßíěęJĽ,{çµđˇS"9™˘jŚ»TŔNŔ~Đ-úňQ"9cąÎd~” Čĺ(Y€»TčFČ  2oŕ-K(L ŕ/˛pçűż\ŘôŁgk‚Şá}ëťe™+pŇX™”ŽľżfŢöwOś;ąČ_ýÂď–LűćSŹ÷©smsq2ż`żHnJ$wŃî-aW$^­YôŰĹOýCŇ?´1îR;ű@·čČ ää¤ĺ8ĂČ)AĘr˛€ÄË‚wädPľń–Ą&T(pŮ™˛eí°óľ;§<¨Ö·>g ›,sYż 5­!?T«OýĐ´†÷VÇK.FŻz>śŃ‚Ő#Ňó“öVńâ÷‡ćĺC3›Šžţŕť„ěŔqo-éßXT Oć‡6Ć]*`'`?ččańś·ÜgřY` ĺ ˛@9PN¨YđŽ|€ Ę Á7޲€Â„ .# ď­žđö˛o>őxP>4%’ë"Ő\ö“ĆŻÔŽş©ĺ±'Ö-­yweĽä˘űâפUĂĂ-ČLîěQ=â¶Y%ăŢZҲu]BÖ`é†ĺ_­ťÖďK˘Ťq— Ř ŘşĚHĎ©Ë p†˙R‚ ”ĺd ™ďH Č 2|ă-K(L¨Pŕ˛0eËÚi\ß·>'¨–Úç"Ő\‘/٬̺aę¸čűkâ%­§Ű/keCĽŕĄ~¸eú“ó¶ż›xxć|ghfřܡĄéŃB™5Ć]*`'`?ččaěđśŔÜgřY` ĺ ˛@9PNŔY𔔀 Á7검¶„ >7'ÎťY°ó˝–­ë‚ŇÁ—®±|E ąĚsń"őšę‘w<]öË…M͛ߌ—tl?‘µâŮ`ü˝=ŞG$űĄvsń—kł˙ßy5w?߸pçű‰×„mgO?ľîĺ`ŇAŐp™5Ć]*`'`?ččIŕPťĂÜgřY` ĺ ˛@9PNđY𔔀ô Á7검¶„ >‡;N®ýhwŮ;ŻîëQ=âZ_j®Ŕd6ő­ĎůŢśňš]ňâ®Íń’Ž˝'ŰÂtdŻZLzČw§6äő®óŤ–ÇÖÚ›exěLÇë–“đÖƸKěěÝ}")Ş  ˙! ¤A(ĘÉ’$ ž’=éă!(G]–Đ–PˇŔgâHÇ©]'Z/ÜÜMĽżOý§Xć Í€hAZc~fSѦŁâ%µźŘ}âă_/šLz¨o}N’§#|ÁţŤ·Í*ą~Ę#[?>”xexěLÇÎă­ľ)µd&4Ć]*`'`?ččp^d¨ŽŔ]*hC~ )AĘr˛€¤É‚§¤DOúxĘQ—Ą´%T(đ)iď<{âÜ™ 7w•Y—ťĆ+1˙˝±ĺŃPłmGă( ßťS~MőČţŤŇţnjyěú)Ź„Ą‘}xú|çýËfĺC•ˇ1îR;ű@·@ź@Lä…ę 3=hC~ )AĘr˛€dË‚§¤DOúxĘQ—«´%”'đ)ąsne˙hÁµľĐ\áŁÔ´†üëšÇž8w¦ł««;~ňOłKŇó˝`8© yß™91|ľpµ˙ňŚŢuŁ˝µ1îR;ű@·@ź@L„…ęŕ3=hŁ!$¤A(ĘÉ’0 ž’=Ńă!(G]®Đ–PžŔ_ć|w×-ÓźĽuƄ̦˘ôha†‹s%¦ą8­1?¨Ěú§Ů%‡;Né8/9qîĚ7Z ňçoző˙ütYëéönĹß.~*µ!/ěCÉ5Ć]*`'`?č艤P”¦mt#„” Čĺ@9Y@rfÁk˛r'z<ĺ¨ËUÚĘř?YwhĎ-ÓźüÁĽę;çV¦5ć‡ă"Ő\ˇŘ\T űך7·Ü}˘5^2˛íŘá0#ßź[‘Ú' ±|čŻMąř'j1ţ|Aä˙y¦ňk“Çöo,\cÜĄvö€n>ŚH ŰAizĐR‚ ”ĺdI›ŻÉ ťčQ”Ł.WhK(Oŕß3ǦΫąsnĺ—kłS"9)‘\'0ć ÍuÍc{ŐŽ &Ü÷«ESv´ŤŁ¬?´÷[ÓLJ?Ľ€„ŹvEřży©eçńÖîĆ_,ڦ6äő­ĎIŹfĘŻ1îR;ű@·@ź@FÄ„í`5=hŁ!<¤A(ĘÉ’8 ^“:ąŁ"XÇ^®P•PžŔ%Ţ[ýoK¦ýóÓeAUÖ…k»ćbÇ/ćĘ}˝fŹęÁ„űFĽ>Ú×oo;/1Y´{Ëo^jůÉüşkŞGĘČ…ŻIťôШU ¦˙q]|]&ÎvťżçĹÉ˝jGůÚhcÜĄvö€n>ŚČŰAlzĐĚR‚ ”ĺ ˛Ŕb@脎Š`{‰ @UB!e6żú…o>őxP1,%’;ĐEŞąÂ”-~óĄI^ý¨ýD%eÁÎ÷nť1!(ҧ~Ś\¸,.ôŕ«sŽtśJÔnÜsňXÖŠg-źTf‰­1îR;ű@·@ź@@„íŕ6Chć )A‡rYŕ7 tGE°Ž˝\ *ˇ<ŞŤŻ×mZ•ÚT ˙ujg®Üd6ĄG Ż©ŮŁzİóşă*)ł?ŘPńΊŰf•„?Ľ\zÇÜ7fŻZĐŃy6Qëńö#÷Ľ89ôPĎšlŹnŚ»TŔNŔ~Đ-Đ'ˇ:¸MÚ€ů‚ŔCĘAd”ŁdA8Ŕ ťÄQ¬c/]¨JhN$3'ÎťiŮş®á˝ŐAůĐ 2k@´ Ó©‹ą’©iŤů=k˛ÓŁ…C^{fĐňąq–ąn çÂwĽ– é—Üß&ľc˙Ć‚^µŁR"ąá;&vInýřĐ…ŁÔŇÁ×5ŹacÜĄvö€n>€ŐÁm’ĐĚR‚  ĺ ˛@n@Ü$üa{é @UBs"i9Ř~béžmŢ^L¸/¨îŐ\…‹Ô^µŁnjyě— ›˛V<_y™żcSP™N˙ĆdżÝýÔ†Ľë§š«vÉŘ/’{Ëô'o›U2î­%q–öÎsŹě_´{KP>Ô;†ď8 ZÉMŹfŻ|.±{rçńÖ;ž. J§Dr”¤1îR;űşEź@@¤T§7IhÚ )APŽrY = n˛6Ź˝t *ˇ9‘śé8u°ýÄ=/NJ÷‹ä:¶2WaŇŁ…iŤů}ës¦lYGaiď<{ŕÔńđg&=Ô»n´/§cÁŤ-Ź~mňĂąo,Lŕž<ÔqňŁö˙×Ě ŢÝw©€ť€ýݢO ˘¶3ś$´íŠ” Č(G9Č‚,Đ€5Y!‰G`ĆĐ“P›HZÎvť玧Ëz׍NŹ:f1Wg2šŠľ6yě—ŞGÎÚ¶!Žňrľ»ë‘µ‹Ša˘.˙ü”×Tʬywe÷d÷'ź´žnÓÔ†Ľ ŹnŚ»TŔNŔ~€nŃ'ŃŰNć€óRŔFĘAd”ŁdAh@Čš¬Ä#0cčI¨M$+g»ÎßÔňŘ SĆe^<.sÉb®Î¤6äĂVîßŮŢy¶ł«+Ž"“żú…^µŁ\p_šĚKOY:8úţš°L¸*Źtśúó®w7Ć]*`'şEź@:äT'9OÎK)APŽrY`C h‚BŹŔŚ 'ˇ6‘„ě<Ţú÷SÇÝ6«d@´ 7,ćęL˙Ć‚ŻÔŽÚúńˇÝ'>ŽŻ‹Ô?,ťyó´'n:.üĽăĄŁÔ lȢÝ[§ěč<—Ŕmąçä±ë§<âÝŤq— Ř Ŕ~Đ-úŇ! :ÉyÂp^ ŘH9‚,€r”,ČA“2’{U= µ‰ädůľí·Í*ąsneßúśÔ†<×+ćjLsqZC~P1,Tnă‘ýq—šßż<#=ZÉ ˙ÍLúsÔđŹT ʆ,Üů~|VVŘu©-S"9RlŚ»TŔNö€nŃ'ˇŐyÎć€óRŔFĘAd”ŁdAŔH™”“Ü#0H čIčL$3·˝}÷óŤwέĽ¦zdJ$7Ó銹ňs]óŘľő9AÉ oϸřO[Wîß_©ůÍK-ż[2-=ZÖ/2á_ ¬ŽÔ†ĽĄ{¶…Ż™Ř…ąlď7O{B[ă.°€ý [ô DC(Ŕvžó„9 Ľ’rYĺ(Y&R&bŕ$÷8 ŇĐ~:IHÍ»+|uÎmłJ‚ʬ”HîŔćbG+ć*\¤öŞLzŕgĎE¦lY»|ßö8ŠLëéö?,ť¦¦gMvř[řšÔ°4Âęʆ„˙1Ǧ„ďĚE»·Ü:cBŹęÚŇw©€ťěݢO ¶Sť'Ě᥀” Č(G9Č‚,$1'ąÇa€öÓ™H*ĘŢyíńu/_?ĺ‘ bX?©ć*ž1eC~·dÚ¸·–¬ýhw|ĄfĎÉcż^45(Üł&ŰSţŻ×¬~űěŇ o/›ýÁ†ÄîĚđ,~óĄďĎ­e…iŚ»TŔNö€nŃ' qŐŮNć€đR@HĘAd”ŁdAČ@Č—|–ôă0H @IęL$ ]ÝÝu›VEß_sá ++łŇóŻu`e®Ö\°®|čĎDv´ŤŻŕl<˛żjăë÷/›”v“xé"µOýđ5oť1aáÎ÷ľ9çm÷ÂŮ”HŚq— Ř Ŕ~Đ-ú˘! :۩°] 8I9‚,€r”,ČHů’/Đ’~o(I…‰„g˙©¶§?xgáÎ÷kŢ]” *ł2˘…îSĚŐ™ôháWëF÷ŞőŰĹOýŹšuśŚŁě¬;´gŢöw˙ő…ć`Â}áŻp]óXzmsqĎšěźĚŻ _sńź¶&|†żcX}ęǸâ7Ć]*`'ű@·č†8€ęl§ yŔvŕ$ĺ `ĺ(Y2đň%\ %ýh ŢĐ  Ď®­+÷ďČZńl0ţŢ 2ëšę‘ľěĎ\ťÉĽx‘šÉ ˙ýĹÂčĎDâ.>›ŽřÇY“‚’A}ë}Kć˙šÔ†ĽŢuŁo™ţäĆ#űľ?WŘąćŕ®>őcÂß:Óëă.°€ý [ô DCŔsÂł…<`»p’rČĺ(Y2đÂ%\`&ýh ŢĐ  Íľ“m¶ąçĹÉÁ¤‡\Ő™«?ý ®źňČíłKC ă.>;ÚŽ~ŘvôćiO|Ąv”oÉ 'ăâ¦5ćßńtŮ7źz<üű$vží:żřO[˛!×TŹôíŇƸKě`?č}Ńđśđl!Ř.śĺ˛@9ĘAd—4ü;Ü<퉛Z;ÝŮ™đz¶ëü˘Ý[‚ňˇ^ßw©€ťěݢO ˛Şž-äĎE€™ ś @(G9Č‚,đ*,™3IS€†Ô–HxÚ;Ď~}ňĂéľŕĎ|ˇÓŁzDÖŠgă1A{NK‰äzÁ?© y·Ď.Mž]°ó˝ 2Ë»ă.°€ý [ô äB@uÎł…< şĐ”Čĺ(Y>Pb%S ' AcöĐŞ‰Í޶ŁéŃ›§=‘ŃT”á.Ő\őÉl*J‰ä%J7,o=ÝŢŢy.ľ´ćŕ®Ô†Ľo>ő¸łî??hZc~P•uçÜʶł§“ˇEë6­ ¸aę˙ÇŢ˝ÇX]ßůă˙h‘ÂÄ™…Üş¦ÝÖ4ę×6íîwk¶ý¶Ý¦mšf›4m¶iMă 0ĚťKaî—sć#WEŠ rĘĄ ( "W‘ËŔ0Ěř;h~®‹8 Ýćśóx䕦˙Îçó|ľy›w>cú„óŔ÷RÁ™ÎŔn±OĐ E@Îe^f„ WáDä]9‘CtA$¤ťŇ)„S‘dé¬G«’xµ|ߎžöçďĚž\›Ó;ä:•ąÓ­"3(şÎ[·?|âÜŮŘjĐăomŠ6čöY®ŻÉ֠ʧo¤0<đ÷Kęw4ŮŞ!餍ËSBąŃ ¸”jŚ{©ŕLç`·Ř'č…" ç2/3„«€p"rŠ€.śČˇ ş Ň‚Biň)‡łôvŁUIĽšţćú;ç–ţËăĹ×Uf%×椻ub®ú¤†óŇŚ%ďn[ąçŮóÍ1W˘úmëoś2*Ú ”Ú\ úřFj÷ʬ`ü˝w-ťľçäńŮĄŹnxţŁţŽcÜKg8»Ĺ>A/9—y™‘$\ţ…‘StAäD]Đ‘ ‰’O9D’°íIâҤŤËż¤ţŽY‚˛Á××dß)tßÄ\Ő‰¦„r’A=ކ=˝ëőX,QŃĆŁ%ş}Ö„čź A˙ý™Ô‰ä®^řř[›vź8–»4űŻ ţôÜĚŻ×?Ü«z„ă^*8ŔůŘ-ö zˇąĚ‹Ťü áň/śś"  "'rč‚.„Ŕ P¨’|Ę!’,Ŕ€őhOY˙ܰUĎÜA/!—y±‘Ä[ţĺ‘StAäD]Đ©T UQ9De°-Iâ̸ Ďoz©gőđ 4Ă-*sMn¤^_ń€ďĎ-)\»xööŤ±ŘŁI—÷¨¦DźžÔp~׊ˇŃwš»zá™óÍqżK[Z[Ç®_6ţ•şWfőĺĄË€1îĄÎś€Ýbź Š€„ËĽäČâ-˙ň‰Č)ş r"‡.č‚`Č z„‰¨"Ď2 XŚ–$qäč™Óá7ÖLÚ¸<(”f¤†ó]-1×äRjP6řçOŐÜ˝lÖ˘Ý[c®GŤÍç궬©}}µ}2éu˝CyÝ*2“j˛‡Ľ±ţĐž1[ęRŞ1îĄÎś€Ýbź Z€„‹˝äH‚-ůȏȡş r"‡.č‚l ę Ş("Ďb XŚ6$q¦[Eft’ks\ž2×đFjďP^ô˙|wÎÄoÍxôtóąëŃ‘ĆS»OËXń— x€*}2©áü”ÚÜ®řćic ×.NĄzôĚé{žźÝß«z„0ă^*ŕLŔůŘ-ö JˇH¸Ř Ź!Ř’ŹüŠ  "'rč‚.Ȇؠ;¨Ź¬J#"-É€­h=gÜ1×üRjßHáŤSFýëăűؠĆćs§››.|q¸4Łw(/Ý;ýä͆óoš:ú+•Ăj__ť8őěůć?.ť” –cÜKś 8»Ĺ>A)´ {á‘"¤ZňT‘CtAäD]ĐŮtĹ‘UiD¤%°­Gâ’›#ćÚN÷ʬ˙\P×Ôr>:±Ř ˙űÄä´pţ ‘Â4oóNP2hÉ»Ű˘ŻµĄµ5q6ęďMëY=\Ś1ţ… Îś€Ýbź Z€x‹˝üR-öŞČˇş r"‡.č‚xHZî«4"Ňň ŘŠ#ńĘÍsM¦o¤0©&;ôĐďM;~¶1FëóźśÎďÎsńÓs]eVP<`Ůží1z×řďóĂyĺßšńčŤSFF#!Ć˙ÂgÎŔn±OP -@ĽĹ^~ ‘{dUäP]9‘CtA<ä­AeÄU ‘jy¬D‹‘xĺćąú7R»Wfăď¶ę™WŹě?xúD̵ćč™Óß™=ń‡óĘ{‡ÜHýďIŻ+>čËÝphďć÷śomIśEú“ů•Ńż=ą6'ÍĄTcŚ{©ŕLŔůŘ-ö JˇȶŘK‘ !ĎbʬŠŠ  "'rč‚.Hü /¨ŚÄ $R-Ď€•h1×Ü1Ws‚˛ÁÁ„űŠ7˝´lĎöCŤ'c®/›ß?đ“yżxş¦{eVRÍ/ô“»Ćɵ9Áä)µą+÷ďL¨ÚŇÚúó§j’j˛ÝH5Ƹ— Îś€Ýbź Z€l‹˝ Â,ö«Čˇş r"‡.č‚„ČĘ‚ľ­L"ŐR X‰V"‰ŔÍsu&5ś” ŞŰ˛¦~ŰúÓÍM±X–5ßůŢśIAiFĎęáéŢé§.Ąv)rűĚ ŹżµiŃî­‰ł<÷ťlřý’ú?=7ł[E¦cÜKgÎŔn±OP -@°Ĺ^ a{ÄUäP]9‘CtAB°N•eZ™D°Ą°­D„›#拝HaJ(7(Íč^™U˛iEŚÖdŃî­ĂV=óó§j˘HßHˇ×úÉŤÔUÉýoź5aÉ»Űjsn;vč—Ď„‚â_®ĚtIŮă^*8p>v‹}‚RhR-ö˛$KH˛Ě#±"‡"č‚ȉş  ‚ŤŞ)hŠÜĘ$‚-Ő€}h%’8Ü1_ÜĄĹäÚś 4ă¦©Ł Ö,ztĂó1Ú‘E»·Ţ6s|0類ŐĂ]JýôűŤľÜ_<]3äĺů u)uÝ{»‹6ľřű%őAńy0Ƹ— Îś€Ýbź Z€T‹˝,É’,óH¬Čˇş r"‡.č‚`ŁŞ š"·2‰` 6`Ú‡$7GĚńŤÔ¤šě lđíł&Ü˝lVń¦—b´‹voť»ăŐoÍx´[E¦źLz]AĎęáAiĆżÎ)^hOB-ĚčßűďO–E÷÷¨Ö/2RŚ13ç`·Ř'(… Ňb/N˛„ËA)´y{‰BśdXŕ‘[‘CtAäD]Đ!At]±D¶e° -C–›#¦çúšěyĽř[3]¶g{Ś6˘ąĄeŃî­Ań€.ĺCRĂůŢé_J ç÷ çýp^ůwfOv‹}‚R(2,ö†PI,r.Ć"‡"č‚ȉş  Ň‚héŠ Éň‰„‹:|AýőX¬AŰŹŘĺćiϤ×t)ÝźµęéÚ×WďúŕhŚľĄµőîełşUd~©235śďFę'ď7ú4‚ŇŚ x@ń¦—˘Ż¸ˇéL˘-Ă©[×}˝ţáčCHŞÉîëRŞ1Ć˝Tp&ŕ|ěűĄPXěe ˇ’Xä\ŚEEĐ‘9tAŃŇ´@E!—vř"këáŘV±ËÍsŮëŠn¤–f¬Y4jÝâŁgNÇhÔ÷źjČ]˝0sŐÓAÉ oö˘·ś\›Ó«zĤŤË]˙|bnÂéo®żyÚî•Yn¤cÜKgÎŔn±OP ]@ze^Ň+qEČĹXäP]9‘CtA`.@äYDr‡«PXŹČ´÷]nŽ6®+¦ÔćF'űŻ 2W>»!ßrô`Ĺk+xń‰ čţ.ĺCnpńđ“‰FßoP6¸O8ď‘őĎ%ć¬ß¶~ęÖu˙8eäWކą”jŚq/ś 8»Ĺ>A)tŃ•yyC®!—d‘CtAäD]Đ™AŔ„ůiEČe®N[=%;ĐŇ#vą9b.}]1”űĺĘĚÔp~ÖŞ§c:á[Žüĺ3ˇ`ü˝Ý+łúEFząź~Ë=«‡ß2}ě–A)tŃ•yyC´D —g‘CtAä9]@ÄFĚd™lAEÎ%®z==1 Đş#vą9b>™>áĽäÚś[¦ŹýĆcŹŚĺ…ŘMő;'Žîúŕčm3Ç“F˙"—R/šč3ąuƸŻŐ˙ąöőŐ ¸ôN7źŰŃpdÁ®7‚IůFŞ1Ć˝Tp&ŕ|ěű˝@$VŕĄé’OÄ[¤EEĐ‘Cät]I“y^°‘9~¸&ĹôÜ,@»ŽŘĺć‰NZ]Aj8˙kőľľzĬíŻÄnž[?üđŕéň5úąuxÉý•Şa‹voMĚŤwö|sŐćUÁÄţI5ŮâaŚq/ś 8»ÉŃ ÔA\^đ.áDĽĄZäP]9DNб6GÔeYuů‡kUFĐöłč]nŽ ×ĂůAŮŕ•űw¶´¶¶Ćržśú %”ë…¶ő˘K3^ŘűVk˘nĽ’M+˘O@Ś13ç`·`źčJ!«˘Žř d"ŰR-r(‚."§ č‚đČ›ś#ç⍬Š:*Ŕµ­ˇÇhűŮrÄ.7G|@ł{eÖŽ†#GOťom‰Ý$o8´7%”{Ëô±©á|Żő˘ůř©Ý*2·;}ŃÍ-- ¸ë˛V=}7OÓ'ś'Ć÷RÁ™€ó°[°OôĄTQGĹL,‘jÁ9AD‘ÓtAxDN‘p!G\Ą-ŕÚ¶ĎĂ´ú¬8b—›#‰9éu)ˇÜ 4#©&{۱C1ťáů;7łţáoĎ.Šţ-˝C®^ü˘{UŹřÇ)#w4Ů~üpÂ.şŚ‰f#ą6ǵecŚ{©ŕLŔůŘ-Ř'z^H)˛'„b&“Hµl‹Š  "‡Čéş ?R'Ű·ś#®Ź"ĐJç‘Ú{ö±ËÍ‘D›ľ‘¤šÁ¤‡ľ5ăŃŐŢYhOLxÖöWnś2ęşĘ¬äÚśtď÷âť}Ńßx쑍‡÷%ň–´b^j8_BŚ13ç`·`źčz!˘ČąŠ™@"Őâ-r(‚."§ č‚üž`#آŽÄ <ę@ç©›kďŮlÄ.7GgúEF^W™L¸ďgOUĎ{űµŐމéč–lZń‡%Ź}göÄî•Y7D ˝ß‹ŢuP2č?ćWE_ôŞ»vżÝ÷Âśč¤Ő¸”jŚq/ś 8»űD/Đ ůDÎEQŇD‘r‘CtAä9]@äGö¤‘–v„VćŃ:UË<^KĎZ#vą9’ źÎěV‘Ý×Ňé%›VÄú7RÝđ|ö_Üv ö‰^ ‰ ¤° !ň,ç"‡"č‚Č!rş€.Ę3Â,đ­ĚŁtŞ~yČ–žťFěrs$î'˝® (ÔůÜěż.ŘŃp$Ö[öęË=«‡Ą)ˇ\źIýěĄÔ`ňŔ?.ť}×íMصvşąiČËóٱ cŚ{©ŕLŔůŘ-Ř'zjH&B.“ň&ł¨‹Š  "‡Čéş BB(ĚH˛Ě#´bŹ^Đ9›ĺ9Űx’Fěrs$Ž'-śß˝2«Kůß<;ĺÄął1Ô3ç›§n]ٲ6(Ü;äó——UÂҌź=U˝űı„]hűO5DC2jÝâ`b×–Ť13ç`·`ź äÚ!“H¸XŠśř!ÉŇ.r(‚."§ č‚ɡ#ĂbŹÜŠ=ŞA§-”năI±ËÍ‘¸ü@jźp^Ďęá)ˇÜ?,yě× #1ŃĂŤ'ź}gKŮ«/E÷e˝ß‹&5ś}×˝ŞGüvŃÔ_<]sülcÂnł='Źß÷Âś`Ü=]+†öu)Őă^*8p>v ö Şˇ ‰xK¦ÔÉb,đ"‡"č‚Č!rş€.’(J/,üČ­äŁ tâyěÖť¤»Ü‰ż©I5Ů7MýŁyż[4-¦Ăyđô‰ ‡öć®^Ś»§[E¦›†źťŢˇĽ"…˙1żę§ó«yŹí>qlăá}.ĄNzHNŚ13ç`·`ź :"ŤČ¶| žÔ!Ă2/r(‚."‡.č‚ ¤č"·ňŹčJ>:Bço‡oÝI±ËÍ‘xúnfJ(÷ćicľ^˙p˙ĺsc=™GĎśľkéô`b˙¤šn~vŇ>ş”}ăżyvJ‚/±#Ť§~öTuP<ŕúšlQ1Ƹ— Îś€Ý‚}‚j¨‰"ŘR*{ň†KľČˇş€đş  ˛$“‹Đj˘+üh 1Q/®“4b—›#qrK1śă”Q=ކŤ]ż,Ö3yö|scóąß-šÖµbhş—ű9—RűEFöĺĹú'q;$-?śWMľ¨cÜKgÎŔnÁ>A54E‘jA?aCz…_äP]@äD]ĐY’LqEV‘Cé~”…*‹×a×I±ËÍ‘8ôş‚`ňŔúmëĎśonni‰őLŢ9·4úGőŤ¦yąź÷şK32W>uö|sSËůß`Ń´¤„rĄÂă^*8p>Ř ö Úˇ,â‡H˪ʢ«"‡"č"'rč‚.“pJ)‚Š:HŻüŁ2ÄVAĽ‹NŇ]nŽÄúô¨=8kű+gĎ7ÇtĎ·¶Ü:cÜíł&¤×ô çą”úŮé)ěY=<(ş?űŻ Nś;›Č‹«ąĺBZîř(-iá|Ů0Ƹ— Îś6}‚vč‹ŕ!ĎB+ŠŇ…Ä*‚ȡş€Č‰ş  â$˘Â‰|˘,˙č±U oǢ“4b—›#1úĹĚÔp~P68(ôÂŢ·6Ţë—RšÎ|{vQrmNJm®©—|ă]ˇăď­ÚĽ*úşŹž9ťČ[+š–;fMcŚ{©ŕLŔů`·Ř'h‡ĘHÂ,·Ň(W«:Š  śČˇ ş Q˛*“Č$Ú!è€ú»uđšl9I#vą9s_ĚL®Í &ěĘ[ľoÇ {ߊőn9zđ§ó«~ůL¨GŐ0ď÷’“VWxü­MKŢÝvşą)‘÷ŐÇiůĹÓ5ŇbŚq/ś 8ěűíĐyC’ĄW&% AU ‘Ct‘9tA„ QDŃF”®€WfËI±ËÍ‘X™~‘‘=«‡űß1kÂěíź}gK¬goŮžíw-ťţ‹§k‚’A=ކ§{ËźůFjJ(7úpş”™şuťeµáĐŢ}Ľ8ú@˘EcŚ{©ŕLŔů`·Ř'(îH2,Ăb)HH©jŠ  śČˇ ş T$Zn˝k!DSÄ-P%â,öŢť'iÄ.7Gbĺ3©AÉ ź=U=ţ•–Ľ»-‚·h÷ÖoĎ. Šô¨ýëĽâ‹'RŘłzřŤSF–˝úrŐćU6ŐŞ»îś[m´cÜKg8»Ĺ>AAÔGĆ`INB>DäP]@äD]Đą"ˇěÍ *#ÉhBŻi÷­8I#vą9Ňůo¤ö¨řţÜ’ŐމČÍ{űµŠ×V^řđeŮ`w /ůĆ“j˛’A7M]űúj;jÉ»ŰĘ^}ů§ó«\J5Ƹ— Îp>v‹}‚‚h€!˝Â,źňpęȡş€Č‰ş  ˘E˘eŘ;9´FQť"Žsî=Úo’Fěrs¤3OŹŞáAŮŕ_/ŚünŃ´Ť‡÷ĹzŘžŢőúüť›oś2*(T“íŽágż‘záFjŮŕďÍ™ôÇĄÓ}&5ęĄ};n™>6ŘżWő~‘‘BbŚq/ś ŕ|ěűŃ#ŃBnEZPĹ™´cEEĐDNäĐ].$Ě^˘¤ˇ;ÂŚ.(qźm/Ôr“4b—›#ťpŇÂůI5#˘ó«áÎ+ďô‰8HÚ’w·u)” ęĘK÷–?3é®!űţÜ’rtŽž9mµ~t)uýˇ=]ˇ †1Ć˝Tp&€ó°[ětDĹ$á{®r°=C,OŰUäP]9$GĐŁĂ[ŕaĘ öłTŁ( zű#iÄ+7G:ĂŤÔ`ňŔŃë–44ťil>ąó·ĄÝ«˛RĂůiŢďĄ&ýŁĎ¤ö¨–îRę˙oţÎÍ˝ŞGÜqëŚq_«˙sJ(×+ľäKO®Í &ü»OÝsň¸-5kű+˙P›}2}ÂyBbŚq/ś ŕ|ěű5Ń; ÁO€.6§í*r(ş r"‡.肤V%6ł`ŁŠ)~Ţ2%itZnŽ\« ĘEÖo[żúŔ; Mgâ K˙µ¸ţçOŐ|uʨ^Ő#ú„óŇ˝ĺK]J &üőÂČş÷vo?~Řţ‰š´qůťsKo›9>™1Ƹ— Îp>v‹}‚š¨ˇTŕ'ŔÂlN«‘StAäD]ĐIěIlfŮF5ŃŞzGÖŻŚI‰ĂÍ‘«9éu˝CyAÉ  lđĽ·_›żssSËůXŹPë‡ţvŃÔ?=73ą6§GŐ07R/9ý"#»UdăďýÍłSÜHýÄřW^řřÉDĂsC¤PNŚ13ś€Ýbź )~lKŔć´Z9E@DNäĐ]6Ŕ’ÄZoTÎÜ_ĎÜúµÍ$ >t/ő*~(3©&;<°_ddý¶őÓß\ůih:ó»EÓ‚˛Ś/Wf¦yŃm|&ub˙A+ćUm^ĺRę'Š6ľ}2˝ŞG¸‘jŚq/ś ŕ|ěűMüX€ÍiŻ"rŠ€.śČˇ ş o€ ‰ť,á¨XżŘf’F¬psä*ÜIěY=<(đÝ9Y˙\ÜÜHÝ~üpÁšE-źLč^aÓµ|hôí˙éą™‡OZ8˙Ę ŃI ç'Ő¸”jŚq/ś ŕ|ěűeüŘ–€ÍiŻ"rŠ€.śČˇ ş r€ ‰…,áhXżXe’F,qsä ˙PfŮŕźĚŻ|ŕĹ'ćďÜ™ŮphoŐćU\:=p_·ŠĚľî~fŇë ú„ó˘§{eÖ ó˘o˙tó9ŰćcĹ›^ J3˘Ó;ś—.-Ć÷RÁ™ÎŔn±OPŔO€m Řśö*"§č‚ȉş  "XŹXČBŽ‚€ő‹=&iÄ7Gľ¸›‰I5#ş”ů?3ÇŻ:°+nłńđľÎ+&ÜףjXżČH/ú’Ż>ą6'úżznćÝËfY2kh:3çćđk‚I ‰1Ć˝Tp&€ó°[ě”đ`a6§ĄŠČ)ş r"‡.č‚Čv#˛śŁ `ýbŹI1ĘÍ‘/b’kszV˙ó*ľ7gŇĆĂűâ#*›ß?°ţĐžďĎ- ĘűFjźIíU="5ś˙ĐňąÖË'Žźm˝nI0îž®ĺCocŚ{©ŕLç`·Ř'( ŕ'ŔÂlNK‘StAäD]Đ©,FlcQGGŔúĹ“4b–›#8iu˝Cy©áüyĽř–écŹ4žŠŹěúŕčîÇnś2*(ÍH ĺşWřy}8_«˙ó·f<:ŕĄ'í–O44ť)\»8ŘßufcŚ{©€3ç`·Ř'č ŕ'ŔÂlN‘StAäD]ĐÁlE¬biGMëד4bť›#5©áüľ‘›§Ťą}Ö„¸‰GKkëöㇻWfőŞ‘Î÷–۸’ @ôA=şáy[ĺŤÍçšÎä®^” rťŮă^*ŕLŔůŘ-ö úř °3›Ó:Eä]9‘CtAö[{XÚŃŔúµľ$Ť8ŕćHG]KěQ5ě?ćWťomiimŤ›xl;v(úwyżíą•” *ŢôR<˝ý˙˝»–NďQ5ÜŤTcŚ{©€3ç`·Ř'h ŕ'Ŕ¶lNë‘StAäD]Đ ¬Dl`GSë×ú’4↛#˙«‰^_“LzčîełŽ4žjh:7ÁXňî¶ŢˇĽ[¦ŹíÎó˘ŰžŐÉýçîxőpăÉ3ç›­”OünŃ´”ÚÜh~ŇäÄă^*ŕLŔůŘ-ö Zř °0›Ó.Eä]9‘CtAüűKXćQŔúµ»$ŤxáćČß=}#…ÁÄţ…ko9zđpăɸ‰DřŤ5·L{ŰĚńI5Ů˝C.Ą¶ő‘Ü dĐŠ}oGpÖŤÔOůŮSŐwÎ-í)?Ć÷RgÎŔn±OP¸ć‹ÎCđ`[6§]*r(‚."§ č‚–ˇ ŚŘŁ/`ýZ\’ËÍ‘żď3©]ʇăî)XłčH㩸 Ă#ëźűŮSŐ·Î×˝2+Ą67Ý‹ţś·źĘ Ju«Č\¶g»r‘_>J®ÍIŞ‘ΗcŚ{©€3ç`·Ř'(\óEç!ř °0›Ó"9AD‘ÓtA›ĐîEňQ°~m-IŽĺćČMj8?(Í&=TµyŐ¬íŻ44ť‰›$<˛ţąľ‘Â®ĺC“ksnz×—üBnRMvôíß4uôüť›ězĂů´3ÍÍż^é^™•&-Ć÷RgÎŔn±OPč4[Îsđ`a6§E*r(‚."§ č‚(Ö Ĺ‹đŁ5`ýZY’ËÍ‘+řDfiFŹŞáµŻŻ.{őĺxĘ@áÚĹą«¦×$ŐdűFj—RŇÁ˙öÄäŠ×VÎßąŮęř´Ý'Ž Z1ďźvDTŚ1Ć˝Tp&ŕ|ěűÝNµĺ<?¶%`sZ¤"‡"č‚Č!rş€."`ZĽČ?ŠÖŻ}%iбÜi×'2KÝ~lKh»ţ‹ÍisŠŠ  "‡Čéş Ą`×a»"9(Xżö’¤ÁIŔ{]ʇăîÉ]˝pŃî­qv#5jŐ]·Î×­"3©&;ÝÍ 6&R” ĆßM‚o¤^Ňś·6ţü©š;ç–^W™%KĆă^*8p>v‹}‚6Aě.4ĎÇŻ€m m·Ţñ6­M‘CtAä9]@d,:ěU$ťë×R’4¸"‰vO$(0iăňČ–µńwqŢŰŻÝ˝lÖŹ˙RŃĄ|HßHˇ;A—MBɦŃ$44ť±>kć›ţąţá 4#©&[śŚ1Ć˝Tp&ŕ|ěű…‚^hžŹ_«DÚÚ´6EEĐ‘Cät]WŔ–łTŃÔ ¬_IŇ %ÂÝôş‚>ἠÇ,\°fQkÜ˝Äúmë ×.ţAń€žŐĂÝ"l# ˝C’е|čż-U˙Ď3óÍ _ݏ[E¦,cŚ{©ŕLŔůŘ-ö :q°Í<"żV%ČłµigŠŠ  "‡Čéş ®€g©˘ hXżÖ‘¤AŠó‹!‘”ÚÜ lpźp^îę…щł×7uëşđknś2*(ŕ»–mLôÉ$×ćD“^WŤAÁšEşIÓß\_űúę›§Ťé^™%NĆă^*8p>v‹}‚NA|¬2OÉŻ€m ÂlmZ"‡"č‚Č!rş€.H,`Ĺ٨(ĘÖŻ]$iĐâřFjrmN—ň!ßxě‘?=73.ď!Îykc×ňˇAÉ ”Pî ®¶†UĂľ5ăŃh|&µ ównî^•%QĆă^*8p>v‹}jEśí1ĘŻ€m‰ľK˛µi[ŠŠ  "‡Čéş ´`łať˘)čXż‘¤AŠż› éu)µą×UfÝ1kÂŹ˙RQĽéĄ8{e§›Ď-ß÷öüť›ÉÓÜýąlBÂĐ/2˛âµ•ú~IgĎ7Gµh÷Ö 4#5ś/6Ćă^*8p>v‹}šEś-1ĎĘŻ€U‰˛K˛µi[ŠŠ  "‡Čéş ·`­a—˘,¨Xż¶¤AŠłk ˝CyI5ŮwĚšđÍú‡çĽµ1Î^VCÓ™mÇE¶¬ &Ü×­"3ÝĹźv„á¶™ăżůŘ#á7Ö(ű%56ź›şu]Pt4Q2cŚ13ç`·Ř' \Äĺó¬ü X•hş[›VĄČˇş rś.  ˘ v)ú‚–őkIt ¸ą’ÎO çß2}ě?„rVx'Î^Óéć¦#Ť§FŻ[=T“}C¤Đ•ź¶'†o<öČ?Ôć,yw›šžłç›/\sžôDcŚ{©ŕLŔůŘ-ö čqĽÁ<.żV%j.ĂÖ¦=)r(‚."§ č‚ô‚…†-ŠĘ h`ýÚ?’(~î€D “j˛÷ś<ď¨őĂďy~v×ňˇinú´{şWem9zPÁŰUKkkíë«Ň i1Ć÷RÁ™€ó°[ěP1â{}yb~¬Jt\€­MKRäP]9DNĐŰ +­A×Ŕúµ|$ :PL_úHŻ+čÎë^™uÓÔŃ MgŽźmlŤÇwô§çf&Őd§†óÝKmĎgs{UŹřreć¶c‡ZZ[üóä®^řµąŃâDs%6Ćă^*8p>v‹}ZF|ď.ÍŻ€=‰‚ °µiIŠŠ  "‡Čéş É`•as˘8¨Xż6ʤAŠÝ}#…]ˇŢ9·t×Gwź8—oç—Ď„ľ7gŇŤSFőçąăÓö×rSBąAiFôYEó°łá}ŐnCÖŞ§ŁŹ+ą6ÇĄTcŚq/ś 8»Ĺ>-#—çćWŔŞDµĄ×Ú´!EEĐ‘Cät]f°Ç°6Ń4¬_kGŇ ĹčŤÔUâűü—ŠíÇÇßKiimŤţiżZîÎűřK©.ř´ť‡ lđ÷ç–¬{o÷«Gö+uî^6ëçOŐÜv ö şFâ¬,OĎŻ€U‰FË­µi7ŠŠ  "‡Čéş Ň`}aa˘D¨Xż¶Ť¤AŠ•űéu]ʇE÷g®|Şâµ•;ŢŹżw±ĺčÁ^|âOĎÍ Ę2\Ľě7R/ÜP.ş˙K«ÚĽjὺüyšZÎ?´|n´8×Ufůö®1Ƹ— Îś€Ý‚}‚ş‘€űĘô+`U˘ŃBkmZŚ"‡"č‚Č!rş€.6Ř]X•čÚÖŻU#iĐ:˙uÔÔpţ…©Ąą«FçřŮĆř{ +÷ď˝nÉoM &ö˙refßHˇ=mM¤0<đźćaűńĂZ܆h_îy~vP< Z"źß5Ć÷RÁ™€ó°[°OĐ8sYy†~ěIÔYh­M‹QäP]9DNĐŮ‹ {UBÁúµg$ :Pgľ{ĘíZ>4úż™+ź´b^\>˙e{¶G¶¬ýŃĽŠ čţUĂúEFşËÓƤŐtŻĚ Ę˙ćŮ) Mgô·mN}đŔ‹Oű»élŚ13ç`·`ź t$ň¦ňý X’č˛ĐZ›ŁČˇş rś.  â V–$ …‚őkÉHt N{#µ[Eć×ę˙ü_‹ë3W>Żĺţ]Ńż1ôPRÍ7/;}Âyɵ9w-ťţ›g§´Şn›v6Ľ˙ô®×‡Ľv ö އ%®~ěI´XV­MűPäP]9DNĐ9Ë »µBÁúµ[$ :PçąÁ‘ÎO©Í˝eúŘŻNٲ6.źvSËůÝ'Žm<Ľ/(Ü­"3ú'§»ĽÓć¤ESĘ˝ięč[gŚs)ő˛Ţ;}bĎÉă˙ą .(Íp#ŐcÜKgÎŔnÁ>Aű° dŐŻ€=‰ţ ޵iŠŠ  "‡Čéş ę`Ma1˘\¨$Xż¶Š¤A‡ë,×ë ţiÚŻT[¶g{\>çć––ÓÍMKŢÝL\›ăÂN;/ĄŢ8eÔő5Ů-ź«Ş—ŐŘ|îŰł‹ľ\™Ů'śçľł1Ƹ— Îś€Ý‚}‚b;I©KÍ•R;Ó&9AD‘ÓtAÚÁŽÂVDżĐJ°~­$‡/B'ąľńĄňˇ[Žlj9ßŇÚ—Ď9˛emôoĽqĘČ4·uÚ7éuAÉ qžŹ¦˘ąĄEU/ë¶™ă{‡ň$ÇcÜKgÎŔnÁ>A ±šDÔ%‰ÎЍťi ŠŠ  "‡Čˇ ş ó`;a˘e(&Xżö ’ĆçÚ^‘Ct‘9tAĐě"°ýô…‹×Ţ@޸:®Î§0»– &öďż|î¸ Ďo9z0^ćŮóÍĽřDPšý{SĂůn¤^öFjRÍ xŔ-ÓÇ–˝úrý¶őúŘËöl˙Ńçö•Şa}]J5Ć÷RÁ™€óŔn±OPLl!ôC`C˘ž2igÚ{"‡"č"'rč‚.  ŘB`ďi: V®ĄÔq}ˇ—2RĂů]+†e+ţ2äĺů‡OĆëcÜ{˛ˇhă‹Ů]pµť—R˛ÁwÎ-¶ę™YŰ_ŃÄöxz×ë%›VDZPšáFŞ1Ƹ— Îśv‹}‚nbIŁÝH;ÓŇ9A9‘CtuŔ KOQ[°om Ź«ď ú@jďPŢ—+3Sjsű/ź{÷˛Yqü·;4ýÍ Ń?3o×ňˇn ^~"…˝ŞGĄ·Íżh÷Vl§%ďn»ięč`ŇCI5#ÄĚcÜKgλĹ>A=±DŃ%‰bŠ˘ťi݉Š  śČˇ ş€F`˙€Ť§(/Ř´vâÇ5ńEÜHíQ5쟦ŤůőÂČ}/̉ăG·ĺčÁĺűvüćŮ)Ář{Ż«ĚęéÎe'©&»{eÖŹ˙RńŁ'ËWîß©€í±bßŰŃg•ÎďU=â7RŤ1Ć˝Tp&€ó°[ě”ËGýب¤Ú™vťČˇş€Č‰ş  č6Řuš kK „\;x#µO8/©fÄ7{ä;ł'[őL|?·]Ťţ™}Ľ2ŰÇ+Ű9)µąwÎ-˝uƸť ď«^{´´¶.ß·#(ÍčR>$5śź.EĆă^*8ŔůŘ-ö zе#~lHôQíL‹NäP]@äD]Đ´;l9}D‘ÁvµE®©ą|‘ÎďĘűçú‡ÓÂů%›VÄ÷;Üx2:ßšńhĎęáî ¶?!iu·LŰÔr^éÚ©ąĄeůľ·’AňcŚ13ś€Ýbź ­Ř9˛ç‡ŔzD%Đ›˛ĺDEĐDNäĐ]@G°mŔ~ÓJtěUˤ“čËý"#»–ťżss?¨Ö?lj9¤ńTďP^J(7ÍĄ›+ů–núG—RŐ­ťZZ[Ła{aď[Ai†ücŚ{©ŕLç`·Ř'(,VŤěů!°!ŃAŮóľě7‘Ct‘9tAĐ,°ŮÔŤK:Ź˙ýÍ‹ 4cýˇ='Îťmni‰ăµůýI5Ů_«˙sZ]K©íĽŽÚ;”ץ|Čç•GăqşąIÝÚ©~Űú^Ő#ţiÚÔpľ cŚ{©ŕLç`·Ř'¨-öŚÔů!°Q@ÁóĘ,7‘Ct‘9tAP¬°Đ”˝»1N:ŹżűĘaj8ż[EfP6xÝ{»[Z[ăř-Ú˝ő«SFÝ6s|Jmnźpž»6홾‘Â`ňŔ»–Nß}âŘ{§O(ZűŐľľ:ą6':.ĄcŚ{©ŕLç`·Ř'(/6ŚĽů!°Q=‘óâ¬5‘Ct‘9tAP,°ĘT´[«@DélţŽű†Éµ9ÁäéuďŰpho|?źyożöŹSFö¨žĘMwѦ} é^™Śż÷îełöťlP±ö+\»řÎąĄßšńhRM¶°cŚ{©ŕLç`·Ř'č/v‹°ů!°Q:yóúě4‘Ct‘9tAP¬°Ä4›őW:ˇöß°čŮłzxPôŕ÷ćLZ´{ëĘý;ăűÉTĽ¶ň× #ßť3ńşĘ¬"…®Ř\~"…]ʇăď-\»řé]Żďu)őJ¬Y”^WđĺĘĚ”P®ĽcŚ{©ŕLç`·Ř'(2‹ŚyeČ­şIš7h›‰Š€äśČˇ ş€a™€őĄ¶ ďŘ™(ľĐŇ9µóFę…/`N¸ď?Ô…ßX÷7RÝđü óľůŘ#AiĆő5Ů}]lß“NÚ¸ĽöőŐGĎśÖ¬ö¶ę™!/ĎŹĆĚgRŤ1Ć˝Tp&€ó°[ěPL+EşĽ8DWŃÄĚ{´Ę9E@DNäĐ]@•°FŔâR^Đz¬JT^zéäÚľU‘^WĐ­"3Ř˙OĎ͵nńĆĂűâűiŚ]żlü+/¤„rŇŚäÚ7R/;Ń„ô çe»”)\»Xˇ®TÁšE*V6¸w(ĎĄTcŚq/ś ŕ|ěű”Ú2‘+ŻV1ó6-1DNĐ‘9tAĐ),°ŻTtKe—a:ąĎ»O‘Î˙řşÜ}/ĚyŕĹ'öžlďçĐŇÚ:nĂóAÉ  ,ŁOŘ ÁvL¤0Ą67šč˙¶ę™ěż.Цökh:SńÚʢŤ/“Ę’1Ƹ— Îp>v‹}zm“•7 ë—tyˇ6"§č‚ȉş  ¨¶XVZ ęŹ ‰¦‹1±â’źżěQ5,ą6çîełţkq}Kkk|?#Ť§ć˝ýZĹk+IąŽÚţK©=«‡ß2}ě–v‹}šnoH‘wŠ<ë‘8yŃV"§č‚ȉş  čVŘK ÖÖ -áĢ´Ź.ĄŢôŐ#ű$'îW Â=ކ ’1Ƹ— 8p>v‹}ŠoKŤ·Ś„ëŽđxé"§č‚ȉş  ( XA*v6Ę+öÄ´ŁgNi<ŐÔr>ţŘŰfŽO çGÇ}™öOôqÝ4uôţS Ńś´¸“zĺţí‰Éßxě‘~‘‘‚gŚ1îĄÎś€Ýbź€úŰă]#ç*#6ŢľŐ„Č)ş r"‡.čš=6ŹîĄ-‡ÎŞt~[ŽĽuƸďĎ-éĘKsYćďş—š 7—;VCÓ™;ç–ö 祄rĎcÜKś 8»Ĺ>«ŔZ/×i‘ëyÓtAäD]ĐTő Ç Ë =ŐčTü×˙ő°íFpjđo˙€+⿸ůďq€•h7€S €€±ř· \)˙1ΕěC»ś]8úü‹Ĺ?o ťü·9˙y°íFpváčđ/˙Ľ€+â?Ě$ňJ´ŔŮ…ŁŔ?Zü«ţ7üç9€x݇v#8ľp_đŹ˙°€/”˙<»űĐb€Dă˛ŕ-ţUťŤ˙BĐiW˘Ĺ|×4˙hńOčlüw:€«°mEŕ‹ŕŽŕź.ţ%üěŰÁĂ DA÷ßtұAŽV3%,zÜ>Ľĺ:ĚÂí\É»ĽëjËŰśv%ň¬{]ą<.ŔLň7S‹ G˝˛ăŕ6±›©Ą…×!đśŔÍÔrÂěguTě"j3µ„0ň5Ű ŮL-LzD*çč×L­Ěx>i*§‰×L-ěţpşTj×L-ěűdşT*‰×L-ěřX˘Tęé×L­ěőLşTޢ_3µZ°ŃéRx‘~ÍÔjÁŹ"ŐĄ°@żfjµ PÔĄ°Bżfęɵ DÔĄ°Nżfę±µ >ÔĄđýš©gÖ‚âP—ŔŻôk¦žV ĘB]÷č×L=ŞÔ„ş4nÓŻ™zN-(ui<ˇ_3őZP ęĚxHÂfę Á Ô™đś„ÍÔńÁ Ô™°…„ÍÔŮÁ Ô™°‹„ÍÔÁÁ Ô™°‘„ÍÔ©Á Ô™°—„ÍÔşTś+$l¦¶6Î €6Sç­­ýtfś a3uŘÚÂOgŔ!6SëRqc¬P±™:imá§ŕ›©u©¸1V¨ŘLł¶ęÓŤp”ŠÍÔkK>u©ś¦b3uŔÚzO]*Tl¦ÖĄâĆXˇb3u÷µĹžşTj¨ŘL­KĹŤ°BĹfęÖk+=u©”Q±™Z—:°čt]Ü ”4µ.Ő‹Śéł Ë3ußµµ¨ŤćőŮĐč™Z—jü‚©}¶Äz¦nş¶(µ×ř>[€z=SëRm^đ >[€Ş=SëR ^đ>[€Â=SëRM]đ">[€ň=Sw\[”Úńiü·ßöíä°a‚ óOÚNˇ%ńZ *„ႿNÁgj]Ş‘ořF~¶ ń™Z—j᫿”?-Ŕt|¦ÖĄš )ź©Ç­-J€G¨ůL­K5,‚>SëR … ĎÔşT«@ˇé3ő¬µE©đYź©u© Yź©u©® eź©u©® eź©u©N qź©u©N qź©u©N qź©­}ĚáßŔzÄ}¦ÖĄş[(ô}¦ÖĄ:Z($~¦ÖĄ:Z($~¦ÖĄş[(ô}¦ÖĄ:Z($~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ž˛ö1_ Sů™Z—ęb Pů™Z—ęb Pů™Z—ęh ř™Z—ęn Đ÷™zĐÚ˘TxÄĎÔşTw …ľĎÔşT§ …¸ĎÔşT§ …¸ĎÔşT× …˛ĎÔşT× …˛ĎÔşT …¬ĎÔşT7 …¦ĎÔşTĂ@!č3µ.Ő¶P¨ůL­K5/R>SëR- …ŽĎÔłÖ–¦ŔSD|¦ÖĄÚ ź©u©¦€Bľgj]ŞÁ î™zÜÚŇTx„jĎÔşTË@ˇ×3µ.ŐţP(őL­Kő  é™zâÚÇęüšx!už©u©ľş%p3ő¶9ˇ€Ô9đi›©w ŐŁ. €N×fjˇ€ÔQPÚL-!ü“¦ş+E›©őľ‘4€ÉŮL-śő™¤©;ď.`‘š©u©¸@ ťš©u©8? ©š©u©8? ©š©u©¸= µš©u©¸= µš©u©8< Áš©u©¸: Íš©ç®-ęÔĄp'Íš©u©89 Ůš©u©¸7 ĺš©u©¸7 ĺš©u©86 ńš©u©¸4 ýš©u©83 ›©u©¸1 ›©u©¸1 ›©u©80 !›©u©¸. -›©‡®­ôĄp39›©u©8* Q›©u©¸( ]›©u©8' i›©u©xąę6SëRńf(4n¦ÖĄâÁPČÜL­KĹk Pş™Z—Šw @ˇw3µ.Ź€Bňfj]*ž'…đÍÔ×Ö„:î'3µ.E*…ÎÔşT©R8SëRQ¤PâL=zmѨ{ŕ6Ę8S/ł¶’Ô%p)}ś©®¦rTN$”3őÚY˘ÚT” ŔY´r¦Ţ§LźĘQř…bÎÚŰ&ŠrT>ĄEŕ;BTľŁBŕGúS ]*pť­6@ endstream endobj 399 0 obj << /Type /XObject /Subtype /Image /Width 5000 /Height 1419 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 31416 /Filter /FlateDecode >> stream xÚěÝKb$É‘DAÜ˙ŇĹ-7lV'Ň"ĚTENPé˙xiţüçđ?9!€oQZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- ĂüżR`\`jwî@đ˝ďî4ĐáTźNđĘŽ >Tx|ŰP 0Ľ˛ő@‡¨ †t8pk"€Ď*Đá@‡+t8pU€Ż+Đá@‡Čřü7 Ă‹đŕ1¶˝t8pQčp@—żi\€ŹŹ)°ĺť Ă‹@‡ľúÍčpŕ¦|xLÝî@Ü:đÁo:@‡7ŕ#Ŕc ětčpŕ¦ĐငŻ}3:¸)S`›;@‡7€$|ę›ĐáŔMřđ{Ü:¸)t8 á;߼€n ŔG€ÇŘŕĐáŔM Ă ů¦t8pS><¦Ŕöv€® řÂ79 Ă«đŕ1ö¶ólSpUčp@Â÷˝é\€ŹŹ)°łť`Ł‚«@‡ľîMčpŕŞ|xL}í<[\:đmoŠ@‡Wŕ#Ŕc ějçجŕŞĐင/{“:¸*S`O;ŔvW€Čp`ż‚ŕ#Ŕc |Ö;@‡w€6´o+°cÁ] Ă%ő& t8pW><¦Ŕvv€= î Hř¤7U Ă»đŕ16łăěZpWčp@½ÉÜ€ŹŹ)°—`Ű‚»@‡ľçÍčpŕ®|xLťě8Ü: Ăť :€ŹŹ)đ5ď4\:ŘÇ>­ŔÖ—…łÂ˛(yź›0đm . g…e€‹Ý­¶±Óě]pY8+,ĐငçąßÖŕ˛pVX6¸ŘÝŠ`; Ŕî—…łÂ˛ĐáŔîAĹYe€‹Ý­çNđm . g…e:ŘÂŢČ`˙‚ËÂYaŮ€čp`˙. g…e€‹Ý­žć°Ámᬰl@‡Řě`Tś– ¸ŘÝŠŕeî0ßÖŕ¶pVX6¸ŘÝŠ`˙z"- n g…e: Ă- ‚ŠłË»[ĽËŕŰÜÎ Ët8°}=‘Á·…łÂ˛ĐáŔÜÎ Ë»[ě^‡ŘÄŕ¶pVX6 ĂÝë‰ 61*Î ,\ěnEđ*w€okp[8+,ĐáŔćőB»\Î Ët8 óQnćŔ·5¸.ś– .v·"ػΰŤÁuᬰl@‡t8°ŤAPqV`Ůŕbw+‚7ął|[ëÂYaŮ€¶®2ŘÇŕşpVX6 Ă-Orsľ­Áuᬰlp±»ÁÎu€Ť ® g…e: ĂŤ ‚ŠłË»[ĽČťŕŰ\Î Ët8°q=ÁN÷…łÂ˛ĐáŔNÜÎ Ë»[ĽČ`'űÂYaŮ€öíëŹ]Gř¶OGg…e:Ř·ĎmhGř¶OGg…e:Ř·mfGř¶OGg…e:ضĎleGř¶OGg…e:ضŹěcGř¶OGg…e:ضOlcGř¶OGg…e:صŹlbGř¶OGg…e:Ř´OěaGř¶OGg…e:Ř´la'ř¶OGg…e:Ř´Oě`'ř¶OGg…e:Ř´ě_'ř¶OGg…enE°gźŘľNđm žŽÎ Ë»[ěŮ'vŻ“|[§ŁłÂ˛ŔĹîV{öÍë$ßÖŕé謰lp±»ÁžµyÁ·5*Î Ët8ŕµÇ¸ßÖ ¨8+,ĐáŔ–µuÁ~AĹYe€‹Ý­:ŕŰÜ?Î Ët8°eí\đm ‚ŠłÂ˛Xđ7ŢŕŰg…e:ز6.ŘĎ ¨8+°lp±»!ŕ-n¸Á·5*Î Ët8°cí[°ˇAPqV`Ůŕbw+BŔSÜpokTś– čp`ÇÚµ`C â¬Ŕ˛ŔĹîVđm .!g…e:ر6-ř¶AĹYaŮ€čp`C ‚łÂ˛ŔĹîVđm n!g…e:ذ6-ŘŃ ¨8+,Đá€#/q ľ­APqVX6 Ă kĎ‚ ‚ŠłË»[t8Ŕ·5¸†ś– čp`ĂÚ˛ŕŰg…e: Ă ‚ Î Ë»[t8Ŕ·5¸‡ś– čp`ĂÚ±`G â¬°l@‡t8Ŕ·5¸ś– .v·"ذv,ř¶AĹYaŮ€čp`G â¬Ŕ˛ŔĹîV„¤‡¸±ßÖ ¨8+,ĐáŔ~µaÁ–AĹYe€‹Ý­:ŕŰÜDÎ Ët8°_mXđm ‚ŠłÂ˛ĐáŔ–ÜDÎ Ë»[t8Ŕ·5¸‰ś– čp`żÚ°`K â¬°l@‡t8Ŕ·5¸‰ś– .v·"ŘŻ6,ř¶AĹYaŮ€čp`K â¬Ŕ˛ŔĹîVűđm ®"g…eľëÁ~µ_Á·5*Î Ë|×ö+ŘŇ€«čýłÂp€ďzŔ~[t8g…q»KěW@‡W‘ř®űŐ~t8g…qßő€ý ¶4ŕ*ŇáŔĹîRűĐá@‡Óáßő`żÚŻ`Kç¬0îŕbw©ý čpŕ*Ňáßő`żÚŻ Ăç¬0îŕ»°_Á–ÎYaÜŔĹîRűĐáŔU¤ĂľëÁ~µ_Á–ÎYaÜŔw=`ż‚- ¸Št8p±»ÔÁ~t8Đát8Ŕw=ŘŻö+ŘŇ Ă9+Ś;¸Ř]ę`ż:¸Št8Ŕw=ŘŻö+čp Ă9+Ś;ř®ěW°ĄA‡C‡»KěW@‡W‘ř®űŐ~[t8g…qßő€ý čpŕ*ŇáŔĹîRűŐ~t8đ]ŘŻ`Kç¬0îŕbw©ý čpŕ*Ňáßő`żÚŻ Ăç¬0îŕ»°_Á–\E:¸Ř]ę`ż:čA:ŕ»ěWűliĐáśĆ\ě.u°_\E:ŕRűŐ~t8g…qßő€ý ¶4čpÎ ă.v—:ŘŻ€®"đ]ö«ý ľ­A‡sVwđ]ŘŻ`K®"\ě.u°_t8đ]ö«ý ¶4čpÎ ă.v—:ŘŻ€®"đ]ö«ý :čpÎ ăľëűliĐáĐáŔĹîRűĐáŔU¤ĂľëÁ~µ_Á–ÎYaÜŔw=`ż:¸Št8p±»ÔÁ~5ҠçþëÁ~µ_Á–ÎYaÜŔĹîRűĐáŔU¤ĂľëÁ~µ_A‡ÎYaÜŔw=`ż‚- ¸Št8fÖLéţ°"ŕÔÎu±_˝ÔĂ×–šŇá,j6O©:śGĐZiŢÖ śŮ»†âÂqgRCV—ˇÓá¬j>\”pjępĽ´Tš7„•gö®±ŘÚ™ÔĹeđt8«š‚Ąš:o®’öm`ÝŔ‘ýkDVŽ›I ]UĆR‡Ëz0µ:¸Št8"–őoÝĂťýk`ÖŚ9-XNV‡ t#{|ru8pépÜ_ľŐÚ€ďúw˙í6Ëę…d”u¸¸á6ČwçW‡¤ÇýµaÉŰpn ÷†Ę¤zjĂň4ÜçW‡GŁ—÷†gŔÉml&“Z~WoClYóú ëpŕXÔḿ,48{ÎncőÜ™SweńÝčuíP95Ĺ:8u8c~˙ńüJۆćąAHúAg7˛K&pf=A¶_–ËgUÜT9†'ô3 \ž]Ć˝ŞĂ%M¸łH‡Óá":ś-šşSÍ©VqrŠ|J™0TĐáÖM“#<Ât8îţm Zş:ś·y/»dŽ\8^#Yץ!óY7KNý/Ç8u8cţƧL¸I‡ÓáR:ś šşSÍŞVqwŽ|J­ź)CŐŃá6N#<żt8îŐ·WÚŢ0:ÜӿŠݩfU«8=I>Ą–O“Áęčp;§Ç‘_:św˙6+ąţ,]N‡[Ľť]2_ł*VÜž$źR»gÉhut¸ĄłăHo/N‡»›ő\}Ž N‡Ű»ˇ]2_łŞU\ź$źR‹çČ€•t¸µSăH//N‡»›U]{Ž N‡[»ˇ]2_łŞUÜź%źRk'ȵt¸˝ăHď.N‡»›•ÝyŽ N‡űń_ŘŢ©&U«H&źR;§Ç Őt¸ÍÓâHĎ.N‡{őäŮ•¶O ÷Ěo±=SwŞ9•*2ćɧÔĆą1p=nő”8ŔŁK‡Óá^ý÷xuĄíG…÷Äo±;SwŞI•*RćɧԾ™1t5nű„8Ŕ“K‡Óáîßfť7ťŻ{®¶ĂŮť±;ŐśJ13ĺSjŰ´Ľž·~: ŕĹĄĂép÷ołŇkÎ×˝×ŮálĎŘťjNĄŠ ™ň)µkR _O‡;0ŽĐt8îŘ߸Üq»·‹ŁB‡ţ-vgęN5§REÔTů”Ú4%ĆŻ¨Ă] GčA:św˙6+ľŕ|ÝëpeÎćŚÝ©&U8Ęš*źR{&Ä6u¸3áH=H‡ÓáîßfŐ×›Ż{®©ĂŮśˇ;ŐśĘFqsĺSjÍtæwc  ép:Üý۬űvóuŻĂőt8›S‡3§RĹ‘ąň)µe6 bS‡;2 ŽĐt8îţmV~µůş×áJ:śÍ»SÍ©f”7Y>ĄvĚ…Q¬ępWfÁ‘z§ĂÝżÍę/6_÷:\C‡ł7SwŞIUá'˧Ԋ™0ŽMîÎ8@Ňát¸W'Ţs+mß8*t¸™ßboĆîT“ŞÂEΖO©ó`$«:ܡp$€¤Ăép÷˙ŞäJ[´s:ÜČo±7CwŞ9•áRg˧ÔëÓ`(»:ÜĄ p$€¤Ăép÷˙ŞäB[´w:śZS˙Ńô÷żŢśŞp±ÓĺYňö$Ě®wjř  ép:\DIpdmŮ<Ž îűżĹÖLÝ©ćT„Ëť/Ż’—§Ŕhvu¸[ŁďH=H‡Óá"jŠ#kËîqTčp_˙-¶fčN5§2\ň|y”Ľ9†ł­Ă|GčA:św˙ŻJ.´EűÇQˇĂ}ů·Ř™©;ŐśŞpŃ3ćIňâđѶwmä  ép:Üýż*ąĐm G…÷Ýßbg¦îTs*ĂeĎÉ{ŁoHŰ:Üąw$€¤Ăép÷˙ŞäF[´:Ü7‹ť»SÍ© §{#źr˝űK#ô N‡ËpgÖ’-ä¨Đáľř[ěĚŘťjNe¸ô)óyičŤj]‡;8ęŽĐt8îţ_•Üh‹öŁB‡Óá.,Ů—¶9•áâ§Ěs$őľr-ëpÝ‘z§ĂÝ˙«’mŃ&rTčpßű-vfęN5§*śdÜ {ĐôâŻ<9ćŽĐt8îţ_•Üh‹v‘ŁB‡űÚo±3CwŞ9•á!ĂnÔu8Đt8îđmćF[´Ť:śZsaŐľř›Í© W1iúůA7˛…îć;@Ňát¸ű·™mŃ>rTčpjÍ…eűŢO6§*ś&dĚ yŘôÚO<:ŕŽĐt8îţmćF[´‘:ÜW~‹Ť™şSMŞ ' r#žv˝ő ŻŽ·#ô N‡Óáś`:ś·¬ĂŮ©;Ő¤Ęp-łf xŃôŇ<;ÜŽĐt8îţ_•Üh‹¶’ŁB‡űÂo±1SwŞ9•áj¦Íď˘Cčťßww´  ép:Üýż*ąŃí%G…÷űßbc¦îTsŞÂőL›!6ÜE‡Đ+?ďđ`;@Ňát¸űUrŁ-ÚLŽ î׿ĹĆLÝ©ćT†+š6#l´‹!΂=H‡3ćŤńńŤćĚZ˛›:Üo‹}™şSMŞ ×4mŘ`Boü¸ËCmĹ‚¤Ăép:ścL‡Óáöt8űR‡3©2EŔĽŢç¶ń}ýzá·ťi ô N‡Óác:ś§Ă•Ýs/üXs*ĂUMśŃ•<‹N!Κ=H‡3懮3Ż0N‡Óát¸†ťjRe¸®‰3¸Š§§ĂY´ épĆüźĆřüFsf-ŮOŽ N­ą°z˙­&U…+›8c+xťBĎ˙°ŰĂlµ‚¤Ăép:śL‡Óá¶t83t§šS®mć ­ŢYt =ţ»ŽŹ˛Ĺ z§ĂÝ˙«’mŃŽrTčpjÍ…őűđ/5§2\ÝĚYąłčzúg]dkô N‡»˙W%7š§Ăet83t§šT®oć ¬ÚYt ép.čA:ś1×áxmK9*t¸Ź‹Ť©Ă™S•"fꌫŘYt=üŁÎ±• z§ĂÝ˙«’mѦrTčp:Ü…üčď4§2\áÔV­S‡úQ÷‡ŘJ=H‡Óá26š3K‡Óát8űrĺN5©2\ăÔU©łčzô7ڰ… z§Ăép3N‡[ĐálĚĐťjNe¸Ęą3¨JgŃ9¤ĂYĽ épĆ\‡ăµ]ĺ¨ĐáÔ®ufe8sgüu¸ĘsčÉ_”0ľ–)čA:\}‡ Ůhά%ŰĘQˇĂ}ö[lKΤŠI“gH‡÷†AŐát8piBĆýj‡KŮhÎ,N‡ÓáěË…;Ő¤Ępť“gDg·†1]u=ř"†×*=H‡Óát8ç™§Ă˝ÝáěËÔgNe¸ŇŮ3 Ł[öv¸ŚáµJAŇáĘ;\ĚFsfép:śOzűŇśz;šß%Óg<'·†]vép0čA:ś1×á/6ÎLÎľ4§ćÔôîť>Ă9¸3 č¶č±ź2¸Ö(čA:\w‡ËŮhά%;ËQˇĂˇĂ™SÎüM®č$Ňá¬`Đt8c®ĂˇĂép>yěKsZú|4 ¦Ď`Îí ăYŰáRĆÖ=H‡«îpI͡µck9*t8t8s*Ă™@c9¶1 çľ“H‡ł†AŇጹ‡§Ăůč±/ÍiĺűŃx•do Łąđ zč·Äڬ z×ÜáĽxťi:śgwép$Nf`ÉüJ®č$Ňá,bĐt8c®ĂˇĂépľzěKsZř~4[&ĐHm ŮŰárÖú=H‡+îpY͡µcs9*t8t8“jbM ôÚ+:‰t8Ëô Îëpčp:śO{ŰŇśÖ= Ťţž4Ž^{EGŃ#?$hX­NĐt¸ŢçećTÓát8»«ô±aä3Ź'ďC[‡C‡s<€łK2î:ś—YÓ±ć¨ĐḰ” |äńděMˇQنrçQ¤ĂYÇ épĆüŻĆ8mŁ9´t8ÎÇ˝miN›źF^‡KßF˛¸Ă%ŤŞĹ z×Úáâ6šCkÇţrTčp\XËĆ]\ev ˘Wtép2čA:ś1×á^˙gëp:ś6:ś95§˝sh öÄ‘_UxépŽĐt8c~č:;µLďß´:śçÁč˝aNÍ)̡!üţ–8ökt¸ŻţЍµěH=H‡+ípyÍs|ÇsTčph6ćÔ”šCCŮá®ý›u8Ľˇ4!ă®ĂÝëpaI:śçÁč˝aN'Őo›C#×.ţ»s:śµ . Mȸëp.ńCI‡ÓኌW~‰÷«±2§fôâ"ôˇ­]|ď'¤źEăżÁZ†&dÜ:\ŕF;łu8N‡{{d<8î}Ó›šţo÷ˇýŕŽ^t8\šq×áR;\ô“§Ă…?/ţ(î[ăÓ;©÷Ňyź>ĄľĽ!ĽT7źE:śăô ÎëpŰ× §ĂépŻŠřkťÔ„wtÜ·€O©ďn˝¬Ă}úŇ#ô ug…á~˘Ă%n´cë/öhsRčp—wď‹#÷1¦ĂţőYßľĄľşBvręa¤Ă9@ŞţłyĚjŃáŢ˛ŠŤĄĂép‘—ŔíßćbĎ«9Ĺłé·¸Y=™6ýN‡N‡łZt¸­®ekůZĐá/ë?ĎĹţíAézFúBŐát¸KáĂýë_đÇ)ĘŠ‡—×áĽ+}-čpw/€čb7§ “ř›t8.ŕ×čp:čp:śŐ˛ ĂEÝŃ˝®Ăép:ś'±715súň5ŕf ~,Ĺ­bη5čp:ś§ĂÚč:śç;Ă čpćôč¤ćľš}¸YSźJO˙"N‡N‡łZt¸5®sůZĐáb.śébź îöoőAŕf Íp˙¨ë.ď’ňí :śłB‡«íp­;Ěׂr $ýL{ޤö̤ź§Ăy&µ‡8η5čp:śwč:{mČŠ·Ż.ăúť.ö±aźÓüł7kęŚëp: Ă9+t¸¦×˝É|-čp—@Řu±ĎŤBö¤<—}čp©ó­Ăép€ç¬Đáz:\ů.óµ ĂÝżâ~©‹=ď?2V1‘ZŁ'Ă q:śokĐát8N‡óÎÔát¸đK ď§şŘó~« —ň3u¸˘ĎSë[Q‡N‡Óát¸ŻŹ™}¦Ăépç/ŔßZ±˙Ô{óXł`u8§4·ľu8đ‘§Ăép:܇fŁép:ÜůK ňǶ_왿Vť ů©:ś çĹŕ[Q‡y:śgč>4;ípDëp×·gRu¸…gpőG—üóu8Đáś:Üw`Q‡łŐt8.á@JýąÍűŹI•áü\7kňß(ăC\Η›:ś§Ă%ýö·;ś­¦ĂépRěď-ľŘsŻ.ó‹˝d8®ë»ĺG‡N‡Óár~öKÎ^ÓáĚcĆ”ű{/öä¬JĄüdÎoâ|·čp Ăép:Üáźüx‡łŮG´—đ›u¸Ŕ÷ă*źČĄźĹ7« v˝ţóu8Đát8.ä?Úáě6N‡ 9$sŞ®ľ>‡ťOR1ĘOżţ3›żżů}[§Ăép—íSÎvÓát¸”I˛1§&µřŁŰuĂ·˘w>(+:śŐ0ć·ŞM§Ăépq—@Ńő×s±›SýÉ8¸Yß˙Ń}‹:˙[Ń3”Îj ó[ Ő¦{b­LN‡ÓáĚ©şŠu¸¨íůç»Ĺ·5čpÎ «eáßZ¨6]ŃźDť™5®éúÓáň~şü$ÄąYu¸=ż:ý[Ń3”Îj s‹_óµ Ă˝{ U]-{Ó¤ŠOaëX‡“án˙ěěoEŻ|PV«%`Ě­}ÎׂWÝá~blóŐâ Ăép:ÜÖe}ôgűnńm „łB‡ł ě:N‡Ë8$îřŹ×ž„87«§Ăůnńm „łÂ3۰ít8N‡Ű÷ÓÍ©§<-N†»ýËu8ßÖ Ă9+¬–Ĺcnáëpľt¸·¤¶ Đśęp:śápłęp:\ř‡‹og!ś:ś ĂůZĐávHu —÷ëu§´Ą¬Ăy qż=ňAY¬N‡Ólt8sşsëępAŻ.r˛«¶—˙ÝâŰTg…gqľt¸•Rß ¨Ăép˛“qłvw¸“żÜw‹ok!ś:śőoßép:ś§Ă™ÓĽç9đţčpž@BśçŰlgg…gýŰw:ś—w Ţ€:ś§9­.á7ŻčÄoEo|PVô«Ĺ}†ç ­ŮH6ćtďÎŐát¸S˘ĂyDčp:(+zé΢oŘxľt8nŰŻ7§&U†Ű?,:śżDžţýߊžř ¬ČVKŔ[óţ ękA‡Ólt8N‡s[ęp:ś§Ăů¶ÚYˇĂYývž§Ă4ÉĆśšÔşŕtb\t¸ó?ŘűĎw‹okĐáśV˲1·ä˝Ă|-čpšÍ+żŢśćý~˝)o=ëpׯ÷źçŰt8g…Ő˛kĚ­xď0_ :ÜűRç¨ĂépÍąI tłępŚ@Ú·˘>(+j€Ő˘ĂˇĂép:\ÖëpćT‡óRŐár~oű‚űVôÂeE °ZĆÜ‚÷őµ Ă˝ •^‚:ś9-®M†ĆÍúĚĎő‡Xη5čpÎ «E‡#ä¦Ăép‘¬Ăi«;~¶ç€×0ĺ–öĎ˝˙8ß-ľ­AŚpVčpVľ­§ĂépšŤgN7 € ¸¤u¸ÓżÖzÖá|[笰ZVŤąĺ®ĂůZĐáH­w §ĂépFG‡»üs­ç¤oE|PVÄ«E‡C‡łRu¸¸ůŐáLja‡sa.ž®I·¶>}·ř¶9ÂYˇĂY÷¶ž§ĂépÝÍF‡‹›SďŢJY5éÖ¶§Ă˛‚łB‡Ă3Ěׂ×}ép:ś籪Ăép1Ăŕ»Ĺ·5čpÎ «eĎ[ě:śŻN‡Óát8ÎŤąi|t¸ľµ­Ăép ¬čpčpľt8N‡‹™T.ď=<@:ś§ĂE}·řvAÂYˇĂYő:śŻnŐT| ępy#ptĘ\™:ś§Ăépľ­ÁĆvVčpV˝˝§Ăép:ś§ĂépŢ:\ę´[Ű'_€>×}["á¬Đá¬z{O‡Óát8nÓ%cRU¦¬U­Ăép^€ľ[|[ťí¬Đá,z{O‡Óá.ćkP[Őát8C¤ĂYŰ:śĘ V‡WŻN‡Óá‚főÚO÷Đát8N‡ ůnńí ’„łB‡łć˝Â|-čp:śW6©:\ŕ@‡»?﷧ò‚łB‡Ă+Ěׂ§ĂépćT‡ó^Őá~ŞŐ<2>Ö}[­í¬Đá¬y{O‡Óá4Îśęp]ďN‡ ZŰ:śĘŠ€‡GŻ®unu8®©Ăą4· “׸şu¸ŕďßΠI8+t8KŢ#Ěׂ§ĂépműőÖŻ7_:ś§Ăép:(+Z:a:ś§Ăép:ś§Ăép:śçbńm ˘„łB‡łäí=N‡Ólt8sŞĂŐ<t8.guëpÁß-ľťA”pVčpVĽGŻ®ňŰV‡3©:śç Ţ4ő·§Ă˛‚łB‡#yďůZĐát8®v»ęp>oťÁ:ś' çŰt8g…բáĂép:śdcNMŞůŇát8N‡Ëünńí Ş„łB‡łŕkwŻNh]ŘćT‡óyë ÖኳçËt8g…Ő˘ĂŮ:ś§ĂíťYN‡Óá\Ď:ś§Ăép>$ŔîvVčpĽ} Ăép:śĎ`ąB‡ó^Ů:ś§ĂE}·řvYÂYˇĂYđµŔׂ§čp:śçűÖ~]2÷V·çśegEO‡łĘ+׿ŻNĐáĚ©çűÖ~Őát8ηčpÎ Îz·îu8N‡ÓáĚ©gşŚ•§Ă- ęľ1ŔövVčpÖ»%ŻĂép7wDűˇ Včp¦ËXépV÷µŃđˇîClog…g˝[ě:ś§ĂYŘÂŽ§ĂŮŻ:ś7?ľ[|n€ýí¬Đá¬vë\‡Óát8 [ŘŃá _:ś‡ç‡“>aµěskÜÂőµ Ăép:ś9Őát¸ŤĄĂˇĂépŕpŇ(Ś{Úůl¨sľt8ÍF‡3§:ś§Ăy’yępV:čpž4Ćܰ»u8N‡ÓáĚ©ç= Ă%ĎľĎOÎź Ŕá„§ĂcÇśŻîÉÍR^čp:śgŃŇáĐát8p8aÜÓĎgěóµ Ăép:śIŐát8ÎŰĚ#P‡łÔA‡ó¤1ćÝĺ§Ăép:śdcNu8/N‡că|űL·ÔÁ÷¤1ćÝͧĂépšŤ…mNu¸Ć§Ă‘ÝáśRŕhR.Ś»g`s:ś§Ăép:ś§Ă9€ĽŃt8§”ĄŇ„gĚ şkO‡Óá4 Űśępľpu8Î čpÎ ăî>sçép:ś§Ăép&µ+,yµşY=Ôt8Đt8cnDsľt¸w·ŹD‡3©:ś”‡§ĂŁ ănĚŤ§cÎׂ'Ůčp&U‡săëpk^:śĄ¶¸Ť17ć.;N‡Óá|ëp™“ęE Ăépčp:8š4!ănĚ ĄcN‡Óá$Τęp^PÖŞ›甲ÖÁ÷˘1ćĆÜ=§Ăép:ś…mNu8_¸:śÇô„;Ą¬u°Ç˝hŚą!wËép:śfca›S®ňI Ăépčp)đę¬0î‘î8N‡Óát8Τz…yB9€ĽŰt8Đś­‘†Đ1çkA‡Ólt8N‡s˙ëpnžN)kt8Îr7ś§Ăép’Ť9Őá< t8Î!N&Mȸ{Dşßs:ś'Ůčp&U‡ó„ry»épN)kÄ g«1/rç—§ĂůA¶§Ăép!¦ĂˇĂ9¤Ŕɤ wÎŕ9ćt8N‡Óát8ÎłŐZő|ÓáRÖ:Řä4ĆĽyČ^:śçYŘ:śçW‡ÓáĐá|¬€Tg…q_8ćFÎ1çkA¶Ňát8N‡‹yčp::śC | :+Ś»ç^Óát8N‡ÓáLŞ/\ĎV7ś§Ăz§Ă6ÇśŻŮJ‡ÓáLŞç- ĂyÄy:Ą¬uĐážż:ś‡§ĂsI2îž\.®'R‡Óát8g˛¤Ăy†ép::śÎ%Mȸ{rą·ć‡P‡Óát8g˛¤Ăy†ép::śÎ%Mȸ{rŐß[÷ŻĄ«Ăép:śIŐát8N‡ó˝ëĺc­§Ăsă˝űÚĘřÁ–îíUŞĂ9“ý Î3ěÝ—‚µŞMřŢuĄXë`źëpĆ\‡“?t8N‡ł°íTN‡óG9Î čpÎ ăî>;~kEýbKW‡Óát8“ŞĂép:śç{×µÖA‡ÓጹńŢxiĄýdKW‡Óát8“ŞĂép:śç{×µÖA‡Óጹń^wiţdKW‡Óát8“ŞĂe˝Ăt8Î1:śłÂ¸»Ďî¬Čßléęp:śgRu8N‡Óá|ďZ˘Ö:čp:ś17Ţ»î¬Ěßléęp:śgRu8N‡Óá|ďZ˘Ö:čp:ś17Ţ‹®¬Řméęp:śgRu¸¨wXähépčp:8—4!ăîÉUte˙hKW‡Óát8“ŞĂép:ÜŽÉ÷ů©Ăépŕ\B‡óyŕĘúýŁ-ÝŰ U‡s&űAcŕý«Ăépčp:8—4!ăîÉUqe…˙hKW‡Óát8“ŞĂép:śç{×µÔA‡Óጹń–áć´Ą«Ăép:śIŐát8®¤Ăůľ°Du8ĐáśĆÝ}¶ůĆ*řŃ–®§Ăép&U‡‹zEŽ•gqŰw:čpÎVăî>“át8KW‡“lt8“ŞĂépÖŞç»Ĺń¤Ă}®Ăó¸ń.=t8N‡s&űAĆŔ¸}¬t8«ŰĆÓá@‡s¶w÷Yř}Uňł-]ÇĄ§Ă™TN‡Óát8,Qt8–ĆÜxËp:ś§Ă9“ý c Ă+Îę¶ńt8Đáś­ĆÝ}}]ŐünK×q©Ăép&U‡Kz‰ép:śĎ Ç©ńÎYaÜÝgÇ®«˘ßmé:.u8Τ/`®cę-nO‡Î}&Ăép–®ăR‡ÓáLŞç˝ Ăép¸Rt8°Ď}Xs.|Dt¸{kW‡“lt8“ŞĂÉpö«ç»Ĺępŕ öaiĚu¸{˘Ăť[»ˇ×”óH‡3©:śç‚ýŞĂáJŃáŔ>×áŚyÇxËp:ś§Ă9“ý Τép:ś Ç©ńÎŮjÜÝgI °í‡ëp:ś§Ă™T.ç)¦Ăép>4§Ć t8g…qwź);:ś§ĂI6ľëMꝏ6Ź'űU‡ĂŐá@‡ÓáŚyńx÷®>N‡ÓáśÉ~1Đá¶~ŰZ«:®ěsÎëpIˇĂť[»©×”óH‡3©:ś÷Büü§a }bX˘:čpÎ ăî>3:śçP˛ŃáLje`Ňáě×ű\):Řç:ś1oN‡Óát8‘¤ĂyŚép:ś Ç©ńÎŮjÜÝg†âň×át8N‡3©:śç îépľ4,Qt8g…qwź N‡ó (Ůčp&µł0]ţ´µV=}pĄčp`źëpĆ\‡  îŢÚő (Ůčp&U‡ÓáěWÎw‹ŮÓáŔ)­ĂsN‡Óát8»Đ™ě’Ńá‚_cąc¤ĂůҰůt8Đáś­ĆÝ}&xŚęp:śdŁĂ™T®öËÖZőöÁ•˘Ă}®ĂsN‡ëépşŹJΙěép^c:śçSĂqjĽ@‡s¶w÷ŮÉ‘(ýá:śŹ@N‡3©7ĆŔ3X‡Óá|j8NŤčpÎVăî>Óát8N‡“lt8“ŞĂőÁÖŞ‡+E‡ű\‡3ć:\Ň0čp:śçLöŚg„t8ß¶ź:śłŐ¸»ĎŇB‡Óá.ľŞt8g˛¤ĂyŹépY“nműnŃá@‡C‡sź Dí/×át8N‡3©GĆŔ;X‡Óá|k8NŤčpÎVăî>SŁHN‡“lt8“ŞĂÉpÖŞç»ĹÜép`źëpĆ\‡Óát¸ŕG•çLöt8ď1N‡ó±á85^ Ă9[Ť»űĚ{L‡ë›8N˛ŃáLjP‡»ö ÓáRćÜÚöݢÇç>ó‹]:ś§Ăép&U‡KxeŹçcĂÔá@‡s¶w÷™ç§Ăép’ŤgRźáŢŃŃá|mŘ€:čpÎVăî>óÓát¸·źT:ś3ŮŇáĽČ^kŐËWŠöągĚu¸¨!ĐáÎMť'Ůčp&U‡k9­Őă?Ö‡†%ŞĂç¬0îî3.&{tžá×”óH‡3© ĆŔS¸vlşfÜÚöݢÇç>Óát8N‡“lt8“ŞĂy¨ľ32e3nműnŃá@‡C‡sźy‹ép+Ď ΂t&űA:ś'™—5ă·ďt8t8÷™gúu8N˛ŃáLj[‡»ó&Óát8ߎSă:śłŐ¸»Ďt8®gîŇŻ)ç‘gR7Ś·pëŔ”M¸Ĺí»E‡Î}¦Ă…î8N‡Óát8“zh <†u¸Šů¶¶}·čp ĂˇĂąĎ‚ǡzÇ9/nż§t8g˛Ô5Ă­yŇĄę‹Ă&Ôá@‡s¶w÷™§Ămx[čp:ś3Ů*ŻáŇQŃá|qŘ…:čpÎVăî>Óát8îíç”çLöÚĆŔkX‡Óá|q8NŤčpÎVăî>;= ŐN‡Óát8Τęp·_e źuÓmqűnŃá@‡Ă¸»Ďt8N‡[÷šŇáśÉ~ç]¦Ăép>9§Ć t8g«qwźép7ö[ŔŰB‡ÓáśÉ~PÓxW¦IÎG‡}¨Ăçl5îî3N‡ÓáŢ~Lů$r&űA:ś‡BĂ€ô͵µí»E‡ÎŮjÜÝg:śí¶ňqˇĂépÎd?¨j <äçŁĂ]‡ÎŮjÜÝg:śí¦Ă˝ý–ŇáśÉ~WţP(ů@Đá|vx°ëp Ă9[Ť»űL‡K¸™ýN‡ÓáLŞgu¸uSmqűnŃá@‡s¶w÷™x1ű ·źR>śÉ~×=‹-َĂůěđ`×á@‡s¶w÷™§aép:śdŁĂ™ÔÇÇŔ“X‡Óá|w8NŤčpÎVăî>ÓáNŢË:Üí—”çLöt¸îil Îw‡»:śłŐ¸»Ďt¸„kYLĽýŇáśÉ~W=Ť5cŃ8ŃÎ(ß-:čpÎVăî>Óát8N‡“lt8“úöx÷Ť„çËĂ]‡ÎŮjÜÝg:\Ä­¬&ęp:śgRu¸Ł©Ăyůôpś/Đáś­ĆÝ}¦Ăép=˙q=×”óH‡3©‹ĆŔł¸n*g٧‡ďt8g«qwź…CőĄ¬Ăép:śgRu¸“3Ů4 :śoŹŹGŃŐá@‡sVw÷™·éNÎř%µŻ(ΙěuŽwńk'°µ9ĂŃ_–¨:śłÂ¸»Ďt8Îw‘'Ůčp&U‚#íW!n~-Qt8g…qwźépůźÇuŐ5ĺ<ŇáLŞ×ýż/®ĂépG?%,Qt8g…qwźépůź:ś'Ůčp&ur ĽŚËF tżúüřĆŕY˘:čpÎ ăî>Ű7 ÍrĘŻŃát8g˛KF‡+šÍ¶Đá||ű~˝çEüń¸Y˘:čpÎ ăî>Óát¸€Il»¦śG:śI]6ÍŻăÂßŢş_}ú}aĐ,Qt8g…qwź q›năś_Tů~ŇáśÉ~Wř<Öát8ß ?d–¨:śłÂ¸»Ďt¸M—±wúů¤Ă9“ý ®ď}ÜřĂk÷«Źżß—%ŞĂç¬0îî3ź˙›îâ ĄĂŮÎd—LŐ´>+·çŔúx°,Qt8g…qwźůüßtGýŞľ×“ŤčLöt8AĘě’÷«Ďż_Ź”%ŞĂç¬0îî3ă°é&ÖáN?žt8g‘Ô<ŤOäÖď‚âýęűď·Ăd‰ęp Ă9+Ś»űĚ8lşu¸Óo'ÎYäépUoäÚĎΗČÇd‰ęp Ă9+Ś»űĚ8lş‡ł~XÝËI‡sůA:\Ó#ą÷« yżúüĺY˘–5čpÎ ăî>[şöJŻá°źÖöpŇáśÉ~Pő´=“‹ż t8߀ŹŹ%jYç¬0îî3nÓ-śöŰĘŢM:ś3ŮŇázŢÉÍ_ŐűŐGŕďFǵŞA‡sVw÷™·éŽűq]Ď&ΙěuŹAŐCąúŁ@‡óřńĐX˘V5čpÎ ăî>[»ř*ďŕĽ_WőjŇáśÉ~PůôĽ”Ë? ş÷«ďŔ_Ť‹%jQç¬0îîł˝‹Żń ü}MŹ&Ιěép‡Pű7çCđăQ±D-jĐáśĆÝ}fńmş€aŃ“I‡s&űAícĐq ů&(߯>3 –¨5 :śłÂ¸»Ď6_T}÷oäOěy1épÎd?H‡+8‡|čpľ?KÔšÎYaÜÝgBܦë7ó7Ö<—t8g˛T?ů‘Oűő§xę?–¨% :śłÂ¸»ĎvßTm—oěĎěx-épÎd?H‡óť†E¬Ăů üx ,QKt8g…qwź-ż©ĘîŢÜßYńVŇáśÉ~1H>Ť|ŘŻBÜŻÁµ˘A‡sVw÷Ůö›ŞëćMţĄ/%ΙěÜ˙ŮökÜ_öŢKÔŠÎYaÜÝgűŻŞ¦‹7ú·ćż“t8g˛d R˙Łľě×EëáňŹ·D-hĐáśĆÝ}vŕŞ*şvĂéŻ$ΙěČ˙ć¨ĎűuŰ’¸űË-Q t8g…qwź]¸ŞznÝôGFř#I‡s&űAĆ ±Zů°_…¸ŻýnKÔzÎYaÜÝg7®Ş–;·ŕ‘‘üBŇáśÉ~1Xw`ů5ÖŞżímúÍ–¨ĺ :śłÂ¸»ĎŽ\U%7nĹ+#÷y¤Ă9“ý c°ńĚňK¬ŐĐU~ń[˘–3čpÎ ăî>;sWUÜ·-ŻŚĐ·‘çLöŚÁÖs«ôGX«ń‹üÜŹµD-gĐáśĆÝ}vꮊżl›^Ď"ΙěŐ§—żUY«‰«üÖŻ´D-fđă¬0îîłcwUřM[řĚHzépÎd?Čśľjś±öëŐe~çZ˘Ö2řŔqVw÷Ů˝Ë*ůšőĚpMép:śIMbôâµ_W®ňżÍµ–Áíë¬0îîł›—Uěë™ášŇát8“š0ND.˙QąJ@: épž\.«/ –Î;C‡“lt8“ŞĂ9a­ŐŠeľů×X˘V2¸~ťĆÝ}vţ¶ĘşX˝3\S:śgR#ĆŔ‘Ľtí׫|台D­dp˙:+Ś»űĚmUuĐaN˛ŃáLŞ«Ňůj­ZäŃKٵ’Á>×áŚyÜx;t8t8g˛d ¸:\÷ŁĐĘÔá|çSK2îî3וÎĚép’ŤdcRu8Ç«µj•ëp–¨u öągĚu8^^†X‡“lt8“ęŞtşZ«Vąç;Ń:=H‡3ć::śŮÓá$“j§˛|ŮÚŻVą§ĂSK2îî3÷•ÎÔép’ŤgRWŤc1tŐÚŻVą§ĂSK2îî3÷•ÎÜép’ŤgRwŤsQ‡ËZˇ:śďsi=6?žgčpÎd?Č8tu8ŹB‹\‡óťN-Mȸ»ĎÜZĚOŔ¨ĽCt8ÉF‡3©oŤgĽ˙(´^u8ßyŕÔŇ„Ś»űĚ­ĄĂ™ą˙YN˛ŃáLękcŕµZŤ€E®ĂépŕÔŇ„Ś»ű̵őÜô$,€ĆD‡“lt8“úŢxČ'-VC`‘ëp:8µ4!ăî>sm=7;:ÜÍ©Óá$Τľ8^ňÖjü#ÜŞŐá|çSK2îî3÷–gćţ<đ˙O¬Ă9“ý cŕŘíy‹\‡ÓáŔ©Ą w÷™‹ëąÉQrnÎś'Ůčp&őŐ1đ–Źy ‹\‡ÓáŔ©Ą w÷™‹ëą©QrnNť'Ůčp&őÝ1đOy ‹\‡ÓáŔ©Ą w÷™›+ŁĂ qs#ŞĂI6:śI}{ <ç3ŢBÂ×át8pjiBĆÝ}ćęŇáLÜ‹ó¦Ă9“ý cŕä­y  k\‡ÓáŔ©Ą w÷™»ëą™IY:ś'Ůčp&ŐŤéĹo­Zä:śčA:ś'—±Ů|ŬN‡“lt8“ęĘôâ·V-rN‡ô ΓËŕ,>rV@×Ěép’ŤgRŚ}Ŕ3ČhXä:śN-Mȸ»ĎÜ^ĎM‹wsćt8ÉF‡3©ĆŔ“ţţ+ČpXä:śN-Mȸ»Ď\_:ś‰űçŃÔá$Τ®oúóŹ ăa‘ëp:8µ4!ăî>s=7+I+@?Őá$Τş2˝ő­U‹\‡Óá=H‡óä2@[ꍠźęp’ŤgRťĽžúÖŞE®Ăép€¤ĂyrˇĄgʧźępÎd?Č8|{_@†Ä×át8pjiBĆÝ}ć{nJ˛V€yÓá$Τş5=ô­UK\‡Óá=H‡óä2D;Ož°`Ţt8ÉF‡3©nMĎ|kŐ×át8@Ňá<ąŚŃĘ'm´Ü:śdŁĂ™ÔUcŕmöőcX¬qN‡§–&dÜÝg.±žcât8N‡3©-cŕuôńc\,qN‡§–&dÜÝgn±ç¦C‡3o:ś3Ů2ŽßŢ·Ź±Äu8śZšqwźąĆž› ÎĽépÎd?Č8{_>†Ć×át8pjiBĆÝ}ć{n2W€yÓá$Τ:~=đ­Uk\‡Óá=H‡óä2PűÎśŔĐ0o:śdŁĂ™ÔŤcŕ}ď­ţ÷«ĂYŁŕÔrVw÷™›ěwS‘¸L›'Ůčp&Őůëuo­Ză:śčA:ś'—±ÚvâD.Ó¦ĂI6:śIuţzÜ[«Ö¸§ĂzçÉe°–8™K ţšĐá$î?ěÝr۸EQďÓřU©™?“‰mÉhö;g1Ů€HčVśXÔ®3p´wÎ~÷MV‡ł?ÁSËłÂܽϼÍ^_†ˇ[Ŕ˛ép’ŤgQ=€ť0íU›\‡Óá=H‡sä2®VO›©[`ř;B‡“lt8‹ÚxÎőN9ÓáľÍępö&xjyV»÷™÷YĂ cŮŞć¦ĂI6:śEí<Çz‡śń‡pßgu8;<µ<+ĚÝűĚ­]бjUcÓá$΢öžC˝#ÎřC¸ďł¶¨} ž[žćî}ć•öóĽ&żt8ÉF‡ł¨fŕHoŻÚă[ßµ-Áç\‡3óĚy :wÜ_Řr…gQŰżhťčp¦Â}™µEíJđčň¬0wď3/µVADzUŤL‡“lt8‹Ú˙Eë@ď|3ţ-jO‚‡—g…ą{źy­5 :V­j`:śdŁĂYÔ;ĽhçťnĆÂ}‘µEíHđřň¬0wď3ďµ6AÇŞUÍK‡“lt8‹zŹ­ĂĽ÷5ÖµÁĚłÂܽϼٚܓE«š–'Ůčpő./ZGyë3ýîK¬-j;‚Gg…ą{źeżÚúÜ“U»ăŞépžÉnČ |-Ě9ßš=Ţ|mQ›|Îu83ź÷ĽçKŔXVM‡“lt8‹ę9ětcŻÚâ7\C[ÔVźsÎĚăç=íé±–UÓáSX¦ďq»pĆr^š(6d€ö™Âô™żËíyŔˉiú‘Řxšg 3gţ.·éÇ+‡¦„ă°á4O&Îü]nÓXŽLăOĆ ĐĽR4ŰÜŽś°š¦źÍ u¦0]¶ą-8`94M? @ëLa˘ls;pŔrjš~"63€ľĄÂüŘć6<ŔOXt·±´{4{B“´Ńív`Śő€ ŔÖŹ™Ž”8; ‹÷úĹq> endobj 395 0 obj << /D [390 0 R /XYZ 90 739.935 null] >> endobj 393 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /XObject << /Im1 391 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 402 0 obj << /Length 19 /Filter /FlateDecode >> stream xÚ3PHW0Ppç2ŔAc(á endstream endobj 401 0 obj << /Type /Page /Contents 402 0 R /Resources 400 0 R /MediaBox [0 0 595.276 841.89] /Parent 398 0 R >> endobj 400 0 obj << /ProcSet [ /PDF ] >> endobj 430 0 obj << /Length 817 /Filter /FlateDecode >> stream xÚíYËnŁ0Ý÷+X’?±˝lÚi•QG5™U5 NŠ ĂCj˙~0$´"ŹÍ4¬°™‹Î9÷\ßh-,hÝ_AóĎ®ľÝala ¸ŕČšÍ- -—RŕBlÍëŮľIâ\Ĺy6ú3űˇĎA Yéúđzńt_—@şŘ]ź†–ă ©[F#AíIś§#$ě$(üMVrT˛=ŕ&YŻMŞ·*óÓpŐ5‰g‡b2˘ź ȉ‰›ÄĽń–Ë0^TdLŐßBĹ~ÇE]N ÎN1Ś‹ů3{^Űăô=ËUÔ͆ˇhĆ=Ĺ%imw•KîÔ/ݤZ&Eľ*ňvx‚@6ďg•uŘmqĆ(_r/Ś› ő_˝8VËjy«UóKĎ“4ňö©«ob˙+Íűĺ¦ٸť†oŃ@–żŞŹ-× íO’}­:Äd âý U#Äě7/Z-UçňG»Ď: pŚD›¨Śë×Ns•ޤS5(ĘĹADĂ•_ÚKÉA‘¦I•Ţ@ť‡‹ňł@N ä×O“±)ŤIĐXM¤‹uµÂß:$!/í*$Ľ » #5Wˇ›$ŠĽ8ptŰ >ě5Ę»ĚFčKPpÓ-–äEm ¦š@Óa¨sdöáő0Sz49Méů©ĺŕĺI=Dř”-W¸—”|ý†]lë’ňXŽFĽeh¦ŘéőB¸Źż±Úß–^–UpOâ@˝µÇa@›Ůußy‘B‡"»DłĆá¶‚>„Y§çŕwŠÇ‘3Ě\#»p©z띢·ŃÇ&ć>y0!†ż7Πv†ą:ďÚČmâ—Ž˝w8C ŕ®ŤNńŤ‹LóTyŃ$ž›i†Ţľ™f<©ąî÷LwĹ_™ţ˝L·ŰíÝç÷ŮŐ?)bÉÝ endstream endobj 429 0 obj << /Type /Page /Contents 430 0 R /Resources 428 0 R /MediaBox [0 0 595.276 841.89] /Parent 398 0 R /Annots [ 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R ] >> endobj 403 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 574.541 160.007 583.517] /A << /S /GoTo /D (chapter.1) >> >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 554.577 153.203 565.481] /A << /S /GoTo /D (section.1.1) >> >> endobj 405 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 538.709 191.1 547.555] /A << /S /GoTo /D (section.1.2) >> >> endobj 406 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 507.691 167.648 518.57] /A << /S /GoTo /D (chapter.2) >> >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 489.631 193.88 500.535] /A << /S /GoTo /D (section.2.1) >> >> endobj 408 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 471.705 198.861 482.609] /A << /S /GoTo /D (section.2.2) >> >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 453.779 186.438 464.683] /A << /S /GoTo /D (section.2.3) >> >> endobj 410 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 424.819 198.373 435.698] /A << /S /GoTo /D (chapter.3) >> >> endobj 411 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 406.759 289.072 417.662] /A << /S /GoTo /D (section.3.1) >> >> endobj 412 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 388.833 263.897 399.737] /A << /S /GoTo /D (section.3.2) >> >> endobj 413 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 370.907 239.389 381.811] /A << /S /GoTo /D (section.3.3) >> >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 355.038 186.189 363.885] /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 337.112 212.759 345.959] /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 317.129 253.994 328.033] /A << /S /GoTo /D (subsection.3.3.3) >> >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 288.169 197.536 299.048] /A << /S /GoTo /D (chapter.4) >> >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 270.108 172.949 281.012] /A << /S /GoTo /D (section.4.1) >> >> endobj 419 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 252.183 251.035 263.087] /A << /S /GoTo /D (subsection.4.1.1) >> >> endobj 420 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 234.257 242.188 245.161] /A << /S /GoTo /D (subsection.4.1.2) >> >> endobj 421 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 207.199 155.484 216.176] /A << /S /GoTo /D (chapter.5) >> >> endobj 422 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 189.293 168.435 198.14] /A << /S /GoTo /D (section.5.1) >> >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 160.179 148.839 169.155] /A << /S /GoTo /D (chapter.6) >> >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 142.273 162.348 151.119] /A << /S /GoTo /D (section.6.1) >> >> endobj 425 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 113.158 196.43 122.134] /A << /S /GoTo /D (chapter.7) >> >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 95.252 249.481 104.099] /A << /S /GoTo /D (section.7.1) >> >> endobj 431 0 obj << /D [429 0 R /XYZ 90 604.454 null] >> endobj 428 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 470 0 obj << /Length 983 /Filter /FlateDecode >> stream xÚíÚMsÚ8ŕ;żBG|°W_ÖÇ‘ič°Đ‚ł—l‡qŚB=†‚;»íŻŻ° Ä‘!Á›ÎŽÁ''cńđęő+ÉĚ7^ăŹ[Śt$Ă xO@BŔr\Ś€7Í0´ľxaÂA’é“’ÖöpŕuŢxűZŁë5ľ5~ ”śďr‡‹Ćæşý#€‘ü“Ľk(&ú8ăĆçĚú’žżže4ÚőŽ<ëÂÜ®ë6ŽÓÎp9Ȳ†°ŮQ±ÎŐÔ˛±»ýo¬ĂU.٤§»K›IÖt,ŰŐçTď@Ą|Ű;_|i„l"žk6ŮőŃFú'”ňŕ‹3ß?ŐâQ­3]?öłż–Á÷…ŠbżHZ@QuÍBFń#AŽ”I°ÍćűÁŘ_¬ćjäÇęĺE¤p« E˛ĺ‹b1‰Ćŕć“Zß®ý…ˇČ%ŞÁ°Cv`ËŘH„\T>ÎţŰ Ggš9?†qŃvş:äwÔu3Ýŕ«EjŢ^FCg†2ăµäiI–IŞŐ1D*HťJČňť¬…Üćżq« áJR§ŘňŔ"śÜ˙ĂhV”n1gu8Â(3F=ř‰?ŰuCu9PYä }hŮB#?mKÓqřÓPAY]ś¶Ą˘Ń÷ĹŤ?mÚlîŁ063|‘&YŽ ?g»ů+sÄr=ÁWR‘ěŰi j(ĘkÂ%é^±żÜÄ'ư n=x5»ó,›ËŘźźPs%®Ő´3Ő Auâ{Í’§–«,íő˘i’ËšđˇČ&1ůcĄ*>z˙J™Q®—ŰĄ‹ąąč+d=k)YËćÄŢ˝¶ůŠF9můbŐfŇáD ‡˛”w»tőnCłŻośäRŇÄ(k/¸`nk”:’Ňüď)’­&î”LU°śŞőd>ZTÍŻiť©'µVQ`ÎR±¸š1łç>:f0v$2ˇë-č3Ý3“x¶ÝQ۬˝e1&jÚ7lK‹Ü¶t«µÍíN·=i÷Gw˝±gşâËJîî™Ë{"· ýl8hw[}#şüÚ¤rˇEL©ŰţýřÎ(,ľČ⡜5Őzod Uň>ň›ív{Ĺ˝ńD» ;ÝIw4Ú2G• şßLĹT˝AĎ;Ĺ‘¸ä@cĄôřAoxď}ş÷&YşˇŮę÷:UťÜż™}¤Ú Y1·[™Ş§·Ď-C >÷qî_6qś endstream endobj 469 0 obj << /Type /Page /Contents 470 0 R /Resources 468 0 R /MediaBox [0 0 595.276 841.89] /Parent 398 0 R /Annots [ 427 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R ] >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 726.819 243.463 737.723] /A << /S /GoTo /D (subsection.7.1.1) >> >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 711.077 279.707 719.924] /A << /S /GoTo /D (subsection.7.1.2) >> >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 691.221 263 702.125] /A << /S /GoTo /D (subsubsection.7.1.2.1) >> >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 673.422 287.349 684.326] /A << /S /GoTo /D (subsubsection.7.1.2.2) >> >> endobj 435 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 657.68 213.756 666.527] /A << /S /GoTo /D (subsubsection.7.1.2.3) >> >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 639.881 230.363 648.728] /A << /S /GoTo /D (subsubsection.7.1.2.4) >> >> endobj 437 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 620.025 259.693 630.929] /A << /S /GoTo /D (subsubsection.7.1.2.5) >> >> endobj 438 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 602.226 238.114 613.13] /A << /S /GoTo /D (subsubsection.7.1.2.6) >> >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 586.485 228.55 595.331] /A << /S /GoTo /D (subsubsection.7.1.2.7) >> >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 566.628 270.064 577.532] /A << /S /GoTo /D (subsubsection.7.1.2.8) >> >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 548.829 220.401 559.733] /A << /S /GoTo /D (subsubsection.7.1.2.9) >> >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 533.088 241.97 541.934] /A << /S /GoTo /D (subsubsection.7.1.2.10) >> >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 515.169 285.147 524.136] /A << /S /GoTo /D (subsubsection.7.1.2.11) >> >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 495.433 258.039 506.337] /A << /S /GoTo /D (subsubsection.7.1.2.12) >> >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 479.571 256.376 488.538] /A << /S /GoTo /D (subsubsection.7.1.2.13) >> >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 461.772 286.811 470.739] /A << /S /GoTo /D (subsubsection.7.1.2.14) >> >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 443.973 289.331 452.94] /A << /S /GoTo /D (subsubsection.7.1.2.15) >> >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 424.237 262.224 435.141] /A << /S /GoTo /D (subsubsection.7.1.2.16) >> >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 406.438 268.54 417.342] /A << /S /GoTo /D (subsubsection.7.1.2.17) >> >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 388.639 259.444 399.543] /A << /S /GoTo /D (subsubsection.7.1.2.18) >> >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 370.84 227.594 381.744] /A << /S /GoTo /D (subsubsection.7.1.2.19) >> >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 353.041 248.067 363.945] /A << /S /GoTo /D (subsubsection.7.1.2.20) >> >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 326.619 189.785 335.595] /A << /S /GoTo /D (chapter.8) >> >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 307.759 257.092 317.686] /A << /S /GoTo /D (section.8.1) >> >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 288.983 243.463 299.887] /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 273.242 251.215 282.088] /A << /S /GoTo /D (subsection.8.1.2) >> >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 254.362 288.635 264.289] /A << /S /GoTo /D (subsubsection.8.1.2.1) >> >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 236.563 294.164 246.49] /A << /S /GoTo /D (subsubsection.8.1.2.2) >> >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 218.764 278.672 228.691] /A << /S /GoTo /D (subsubsection.8.1.2.3) >> >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 200.965 270.363 210.893] /A << /S /GoTo /D (subsubsection.8.1.2.4) >> >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 183.166 293.616 193.094] /A << /S /GoTo /D (subsubsection.8.1.2.5) >> >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 165.367 273.133 175.295] /A << /S /GoTo /D (subsubsection.8.1.2.6) >> >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 147.568 289.332 157.496] /A << /S /GoTo /D (subsubsection.8.1.2.7) >> >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 128.793 257.053 139.697] /A << /S /GoTo /D (subsection.8.1.3) >> >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 111.97 315.185 121.898] /A << /S /GoTo /D (subsubsection.8.1.3.1) >> >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 93.195 298.288 104.099] /A << /S /GoTo /D (subsection.8.1.4) >> >> endobj 468 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 509 0 obj << /Length 1015 /Filter /FlateDecode >> stream xÚíšßoš@Ŕßý+îQd÷»G«˛ą´şˇ]–u aôlHťĹ,Ű_żCEŁVY·%}¸z­půäs÷ý<Ţ6®ĆŤ76Ć€ëÜÄ&O‡Ŕ2‘N1ă{p×ě ăŢ`<ŇľŤßşÉ‘üęúoAÄӍ޸ńŁĎB€Ö –n üYăî÷rţ=€:á ü\˙× Čq FŤŹ ¸]Ěćűˇ템dy$µPńZí ߸ŽĹ}Ód‡Ö8Ą}’Ň{ĄÉkÝÚî¨˙Ą§´ r&TË,rs×U±ű×=w ÚlßôÜ›öçüMpµÚ—Ç–q.é˛ô•ĂÇn‰Šíç0ią \űúvôε)ŕHM6kíäOŇm ÝxĂ&űU-ÍZ´ĽhI'fx;>&޵g_^ë‰@Kęç?/—Ŕ¤Ě$»&.~”TÂ3«oţ§ľ)ĚĆVßOBHă÷}zL.nQ|9Ó’Iřţí/ôŻV Ó¦,Ř•¸„­Kő––Yű$Ő¸> endobj 467 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 727.795 312.037 737.723] /A << /S /GoTo /D (subsubsection.8.1.4.1) >> >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 709.692 281.631 719.619] /A << /S /GoTo /D (subsubsection.8.1.4.2) >> >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 692.669 260.081 701.516] /A << /S /GoTo /D (subsection.8.1.5) >> >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 673.485 303.369 683.412] /A << /S /GoTo /D (subsubsection.8.1.5.1) >> >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 655.381 302.821 665.309] /A << /S /GoTo /D (subsubsection.8.1.5.2) >> >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 637.277 276.271 647.205] /A << /S /GoTo /D (subsubsection.8.1.5.3) >> >> endobj 476 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 618.198 298.816 629.102] /A << /S /GoTo /D (subsubsection.8.1.5.4) >> >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 601.07 309.456 610.998] /A << /S /GoTo /D (subsubsection.8.1.5.5) >> >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 582.967 267.424 592.894] /A << /S /GoTo /D (subsubsection.8.1.5.6) >> >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 563.887 308.36 574.791] /A << /S /GoTo /D (subsubsection.8.1.5.7) >> >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 546.76 298.398 556.687] /A << /S /GoTo /D (subsubsection.8.1.5.8) >> >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 528.656 312.783 538.584] /A << /S /GoTo /D (subsubsection.8.1.5.9) >> >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 509.576 275.155 520.48] /A << /S /GoTo /D (subsubsection.8.1.5.10) >> >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 492.449 291.613 502.377] /A << /S /GoTo /D (subsubsection.8.1.5.11) >> >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 473.369 226.517 484.273] /A << /S /GoTo /D (section.8.2) >> >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 455.266 243.463 466.17] /A << /S /GoTo /D (subsection.8.2.1) >> >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 439.22 251.215 448.066] /A << /S /GoTo /D (subsection.8.2.2) >> >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 420.035 272.884 429.963] /A << /S /GoTo /D (subsubsection.8.2.2.1) >> >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 401.931 284.799 411.859] /A << /S /GoTo /D (subsubsection.8.2.2.2) >> >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 383.828 262.363 393.756] /A << /S /GoTo /D (subsubsection.8.2.2.3) >> >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 365.724 290.149 375.652] /A << /S /GoTo /D (subsubsection.8.2.2.4) >> >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 347.621 270.961 357.548] /A << /S /GoTo /D (subsubsection.8.2.2.5) >> >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 329.517 272.326 339.445] /A << /S /GoTo /D (subsubsection.8.2.2.6) >> >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 312.495 260.081 321.341] /A << /S /GoTo /D (subsection.8.2.3) >> >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 294.391 221.507 303.238] /A << /S /GoTo /D (subsubsection.8.2.3.1) >> >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 276.288 257.849 285.134] /A << /S /GoTo /D (subsection.8.2.4) >> >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 258.184 241.163 267.031] /A << /S /GoTo /D (subsubsection.8.2.4.1) >> >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 240.081 252.49 248.927] /A << /S /GoTo /D (subsubsection.8.2.4.2) >> >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 221.977 219.285 230.824] /A << /S /GoTo /D (subsubsection.8.2.4.3) >> >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 202.792 244.191 212.72] /A << /S /GoTo /D (subsubsection.8.2.4.4) >> >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 185.77 236.44 194.617] /A << /S /GoTo /D (subsubsection.8.2.4.5) >> >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 165.609 243.643 176.513] /A << /S /GoTo /D (subsubsection.8.2.4.6) >> >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 149.563 235.086 158.41] /A << /S /GoTo /D (subsubsection.8.2.4.7) >> >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 130.378 259.992 140.306] /A << /S /GoTo /D (subsubsection.8.2.4.8) >> >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 111.299 259.145 122.202] /A << /S /GoTo /D (subsubsection.8.2.4.9) >> >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 93.195 264.126 104.099] /A << /S /GoTo /D (subsubsection.8.2.4.10) >> >> endobj 507 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 512 0 obj << /Length 219 /Filter /FlateDecode >> stream xÚÝ‘;OA…űů·ś)öz;Ż Ś2݆‚€·€ůűŽ ›(V¶V'9gîÉ79{ x0“bîć"1 P^!ÄŔ腡젳Çd?Üş,@CBΡÉôqYf˲úĘ̬ŁáđĐá#Fő°íM·&ŘU„šś‡W=´˘Uß`ež ]y.÷§ýµčy$Ôo„ěs­NĄzQ.0 [dvMňd‹SoýËýć}3ŕŤýĐ5YE×x˘˙"mο̛OłÔ5ü°G˝ť.)*É_—űxv endstream endobj 511 0 obj << /Type /Page /Contents 512 0 R /Resources 510 0 R /MediaBox [0 0 595.276 841.89] /Parent 398 0 R /Annots [ 506 0 R ] >> endobj 506 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 728.876 241.073 737.723] /A << /S /GoTo /D (subsubsection.8.2.4.11) >> >> endobj 510 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 515 0 obj << /Length 1491 /Filter /FlateDecode >> stream xÚŤWMsŰ8 ˝çWxz’g*E˘ľŹ‰ă¦ŮMg;µgöĐě–h›™r%*©űë ”lĄęîžH‚ €O?ŰÍüŮý•oÇŰőŐőĆfĚ÷’„Ĺłőv–űł$Ę˝8 gëröŐYěůQ‹fî˛Řw‚ů?ë?čDäĄYŕ ćƱeŚ<(ÝĚ̩ˮвVĂ‘ ňÂ(aöHzQlm^0wß÷ťUQ…=Îr/OXb°ÔËĂ„¬÷˛ť»a8e]tˇ4®R§mŃČŤ°›z/h˛—»˝[‰9‹ť—y;˘"}©Úvř/¬*W%íu-ßYY˝Ý—:«ż®?}^Ţ»ě:˘­››yä; Z܉˘.1f¨[ÉMĂ›‚BAŕĺqL0ĘKŹ8Z†(oN4’9|hx§öőÖ\ ëŐj©;m··ő \¶k¸î/[Ȧč¤niőäÇţĂĂ †Ŕ#Éť8 UJµŁ%äkl»wß,ŠZ=ů>Űu w§aľßC©0­Ć1päáX ĚPKëccĚá #Ë߇Ď}\ý|¬1:Żî˘Ć+×w©Očş5ńqéaď}ÄL/·x=-¤P=‘ŠŐO«—€F“s#`tý´ÁĂ;z —މŠÇh‹®‹Ď¨–—‡–jĎU!¬Ę/WxńÔ3OŇŻ `Ŕh@ gAäčšä«Ű/4A «Ł(tĂ+Rą%w`ď‹8V˛ŕ$ë,y#hR«ęD'řŃčm*»ÓĹőú‹Ç8ľ¤›,µSÁ4iOCŞ2–˛ˇĘ’ŘÁşLs ¶FńLMăçŤřóÜ áˇYĐąNŔˇź:§ş#9Ő ¨BÝŐ@v;aď×Ön#xůĆж®*zĚčřŰ[c­)…á< / 3“Ę8KI÷‰±x¬őŐŤˇ.0Ë…ý‡Yąé™Zúř_pOO— yÝËbOÓR 9*ó¤z˛ÇI{Rš§ą)m'.µ4grg¦řŔhÉá-6 ÔkĎc˙ ËgNINܬ×á%ĂnŰmŽĽŃö T  őŘ`ŔâKě NŘń®;Ě v',[#CÝf^”äăD˙6nŻŚ!Iţ=$ŹťţńL_.`„‘a{´ďŞ x<±˘{~:Ż7˙lžÂ(:ŚtţĆĂ7J>[Á»TŽś]'KQI%hIü ™bC*HZâ'ęť˝!˝'ůÍrE“4`”(Cąż Oß$`mńM2+`ľ™s.4ąźŽ_¦^j’:7ĺ >5ű! “Ěą!źqş°ÜІA¶á-i¦Ôâ€Ó ĺA¸şv·ŤřÖť»Ô<ŔÂŢ”QŘŹ‚V”’$î´MRŇ“?¬X‰A0¤Â"ěB1Ú,QnŐG•cÝhűŐ5ŰŻ@®Zh˙ż^őn–őK…ßW? ‡QÚž»†ů>Á3Ű®E† §˝˝P”±oWZţčű™ˇ÷ÁÂ)§›˙OđŐv–÷̆·I#›ŐácˇĺçOlśeăý9Ń[’n±1hM˘©¶ -&ż&UóĐkëËŁySĐ– M€GN:CK/a’Űšb§j‡ďçĆ<ŚÚkóµ•eg*dä’Ý7câ¨Z“ -¶1ÔÂGÔáČi@úúnjÄî«î°1żF7'-ZëݡtörjŔśćĎřăc7Źm(*©fĆb3„/ô«čKŕmŰ›&™ŐB'ĆŘŹËőŐOüQČO endstream endobj 514 0 obj << /Type /Page /Contents 515 0 R /Resources 513 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R >> endobj 516 0 obj << /D [514 0 R /XYZ 89 770.89 null] >> endobj 2 0 obj << /D [514 0 R /XYZ 90 739.935 null] >> endobj 517 0 obj << /D [514 0 R /XYZ 90 553.953 null] >> endobj 518 0 obj << /D [514 0 R /XYZ 90 553.953 null] >> endobj 6 0 obj << /D [514 0 R /XYZ 90 553.953 null] >> endobj 519 0 obj << /D [514 0 R /XYZ 118.403 425.312 null] >> endobj 10 0 obj << /D [514 0 R /XYZ 90 407.464 null] >> endobj 513 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 523 0 obj << /Length 146 /Filter /FlateDecode >> stream xÚ•Ž± Â@DűýŠ)“ćÜŰ5—»VP1ťx]H• &A‰řű&‡–VĂ›Ç0.`ěiiµA0Á‰C<#0JgM!±CťIŢÄ ęĽ Şó&•‡azäÖgc÷l§ë8, m#ÝÉÎĂ&MQšR ´=Ő Ł›ű l4xĽŐc-‹ň†‰?—ľůăňj”ĺ_Őŕ1f endstream endobj 522 0 obj << /Type /Page /Contents 523 0 R /Resources 521 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R >> endobj 524 0 obj << /D [522 0 R /XYZ 89 770.89 null] >> endobj 521 0 obj << /Font << /F22 396 0 R >> /ProcSet [ /PDF /Text ] >> endobj 537 0 obj << /Length 1949 /Filter /FlateDecode >> stream xÚŤXÝ“Ű6Ď_á·ĘÓX+Q_Ötîaëͦ{—L2Ům_Ú›Ś,S6§˛¨ŠT6{ý(koÓ' @â‹?ŔŽűE´xű*âďĎŻ®n…X(Ěs‘-šE-ň´ łu˛xŘ-~6‡Ş·rX®Dbů߇“Fë"FŤh±Ę˛0] Rx§¶C5<‘ÂŻ¦ÚËI)NĂ$Í+ĺIf|‹ăĺ*Ž˘(¸ţxGŞ7ŇÔę­Ň,ʰĚEÎúb¦"&ýë¶­"cő"˛Ú9łůG‰VÚ¨IÜVו•;⪎ö ‰Ńčv°¸WŞ«ŰqÇ'膸¬”leeř„ľŞ˙ďĂĺ*YçÁČÄYđtfÄÎyą%326#¶­T‹~٧q–YFž˘DˇˇĘ ˛şʞłpQŠŔP ßGĄ§ŕÂ]Žý Ń¦/j‡÷ăVŁYat‰sRţĆÍŐćljĹýPŤ»’|süëëe¶KÖz2 ĺ޸ŕŃ”ńfějL·ˇ%ĹS˘kń ¨ŕh/,c$>˝}µřťö«š/ţ w˘9á5¨ćáĆp2Ł]ŮŁwú|lUGĺ›>ź†v(Í@LžˇL­fŇ@$ ±gleU]µí­[ŐýYm[IRĺo@9ç(Đ.(ăęćkuě[éŹŘr Á°z})¨DYôNuăW bŠśćG|{óźĎĄY»9ŠżWő Ťn,±~[ćQ ĚXµ´†äăYá Ż9ŤĂ".ýküš7ŕęöt½ük”]-ż˙śoŃegoĘuD‡ŔĘ˝ą´îî?\˝˙řćíJ\Ą´3źcĺ_ެfü"ř"żUÖŘAB Óšr›şwßęĄČ‚Gľ˛Ś·Ű (Ö8VÝ®˛J%Ď|äQ 5´ş”Ś~Ä Ä‡ ł+Ň”‰ĄG;m?ĘJ"çoĹ KHt@UĽC†ę °×Ç ĎîeÇŇß[·Ú\ş‚QEZŮŘɶ×@%Q`çíÜ5;ÁZŻ!&LlbxXµN``c§ n#`¶,]Ő`<™ŤK«ů{ŕSF#‡–YÚ0˝¬BZMë¤wBR' I°÷ěő Ă™t1M¨_ą~ŢŻńżŚ4˘gUÖ}†.Nw$ĐŠwµq)(á\HřĺÝ…Wřô”„ eĆú@TMýöwěťWű[ŐĘOPRź?@˘ń ócCüú(áŽËí„«Ż`K‰fr>-ˇ0­Žň¨FM8WbîÓ±#6<ł±¶#Ô¦s6ögO Ĺ·Ą[|ëâ wňqîIΕ¨ e|…g±sŢ÷ŤÓ €M™^i'W3QÂ]«SŰ9yO=Žż›<śÔO÷XY[Ţ>đ]€Eë‘ eFůXY˘ŮzAŐ_®‘,!tŽCĆ”č)ŻgÇP?Á§ y¤ĹG¤apYĆQ ­ůűĐÝŠ.ľޱ;čFňˇww÷DŔ¨ĐCě ÍźŽŁ%QěŇIĎëq§4‘÷ó—ëŤîpµ§ŕqEZv}żˇ†\w´3vđ¶jiL3¶Ä©¬•ÇŢňĄÚŰQë}§ţ'Ďl™úĆËΠ`ꡕőM“n†Ó´;›ĂĽ¸bEŐѡ•mg¤i‚ćş,2Rľ T¨˛ŃGlV+čÄ|ţ4–ϧ"VZS˙uăbç45x2\ňý7ü‘Ő<ˇÚE%?ŤžŁ™Ľnß·0#ą©h>qŇÔNb®g–$"ňq}6l‚ľ5˛m~T~¶_GaĎótą]ׇAsęSĆŠ$)až óčZ ö »Ů â,ŠÍÍPí±±Đj4ä ČMgŔ<Ćśˇę–ő#3ŤYQżŕ‚žç‚'ő4šé(ÎCvšô•=čŃΑQĎ˝ŚÓČHuHř'{˘<§Ó|@'Qi˛ôYUĹÂýƱ¦Cţ­‡ç3ăIń»“ý OöϰöĽýÎŕ–»ß ń#x—˧¬ń6} ćcáϨĽ—n(¤Ĺi¤tî `t:ř!KĎ}ô߫ۤXaYDî—łaŻ!:Iglňňžţr•ClţEź €.tę@oĄ}đ%ôđÔ»ny¸LĽjŚÔk:¦>4ď\±Äe ¸ż Ó<ĺëźäŕ ŕ§gśŤë8íÇiľX%Y%±źú/ĺő®™fÉ•n`š&Ń şq› )Ý„ř¸ś#>Şmž©ÍpžŻHěŢ÷Nཿ1×Mťîý{§{ŇW~^ş|Á”ĂďpD&ú•ĺę9}ţĆ꿯\˝N‰ó&pÓ}±A‹F/Äcx:´4Ťű ĘY şAʇɭlč·é7˘4fÁIĐyđńŇTîŕč$J8o%AŔ䄹ĺ10ľ‰Ëu$WíhʰLäţO™ý°ÜĐ*[Zě%®řŰ úHçMÚ3äuf¸8€€Ż´qđ–pp·ŕů\tđ(x×™˙žč #ŃQľŕsś\M…U†YÉ*ąř ~¦ąSu3ô™Ělµî/CĎ›‡W˙52aŞ endstream endobj 536 0 obj << /Type /Page /Contents 537 0 R /Resources 535 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R /Annots [ 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R ] >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [202.716 476.14 272.085 486.068] /A << /S /GoTo /D (aacdecoder__lib_8h) >> >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [141.154 339.579 179.948 350.483] /A << /S /GoTo /D (main_8cpp) >> >> endobj 527 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.326 279.803 449.021 290.707] /A << /S /GoTo /D (CommandLineUsage) >> >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.008 217.224 215.21 228.128] /A << /S /GoTo /D (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) >> >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.579 136.696 236.441 147.6] /A << /S /GoTo /D (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) >> >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [173.128 112.786 289.63 123.69] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 538 0 obj << /D [536 0 R /XYZ 89 770.89 null] >> endobj 14 0 obj << /D [536 0 R /XYZ 90 739.935 null] >> endobj 539 0 obj << /D [536 0 R /XYZ 90 549.218 null] >> endobj 540 0 obj << /D [536 0 R /XYZ 90 549.218 null] >> endobj 18 0 obj << /D [536 0 R /XYZ 90 549.218 null] >> endobj 541 0 obj << /D [536 0 R /XYZ 302.62 448.737 null] >> endobj 22 0 obj << /D [536 0 R /XYZ 90 428.837 null] >> endobj 542 0 obj << /D [536 0 R /XYZ 90 232.748 null] >> endobj 544 0 obj << /D [536 0 R /XYZ 90 168.823 null] >> endobj 545 0 obj << /D [536 0 R /XYZ 90 108.719 null] >> endobj 535 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 563 0 obj << /Length 2405 /Filter /FlateDecode >> stream xÚťŮră¸ńÝ_ÁÚ—U#. žŞTĆ{â­Í8Yk&•Ěną ’áˇĺ±Ž6?źntC¤.{f_D ŃúîFËłÖ–g˝żş^\}'„5wç±­ĹĘš{Vűn$|k‘[źíĐůeńHĚěŃŔ‹e+Űť3‘gěäZ!ÖŐíâę×+<Ë×E‰›‘•UWźń¬ŕ?XžĚSëYcUV(ř–ÖăŐ?®<&ęř«‰ +qç‰ç#‘ľÝ0ń­Dበ˘ňƙŞg˙OÓb6{Á„˝™®ç§Ö,HÜ4H™G÷`‹őyÁ9?)™‡Ih粗8 ěUŰT[}×·JV´đłç‰RŃRÓl\í˘î‚Jdeˇę~Ö Ű-ŚrµzB[:Âł‡•#"{ĄZZţŮ‹ĽďŠúzţŽp‹šéGą·kVŔOšÜWɢvłíöK<Ď׬@Ý0 ­™ď»ó("©ÜŻŕôBŠÂČ.:š˙ćř‘­´öÚU˛,iˇ,ľ8ľg+šýgčxcřćň`]ĘěťĘš\µOô˝keĄY$đX5¸ăą0w¶j«dŻňrgćýĐÖ/ß÷ö­zöÍӻۛ§8^<Í´<–@L¸ýđđńý_ź®ďŹ'T$±=Ô}d$‰­ęfXo FË čłjÁV¤áÄ^î^RU<•Ĺ0yA¶ëĚ‚tn?Ôšo8·ecŤ÷Ć ×oTM°~S0IGf5ešŐľ‘€ęĎc;kŞm©z…WřsŘŞđ8\ٶM¦şy©¬sÂ(xgż1ŞÚö;'Ž`öÚú˘“ĎĚ–rۿމ˙Ő¦– ˝˘ŐV× …îů„?S3Ł]b”¬q¬čcx,Vŕ˛/šš`ĎEżˇQWTE)u5Ô"ɲ0,(ef|Hřn:çČťŤ,7č2Í ŃWšFŸ¤Y:Ű(ätČźś<•@‰T \ĐlĆhQ+Ď;@¸L˘9¸á8ŽMŁÉÜ ăAę47Ł<§5ÁˇWoŽŽE=†ö¤¤®Ď…#Ü4 čÚ3rA÷őŞyC9CU¸Ś§Ë]Ż:´­éühŤÍ˙ó‹ &ň\ČLł r­ ţV¬|k`ŚĐĺ Ç·3mż0k  ŰŃg‘%ä4ůűÍßCyŃ0Ĺ ő ‘„sš©`킎ΩţžŐŞC|µéŕ€6¶‰VuۦîŠeˇťŚĐvá˛l2Ůó^yÖTČ7E¶9ĽťŘOí5oŢGëÉń›¦Ě }f[3ô{ŁDń|•ús×éˇ޶mÓ>B:2¨żĐ粂ĎZ風Ô; §O×ďžď˙}«S,ałđ9®JąîöF{R Ąn Uk2¦ý@ĆĂŃQÇ(@r¨1ଇ–#g „®OęˇZR¸솏Ę6˛®UŮÝAč۝ĨKK°]1x…Ľ´+~WÚÄő¬ŕ;릧Á—şAŤ?׼Î_™ďłřDż!ެ3ĽFDˇ˝kPíh˝âÁTOďU˙¨ĄząěŠV€I[($‚ '‚Jú€`‡ *†‚T{¨ŐŠzMscŠČăŞi+’ő„Gv1ťn÷ŕý`Ř>Ć[»&ś×»~W4—žßG1tçDk‘)ČŮ‘Ű÷ŚOŘËI‰—łě¸Tw˘ÂČö+&šNí˝í I+‚Űah{FĂl©ńİbmX4Ň đ¨50Ť[€IĐĘ™uKŕ˝l{6í *_•ŔS3tX áâ>ÄâD[ł¶ěh$D~Şż˝üÁ«GůÓśj]-Ҫ٨Ó´Ćą-,ţÓń!$ľuü ˛?Ý"Ěß?Np}z•v,řf›¦S5ë ´L„ŐšŚçŻ;tĄE%1ôN÷źŞë$tPŃUšşŔd‡VöçcîiŐ/™$ćş=ąđžĂ§Wv˝ÚrŹó@BSŰðnĆ pK ?L53Ũ—Ą:(@«¦Ą8äíKSôƠ䄹‚Q˛ BĂk"đ™O˙P±q‹nJ°‡Ë±m*€ŮQZ6Zä7ÖTNűRÜäŮVÖîŰŢäčťAŮGĹîRĆÂňCČY±ĐyLA`ÍĎ…gÉA¸Bx§ŇŽŽ~Üę«3ąĐÓŮpÎąŘĐÓmj¤A^Ü*†a`ŁŃaҦY”ü…‹Ł0kŞLűú1<`jľă¨bžŹÝ“k ¦•h\Ȩ́Ĺý™§›3Ä2njtěbôţűjkaňi” q ě¦flĂ5_¸ÝP-Nź >†l0řĽ”3#8ýŚW™ ¦D ¬jĎ0j˛‚ńá7¦L6d÷RÍw®şäŞQ?Ü )ĺöří¸ŻrO_>Ż?u4 ‰‹hoŽUĂŁĂb^lŢ™.wôíTođéŰi2'¨ÓÁŰÇ0őĺ…$ď]l.ÁZÄu ŢÚ:¨ ™P–+´şZ1ćK \ż˙đtŤtAÝ;;§m,†ĎtKŰżhFŠÔu§RÔ>Ň™BŤóÂ^)Bę;˘ő`ĆKě…“˘9hđJiË ŤŔůěh!‡ÍqÉ»ä5áh#°˙Ľ×„Â:uNtz"ö‹—:Nâ[:N đĘť¤ÉézF}7^** ë˛îM{r¬]éĘeCmNţÍeNޱM3ýčŢ785Y;Ăń‘‹höâ§N ° gi®Ç˘ß" ěť2űt» GYłĄwŻ>”(Ś…=UÜ«7Łx©:h ®Bfő§o›&¶­ŇA¦Ćű^ç=NNŻ®E®´Jmő0$ŃŞźÚ˝”ڍ 2Ř e'ő´,`A®¬r0s±Żß —IíA€@O-čHBö3-Á8¤}ćbn[""gaĽ«Uç:´]OucBĹ6iKŠ$í‡çG2&ś˘3›ŐŻ µýŁ4RźY †CÉŹ,¨żÉó‚ú„Ô› í­jŃx™`•Ş˛-ą3ÇvÍyź– L[݇#¤v8ŚđDBÖé?XĂŢí@MM2L˙ _m¨[ PĘĽ0в2ŮÚž9xµŞJí±UG›/™<\ŚMę3<±ž#Ď>Uͤ ökŔă˙ŇŔ <ń­1ý‰ş! endstream endobj 562 0 obj << /Type /Page /Contents 563 0 R /Resources 561 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R /Group 392 0 R /Annots [ 531 0 R 532 0 R 533 0 R 566 0 R 534 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 572 0 R 559 0 R ] >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [469.394 688.981 508.188 699.885] /A << /S /GoTo /D (main_8cpp) >> >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [228.074 677.026 344.577 687.929] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [433.11 677.026 513.996 687.929] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) >> >> endobj 566 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 665.07 184.525 675.974] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) >> >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [305.852 665.07 380.321 675.974] /A << /S /GoTo /D (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) >> >> endobj 552 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.754 619.262 208.224 630.166] /A << /S /GoTo /D (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) >> >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.071 548.567 249.573 559.471] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [195.961 458.943 315.79 469.847] /A << /S /GoTo /D (aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) >> >> endobj 555 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [353.346 449.479 392.14 460.382] /A << /S /GoTo /D (main_8cpp) >> >> endobj 556 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.008 317.553 216.325 328.457] /A << /S /GoTo /D (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) >> >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [325.7 176.881 364.494 187.785] /A << /S /GoTo /D (main_8cpp) >> >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [468.935 176.881 513.996 187.785] /A << /S /GoTo /D (main_8cpp_a08a7e8a6abdc5cf6d2ac4e978e084d1a) >> >> endobj 572 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 164.926 112.027 175.83] /A << /S /GoTo /D (main_8cpp_a08a7e8a6abdc5cf6d2ac4e978e084d1a) >> >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [139.807 152.971 214.277 163.875] /A << /S /GoTo /D (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) >> >> endobj 564 0 obj << /D [562 0 R /XYZ 89 770.89 null] >> endobj 565 0 obj << /D [562 0 R /XYZ 90 710.306 null] >> endobj 567 0 obj << /D [562 0 R /XYZ 90 635.94 null] >> endobj 568 0 obj << /D [562 0 R /XYZ 90 567.401 null] >> endobj 569 0 obj << /D [562 0 R /XYZ 90 388.153 null] >> endobj 570 0 obj << /D [562 0 R /XYZ 90 336.387 null] >> endobj 571 0 obj << /D [562 0 R /XYZ 90 281.513 null] >> endobj 26 0 obj << /D [562 0 R /XYZ 90 274.111 null] >> endobj 561 0 obj << /Font << /F22 396 0 R /F37 543 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 580 0 obj << /Length 1021 /Filter /FlateDecode >> stream xÚ•V[oŰ6~÷ŻŕŰ(`bx•¨Đ4ńŕ˘HŰŘ{X“.PeÚ&K‰$/s}/r|[±˝‡ç~çÂĂO¦h‰(úmt5]Ś9GÉž ŮeĄ #Š34›Ł{̉b®(ľÚ,¦őňtŰőf}™˝C’iBYhÎ]Yĺčf6z1ĐQĢJI**ÖŁű/ÍA˙Q"2Ť^ś×I.`­ĐtôiDCv˙¶Č,$“ %ŚFĄ…lŞ…óŘť)I%‘n+¤ |0\LÖ]7řÓIxďń]{]ăTBRZ¦ß‹qąÜ´ĆwŚvĹ‚Qüľ\"b o‹*›…_űUPk˙§7mťW^SÖO›Ţ‹_#Nńfq…í…Ř~7Ňf>ˇX2’d™OhćđĄÄ]ůÍI‡M?ć¦hć 1â˛ŢĄ®C ŕt”‚Ó•ťwëLp*ëýŹUů5’“•÷z ŠvfóR^‡ÝěîÍíôㇻ(ˇxv}óöqr{Aă~?Ćnä¨-ŹdJůަ“Ď7ÇoĎçfăwë|ë…bŐ4]hoî—nťWŐ0ҡ% męů Ü]Ȣ©ŞĆ–űRÖËŘÔ] žy_‚typ%D ŤbžĄSźççęĐë>V.;/V'—\¬ňş6áň[óĽ)[Óů]šč0Űt¶50•\ý8ä®®—U3 áÉťÚîmşačŽFőµ]ܸ3’ĄP4<Ď Ę$a!“?˝×ÁŁQD')Š÷Ľjwż1KÂRuŘľi3\E»˙HňőSut­0´&8‡iľ 9˛˝čIF¨´W”‘TĘđ@˘‰ ßE±ĆonaC3<Ťb•âŹŢň`µ·;_ŤŻťćś4~{¦ČŚí8Čx<“$™fĂ$ŠÓ ‡ĐW€ sď7ă3ŕ"…łú?O]–6„Ćźá—CŢîŢǤ„*9ůĘďá’ĺž#Ng;lxÁâ,%,S‹\@  L‰ÄJ)(N3Wš$Éî»ňë)6đ±bÉŕ ¬Ďt(B ňÁ,ťRă8ŻçV?" Ë5ÁŰ1;uÓűcOyŰ{•{$°úg¦0†?EJáÎŰ x›·[żqD»°1ňÂXË´%ëÖŔ°›sś×Ô¨ĽŮ´…‰-ľU\TĄ©űÎ[ýYÁňÉ2xô«2«{ 4(S†' ŻÝZň´Ž­)Li áoűÔĚÜ›sżTĂC vßšĘäťůŮ~ĺRüä6á@÷—ÇŰ„°®ÓVx9,.|7‹Ľ~%ÁĄ¨¸ě– TÔľňtxîkc_A ‡™uÓntmDńř‹DPţ˙°|Ť™E endstream endobj 579 0 obj << /Type /Page /Contents 580 0 R /Resources 578 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R /Group 392 0 R >> endobj 560 0 obj << /Type /XObject /Subtype /Image /Width 1405 /Height 715 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 587 0 R /Length 12695 /Filter /FlateDecode >> stream xÚíÝżŠe×™Ćá9–`Ŕáŕ łnĆrbŤů ěd`pěl†ÉŘ”3A_HÓŕŘÝŚ@n@ʧˇQwťłÖ·ľoí˝Ö~~‰­®»ęěÚűíÓUŹŹ¬çá˙őÖĎy4ůěŻň ~¤7^ü$_-;}łCâ›^zvXýžÝě0sv¨;Ô›}łĂ®7ĽQ>űf‡ŁľZöű$f‡íg‡ŔFáłżńGÔ2;t}Ář$fłĂö7}f‡ńW›Ş|€‹0;ŚżWëŢ÷™Ć_mď[LÍ€ĎUî•Ěľž{_­Ů ëžĄńGţIű㽟ż×ňJF~üÂÝ—ŞžÂ?]pđ'>÷‚gxÎ˙í?ţ:‰˝W•ňńŽ| ťóˇе „o0ňJ÷JY÷Vą[ĘČq-!é/ţxÄsÚ˙děĎá•5łŚUźęˇ0~#řŰçđ›đRŹc?R2vKľOĚz»çśŇż&SŽóyf‡ó?”ž»­hż§®~ŇűŤ·űO)Qď‹Tż«ŤwÓíźôÜ/ŞŔůŔÇg‡Ţ•ő›,ÂŹ¦s>”ď^Gîą·‡]75±»°ô[ČŘhü(b«NĘj‘ňuľ‰ÎťłęÔŕOŤHÜFNőPĽ%éşQ ܰ”ţĺoă˝ář?R¨ţ(RŽđ9g‡Řë™b*ëK%üh:çC  ëŢsđi؉{ĹÝ?9r7=sĽż+ú7,–‡Á7ť5;ڍŠ/Š[1ůˇĐuW2r7tŕě0ř‹&ł~‹DĹěűą÷ţ‡Ěą?Ű!ńëżtŞ ®Źz(L›FîIc÷qECAďýWŃß·Ľŕf‡đ$UńO“đűy·@úmW×? /˝Wzě˙ő‚ŤGŁë¶+evüđO>;Ś˝…f‡‘ië¨Ů!üPHĽ?˝ńôěń›Ż‘ç „ďńo‡Kg‡–?ąĘěĐő*>đóĚ鏦s>”–*îg‡‘_LĐű>w˝‰“Ě_‰¸ŮaňC  bv¸ű—ŃGÝ+Ý~oĂGŁnvČú #ËÍEřŠłCăŁéś%€ö»’ŢźŠ0~K~ÔďvŚý܆Л˛ÁŰá9ĎÇ|,Yżu4}v¨ôŮ!÷űkRR~Đbúě0rű9áIą‡nüŁÝOű«ęôŮ!ńGJލ“ĎG=”>ĽĄęúE·_OâěĐ{?5˛ÔÍᏢč7óßćÝD§Ď±•ű›,ʦs>”ž»Á l;Ůń{öĆ_ů{ťŁ—űQôţVÍ®7=˙Gö¨Ř”FÔ„HâżšöPxîĆ*ü;ňFîŞîŢ×Ä~fĹ/Đě˝ůŞţ(R~ybʡ(ýÚh|ĎÇg‡ŇOSĹŁéś%€oÇď)o¬b·„á[×»G#kv¨ű(ž±÷Ĺë~ńâřöXó+Tâć0>ÔţPxîvl䞢n©Hąw+úůxé·‡]Bŕ赼챳CřOüŐ¨˝*ýYE3Ĺś‡ŔśŐ?›ŽG€%Š>›ŽG€»$Š>ˇŽG€%Š>ˇŽG€»$*>ˇŽGŔá7G~¸ý®ź\ÇÁŁ ŕ<7JŽ x4TÜ(9 ŕŃPçááÁA*<ü/ÇČőđGHńđ GůčÎ`|ÂZžŰŕů@‹‡›Â/h…€«yhs’W śÍCČoݧ ÖťŽ˝Ó_ń}¶ąýę8¶>ŔŤŕ¦Ŕéś‘Wň®CŔĹ€+ ĺşÂ\f± ‡ pYŚOw”×-@ĘwmXýzĆ% śę´Ăěw…ă"ŽýŽě€.x€ôoÁŽŕĘH˙ÎëP®ßvR.ŕ Čő'fĚ2;ĽxůęÍŰw’$IŞëOů«Ů€kÎźńĺ7ß~'I’¤şŢĽ}gvŔě I’$ł$I’Ě`v$I’Ůł$I’Ě`v$I2;€ŮA’$IfĚ’$I2;€ŮA’$ÉěfI’$™0;¸$I2;€ŮA’$ÉěfI’$™0;$I’Ě`vÎÖCHŃűĐř˙‡_៯Ü|ř×[ű•dvłdv0;T˛Öťn-MřJ“dvłdv0;T|P‡“Ű_KsľŇ$™Ŕě ­u3{ÎŮÁgęäłCď•dvłdv0;Âď€Ďµdv¸{˝gîŔě ™Ěfłdv¨›,$łŮÁě`vĚułĺłtÁ١啴ü»ţ ?R˛ĺ(t˝ć®xY?Űsţ{>ň3Koż­‘O™Y)m0;0;Hf‡%f‡‘Ţń?pvóžWĚéź2giÝŮÁň€ŮA2;śyvýU{ăÍűČ?%¨žĆ?đŁf‡iK…¤UfËfÉěpţŮáą˙xzÝÍ{âĎv˙ž§ül‡Ć9âîî!/m6;0;Hf‡Óν··-÷°Ť˙őđŮać{žř_˙ Äć ]av°<`vÎ?;ň üÎs^üŘŮaň{>áąfÉě`yŔě ™Îů›,Ňg‡ÁŹčŔ١č=üŻíří?âÁ.y¶$łĂ*łCě8Ăě0˙=7;Hf‡ŇŮÁĹ0fÉĎv0;Ćg‡Ř8fvöž\ `vĚfłŮA2;0;HfłŮÁě éäłĂŤ˙Ě’ŮÁě`v¨űŮu_á’Î0;Ü"Ŕě ™Ěfłdv¨{ $łĂöłĂŤ_üqň١č=OüGfÉě`vŔě ™zďWśZ>ŘÜ•5;ĚĎKG‰»Ěě m<;X0;HW›îŢ6î4;v‰‘•8;L~Ďg‡ŔfbvĚ`vVźnÜŢţ-«Ď7>Řô•őo ćżç)ĎgŻ"fiďŮÁň€ŮAşŕěđŃűĐ]g‡»żŔ1ë@őľˇŘ{Ţxăßű)ÎťşŢyłdvł´ÁěpăĆp×)زÔČěpČ{žţÓÚßł´ýě`yŔě ]dv¸ý3výMYO?ü”đěpě{>ţu{z‰»dvł¤«­4’dv°<`v$ł$™0;H’ŮA’.8;X0;H2;H’ŮÁě€ŮA’Ě’´Üě`yŔě Éě IfłfI2;HŇrłĺł$ł$™Ě$I’´Üě`yŔě I’dv0;`v$IŇrłĺł$I’ŮÁě€ŮA’$IËÍ–Ě’$IfłfI’$-7;XHü†ňâĺ«§ď’$IŞëOů«Ů€kÎLłâ…˘kfĚfł° ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@‘‡÷8@.łPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@ËPÄěÔ±<EĚ@łPÇň1;Ŕäo Ç~óőM<<—;Ĺ=÷:ß–[!¸ČŮ®öÝóŔ^ă‡g×qč}—Â/hvgW`őŮÁw|đđ¬~—Š>ł8Á€oťîkŔU±Ůaňěŕ¬N°ŕ[§űpUĽčĂł÷˝Şű(Ěŕ ľoşŻ—Ä›=<Í€¬ř}Ó} ¸$^âáiv\Ť°Ç7—®?3ţĂŐcWŃ?y©Ü١ń}kŁď˙ɇ›ŇÚŕg ÎvĘşřĂłôO¶ż'?R˛âLŘfv_–ß}ń‘Ěšzß˝Ţű‘ŘĚş2>°ô)ËĂ3}vx¸'}v¨;“–öŚ\âƶŽÁ»é‘W8žá71áĄŕ´§,ĎŹî$#l䤛JĎä€Ů€ f‡ö éŢËŕđËÍŹzäxĆîÂÇÓµ=KĎž)OŠčF*f‡ô39`v`§Ů!đĘSžµ»< _ź‡oLb÷7^Iâ?{‡SÍžŹŮ˙V.öJÇ­úLX¸ÂěpřÜ1>;$^~ľŕČAsńŔ–ł‡gă1Iů©ułCŃ™0;°Óěţ˝?™őŻÇ_|đɉ7DíÍőW.řđĚz÷¦ÍÎä€ĺ€Íf‡˘ßţ}jŐĎÄĽ?đľĆ%W¸ ľÚĂłzvH˙ŮÎä€Ů€ f‡Çš_wűµí1;ŚÜ8Ä~ö»ŹŮaă‡çČOč |8fpĘ€iłĂcöďµßlvčúGÜĄ÷5±Ďl<;löđLů!<éżśÔěfHůÍk˝×ĚŰĎʎR}_c|Ŕě°ńĂ3ë˙Ć›6;€ł.8;Üľv=Ű&°ô}Mú§Ţě€Ůaʇgx§}lű…•fpÖ€3ĚĎ]Ç^vvhů‹ÂCîkZ>S°÷ě°ŮĂsüéaă?çÇ컞xÎ9;<Ţű=ő‰SĆä١ĺÝx˙äţ Ťďć`ˇSÖŐž?y7Ć˙Ƅ١îL¸B`•o%˙V˘âŻşFŢç¬eŁ÷cOąŔ.ýO¬uĘňđLů¸˛ĆśŔ©ľúLXĺ~đ÷˛ÍŮńVĐţ3Ű?fłhjjĆošŕ<§,ĎiłCúo˛p&,śyčúĄiaaäŢaä}ů"±Dľµ‰}:\Űłîěŕá98§€¬ŮˇúL8óeüs˙@¸÷eS~ĺÜČËfÍáWľŻüÝŁąGV9_yx>Fź'0řŰ?Çg§&°<pÍ+ů”ëĆÁŃ#öngýHÉÉ×˙)«Kř¶Âµ®{=<g‡Ç¤ :pźRt&Ěś|żnąÜťđ>·cą=Ż»Š4›]÷zxfÍ-ď@ő/ĘL<“Eg`ÇΗxx8gľG‡'Ιŕ4ŕá ŕĚ ľ;žÎś€oÍŕá €ó'śó{±ßžźK 8É}Ťcž[žN 8üľĆO€]O§ËěÔ±<EĚ@ËPÄě1;u,@łPÇň1;uĚ@OxŠ€:– Ů¨cvŠxÂPÄěÔ±<EĚ@łPÇň1;uĚ@OxŠ€:– Ů¨cvŠxÂPÄěÔ±<EĚđţ÷DÇpîH?M9S€ď‰€s€3ř†đ“—sŕ* \şť¸śÁ€%NYŽ®Ţ}OVögކ”łPőë0;@ěJŰĹ90mUsŞ9Űű\ó¬č8¸0ľÇýĹe?ąxÜyŕQŔáßy 7\®g´m® \Ćă1ĺ±fÎp%éȰÇ׆ËZ€í§-GoőĎ»ăpťońíW\»ú´,ýťČą}§O«C`p€“ٸ¸řw%§ýĄ?‰ŔĆߦ V˙úqÁ €ýaőĎťă°ë·f‡‚ń«»S]dúÔŕ»ëRśŰń…”~Ué3€ď®(pnÇ×Rú•¤Oľelđ9rÜ'ÂIľś|ŕ‡OÎę\ç+Ę—1ľaá;;Îęěqçkß;|‚Zř«1 Ů¨cvŠxÂPÄěÔ1;E<á(bvę€"žđ1;EĚ@łPÄ€"f ŽŮ(â Ŕ®g¶OĹLŕ‚Ůě`vŔě`v0;¤ĽĂ_˝~ýý?J‹öďüăÓ—ń›·ďľůö;I’NŰÓ·*÷ż®ĎĚ’ŮA’$ł'<Ě’ŮA’dvŔěĚ’ŮA’$łŮŔě ™$I2;¸DpN3;HfI’ŮOxĚfÉě I’ŮÁě`vĚ’$™\Ą8ˇ™$ł$Éě€'<fłdv$Éě`v0;¸u•ŮA’$łŮŔě`vĚ’$łW¸P0;HfI’Ěžđ`v0;Čě I’ŮÁ…şO`v0;HfI’Ůł€ŮA2;H’dvp­ŕTfvŮA’$łfŔ©Ěě ™$IfŞŻŐ}łŮA2;H’ĚĚ’ŮA’$łŮŔě`vŮA’$ł> €óŮA2;H’Ěx€ŮA2;H’dv0;Ě2;H’dvŔěĚ’ŮA’dvŔ;€ŮA2;H’dvđ„łŮAfI’ĚłŮA2;H’ĚĚ’ŮA’$ł‹vg0łĚ’$™0;Î`fÉě I2;0ó˘Ý§0;$ł$Éě€ŮŔě ™$I2;Ěf™$I2;¸h÷éĚfÉě I2;ŕşŔě ™$I2;¸npú2;Čě I’ŮÇĽgŃňz>0ó=Ś}P|š*ŕsŻsđm]ä_ý<|Śs‘ŮA2;H’dv0;ŚĽžđ­ÖQ÷e§úB ßźÝŘšr7ăŮA2;H’dv0;ŚĽž‘›¬CîČNx88;ĚygĚ#›sŁŮA2;H’dvpé>ů/ëÍkÍűö9ŹłŮA2;H’dvpé~Ôí¤Ů!ü^Ő}f‡ôĺÍň`vĚ’$™öľt/ý¤Ěf‡öźąę¤dvĚ’$™ĚfłŮÁě`v0;Čě I’Ů9÷z}%)?:ďĂ?ßřzÚßĐC›®×ĐőˇŢŐŠ?Ůţž ţHÉçŢÖřoëh—űĚfłĚ’$™Ř`vč}m±Ĺ ö&gŠŢĚ˝Ďí}OÂłĂí·µëěP1avĚ’$™.uő>avÜöŢȇ_˙„—úđeZĹs#(ĺĄÂBxv¸ŕłˇF>pŁ„Ů.~ ?çGJÎĽCo|+w‘‰żśqđ?|=éłĂí·{…›ëđ'Ýě`vłĂ´ßd1ň7ă#˙„a|Łhą Ľ“ż ™b“ÎŐn®źwłŮ\ĂŻuÇçÓŤ‡§c¸†ŻřÝŞŕáé®á+>@÷)xx:&€»r ¸ĹvLŔ]ąŹÜ_;,ŔŐnĚS~U¸żvX€Ä›ôý>"›ězĘr`ą›ôý>"·'°ë)Ëq€ĺnŇ `•S–ăk]Ă»Ś:e9ŕ2Ŕů p8_.ăç+ç+pŕ|őř±_é @Ě.ăĚ\Ć8_e˝Ăűúëż˙ăź’6î“O>ůőo~űćí;IŇQ˝xůĘŤ­Ëxŕ˛g¬“̢łĂÓ-É÷?ü(iă~öłźýî÷řćŰď$IGőů_ş±5;fł$ł$Éě`vč}ń9·'żĄz˙}îżq@bÇęîK]đqç_u™Ě’Ě’dv`›Ůáî=ďŢ7€Ďý ““Ě׼ű6;8_™$™$ÉěŔ—ń-Őľń ૻz†Ůá˛wßfç+ł$ł$™0;l6;śp%p÷Ťó•ŮA’ŮA’Ě.ő·ęf0;H2;H’Ě.ăÍf0;$™$Éě€ŮÁě`vŔůĘě Éě I2;ět˙pÓí;ß8đv»nş»^|đĂ?đGJ¶v?äđ‹÷~Č˝o˝ë g"ĚfÉě`v$łÇÎ#÷—ÍzÓźîůĵ»ŢzăANg0;$łk~I2;pÔě0r÷{ń”7}ńŮađ~ Â/{ČWfłdv0;H’ŮôËřŔŤçs˙µĺ5´˙§”7=ňá8; ľÂŘáíz ˝«Qď[?ö«‚ô/Eł$ł$Éě`vÝşvÝ]öľoúâłCâOQŮ bo}ä+Ęň`v0;H2;H’Ůťf‡ńç‘[WłĂŕ‘yë±§+TĎŹ~ŮÁě Éě Ifśro[ţäŕ_Ö_|v|ë˝?˛cÚ[źđUÁiĎWfIfI2;`v0;¬2;„şBĘ{8ţłĚfł$ł$™0;ô2;Ý>÷ţއÜŮ!ń­›ĚfIfI2;`v0;śgvýşÉ¬Ů!ý­›ĚfIfI2;`v0;śavh9ÔułCŃ[7;Ě’Ě’dvŔěP˝ łCĹç.ü6ÍÎWfIfI’ŮÁě`vŘŕh–~îF~ů©ŮÁůĘě Éě I2;˛ţ‘…Ůá¨Ůap78Ű‹›ĚfIfI2;`vHąý4;Lmbo}đ'Rú‘’ÎWfIfI’ŮÁě5;ބ١tv¸űłÚ˙kŕsç7Y¬x†É:¤fIfI’ŮႳCďýk˙3á{[łĂČżRé z?wíż3öÖÍfł$ł$™ŘăŽ`Âo± üęLłCăg'đÉm?ţ]Ż!÷­›ĚfIfI2;°ÍAőěĐrZôD‹Őg‡ö§%„{ᅥčzńđ[7;xv–ŮA’ŮA’Ěěô‘f‡ŔM´ŮáîggţZ~ň‡c«ĹÝ·nv0;$™$ÉěŔ®Ď_{Ě’ŮA’dvŔ­ľö0;$™$Éě€[?vý˘ňµ‡ŮA’ŮA’dvp‡á/Ş–źŰŕpavdv$™Ě›nü\M_x$™$If×đ0ľşÜ8‡ÜřcáÍaÝŮáo_ý÷üSŇĆ}ňÉ'żţÍo߼}'I:Ş/_ąĂ=á•°ăŚ/wV‹Ífćp­nv.5>Ü~©+ś»|ë0;Ňo«ďţyç.Řţ6ÁˇV<}9pţëv—îŔ˘§/ÇÎÝîŇXôôĺ8€ëv§/pÝŕô¸nÎv&™üËŚśľ`•;‡<Ť€çî `äbvnÜ28ŔČ9äÓÓ,qËŕ8áȧg0Xâ–ÁˇV<‡8€[Ŕ9¤ôđ‰· €sHŃ;ŕgľep€‘sŮpĹÔťFüHIŕT7 €3IÖ[÷Y7 Ŕö'“ůç“ĺNbLäZÝěl38ň-`ĹŮáÓĎ>űęőkI’&ôô}ç_~ţóĎżřRşZ/^ľr·{žűÇ0;ĚzţąűĚ’$™$łŮ ev¸Ëěŕ2X’dvĚ6€ôńˇčŤš$I2;HfłpĺńˇôÍ™$I2;Hf‡iWűŽŕĽgv$Éě łdOu0;H’dvĚfłŮA’dvĚ®˝ŕ„'˘şÔŠłÓ¸D÷T`łłĐŤŮˇâ4evŔě`v®ł9ÜťrĎTN}0í‚ߡ<Ý=U,Î~0íšßˇN~ 2;ŔŢ×üÇžrOYÎ~p¶k~€OAfŘűšŕŔSŮ–»ćw€OAfpÁp†łŮ6ľŕ8đD”ţ;4ťŕ —úŐ碻§ŁôÍáŃěő—úp’ÓŃŤ“RËź żiꍻÎw(€“śŽĄżiź(şČw(€łť—ć ďżQŠ.ď ŕśg§ęÁáý7ç°@ĹU˝C8:@Ĺe¶+m'Cp™ ŕ| ]c»ĚN~ŽúÉ™Şč¬ĺ|E—ôpÎłÓsłCĹąkąóáąJ·9»ĎÍąg°g‡O?űě«×Ż%IŇIzúÖüô úó/ľÔN˝xůĘ˝łŮŘrv¸q˛ŞXVśž.oľ˙áGI’t’ľ|ýúéô7ß~§ťzóöť{ç‹\`לCź›ĚfI’Ě2;xŞ@řywĎWą§2ł$I2;Čě`v®v^2;$I2;Čě`s0;$I2;ĚłŮA’$™dv¨ľ¶włŮA’$™dvđTŔě`v0;H’dvŮÁě~‚ň 4Í’$™dv°9$žŁŢ?MÝŢ"Ě.đ$I2;Čě`v/ĎýĎôł™ŮA’$™dv°9—Zî2;¸Ŕ“$Éě łŮ }y(zŁfI’dvŮá"WÔ€łÖśÁÁě I’Ě2;xŞ€mÖě I’ŮAfł€ŮÁě I’ŮAf›fI’dvŮÁě`v0;H’dvŮÁćrĘšö“$Í’$Éě łŮ¸ěÚŕ7Y$I2;ČěŕiÇŇńÁě I’Ě2;xް÷ćő‡Í’$Éě łŮp‚ę=MŐ-fI’dvŮÁćě·9Ěqł$I2;Čě`vś fžâĚ’$Éě łÍpŽ2;$I2;Čě`v¨>AĺžčĚ’$Éě łÍpŽ2;$I2;Čě`v0;$I2;Čě°ń%˝ăĚ’$Éě ł§:NSfł$If™Ěfł$I2;\Ě;€ŮÁě I’Ě2;g*łŮA’$łĚ6łŮA’$™Ě®ä Ŕě`v$If™l€ó•ŮÁě I’ŮAfł@úů*‹ŮA’$™dv°9Ě’$™dv0;Ě’$Éě łŮ ÷Djv$If™lfł$If™Ěfł$If™lfł$I2;Čě`v0;$I2;Čě`s0;$I2;Čě`vŔě I’Ě2;ŘĚfI’Ě2;ĚfI’Ě2;Ř0;H’$łĚfłŮA’$łĚ6łŮA’$łĚfĚ’$Éě łÍŔě`v$Éě łŮŔě`v$Éě łÍł$I2;Čě`v0;$I2;Čě`v0;L{‡?ý쳯^ż–$I'éé[óÓ7čĎżřR;őâĺ«ë܆ŰĚ~S`ł—š ýzŘ%1@éiÖqŕĘ×Ă.‰JOłŽ—˝v= P}¦u¸ěŰëa€ę3­ăŔ5Ż„] L8Ů:\óJŘĹ0Ŕ„“­ăŔ/] Ě9ß:\đ2Ř•0Ŕśó­ăŔŐ®]L;ĺ:\íŘe0Ŕ´S®ăŔĄ.€]Ě<ë:\ęŘ50ŔĚł®ăŔu®~]L>ń:\çę×0ŔäŻăŔE.}]ýĚ?÷:\äŇ×Ő/ŔüsŻăŔ®{]úrú]ńű0;`vhĽ†t `v¸ýżúĺ/˙ţŹJ’$©´§‹®ýf×˙f‡»ďđWŻ_˙ĂŹ’$I*íé˘Ëě€ŮA’$If›€ŮÁě I’dv0;Ě’$IÚcv°9Ě’$Ifł€ŮÁě I’dv°9`v$I’ŮÁě`v0;H’$™lfł$I’ŮÁě€ŮA’$Iźlfł$I’ŮÁě`v0;H’$™l$I’dv0;Ě’$If›€ŮÁě I’dv0;`v¶ď!jŃö¨Ă»ĺWÎşÇäî×ó_đ’ŮÁć`v0;Hf‡É©Ůáđyř1ąűőĽÍÎ&™ĚfłdvŘűöË›ÖÁęŘcr÷ëy§§÷Hf›€ŮÁě ]ö~܇iv8|výIfĚfÉý¸ŮÁě{ëľT$łfłä~܇iv0;HfĚfÉý¸ÓÁ4;H2;`v0;Č-dúëiůˇ|]?¸ďî›čý™˝G p¬ZŢ·iGŁëi˙Y‹ăǤëU˝ó±ŹnäSćGVĘěfÉě~=áßĐř×ĐŤ/Ţx/ŮuĎX1;Ě9'ś?đg‡ôO™s‘Ě`vĚă÷’- ĺfąwOHś˛ďŕď*Mąe>vv˙ŔŹšbďü6żŽV2;pÔÎp—ŮAşÂěĐő¬fäMô~'™şž\Qw4˙<¤čKĄâ“5ţlŠĆ9âîîä#ł$łCě^˛ĺf3đJşv‰Ü›ÍđÝbě˝=ühĚśÂř!łĂČ?±9HfJg‡“ż˙f™ş ŢŽĹnúRîřo6Wť3ŤiłCŃ[ź0;ŢşŮA2;Pş<¤‹Ěéż ÷®íöS÷c÷ÂĄłĂ ŹĆáłĂ›IĘ>ě’ŮbłĂůßyłĚ ÍEw|I}řX8óěűcfÉě€ĺÁě ]ůg;l<;äłĂşłCl 3;HfŠf‡%ŢsłĚf‡Š»EłŮÁě ™¨^Ě’Ůa‰íŹţ±ş[lłŮA2;Ŕřě°Ę»mvŮÁě`v0;śá—Ěе<$łĂŠłĂ˙˙IłŮÁě ™8íě°ĐűlvŮaŹŮaüůíď˙Éńsěě0r4Ž˝űľńŰCNňŹ,Ě’Ů€3,fÉěPqøgÜxv¨8ăż,56)äîéłĂś§ÜHfhśÖz‡Í2;¬5;ôމf‡ÁżÚž9;„ŹĆÝ›ëęŮ!°¨Tżó#ŻňÎŹĎŤÓ‡ŮA2;€ŮAZwv퍢îßž~4nżTÝ8“őžÇŢů¬Ů!0ż$łfIWř1g{[»ľ‡’dvłdv0;H’ŮĚ’¦Ýh/qGovdvł$łŮA’ĚĚ’Ůa­Űył$ł$-qŁűŽfI2;€ŮA2;fĎý$ł$łCĹěŕźśH’ŮĚ’$If0;H’$Éě€ŮA’$If0;H’$™Ŕě I’$łf—’$If0;H’$™`ˇŮ€i\`vŔě°™˙iXđ endstream endobj 587 0 obj << /Type /XObject /Subtype /Image /Width 1405 /Height 715 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 9694 /Filter /FlateDecode >> stream xÚíÝ?R"_żŔa–ŔÜ+pn€ ¸`Nnv«Ś­›‘’™q#obdBbŔ­˛Š*_ ľWť§»átC?Ođľ3 üŽň™csút§@;DĦ÷Üţ‘—ä{Ą›ć[řß_ńGl_ůvoŞmë]*MlzákůÚ†­ă›řŁě!+ă›Lwéa‹M lć·U|Ë×ůFÉŮ ?ë˙(ľégÚ9ľĄźłm?0…}[;©¬Ş1ÉĹŔťt}˧QUĆâ˙’•٬eą]|KFfűŘ1ľeý+Śo”g´â4´ ¤^sáC&ľ @Y|cűř.Mr×&»ĄÝh†íâ»Ń:ß]â[Ç7qěßTVwS(ţř¬č‹7$Ź’Őe«›Çwő5o´Î·đäŽÂ—Wř,›/†(;÷ˇ }‰¨UN[‹ź(ý[źdQßŘú$‹íă»éŔś^Ü)ŢŠ±Syrđfń-?wűÓ‹+ł¸űéĹťä ŠÝ ˝±NŞv…§y•í$Ó©®oÁ&8Űn¬“zÍɇÜecťÔ.—?€’=Óűę®˙ťNÉM…G8Şa«ý«^sé:ß§ GfűXŢ•¶,dťŠĄ«[îç[úÉó$:Ä·Sx*]ĺžkOQĽ“p2ń[ @ň2BťâĂŐWË)ű|©$Z+Z#ĽC|ąńe„Jf¬Ą1®€ę,7ó•@|Ĺ  …©ů•i/ ľFĐ^ířQ^B|Źpd€SŻq02@ţÄ#ÔáÜä÷>6ą=E\€¬úŻńüO=ds~űóŰÎŮ8âŮě ‡ë‡YÄűÝŮçŻ/±xľ»4*‡syó0ŤŹňŽ{oęŢ<Í#/ŁkG öíŞ?zúěnĽ?Ý^¬ţaořňůG‹éxŘż0V?uÖďߏž§ó϶Ćëó¨V<)Mßżîö6}ÝöŻ Ŕ6úýĎ⎦Ó×říu:şďot\·=zśľýţk‹ét2Ý}<\ϨB‹ť÷±ěyúËźjţň;ť»LaĎ>ůa:ť­<ŕ/c#ľěîĎw¦7)'â˛ßŽF/o÷EPańŐŇĎÜô÷xĐŕŁĂź_…ŃÇŚxúm2Mˇ·Źqzúú*śysTş?ú~÷=ţýĐü5‡űpÝ˙ËGó4Bďß÷äÍç÷čĂňŹ łéóhč° MwuóÝż?â>ŽF~żkX8FýţÝh4ůółÂüăűŮJŮÝáÓŻă‹sÜŰľ5˙śĎĎ?>ź>Ü(0 š#ÜMľŽ.<Ţ;Ŕ麼MŢ­´ö}NĘűđöń3ŮóĐĹ´ÁYôy bzëxőę}Ěy_‡~ŁMşń[,ĆÖBPهŹoA奅ú“ßęňĎ~ŃRWoö˛§.gńlhď÷˙|b¨é›obI-v32´UŻTrUCöm@Ą[­@|A|____ÄÄÄÄńńE|ńE|A|_@|__ÄÄÄÄńńńńE|A|_@|__Ä_ÄÄńń]uu¦)/dŹďč­'*/dŹoÄťŞ ľ?ľńěĐâ ůăoW‚řBöřF •ń…üńŤ‰C/äŹoĽ;ô€řBţřF Ôń…Üńťi/â ąă+˝/äŹď˘«,/äŤďl0°Ô ń…Ľńý:ŕ0››ú"ľ1ľç_˙kę‹řBÖřţfę‹řB ń5őE|ˇ†řv^L}_Čß^ŚÄń…ÜńíLâ\]_Čß^ŚŐń…Üń5őE|ˇŽřšú"ľPC|M}_¨#ľ¦ľ/Ô_S_Äꯩ/â 5Ä×Ôń…:âkę‹řB ń5őE|ˇŽřšú"ľPC|M}_¨#ľ¦ľ/Ô_S_Äꯩ/â 5Ä×Ôń…:âkę‹řB ń5őE|ˇŽřšú"ľPC|M})p;*őv~‹™úÔÁÔ W¦ľ5™úä70ő¨eęŰ5ů§ľCę;7ő0ő0őŔÔŔÔS_S_L}L}řrcę _wnę ßĐÔ Ž©ď»A¨aę;0ů§ľ3`ę `ę €©/€©/¦ľ¦ľúúđĺŢÔ żóx1ŮŤŁgňO}'ŔÔŔÔ€ĂÄąAČ­c`ę `ę ŔaĽúä7{ÝlŢ5ů§ľC`ę Đ7¦ľůuço ;רeęëzBdÝVđ· ŕˇmŰ/Đź?KŢgóŮb÷qmhz|˝•?h±ţŔ!ľ‡dgIš_oĺ–ŚoőÝĹwg6UG|Ĺw÷řúŠíě"ž â+ľkŁüÄ÷çě,‰řŠŻřÖŔÎ’ŻřŠo^Î1fŁ·ŃĘŻÓŹŻżżn)ŽďŇßYľŰçď⯒§IľšSţ‚dĐ*~·|ďäne_mÖŮ^‡­ă›xs»1uSQ|W˙Ňj/ÖźŞ¨+-Éď­8ľ±~ďD|ËżÚ$Ř^‡-ăeďćDŁŁ ľkĽö|‰;TŢrâ_C ÚÚ—3ůś…ń­řj“ŕc¶‹ďň[xőÍš¸­4ľkŹXú“íúÓ$_Í©Ç÷0V0 ^IvY|[v čÇścĚÖńMN†Ë#]ßÄű;‘Ś‚ůXŃ«9őřhĐŠŹ1%ú)úßÍ9Ç]ă»E¤Óń-|S'oJ=MËŢ致H7ů9[2ľĄ_mRścĚŽ‡:é9çúGŢ•ńMO— Ó˛ü4Ń®/Čá­č/mßĘŻ6IÎ1fŰř–® M¬7Ş\ç›zWoÜ‘˝×:hUń-9ć[ůŐ&É9ĆlßNůR‡äbĎťâ›JÂúgęíú€ý …?Ü®°ßrŽ1ŰÄ·S±¨ě§ńŤ­:Ňľuľ‡´‚Ăú%ËŰÄ÷‡ścĚVń]{ďî1ľë-Ş:ŇŞüvĐŠĎ[ű}GńÝ»W'Z°U|;ËgśnŃÖv¤ä…ŠďĎ-uzpňd:ńÝçłu|Ó?îî%ľ±}GľżšvĆw/–ţˇeuľâ»3'Z°K|;kg[U˝i‹{©¬÷Ż*S+ľ ű´ż[CTĺ>ßßť ťhAĹ;3 –tľCw:ɢ´#ťŠYZ;â{ĐA[ß'ť{'YěÍ™-¨xŻ'×!mvۧwÖŹDVž)ۦó‹=hĄńŤpzńŚăŇ P\ßH˝ë“çŁFjÔ¦ë¤Ţ˝Q¸ÉKń? §ßZz«ĐŐç¶±Î>YmFÉ›}y—Ö¨Ú>2uŰf[Ju$ভř™Űđő8Đ EŮ UńµĄäN&qf(~·ĽĎ’™^˙ËU›©—ľ˙+–§¶m?ßĂZŃMë˙Ż´°™úެ6Ł,żé÷YŃŹÄĄ÷{GŇGËĂRtEśhÉă°V|}¨HE×e„öaön hRa0h-áŠčAŁÝůÔ #Ťěl닎4jpn[_dÄ QŰúŇ€†X%jĐÚ§#@:b ZŰĚlëK:b ZëÜXm_wţb˛ł·@ .ímPąä7› ęđ`€üÎ}äPÉÂGnŮ âÖ d7ź€ěî}äßy<€ě&á#7€ě®ăÎ d÷ć#7€ü†>rČĎGnup–@ l, P×r¨ĂC\€Ü.cd˛{}7ŮÝEß äÖŤgÝSś€ÜúvרÁŰ«1ČÎ-jŕňux™Ű] »A qfă¦Ćąô5iŽî|b8q\„†™ŘĎĄA-őĺ0^âÚ 4K?\BˇQ_Ž[ŔśGř©ŞYîâý)&ç˘)ćScŔA&ľĎ¦ľM2Ĺëyç!#ům‡đĄ`˙Ćńpţľ°ŚĽ!.Gď1~ýjńä_ĹF¸rŠ1{wöôąiSo±°¦_Ś›Ç÷·Ű?«JűĎ‹ÉĐǡősŠ1{˙ ÷=ž>ßę˝y<űx˝Ný»ń,"fK©=»}^DĚ'Łk_ťZŤ¬>aźş7łßüťÇ“c58ďߌ&oÝŤ·ÇAjESďţőóOc:ľď_Żz\Ć˝A`O?áöď'ďw˙Λě}ţ~<ŕ<Ĺí÷ďFŁÇéWuc1ß•^/ár0zyŹ_ ~ŤF×ýľ/TVł7cĐîM‡OÓ}ř5“Z<­ĽßĎď¦_0ßË“ĽŚnöۇŢG°FźÁ:bżFţźŮt<ô7]ÁŐż˝LWb~Ěă1ůř‚Ţ~|]›żw½3‘Zú{פâ^ćľ.­ózě[*u_·Ř;˘÷yR­C»t.îßbŃ iÇmř¶l›Áń/ď>›Ď6˝ë(CÇřĺúős‹ˇ¦|Űĺł}߸€ÔpÓë°<ŘH‘ĺéć{cţ-vܡmş§đďmwĂ+.í,ĚĘä·9źs9îĐ6[Żh˘·‰oov2›5啜Ĺ/G»fľ'qôzłeCçC_p–]5głSçYÔ`h€üěďP‡™ëYäçz5¸tM€ĽOŤ@váÜw€ěúÇľÉŔQš?€ěž˘kr»Ţbkjö¤»x2Ů=ŰÔ żŰč€Ü.Ž˙Ş^Ghć$7€üĆ›5Xo÷“`nGíńż˙÷?#ŘIŤÇ]›5ŘÓî™P©Ć“|ĎšsEOÄÚßÎôMăÄÄ7;;Ş‹/o ěl&ľ ľ5č.ěl&ľ ľůM"'ľ ľŮ ťa,ľ ľůőb¤râ ⛝ËhŠ/oďpg‹/o~·19ńńÍíÂĆâ â[ÇAߙ̉/o }ĎtN|A|óôíëśř‚řćviĄŻř‚řÖ`aĄŻř‚řćg{ńń­íÄÄ·W1:ńńÍ­öô_ßü¦ďB'ľ ľŮ=¸›ř‚řć7Ą_ßÜÎě­#ľ ľ5Ů[G|A|ó{´·Žř‚řćgońń­Á…˝uÄÄ·‹‰Ô‰/ov/Nł_ßüĆ>q_ßüîâJëÄÄ7·«¸Ó:ńńÍ­ë7ńń­Á۫։/ov.%$ľ ľ5ĹyňöŹ—÷ý×ß»ň§Ąb«“zز§úógÉűlü7|e±×_hy|1¨ę`ěßŘ:ľQ}S ńý÷5_ß˝¸ŚűŠřĆîńÝ:VÉřvjŹď÷/šř‚řî',ĎŰOG›ßý®š:€nqÁ†˘řv–—ćĆ·ä2B?ĎoG|ý™ľíµRí4ń~ęyŹďuń_`Ó÷úţ:ŇšöŠ/đcŁčŠŻřąÝÇ…ö6¨˝â -q›ĽĐá ń_`cčď-ľFS| őăf_ń5â lę˛)[ü ľĐ&12â dĆ@|üń}2â d÷>1â d—ÚÖŚŁŚďĹ=zy6§iŘ”7ű>·5ŁÖřö]ť Ş5ć‡Ëg?ćŠ/ŻcŚíP|NŠř‚ř"ľ ľYă{kE®\_míjlÉ4Eľě‰/oÍń=Č…zc—řƉĆ×1_ß÷˛>ĹŢŻÁľU|C|ĹÄ÷ÇńÝş°Ńľ˝ŇÄÄwßńíŻř‚řţył/ÄW|A|óżŮC|ĹÄ·öřţ{‰˙ę‘üPěűŤßîĹź¶}ţŮƸ-ż’ô҉őW0’/´ň‹/oÝńM5pí¶˘;$ľ‘úŁ7-ż¬•{.=mIŢĹÄ·Ţř¦J·~cÁßäS%_@$_č&ŻX|A|k>ćű-ĂkËĆVă›\SVp7v]ç»ň¤+·®ţ‹°zĎÍ_ń!…3Ü@|«â›lŢę}“wć»Ţß•‘LŢZ|OńńmF|ďŠVŇ–*ŐľÄ7}ˇ‰oO‰ó)’˙JřŔ hT|{qŰ)YJ[\¨•,(ľÉ+•LÍăűůÉ{Š/oôă¦sjâ/»)ľĐ–řöĹW|A|s»=ŤřFĹ–’â 4+ľwqy"ńŤ“hŻřBKâ;ŠłS‰oB'ľ@Ăâű´8™ăĽ˙tÄhx|§oť“«oG|¦Ç÷íĺ”9}zĹÚßxę ľ ľ™ť%¶v@|A|,}v1â â{P×q­wâ â›Ű‰śc!ľâ Çß9ÇB|ĹŽ+ľ§rŽ…řŠ/U|Oć‹f+ř&_hm|Oč‹#Śo*żâ ­Żs,ęŤo/´2ľÎ±Čšßoż^ţ…řBËâ닌íMüN|ˇĄń˝‰+aĚßT‹S_ń…6Ä÷Á2ß:Ú›¸„łřB«â;±ĚW|A|kXiö*Śâ â›? ŹÂ(ľ ľą]ĆPó/v(]î ľĐ‚řl(YűR3ń…Ć÷>Îu1[|cí7‰öŠ/´!ľĎ;d­ď7kE_hQ|g;Ô“ßNŃA‡Ĺ÷¬Ďý÷ÓÔ3ËâYkČoáĆ8—qošF|áô b`ÄČíŢŐ3ĹČď1ŚřٽΌřŮą†PÖŃN¬ô_hŁžťęKŻřB{ÝąŚEŤí_h­Ç脌ńÝěžâ 'oćó¶ćµW|áäuí¤ž3ľ›ŢU|áÔ]ąlĽřů ŁgÄČíŮůmâ ä÷65 ¬Żř‰;‹±A_ ·ë¸1Yë»Y~ßńŞ-ţÓň¨ý˛Áö“ĚśŢĂźá6uu.¨Vű2݉‹gŠ/o~óM_ßÜ.âA›H|á´ă{ëúmâ â[Ă{<΄N|A|s{Ő9ńńÍČw¤sâ â›˙o_çÄÄ7˙!_W±Č´ĆĚR3ßo‡|íŞ#ľ ľůŠŻřBâ;tČ×1_ßü&ůŠ/o~ ‡|ĹÄ7»žCľâ âë/â ­ďdáŻř‚řć?ä;ąlKÍŠ/´.ľW1”EńńÍm=Y_ßÜ^]ťĽž űµcľĐľřžÇŁÖĐޢ߉/´$ľ·q­†ůă[ň[ń…VÄ׹Ĺu··¬ľâ §ßnXh&ľ ľŮ]×~ý8ń_ha|ă\ ĹÄ77×-®{±Cérń…ŤďĄÍ,5ńÍďŢém5Ĺ7ż_hM|§No«­ľß/´,ľgNok@~Kî&ľpšńuz[ýů-˝“řÂiĆ÷ŮémÍ&ľp’ńíÚG]|A|ósz›ř‚řÖńÖŽ3}_ßěG^äÍn ľŽ:Xj&ľĐ‚ř:ęĐ„ô–ćW|áăk­C˝ń]űĄřB;â{72X[{‹~'ľpňń}r†EÚënвřvĎ:XW|+n_8ář:ę ľ ľŽ:ŻřB+âë¨ř5Ä×QńjŻŁMZí ľĐ–ř:ęĐú–´W|áäâë¨CÝőu†´2ľĎ GjŽď7â m‰oו3›“߲#óâ §ßŰč `3ň[ţ±¨řÂiĹwú®~Ç@|á´â{#a_ w|ďăRŘÄČß·W]«ýďň˙‹/´ ľWq§~µÚ¶ú«=Çw<…j‹˙´|®óľőă\˙j_é°öËýĆhśîÜĹŰšŇŢÎÁN/gPs|K~+ľpŞ&N-nR{´Ą$Đ4gN-_ ż»¸2â äöę -ľ@v—N-_ żq\„FŐ7ÄZ ;1őÇ÷đ—šĺĆ"ßfÔ7ż_8]ÓąEľÍď7ń…Sçă¶ćĺ·änâ §blOť†ĺ·ôNâ 'ž:ÇE|áDř¸M|ĽÎŤřąő|ÜÖřę2B@ř¸­Qéýß]FČ5Ü 9×pë.|ÜÖ¤ôţ‰o/śv|oăZřšßżsŢťá&ľĐśřÚL˛1íýöń…Źo/î…Ż1óŢoŃ=Č®fâ Ť‰ŻŹŰ5ń_hI|ĎÂÇmâ dŹďеŰÄČß·™î‰/;ľ¸Ó=ńrÇwbuKÍ€ěń˝Ś±ę5k­Y8ÉZ_ëĚWß?˙ăôb8ářÚÖˇqőýF|ádă;´­Ccë[r7ń…cŹďĚ:ł†ć·ôNâ GßëĘÝ_8ňřNÂ:3ńrÇ÷Ü:3ńňÇw—B&ľ@ćřvçÖ™5s­řÂIÇ÷.‚×ČUfaµśr|go’×ĐôVäW|áă;°Î¬aí-ú­řÂIĹ×~fÍjoĹ-â 'ßžufMjďf7Š/|ígÖ řn|«ř‘Ç÷Üu3ĹČßQôTŻÉíu!8Éřv篪'ľ@îř:ÁB|â;›‹žřąăë ńjŻŤ|ĹČ_'X/PC|ăBóÄČ_'X/PC|Çq%yâ dŽowî‚ńâ dŹďĐ M‹oń…ŠŻ‰Żř5Äw7‚'ľ@îřÎ\Áâ؉/a|ťY,ľ@ ń5ń_ |q/^â äŽďÄĄŰÄČ_[ę/PC|M|ĹČß^őÝő"Qâ â˦ľçâ âKö©ďÎWG__vźúž‹//٧ľ;O|ĹÄ—ÝuĹÄ—c"ľ ľ//â /â â‹ř‚ř‚ř‚ř"ľ ľ ľ ľ////â â‹řâ‹ř‚ř"ľ ľ ľ ľ////â â â âKmnG@ĄˇV@Cü?mÝa endstream endobj 581 0 obj << /D [579 0 R /XYZ 89 770.89 null] >> endobj 582 0 obj << /D [579 0 R /XYZ 251.553 600.141 null] >> endobj 578 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F13 583 0 R /F11 584 0 R /F8 585 0 R /F14 586 0 R >> /XObject << /Im2 560 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 590 0 obj << /Length 149 /Filter /FlateDecode >> stream xÚ•Ž1 Â0F÷űßŘĆËĹ$Í*¨P\Ä8•µŐ"ŘÁ:˙ŢXtptúŕńîqŚŚ -#Í×"*8qg†wZYŃŞĚĺu,a’ éf‚ŰËqlĆg>ËŮáŢô§·E«H7ŇIbč)d˝ňƢ¨Ş]â%X™Pŕ1YbŇ^±§ńç©ďţ´ Ł Ëż©9»1„ endstream endobj 589 0 obj << /Type /Page /Contents 590 0 R /Resources 588 0 R /MediaBox [0 0 595.276 841.89] /Parent 520 0 R >> endobj 591 0 obj << /D [589 0 R /XYZ 89 770.89 null] >> endobj 588 0 obj << /Font << /F22 396 0 R >> /ProcSet [ /PDF /Text ] >> endobj 605 0 obj << /Length 1706 /Filter /FlateDecode >> stream xÚťXÝsŰ6 Ď_áGé®Vőm«oiâdŢÖÄ׸ŰíÚ]Ž–i[7YŇ(©iö×_’ÇÉe{1 Hŕ˛;ÚŽÜŃő™+ăÇĺŮű+ßů®Ç~4ZnF‰;ŠĂĉ¦Áhą}µ.vŞj´±Ç~äZýçňgŢ:“éÄĂîhEN8őyĂĄNËu·Aµë¬äiŮ6UŰô ĽĐ ÂŘqŕ„‘X Ď{®ëZ·«FeEVlYCşSEˇs&öŞŞzNVll?˛JłWMVb$%Nű±Řđ§ÎÄ‹ŘĆr§íq[ÖtÚ5rZśĘiiľ!˝8­¬ćµ¬Xg©jşť«GŃŔC­ekąáń;O™L­r]˛B«ŁŔy!&îČ N>_źŤľ’ŕĹ]c´ÚĎ‹M)‚|8Śë1Ľ‚©•ę<ŻZ“ČšŃm‚ ˇU›řcźĺÄEŕ‚=¬ Iqç$ŘČbbU§&[Qf'+Db'*5řÉmbľÍąEÖ—ËůíýĹOç77ł_ď—,fń ťß\×/@˘NŻ.ą§śwvpĂŔŤ¸. ‹®ÍSĽ!ŽĎQHŞ: ř{M·˝nW=źáv*j_vŚwEN@^7Ę4}™{Č 8sĄĽ TžźR@‡?Ôů®źŐć'•cńRN —âáRt˛ŔťXuşÓűŽ[óČC¦ęXJXPQ™ői1»űďCp8IŔB[÷&Řɴͦ´l ®ą°ÚV”ʬElpŮ0ĺžwI…=ö>X¦]ŔTŹ”^"żą‘ŰČQ<Şé®(čÄĄ»@d‘+Đ'ŹvYe/„xĺ"Łr<*ź÷Qô®4+ BË.X÷Đq€—#‰3ýCÇxěž¶•í˝p"GŽŹá%±€ĘK˝¸”ëMĂKu¶¦wĽX©Ě»8[/zÓńäďşFs†N}×}čh¦NäŽďs,S@gЇ…)·đJ2qQX\¶L!ři,ŇĽĄĆ‚)9 Q‘äj—ý­éŻžH© ÄĐôqP(‘Ä8vv˛ć”SŽxëUWÖ%¸býôöŃpűJ*ßgTęa¤¤˝äů]k €pÍŁ7ő …Ă©‘#9a[•ç§›Ą^ ýtMLľ QÄ/Ś˙ľo­đ ĹŮ÷pÄšý Ś´4F×UYtK ®ŢP\B ›‚5°… u´fʲ;Ą”bn­đ(#ÂĄÂŽŇ`}Ş‹“’-ü”™ô5]""/ëŁ'šä®Av^hĂCč˝§Ó® ÷Ą Çwo›={©ž÷ö4:ń7¶á^ŽC"ĂB ©O7$»¸Ú=1^°çp±é(hU~B;’×ÁA4YXÝr ť /(©Ů^wúÝŰÝ‘±J™Z*Ý`cýr;źL­ós;źŢ/.>Ýß~Y.ľ,ďç7ËŮç_gç¶=ÄołËg}X’t­ńŇŰ5BźÎ‹ůÍő‘Z {Đ|§_ű\%í*~qŁ?ĘZdČ#|y˘ĺ«!8ÔŇ}‘g+ŁĚ#›¶H»Ż¶Ó×#Ť*•/Ëű;Ý,éhł“úŘe¤¸sň!@§86|ŠŢ–ÁANśţŐ?苪~#ú©<ô•P*N(˘h"!¨›-|ëqŻ9ť2=U_‚âPľPĺ÷lM‰AUN2Äę'Ş‹'*ĂA02IIM0Ë©†3ŃP©?aN׫·Ć•Ç+DŇkal…¶¤{€N k­ĹĚŠAřŐĽň™Ťěţ3›Ő=ě2üÂ)•ś¬„WŇߧݱ’ňśBż.MÚ G ;řćZ7Ăů^đŽĺ> endobj 592 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.276 498.78 443.735 509.684] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 593 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [473.817 457.246 513.996 468.15] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 609 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 445.29 167.927 456.194] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.783 213.894 277.511 223.822] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [297.843 213.894 493.15 223.822] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [362.637 200.963 461.296 211.867] /A << /S /GoTo /D (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) >> >> endobj 597 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [99.384 105.15 215.886 116.054] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [330.639 105.15 384.098 116.054] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 599 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [131.066 93.195 250.895 104.099] /A << /S /GoTo /D (aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) >> >> endobj 606 0 obj << /D [604 0 R /XYZ 89 770.89 null] >> endobj 30 0 obj << /D [604 0 R /XYZ 90 739.935 null] >> endobj 607 0 obj << /D [604 0 R /XYZ 90 549.218 null] >> endobj 608 0 obj << /D [604 0 R /XYZ 90 549.218 null] >> endobj 34 0 obj << /D [604 0 R /XYZ 90 549.218 null] >> endobj 610 0 obj << /D [604 0 R /XYZ 219.513 299.929 null] >> endobj 38 0 obj << /D [604 0 R /XYZ 90 278.186 null] >> endobj 611 0 obj << /D [604 0 R /XYZ 105.223 192.161 null] >> endobj 42 0 obj << /D [604 0 R /XYZ 90 172.475 null] >> endobj 612 0 obj << /D [604 0 R /XYZ 252.389 96.348 null] >> endobj 603 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 638 0 obj << /Length 1505 /Filter /FlateDecode >> stream xÚŐXKsŰ6ľëWđHÎX ľ$M’G±S§ŽâĆJsH3Š‚$NiRá#nÚéď»”(•´eµMŰ–‹ĹâĂb_ 3–3^ő^L{OÎ…0†öĐľ1]Cf>·=ÁŤéÜřh¬ľ#ü7_Ę(›ËÜę Ź™a5Ź3$łŞ\WĄőiúşw6í}îqPĚ ®y8žÝö>~bĆřŻ f;Ăq§Ąn W80&Ćuď‡ŰĹą=ô> endobj 600 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [136.073 702.45 301.801 712.378] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [360.204 702.45 513.996 712.378] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 640 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 689.519 135.828 700.423] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [239.219 677.563 292.678 688.467] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 619 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 661.996 202.796 670.843] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 620 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 642.315 205.864 653.219] /A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> >> endobj 621 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 624.69 214.96 635.594] /A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.392 607.066 279.12 617.97] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 623 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.915 526.323 265.3 537.227] /A << /S /GoTo /D (structCStreamInfo_a36fa897b242eebb936d99010a8c580be) >> >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [136.073 462.787 301.801 472.715] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [360.204 462.787 513.996 472.715] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 449.856 135.828 460.76] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [239.219 437.9 292.678 448.804] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 627 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 422.333 202.796 431.18] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 628 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 402.652 205.864 413.556] /A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> >> endobj 629 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 373.072 214.96 383.976] /A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> >> endobj 630 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.663 355.448 308.97 366.352] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.902 278.048 279.629 288.951] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.915 93.195 265.3 104.099] /A << /S /GoTo /D (structCStreamInfo_a36fa897b242eebb936d99010a8c580be) >> >> endobj 639 0 obj << /D [637 0 R /XYZ 89 770.89 null] >> endobj 46 0 obj << /D [637 0 R /XYZ 90 739.935 null] >> endobj 641 0 obj << /D [637 0 R /XYZ 269.286 529.476 null] >> endobj 50 0 obj << /D [637 0 R /XYZ 90 507.769 null] >> endobj 643 0 obj << /D [637 0 R /XYZ 269.286 96.348 null] >> endobj 636 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 652 0 obj << /Length 770 /Filter /FlateDecode >> stream xÚťUŰRŰ0}÷WčŃž!F’oq¦íL†‚IC&ăÄrđŚoµăŇËôß+yĺ¤O»+í®ÎŮ]I-FçĘŔWŽĎ(E®îÚÔF~„\Ś›č%ČŃťjč†ÖˇVO‚,c iPq¶ý Ň"a·ş65UW»÷/”ˇŻ|W?#ŇdµÝ1,´H•»{ŚBľ~°n¸]ôŘxĄČ¤— š*_Ľݵ,ÚB¤±C×H‚1Vű“ŃP-ňpŤ0ÍC=&OilƨCMÝ0]H8Ę´ŽiÚę"¨hyÔp2ĺR˛šś+č®Ůď÷5“—h6>ąš]ßřă6ňüáärŘ×a©·ĂS™X5a–Z±ä_ĺ ß|ŢÉçľç /g)AĹ€ŃU<yç»hę¸ ±@Ž„tÔ8Ş 4^…F d­yč<^ÁRµ*Y‚^WPľżîEwÝ‹.ôňU CV-ĘxÎBjČs¸6őO;îc8ÖĄĺJ¶Ä­FQYYĹy&7tŇ6 ąQK9v»ô¨ÎłNB0H­©Ž2$Ę“$רĄ>®Çě‡0¤n®·9g»Ř\©iS®Qĺ;ťQ{ĎE ÚŽnSI{#EŻ—Ő©ĽĄŐťćÇ}TĆk©Í=© ™Ř×x~ě…ü@Ŕ„úłł‰P®=_sLő襽^Oëäiw ń›ĆűűžŞ´ĐGY/Xő:r,Q¶37ß-’ߎCP‡±‘Eۨ8‘Źć\şI°`r¬‚jwšžfg{Ţ6ČëUQËIźk”_µH„F¬ěm±kĺń™á ‡?´ŻťĄc× ˘2Ďx6‹yʤV5o:čřČMĎ2^><ăJ¨đMăPn×e™×Y¸×ą-iWw©{(r8žµëpČ^8ş®żĄw8Jď (˝˝(ż=°˛uÁľ×Aˇ‹ÇKČ­{•Aʦńo¦oŤÎîďÝĺ_,¦oýĽ˙ťs0 endstream endobj 651 0 obj << /Type /Page /Contents 652 0 R /Resources 650 0 R /MediaBox [0 0 595.276 841.89] /Parent 613 0 R /Annots [ 633 0 R 634 0 R 654 0 R 635 0 R 647 0 R 648 0 R 649 0 R ] >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [136.073 703.446 301.801 713.374] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 634 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [360.204 703.446 513.996 713.374] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 690.515 135.828 701.419] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [366.073 678.559 419.531 689.463] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 662.992 202.796 671.839] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 648 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 643.311 205.864 654.215] /A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 625.686 214.96 636.59] /A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> >> endobj 653 0 obj << /D [651 0 R /XYZ 89 770.89 null] >> endobj 54 0 obj << /D [651 0 R /XYZ 90 739.935 null] >> endobj 650 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 657 0 obj << /Length 152 /Filter /FlateDecode >> stream xÚ•Ž» Â@DűűS&EÖ»wÝd·NÜ.¤lÁ•ßµ°´:Ă0†qcG«@‹­Ľňąä'xF‘keE#DT‰ć43˘ťNÖmÓÇö‘fb99ŽńŇżc?·qHëPŇ&ĐťôdfčŮd U‹¦ŁŞfÄ©/ÁĘx‡çĽę°3ńŠí‰?Żľüq9Ł ËżŞč2| endstream endobj 656 0 obj << /Type /Page /Contents 657 0 R /Resources 655 0 R /MediaBox [0 0 595.276 841.89] /Parent 613 0 R >> endobj 658 0 obj << /D [656 0 R /XYZ 89 770.89 null] >> endobj 655 0 obj << /Font << /F22 396 0 R >> /ProcSet [ /PDF /Text ] >> endobj 664 0 obj << /Length 1136 /Filter /FlateDecode >> stream xÚťV[oŰ6~ĎŻĐË T‰ÖĹĘžś4é\¤M‘xëŚLŰDeQčdư˙>žCĹv’čC"ňçň}çBÇŢĘ‹˝'1}Ďf'ď.óXĺ9ËĽŮŇ+c/OË(ŹĽŮ›űçkŢjŃ!Ëb? îfQ#ŤŠq‘€Fě…YĄcF jłáÍ"¬e#PëĎžŻiŽĽ2*s–;Ĺ"J‹ § Ü1±Ĺ^âu ,n>śxó0KÇţ†Ë&ŞÚ–n!:ÓkŃo°änˇź‚$ön䦭ĹF4šë ńĄjz”«ĺŹť~‹łŘü%Ż96HŃĐB´˘YČfEv›ŔćÎżĹ1kh7ą9˙ăţk°ŘźÜ‡`ŘH’¨Ěrdăóőů§÷WÓĎA8ŠS_H€kVěb‰_˝V=‰dŹ_^i°Ě„\‹i‰G١št´rf¬ ó+µieíÜu˘oĹ`.É|Qď‚<óŁ L ćżG`9\·Đ!Q‚Ţ}hiéË˙É;śż•÷‘)­¶SŃŁ\­qü`î»ďĽS[HČ ŹM§.-%Ć”#ltŐZjyŰ9łOX`°¤ZI§Ťz ouŘ %3ÁçYs“ŕp”ů“şWxCjü‰ÍŽ=R˝Iž¬ĄŢщŐMünŰ ŔŕrŐń…/Ł©x]“qľŐjõŃî5,;ěe(ąÜŮl3ËšŘŕJ6řĺt ŔýßwP"€ÖY.˘śĄhůV‘ţż;µĹĹsÇŔî cö*‚h†.L§wr«dCa¨ĺŃ5CóŞă„ŕAŽDzPhîűîrTxET±z,‹XIôXyÎ +ůÇ‚65O˝°ŚŇśT:aĘ«Á;Óéíý—NU˘ďĎ7‹úJöŚŕáŮdf _NŻ.~CÁŻ-^˝_š&Gż[ážâöß×§.+Ěđ¦9ó†kŚßRÄ»ŢÖ °Ę«5®ž§űlżz1í¸>  Đ$I|‡‡ Ć©?§q)Ä‚\JJťVCĆ,v4íBŤ†‡)IŁQš3B:2ś” "M#(‰ “¦Ăj ďA˙&EĄKîĚÂ1XŇž,LĹ,ěăh6{OŚ„ń2^U˘Ő=n´łłTu­ Eź°Źâň¸;AŐ9vAFЦ…é• ťÚJŢ·©Zm_µWz·69Ä1Î.XmäjMÜ6J»p=|4§\Gośí¦Ć‰ ¶0:îZŻR äiµí,'ŃOtÖ/=ýśŢá6„q Ů@P‘Pmµ•EaŮŠ"5żV˛ˇ(†˛řdŔµrÁż¨’ENýÇŚłdŚć‡0ççťÍORF LiÓni„> endobj 659 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [102.761 533.473 141.555 544.376] /A << /S /GoTo /D (main_8cpp) >> >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [293.957 533.473 322.51 544.376] /A << /S /GoTo /D (main_8cpp_a0ddf1224851353fc92bfbff6f499fa97) >> >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.861 509.562 222.656 520.466] /A << /S /GoTo /D (main_8cpp) >> >> endobj 665 0 obj << /D [663 0 R /XYZ 89 770.89 null] >> endobj 58 0 obj << /D [663 0 R /XYZ 90 739.935 null] >> endobj 548 0 obj << /D [663 0 R /XYZ 90 549.218 null] >> endobj 666 0 obj << /D [663 0 R /XYZ 511.624 399.171 null] >> endobj 62 0 obj << /D [663 0 R /XYZ 90 381.025 null] >> endobj 667 0 obj << /D [663 0 R /XYZ 90 282.946 null] >> endobj 66 0 obj << /D [663 0 R /XYZ 90 278.239 null] >> endobj 668 0 obj << /D [663 0 R /XYZ 90 188.685 null] >> endobj 70 0 obj << /D [663 0 R /XYZ 90 183.978 null] >> endobj 662 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 672 0 obj << /Length 1077 /Filter /FlateDecode >> stream xÚ˝WMs›8ľűW0=%31Ř™7ín»žMcosđć °5 ’ Âůő+Đ+ ćŁÍa÷$^=ď×#ŚŤŚĎűĺŕý'Ű6<Ó›Řc2܉e:¶e,cueŮ×Ă‘mOś«ŹcĚ‚aDąÚşú+Ĺrý˛ü2xX~ , ‰ «€p\Ó9†V/Čäű/2GŢ­q(¬bclŹä‹Á·ŞŇą†kz.˛r:–52=ËpmÉеĄÉÝőp‚ĐŐÓĺ\ÍćłÇVND˘ =sIÓ0‹nZ<-ÁššÇY ł5¬n螀§ëÓ­,%‰Y@­±9Oäxkz¶§vŠ5˝T Ě3Ölq(t\ö·Ŕ(Á1l1TĂ.‘Ž€+żĐaó9”e¤Ź p_U°YŻIňŇ ZśJţ(Űgx›îOCę7H+ŕsá ŮŃîÄÍ«¤ŹâëŻSt4Eľű?ĐjKްH䦝!śqŇM–´µÁžâ2{…”łFŃaHűĹ–Pü Ac’6z ŮŤŚäÝ€/{ÎŻs=+ 61đâ™ňp¸– ÝâĆ Ô*ĐÜ- (ű®5w°Á»łÜ”ˇ*l‡ýHß•!)µ!g*ąAX…ŕ˘b5ĎŽ-RéÎRĽŘEHZ2Ő+ňřĘpťę™Ä í.» ńgÚĄUDö$ꬸŹO3-ŕą]©pÚ¸P’2Ř!öO€ŘaKt ş–2®s±´l·năăĹ2B˝ÝsžţÄ'çW|Zç8˙ˇC~ż+O$|crä’ó]töëG†Ąż’@W°.˛f6C¦í@Ýëó¨ŚĂG™V…2MéßKżżĽ?•úVÎ+ůěNĐw ÔĹÝpWËE®»< kçśşëń—âS[ HłHä ębUpXÍöéÓ¤Ľ›´{çÇ*7íLÜ·y°éĹ–n¶eö"*Ní$#~őâ’¨ł¦v…a\ź[DÜôɱ| Iű4볪;mŹłąć“Š]Â}Ą w%‡RéwZ}ü-fŚDiýaŕÇGxřĹôX—˝ňřé=`c- Rk}‚ŁX^w ôD {Đ}[Ńt«j݆\ő=7ÎrńĐÉşÓ‰ )w¶nDyíÚń¨Đţ^¸ö@Ĺ ‚”ÉŁ, Çî+ ‰ßpĄU6zęoI¬ĎY¤Ĺ ˘>|ř wţŮ–’SDęPÍZ­t[óyúÄ–^)Ż.˙ŇnGćŮoýIű% ·ĺ endstream endobj 671 0 obj << /Type /Page /Contents 672 0 R /Resources 670 0 R /MediaBox [0 0 595.276 841.89] /Parent 613 0 R >> endobj 673 0 obj << /D [671 0 R /XYZ 89 770.89 null] >> endobj 670 0 obj << /Font << /F22 396 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 678 0 obj << /Length 401 /Filter /FlateDecode >> stream xÚĺRMoÜ ˝ďŻŕh¤đŤÝ[[ĄiŞžZß69łHŽ0îÇż/,ě¶«¨ż §y3đfćÍ OŰ®öð»ţD) II&Đc yŹDÇŔ`ŔľůxĐ/ŃŘR†/…Á‘ęÉ Z!ďh%Ěz]Ë÷;oěŻ3…pĸ¤•"â˘ÖŔ–`Ś˙%uk¬\zÔK*+•*Ô3Y¨źm°ĺż>x¨`ĚÉězUĽ5†mŚ'oónńµ’ö¦ç“Ň ’m}üé⡠ÇŕěT ±ëÜKĚ9Ţĺ&Ďýk1 d'o·»¬ź(Z˘¤Ľë{ V?ßůiąHö-帹Ç—[á'ŰQgrź¤˘ů‰hŽÍr’LKxÖ&¸řÓŹË ŁL&q Áú8˙.®±ăb¬)ŽŢŚ[j\GŤ`˰jŢĎ3¬-ajgłćvS¨]’DP/D‘tŢCfÚĹ‹Ł–´eFx“RŠ´ë7gxßż ^ŢΫ›Ů·„vŞ!ę?Gvio†Ý±v㞠endstream endobj 677 0 obj << /Type /Page /Contents 678 0 R /Resources 676 0 R /MediaBox [0 0 595.276 841.89] /Parent 680 0 R /Annots [ 674 0 R 675 0 R ] >> endobj 674 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 481.935 156.636 492.839] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 675 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 472.037 513.996 480.884] /A << /S /GoTo /D (section.7.1) >> >> endobj 679 0 obj << /D [677 0 R /XYZ 89 770.89 null] >> endobj 74 0 obj << /D [677 0 R /XYZ 90 739.935 null] >> endobj 78 0 obj << /D [677 0 R /XYZ 90 553.953 null] >> endobj 676 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 683 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ•Ž±Â0C÷ű Źt \YA€č†ČVu@XZ$Ô>źPÁŔČdÉz~2ă Ć––‰D˝x¤ "#xkśX¤ÍĚ–E›jhPS:źGS»ęŹăXĚĹńlwëÎĎ7CëDw˛aŘÉă‚ ęp¨i]îk°ŃXá1QJŃś=´'ţ|ú揫RŁ,˙Ş^˝0Ü endstream endobj 682 0 obj << /Type /Page /Contents 683 0 R /Resources 681 0 R /MediaBox [0 0 595.276 841.89] /Parent 680 0 R >> endobj 684 0 obj << /D [682 0 R /XYZ 89 770.89 null] >> endobj 681 0 obj << /Font << /F22 396 0 R >> /ProcSet [ /PDF /Text ] >> endobj 692 0 obj << /Length 456 /Filter /FlateDecode >> stream xÚÍ“Ánś0†ďű>Â×6¶Áąm·Ý4mUËm[U^đK¨!Júö5ŚŮĄUŁ˘žf0˙ŹgľşF]nHŻ‹Í«=c,%¨8!Eä ‹> endobj 685 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 481.935 172.546 492.839] /A << /S /GoTo /D (aacdecoder__lib_8h) >> >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 484.092 513.996 492.839] /A << /S /GoTo /D (section.8.1) >> >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 469.98 141.971 480.884] /A << /S /GoTo /D (main_8cpp) >> >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.599 469.98 488.591 480.884] /A << /S /GoTo /D (LIBUSE_Calling_Sequence) >> >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 460.082 513.996 468.929] /A << /S /GoTo /D (section.8.2) >> >> endobj 693 0 obj << /D [691 0 R /XYZ 89 770.89 null] >> endobj 82 0 obj << /D [691 0 R /XYZ 90 739.935 null] >> endobj 86 0 obj << /D [691 0 R /XYZ 90 553.953 null] >> endobj 690 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 696 0 obj << /Length 144 /Filter /FlateDecode >> stream xÚ•Ž» Â@DűűS&…ëݻNÜ.¤rى`Ąźď&hai50ś9 ă Ćž¶‰ÖŤ˘ŠNŇ‘áťVV4RFWiW÷©… ¬4ë2ZÚć6őJ,W‡{^3B»Dš †^4Ö+o,Îu=#—ľ+ž 5a#¦ä‰?—ľůă F–UoZ0Y endstream endobj 695 0 obj << /Type /Page /Contents 696 0 R /Resources 694 0 R /MediaBox [0 0 595.276 841.89] /Parent 680 0 R >> endobj 697 0 obj << /D [695 0 R /XYZ 89 770.89 null] >> endobj 694 0 obj << /Font << /F22 396 0 R >> /ProcSet [ /PDF /Text ] >> endobj 720 0 obj << /Length 747 /Filter /FlateDecode >> stream xÚŐVÉnŰ0˝ç+ô"Ä’©( xK› H[>IĐm%C˘Š¦__J˘gqb@v€ž,Ń3óćÍŽ@ŕŰ2żýčěó9!€ čy„hB<B¸ JŔ­5Xňµ…í†,ßţ]¶úŹkĆ qHyY¶ćĂ<®V"S\É<Űşb ]ęăęą2ĺCl;!d &ްq` ľşČć6aVކÔçU¬Ú籋Ö*‹… ńLt@ŠŰŕŃRš´Ę&FUöu!ëřżmĚ,a,d6Ď‹U›vsŔgyePŐŇřĹUQhréCűš8ODbě«DšŚ®8´#«—¦íŮBD¤‰Aă›L Á'ĎtDŹY°eäúOa6JŐ”>É,N«ÄpÇxÇ’ąĐíĐ~y%–}n 8ŹŰü‹űTÎŕň•!ž®Ąqřú('†!cŤśfZ ŽëAć™ÂßTłTĆ-ĂžR…śŮY•ŇĹÖ1¶˝řL<ěAęęHşŃphřŢžř€[‡éną¸ŠĚ1őőø1hç«u*Ć\‰'îŰ0u])DČë3/řJLäßw`üŽ0YµŇ×2ËDZvâÓłł¦Ă‹ëűÁ÷ŢŐŐčÇ}ôófd´§»bhBo+ľn_wO†ĎTô!őÉĆmm’ŽěYë=Er°K´ôîaµšęĚÇŻdL Hp¤„/˛DĆbO­}ŐÜ#őŹľ†“[µk­‹ĽžBi7Çşî_ŽѶŢŕ«Ó^¸mg5ÁĹiË8“ęôceŰĺŤ(ÎëóѢ‰úëřGőN­ťÁiŘĘlŃůLßE¬G_t›Ł“ÍzŘúcúQ~äĄęĹz^•ÓLŞn̦‡6ó> endobj 698 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 420.704 181.476 431.608] /A << /S /GoTo /D (structCStreamInfo_a5d5f38d670deaa5abf887c3b580df1cd) >> >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 408.755 175.379 417.602] /A << /S /GoTo /D (structCStreamInfo_a36fa897b242eebb936d99010a8c580be) >> >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 394.748 189.785 403.595] /A << /S /GoTo /D (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) >> >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [237.875 378.685 297.73 389.588] /A << /S /GoTo /D (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) >> >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 364.678 227.693 375.582] /A << /S /GoTo /D (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) >> >> endobj 703 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 350.671 196.41 361.575] /A << /S /GoTo /D (structCStreamInfo_a47fa73a2c1269f30d1439e90c7652f49) >> >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 336.665 161.003 347.569] /A << /S /GoTo /D (structCStreamInfo_aaf23a4756ee1a1b36f0b7d104d3f9882) >> >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [219.344 323.635 233.511 333.562] /A << /S /GoTo /D (structCStreamInfo_a24cea6707207c95269162847beaa0b7d) >> >> endobj 706 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 308.652 193.103 319.556] /A << /S /GoTo /D (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0) >> >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 296.703 163.773 305.549] /A << /S /GoTo /D (structCStreamInfo_a4d64654dd9d366c5ea41a89d1972534d) >> >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 280.639 220.758 291.543] /A << /S /GoTo /D (structCStreamInfo_a6e431a6f8aeca62ffb7741b3ec068f7b) >> >> endobj 709 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [219.344 267.609 248.306 277.536] /A << /S /GoTo /D (structCStreamInfo_a8ffd4db9d615e545a5e8cb51990965fc) >> >> endobj 710 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 252.626 203.474 263.53] /A << /S /GoTo /D (structCStreamInfo_a28c5ba6424b0975f7074b8e1e217a7a3) >> >> endobj 711 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 238.619 161.003 249.523] /A << /S /GoTo /D (structCStreamInfo_a73484dc9e2406a34c5dddf16b3cf6d0c) >> >> endobj 712 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [149.616 224.613 188.142 235.517] /A << /S /GoTo /D (structCStreamInfo_a239e02305ca579866e527f4a512b1fdc) >> >> endobj 713 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 212.663 220.22 221.51] /A << /S /GoTo /D (structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b) >> >> endobj 714 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 196.6 202.826 207.504] /A << /S /GoTo /D (structCStreamInfo_ae8a7599cb585fdb0ff5446b0a6abb9c8) >> >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 182.593 198.642 193.497] /A << /S /GoTo /D (structCStreamInfo_a8a9699c8f4e00893127a7e49161bbd0d) >> >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 170.644 229.934 179.491] /A << /S /GoTo /D (structCStreamInfo_a1f2571c63e5f1db6e4d1537e37310568) >> >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 156.637 225.75 165.484] /A << /S /GoTo /D (structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120) >> >> endobj 721 0 obj << /D [719 0 R /XYZ 89 770.89 null] >> endobj 90 0 obj << /D [719 0 R /XYZ 90 739.935 null] >> endobj 614 0 obj << /D [719 0 R /XYZ 90 553.953 null] >> endobj 94 0 obj << /D [719 0 R /XYZ 90 553.953 null] >> endobj 722 0 obj << /D [719 0 R /XYZ 90 440.709 null] >> endobj 98 0 obj << /D [719 0 R /XYZ 90 140.689 null] >> endobj 718 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R /F11 584 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 741 0 obj << /Length 901 /Filter /FlateDecode >> stream xÚĄVMsÚ0˝ó+|´gŠ*É–Ť3Óqh›LShpť´ÓQ@w°äÚ˘Iúë+ٵC N{AŇz÷±oż$ě,ě|蝦˝·ď)ub‡4tŇ…c' b”8éÜąqÉŔëűÔŹB7YńŞňú”a÷LÍÖąšëLIď{zŃĄ˝_=b0±C6,B‘ĎśYŢ»ůŽťą‘_8ůńŔąßhĺN@}ł®śiďKďřCŠŁŤCÔřQëP„˘^ź`ŚÝK‘ߊ|âšđn‡"vú4@,·ČóĎ©EI¦şôČŔ›ňĽX‰+®@ű‡ˇ«Z7“K‹XÖ6›]&íúńŹ]ď3}§ÖÚ¦§Wvó 3Ľ(UnO3%żaL—ëŇň …2jí§éűÄl›&}ÍjâQěŠň}Éó|ÁČ"Mfc»U Ów ˝ŔxŃp,Ĺ>îĂiҲ¬˙“D(¤Ŕ‹`X­;ńÎżÁźô?%Ď‹Ŕ} śŮ3—óçFćKÇř‚ˇgěŻĎÎÇ?ƧŁ$ý‘~ťŚŽ%Eé—30\Ď3e@Řßţ3m÷©g~ aO[ÁŤâ&¸'ö[Vٵ`ŞÎfĚlxQ”Ş(3[ÍFđ»vŻÖÂâŮ ůĺdôˇOíţ6Ó•. źęÉĚh‰cwiÖŔT[ű&¶mÎęˇZžź’—Ę>ŘŽyЩ썓Çűňx.+ÍÍ|‘B­ˇŘŤéS“wîFÖÉ­Ů—R¬/Ab ŽĚŤ:üŘdÜ'Řť$PusQ+J1cĎr%(*-JŃęL8ÂÓäăđęeQtg»Ą»\‰ä·GŰÄ`ď49¦—«Ç†0ŞuQ¨R·‘é»ć‚K(©ě:ÚŢ›7ŃZÂj:žąăş¨Ów Ú&y&đEčŞýěŰčçŠxĐĂ.Łeô …¬Új& Űš4ě٤9ř®„ťşĂ¸?…k¶ŰĄĽĂŁëý_Tb r}ś‹©bź/«® Ďn¶h\6m)y[ô0¨˝q[ć˛v DďËL›€đqç~ž‹™š››Ü曝»O„4tDÝMÖ-Ł2·ó¬ ¸Sţ7Ż‹iöç屝6ś¶$UmhŮ,ö2“äŘ?•}•- +´ďIńúGIűŢ}I|äcúÚ‡ô_ânó  endstream endobj 740 0 obj << /Type /Page /Contents 741 0 R /Resources 739 0 R /MediaBox [0 0 595.276 841.89] /Parent 680 0 R >> endobj 742 0 obj << /D [740 0 R /XYZ 89 770.89 null] >> endobj 102 0 obj << /D [740 0 R /XYZ 90 739.935 null] >> endobj 724 0 obj << /D [740 0 R /XYZ 90 722.904 null] >> endobj 106 0 obj << /D [740 0 R /XYZ 90 722.904 null] >> endobj 729 0 obj << /D [740 0 R /XYZ 330.795 680.874 null] >> endobj 110 0 obj << /D [740 0 R /XYZ 90 663.146 null] >> endobj 726 0 obj << /D [740 0 R /XYZ 252.171 587.881 null] >> endobj 114 0 obj << /D [740 0 R /XYZ 90 572.211 null] >> endobj 728 0 obj << /D [740 0 R /XYZ 111.031 518.181 null] >> endobj 118 0 obj << /D [740 0 R /XYZ 90 500.828 null] >> endobj 727 0 obj << /D [740 0 R /XYZ 180.798 460.437 null] >> endobj 122 0 obj << /D [740 0 R /XYZ 90 444.767 null] >> endobj 733 0 obj << /D [740 0 R /XYZ 339.233 402.693 null] >> endobj 126 0 obj << /D [740 0 R /XYZ 90 384.966 null] >> endobj 730 0 obj << /D [740 0 R /XYZ 507.013 344.949 null] >> endobj 130 0 obj << /D [740 0 R /XYZ 90 327.222 null] >> endobj 731 0 obj << /D [740 0 R /XYZ 261.316 287.205 null] >> endobj 134 0 obj << /D [740 0 R /XYZ 90 269.477 null] >> endobj 732 0 obj << /D [740 0 R /XYZ 263.498 229.461 null] >> endobj 138 0 obj << /D [740 0 R /XYZ 90 211.733 null] >> endobj 646 0 obj << /D [740 0 R /XYZ 441.858 171.717 null] >> endobj 142 0 obj << /D [740 0 R /XYZ 90 153.989 null] >> endobj 739 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 746 0 obj << /Length 1072 /Filter /FlateDecode >> stream xÚÍWKoŰ8ľűWč(k–¤ŢA/ŽŁ¦.R'k+‡"- F˘mzx%ąiţý’JµwăěÖŔ^Lr†śˇľo46V6®—ńŕÝJŤ…őŚxi„Řđ=‚\JŚ85LkH]lŽçmm‘Ŕ䬔K‹şf !ß&-Ěg|ÉaW™p!ňB/4Ih}‹? ˘xđ×€·Ř ĘŤë#ßvŤ¤<|ĂF*äź Śě00žÔ®Âp¨-ĆÜţŕ˝+ŰW¦béS¸2ĹNשjIH1Ě–ťčc4Ť,G|¬żb§â—ČË OCâ#Ź:`Ň%tߢÔÖ†7W°feşŻ„f×´ ¦d.˝ýńĆ‚eĄĽ”Ľ’fl‚<ÇďyBAÁ›÷“iüKŢ..ĘmqÉŇQ’đ¦ą/ł¶Ńě}ÔA¶‚xť5`±Ű5‡‰°öČ5 ŐR+«–ĺ ĺć[ĺLg:jž0KŞ˛ÉR±Ô`üŘČĆô­˙˙ţpĘ endstream endobj 745 0 obj << /Type /Page /Contents 746 0 R /Resources 744 0 R /MediaBox [0 0 595.276 841.89] /Parent 748 0 R /Annots [ 743 0 R ] >> endobj 743 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.494 432.336 513.996 443.24] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 747 0 obj << /D [745 0 R /XYZ 89 770.89 null] >> endobj 738 0 obj << /D [745 0 R /XYZ 90 692.566 null] >> endobj 146 0 obj << /D [745 0 R /XYZ 90 678.544 null] >> endobj 736 0 obj << /D [745 0 R /XYZ 90 618.946 null] >> endobj 150 0 obj << /D [745 0 R /XYZ 90 604.923 null] >> endobj 615 0 obj << /D [745 0 R /XYZ 440.382 565.106 null] >> endobj 154 0 obj << /D [745 0 R /XYZ 90 548.926 null] >> endobj 734 0 obj << /D [745 0 R /XYZ 90 489.329 null] >> endobj 158 0 obj << /D [745 0 R /XYZ 90 475.306 null] >> endobj 737 0 obj << /D [745 0 R /XYZ 90 403.753 null] >> endobj 162 0 obj << /D [745 0 R /XYZ 90 389.73 null] >> endobj 735 0 obj << /D [745 0 R /XYZ 90 330.132 null] >> endobj 166 0 obj << /D [745 0 R /XYZ 90 316.109 null] >> endobj 645 0 obj << /D [745 0 R /XYZ 373.594 276.292 null] >> endobj 170 0 obj << /D [745 0 R /XYZ 90 260.113 null] >> endobj 644 0 obj << /D [745 0 R /XYZ 282.307 208.341 null] >> endobj 174 0 obj << /D [745 0 R /XYZ 90 192.161 null] >> endobj 725 0 obj << /D [745 0 R /XYZ 291.194 152.344 null] >> endobj 178 0 obj << /D [745 0 R /XYZ 90 136.165 null] >> endobj 723 0 obj << /D [745 0 R /XYZ 377.928 96.348 null] >> endobj 744 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F11 584 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 752 0 obj << /Length 418 /Filter /FlateDecode >> stream xÚ•RMoś0˝ó+|„ĂşcòÇlż©U»ËmE‚děÔ°Zµżľ†)ŮJ•ršđ{óŢĚi /ŃM}řĚ9)h‘ńŚ” )€äŁ’3RÖäsH6‚‹<‹÷F C˛á⏮:÷ÚŽjěśMĘ»čSýŠXŕÂf™Ó\HRőŃéHľß ˘Ř’ËüŞ')!rŚ~Fđ_=<”9G=9e”ÓI€řö{‰’öÇŃ'lkŐßÚ&á2v»Ý úŁjÔ“ČŔ,^1Ů𔊴@âňY#‚üšëÎbüúŁk0Ž+ 9óÓZW®Ö5?öß0Qçşs y×Ze0ż ޵ÇňxsŔäĹ»JCgŰđ‚ŃIú$–ĺ4ă)Š=čF{m«µŐÓŇżWťťh˙Ę+—ő›˘çWgݲčaôçjÄü’°`eůŃj;Źhéßx×_OĹă¦=\‚‘Ő0pŁwóÁ¬',Ł©Ř†]H*‹ĹŢ=çňÍ+Ľ+ß.v¸ÓF†ý+UáĚýŁéž’bú|…Äx} [Ađ÷Ţç_Í endstream endobj 751 0 obj << /Type /Page /Contents 752 0 R /Resources 750 0 R /MediaBox [0 0 595.276 841.89] /Parent 748 0 R /Annots [ 749 0 R ] >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 642.603 183.28 652.53] /A << /S /GoTo /D (aacdecoder__lib_8h) >> >> endobj 753 0 obj << /D [751 0 R /XYZ 89 770.89 null] >> endobj 182 0 obj << /D [751 0 R /XYZ 90 739.935 null] >> endobj 750 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 760 0 obj << /Length 368 /Filter /FlateDecode >> stream xÚ…’MSÂ0†ďýĽ´BľŰzC=©˝©ĂÄ4ĄťiÓZËo qś’MöyßÝMXîä×›,,A!YRK!O(ČrđÎJŮ şŹĆ„Ł0‰Ţ˛{G0'1ŢŚ9‡,!XTµvŮóVmm9T­9’AĘń¤ qo•@Ť1B(”RĺZµąîWuő1ÂŇi~«?é–…“PĄ˝:)L^<¦PÄ©/kţŕ¸ét§7swqµęeżuAel×E„m1Ę;–Zs_"µ†Î—Ć?}q aÎ÷Ş2ŞŢäVBŘĆFŤTeeôjŘv–Ł˙a _ÉM^µçéübúZÝWęyČ?=đ{.§nËíĆŃi“ŰF‡~ë^v~řE뻿ô>×;ŻăźuľŢf¶0Ŕ$†3€‘€c šŕ#@0Meű”Óýţň@úɲˇ`ŢŹöűËď pşT endstream endobj 759 0 obj << /Type /Page /Contents 760 0 R /Resources 758 0 R /MediaBox [0 0 595.276 841.89] /Parent 748 0 R /Group 755 0 R >> endobj 754 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./aacdecoder__lib_8h__incl.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 762 0 R /BBox [0 0 350 164] /Group 755 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-0 763 0 R>> >> /Length 589 /Filter /FlateDecode >> stream xś­UMk1˝ëWĚđd>ô e†RôÖĐCČ!Mâ”’’ú÷;ŇjíőĆMÝ{FŇÓH3oŢî“»€'§4€¤EáůľŔÇPźç{8»&¸˙ŮÇź>Řß/Gpnżďîň  n|„1Ěcµ,@9Ě<[{€onB­aň…–ÖĄöÔÓ ËĆož¨Ĺ9đlµĆÝ#-rŰnqÖW°”’BlS»{¶[oÝŮvE+˛Ľ6[wůŽxPž[VŞŁ}Â/BźXĹAĄN¤ľ‡•V[ş˝îó_-RŢ W›s÷~łŻ˙źŞdĹńľ&l6Ör°Ä˝ăDzLSŠâ3„ă%ąňŃŠÜô‰)ź»E…¦Ľ·=?k”ľ•-͡/K`­U2i©9ď=o†cëŤ((”Śu˛ bíź0XĆÂą–}Î2ćbC*R‚1Dřüú­řą3j˝H˝1ÍF˛¦J%ŚI 0Ť x±i}ŰÖ˛F2G·Qm9t;ď3ôIzlđăěł \)b|ŞÖ«> endobj 763 0 obj << /Type /Font /Subtype /Type0 /BaseFont /FreeSans /Encoding /Identity-H /DescendantFonts [ 764 0 R] /ToUnicode 765 0 R >> endobj 764 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /FreeSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 766 0 R /W [ 0 [ 500 556 500 556 556 556 333 556 222 222 556 278 556 833 556 278 500 556 611 722 667 556 556 667 500]] >> endobj 765 0 obj << /Length 767 0 R /Filter /FlateDecode >> stream xś]ŇMn0ŕ=§eşŔ„@"!¤*ݰčŹJ{°‡©Ë8 n_ă‡R©H }™™Ŕł_ę—ZŽâ;ɆőV–çén%SÇ×AG"%5H·)<ĺŘš(öĂÍ2;kÝOQYRü鋳ł ížŐÔńSDDń»Ul}ĄÝ÷ĄÁOÍÝY;J˘Ş"Ĺ˝˙»×ÖĽµ#S†÷µňőÁ-{?ö×ńµ¦4Xŕ“ä¤x6­dŰę+Ge⯊ĘŢ_UÄZý«§Ćş^ŢZÚ…oO’\TA)t€PeĐ:B=”)T·Ú ť:Cg¨…¶ą.(eH˘v‚¤ †¶ÎoÇwŠÂň „|Y!_¶Í!_ÖAČW ­@ľĽ€¶|X%|Ĺ!,ř¶˛ëŇŻç䱯ňn­ßŇpÂ^®»8h~ś73™u*Üżd° endstream endobj 766 0 obj << /Type /FontDescriptor /FontName /FreeSans /Flags 4 /FontBBox [ -958 -462 1632 1050] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 1050 /StemV 80 /StemH 80 /FontFile2 768 0 R >> endobj 767 0 obj 328 endobj 768 0 obj << /Length 769 0 R /Filter /FlateDecode /Length1 2928 >> stream xśUVkpSÇŢÝ«—mY–Đ˶l,ůú-ů–ŰX’%cÉ’…%@2˛Ś€Ť-[´Ä1cBR  ž)4ýÓi;¦sÝ6…i3%mfÚ!?h™ˇd&t’’¶C:…?sŐłW˛!ŇěîýÎî9űí9gĎ˝#„ňŃqÄ ăXj$Ťţđßa„¤˙izlî Q4 9‹l+ઽé})ńąSnŔÓ€˙˛oúĐ^YÇĆźĂóMбLě˙ß+wĘł¬u’/I3`şľj"upŢzE¬|đřôěŘBń󀟞HŤĚ§ń5bB ŔĆôwö¤Őg’?|đ3D!|źąlĄđ¤2©Ä&• ßçgqŽ {+ÍĚ=ĎĘ{Ö6d–‰žP=6ęV›U§UilV§VÂVÖÔŇÎaď”:;q¶×°•©ÚÚÚŚFç’ÜoĚËcuuőâh˛(Ż LÝXÜ^Vµˇ¦ŁmS»8⍕ěń··âďöúř»ődK^u]0ÚŁŻ)/QIóEbIi©®¦®±…˙SoCR®”7†-@Ud–ń§Ŕ©Ű„aW­Fśl ,đˇ,ń¨¬ËŢ y§´QY:9µ°¸W 'ś›gG‡öŰ=uyńÄŤQpś±ě=%Q2P°Ž—vô*&g˝ŐaŻÁOý•ý­űŮ;í¸ŘŤzÝá0yř˘Ö»Áüö©…«Űp˙,˝+1;ł+9 vëŔwxjP9BŐ&ťţ%I%ĺ¨×‰MÔ,€`ţ6#{٨rnpćř÷Rţ%Zţ8®ÁŃŽ-O¶ÖuOîŘ}“ëţ.§…\ńťYîUŔť‡=ň‘¸Ct4ÁĽľR˛ĆZy`aq&˝plÖűĽŰú‰áň™7.]ƲËÁÔS©ÄČ µ…‘:Ř*„Qµ*VeÓvbpvEŁŃ`•§®@‹?$ţ}ü×D>ĽŮĆ śy’ wćäkMâ~ńËcVkÖ^7ô×ŔŻ0§cעÔW€)owćtE“fgťZÖq%‰É‹gDţ÷ÉÉěůZÁ‡°NJ`ťM%d =c­–Uż©ąźďľpA8§&S9‚:„m Ť‡†b flj|rpą>YQbP•®/0.ĹOů‹ÓÓ…‰ľ,BüD6®5WC6®zH´—U˝×ŕćé‰CGöŚt˝%„5ů„|ŃźüńÉ…«!ţ)ůĹ·â:†=żĽlF™´ôk/Ă鸏˙-y8°<Í«8t×a­”žŔ¦2YuJ [›ÝÔŚă¸äÜ;?=űţÍétzú&yřgţć‡Ξ˞˝tßÝ‚¬˙l*lËĂ,ľ94„§ćůŘ2ĂgP&™ń&>Ŕ?ŕĂxNĐsÁ]ý|q3­ĐΞUeĂźŞĂ›úvAŕ\ˇHŻÝráKüiŘp=ĺ\>_ꕎ:đŮj…r€ˇŐŘF Ańů֬牣GĆG;ëZ†{3ŇíŠŃN6`ň„BÝţęÂńwvőńţŔž QlxÄ`µŕÇ3ÉáÔTr4•ők ÜÁyŚZ ŠY;‰ĂŢŚsUVżV~+đz¬Ő(¶˛‰©µi5ë ŢŃŞ.:ýŢ›ç揝Ç1śÜ鏷şoů·ŐuîsŐBmŐ8¦6oß\ÚPŻŹ°-Ő§ĆľűúTO°ŰŮвnf·§|cGÓúBÖ™hW´Ú+˛\*Á‡Şŕî®ÇŮ#6ă& |(ťšWŮĐd:,qxťžsh¨wćwŁ8Ćěµµ7ŮÂ!ßkcIn4;«Ë+óŐ:OgďÎh0j®*cĺjµ®ĎoĘf #Ś„…ŃŽDČŁţ ůş8“˘M/‚°B‚Ú…±DŕKőEH R)’AfćCÖȡÂ*ŕmŁD*´˛A7Q‡ôô}FääWY!ĐA=öŁü· V¶Ă?‰’˛pHŕÂ1Î?绥“cqA¶7Ţç°ş©¸‘ĂŁń“fNjNÄŚĆÖ7˛ß3ŽŹ¶L¦¸Áoä%0ó˛qS#ÇX&‹Ť\W8fâş`Fdˇ&M¬épěSĂÇq¬‹˝0üÔ8±9Ćůćâ‚<‡mÄ–ÂÄ`#'±,Uâ3@Ęx&‘0p¬H-KU‚¨kM$ł¬S767˘¬·°ëO笟 µ?'ĚWÔmý¬ť¬Ž+nŢ*Ů-*(C«ţ…žůŠżŹ%﮸W®Jvçä/%řň j€±ĆRhuĐŞpy‰%ó=‚wÓ#äY+Öˇť0úňѰô4tŽŚˇAň7'×Q?`´rxnůĘÜ^đA‚>R4üô%rbHăŘŤş“Đ໎&rľÉhú@÷ŁćEđť(¸ Ú<´ŰDp×$ďÓďAát%ř6GŻ€órÎ!Ńmś9…ś,[ÂřGń% §„lĐ ŔĂńx9„2CśČčĺs7'3z-ú>1 @ @¶)$¤š˝żG¨\9śGŐĺ@>ťĚ[Ěä&1W3^« Öóă›(§ë ™‹hM˘ ’A3')˘Ĺ«%)ęZ*ş@ůĘ‚ř˙‹J’ô endstream endobj 769 0 obj 2185 endobj 755 0 obj << /Type /Group /S /Transparency /CS /DeviceRGB >>endobj 761 0 obj << /D [759 0 R /XYZ 89 770.89 null] >> endobj 186 0 obj << /D [759 0 R /XYZ 90 739.935 null] >> endobj 546 0 obj << /D [759 0 R /XYZ 90 553.953 null] >> endobj 190 0 obj << /D [759 0 R /XYZ 90 553.953 null] >> endobj 758 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F37 543 0 R >> /XObject << /Im3 754 0 R >> /ProcSet [ /PDF /Text ] >> endobj 790 0 obj << /Length 1074 /Filter /FlateDecode >> stream xÚÍWkŹ›Fýî_1RĄKevfxDŮVŽY'Nm6U´‰5ě.‘ ĆŮ®úç{aflđ;í6Ş% îÜsćś;şC˝j˝ô[J‘‹]‹ZČżE.A¶e`N äGčFŁ´ýÉŤLÓĹçĐ©j$ó¸­SN´^6[-â´‹$KËĐVßo}mIQĄă6¶MŽf‹ÖÍ'‚"hŤ6]=TQ Ĩ ×9š¶~k‘5s‹…G› ţ}˛$îňđË˝¸]Ţgmʵůćá>™É7 ˇóX¶GIĎŠůŁxĘrqMŇf{’Îć«HŽ´XÉLĎ«Ń*şŰWPAi@ ;†87°Ë¬RŻ-‚]×2iRżŻ^Şž˛áb¸`¨—8yT®˛ëµôĘVZ8§R> endobj 756 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./aacdecoder__lib_8h__dep__incl.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 797 0 R /BBox [0 0 170 164] /Group 757 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-0 798 0 R>> >> /Length 337 /Filter /FlateDecode >> stream xśŤSÉjĂ0˝ĎWĚX™±KP|”B ‡´†Bi§”¤ôĐßďH–íÄ”¶ČöĽY4Ë“|†%žA;ÔCŔ ń˛ÇüƸ.śmźYzĎ.ä}‡ŐIî€ ±ËrŠ’KŹGdQG$Ďß Źš©Ę*q*Ą(Ą%Ő !KxĄN©n8cÖ!NҦ˝’dŢ@P!„Ęşd㑥ăćł¶ B¶bÓÂꎸÖ|-Ëş(m:ĚÔałaäj]FC•ľ.t”!ËM¶żJ¦¸­×Íű[ˇ‰Ó‰titÖ#0}ĚpíĎěj=ßě~Úě0›=mß˝ÜŕI‡x #2"ŘĹYĽÜ4R˝ô*ŘłrŇ· ŠSČiĄŤÁ->˙ž-RôW5V]˝ŕşzLťrDďGW$đ6tžţŚ%|:ěŁä endstream endobj 797 0 obj << /Creator (cairo 1.8.10 \(http://cairographics.org\)) /Producer (cairo 1.8.10 \(http://cairographics.org\)) >> endobj 798 0 obj << /Type /Font /Subtype /Type0 /BaseFont /FreeSans /Encoding /Identity-H /DescendantFonts [ 799 0 R] /ToUnicode 800 0 R >> endobj 799 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /FreeSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 801 0 R /W [ 0 [ 500 556 500 556 556 556 333 556 222 222 556 278 556 833 556 556]] >> endobj 800 0 obj << /Length 802 0 R /Filter /FlateDecode >> stream xś]ŃÍj„0ŕ{žbŽŰĂu×ýĘöâˇ?Ôöb2q5†ľ}cF¶Đ€Âç̨3ĂoÍKcMţáGŮbm¬ň8Ťł—öƲĽedŘ”îrŽńXÜ.SŔˇ±zdUü3§ŕŘ=«±Ă'üÝ+ôĆö°űľµô¨ťťűÁm€ŚŐ5(ÔńuŻÂ˝‰§â}ŁbÜ„eËţ2ľ‡P$çôKrT89!Ń Ű#«˛xj¨t<5C«ţĹó’Ę:-ď§ô<¦gŮ)Ż“ Ňt IGRI*IštJ:¤sRąĹ.”)IWŇ•$H[]—T IRěBR$EBŇ–©éëYjyëmm~ÝÔc˛rö>5­3MsťŁ±řظÝZ•®_<íO endstream endobj 801 0 obj << /Type /FontDescriptor /FontName /FreeSans /Flags 4 /FontBBox [ -958 -462 1632 1050] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 1050 /StemV 80 /StemH 80 /FontFile2 803 0 R >> endobj 802 0 obj 287 endobj 803 0 obj << /Length 804 0 R /Filter /FlateDecode /Length1 2112 >> stream xśUUmLSW~Ďąímˇ|´–¤:o)V>ZA ´ZŞ­Ú‹µRT±´.Śů1Dťfş%[2EÝWögÉŚY–˲ef?¦Ë’íŹf1cY4ŃÍók[0Q˙¸Ý{n ¸{sĎ{ź÷Ľç=ĎyŢsďŮp 8vĹcIč}ň'€ťÝ52,¨6óo#îA\Ú—ÜWżsĘ‹ř$âźöî?Ô÷‹őSßżP…ú÷Äv?=>}€ß>w?:řÔŽĹ—öLJľň×řbĎţÄ®€ýkÄ·Ćc“ä=ęĐ8 ÉW÷$Ť§Łź!fůž…2ÉÝD¶|3X j«ÁJ&ĺ锟wsşŠ»Ů2ý `lEę-¤(‡ZŁŰUc6 \5ő&ŢVb_ĆšşÚ5šú5¤‰ÔÚm%ĽĆXăn"y\ą™żŰíĚʲ™ËĘŐˇh׎,Ý"Łł¨qQé {SĂŞFuĐ^¸§­ŃM\Ţŕ—Ż—ÓµYKË:Bë í‹ęó5Ů*5_\l¶—9«ĺ6TDsô9Î.‰Ŕ’Ô#r9!°-'8«©ŔŚś\yDáĂX’ßCZOmkG§oĐŇ&ŁŁcű¶ÇI¤~u˘wÇľŁ=ăc'>îe˘PŚů¦č-Č ÓĂV7ź§ĐŔe˛»ëjídŞ­¤Ë˝ďđ‘ľýug[C!ź7 ·f–ůVT~pjôÂ&’/?KnŹ$†¶G· µ#Čł,µš çIęÇBłÚĘŇâ(‘ŹKe°ĎŇŹt{3Ţv`ˇI>Fě$Ô´vóăőe­[{Ć ý¨ÍSď Şfq[š{)r—qŽl0!w¬Nݤ/,áçX댎 %GŹ&ü€ß·©‹ZĆO?7N´ăńďăńHlĺ"ŕæsĺ˘Í#&Íŕ2­!(i…BĄ-e:ů‘¶í•źĐśť«]ÔăT€zS'p/Úd­ŁŢ™KGkjŇůZ±˝şbź“] 1­3ŢŢÔ 8ŻôiŇ˝ő&[Ýů`0Dů™g4ç×ôúܨˇăň`!Ćą Ędk\f˛ç×č®č?řF˙ŕęöż°(ŢÖ-AzKţgëą±źt·‰+‰„M¦y1é®B?ăĹf˝ÚŹóű±ąŹsŃ*UQ$00 p×ŰČŮ–rOg0¸´˝aŁ$őŐ±€üNówő˛Ż< ™ôjhelÓęÍŽ7Ěĺś}ńw”´×ĆK××nč ą–»Ö§šÓVUp”¶Ż“_'5ő•ň·łv–çśĂ87‡ů˙Ym›Vm쮪ńtb®p}ugł‡~‰•éÄ8îÓ6â˝Eµď(D%pH`l—*a©mD”Ŕ¶¶Hâ+ĂM˘â…I‰—9%â„ŰU’¦2„u6lźv÷6X¬VŃbťu´oűl˘Ő)qŽ"AňÂVÉ=*KiµY‡ďXnŚ ĎXţĹa’ş2,ůGDĹ/Š8ŤÚ‘évJĽc˘„śFRÂéHÄ"fŃ8&J—gÎĄu,0+«śV‡4ź9ótęŢÎüĆçTDZ˙:ü|Ż‘ÎÚiŻ\Ă÷¨ŠjaVOlą‡ň$tó—§˝ÓřžŚţŇ“gĐBPv Úb|Ęđ)%࣎Ôc¸‹ßě]đ˘ĎM̰ ­źk?łĚ—ÉĂΕk8!+%űp®c}đ_Lń|ˇ)žSĎ2¶!8ôs|®±­ŔÎ7…•ž\Ý𲧠ÎĘ,B Ş+$u Ú%m >endobj 770 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 484.491 191.996 493.338] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [149.207 400.747 222.75 411.278] /A << /S /GoTo /D (aacdecoder__lib_8h_a388a21070208ec23217c4ff8f8d98754) >> >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.779 376.08 239.806 386.611] /A << /S /GoTo /D (aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) >> >> endobj 773 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 350.706 235.474 362.661] /A << /S /GoTo /D (aacdecoder__lib_8h_af59d78a4583ca81ccb2675dce592b812) >> >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 339.304 240.306 349.232] /A << /S /GoTo /D (aacdecoder__lib_8h_ae09502f250437ee519971ca3a95ac9e0) >> >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 326.592 224.814 336.52] /A << /S /GoTo /D (aacdecoder__lib_8h_a8bc17277db0f7651065f62d66f92ed9f) >> >> endobj 776 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 313.881 216.505 323.808] /A << /S /GoTo /D (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051) >> >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 301.169 234.776 311.096] /A << /S /GoTo /D (aacdecoder__lib_8h_a4666e424f482470e872827f66399454a) >> >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [306.836 243.796 422.432 254.699] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 779 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 187.772 250.986 198.303] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 172.415 180.809 182.602] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0) >> >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 156.715 253.775 166.901] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afdf896f1fefa0b962ef99c6cb2681027) >> >> endobj 782 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 141.014 218.637 151.201] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af1e591927344a1a91c49b87efe3fb0b9) >> >> endobj 783 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 124.596 217.7 135.5] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4a877298c7076e5ef4dd848912ab1d48) >> >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 109.613 293.297 119.8] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41adbb894fd8e900c4993f57ae88f8aee1a) >> >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 93.912 260.102 104.099] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) >> >> endobj 791 0 obj << /D [789 0 R /XYZ 89 770.89 null] >> endobj 792 0 obj << /D [789 0 R /XYZ 90 501.144 null] >> endobj 794 0 obj << /D [789 0 R /XYZ 90 419.084 null] >> endobj 795 0 obj << /D [789 0 R /XYZ 90 260.222 null] >> endobj 796 0 obj << /D [789 0 R /XYZ 90 206.109 null] >> endobj 788 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F44 793 0 R /F11 584 0 R /F14 586 0 R >> /XObject << /Im4 756 0 R >> /ProcSet [ /PDF /Text ] >> endobj 861 0 obj << /Length 871 /Filter /FlateDecode >> stream xÚ­[oÓ0†ďű+|™H,łťónâ”@N8îÄ4&«´Ý´u˘+„řď8'ŘŮiš‹Ę95Ź_űűŢĎ—‚ŮdĘ'ÇĆŔ7|;€_×A†Ťŕ+p¦yŇŹ° µĹbąZ/oWë­¸ľú˘[P3ľ6w˘«ëusÄÖë­ŽHkdäYĎT0{ X:OtkEeTŽ ŻĽ<Ś–\÷MI­‡VĹ›ŕ—*KĆ-ą)]˝MŮhĘś‘¬ěBPZ «nĺLĹdĚm ”´?gC¦ź8ÍĘ8ĎÚ4.’äz•ˇŞ > endobj 786 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 726.819 214.931 737.723] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac806692e8a98e9baca1bca5f7d9df0cd) >> >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 711.468 212.729 721.655] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) >> >> endobj 819 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 695.4 252.5 705.587] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a242d8bc09683a84b578546663dda36fa) >> >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 679.332 261.735 689.519] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888) >> >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 663.264 282.617 673.451] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dff2410394a6ffdf0f95ec66cbd0107) >> >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 647.196 300.33 657.383] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae6d7add4f73779b26c859900f710c34f) >> >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 631.128 290.916 641.315] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a95dafb71a0623fbeb0715e46b7a189c7) >> >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 615.061 304.993 625.247] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a97113255d01bdf3cc7104dd411f40949) >> >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 598.993 326.881 609.179] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f) >> >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 582.925 318.034 593.111] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0bd193ee6a8c3151c5c6469f7e455a8e) >> >> endobj 827 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 566.857 272.445 577.043] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afbf7d7d96fdf87cb5f7541348a597b48) >> >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 550.789 250.009 560.975] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dbbe3b38d0dfb444fdc3a7adae2f807) >> >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 534.721 258.807 544.907] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8aa244ce1ae08763dde378161df0652f) >> >> endobj 830 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 518.653 209.959 528.839] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) >> >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 502.585 227.653 512.772] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5) >> >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 486.517 261.745 496.704] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae36383b7f8b4f36072eb60a303c439c3) >> >> endobj 833 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 470.449 234.308 480.636] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac8bc8e0a106154098f730ba596c43c50) >> >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 454.381 348.36 464.568] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac12235e2fee27efdcc78f2946f86e4ab) >> >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 438.313 283.922 448.5] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0357ce81d9d62cc106c752121fc9dc8a) >> >> endobj 836 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 422.245 224.156 432.432] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a20cdc26726b22cb44143b4e440441e0f) >> >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 406.177 271.877 416.364] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c) >> >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 390.109 301.426 400.296] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921) >> >> endobj 839 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 374.041 261.586 384.228] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) >> >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 357.973 259.922 368.16] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6) >> >> endobj 841 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 341.905 348.948 352.092] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) >> >> endobj 842 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 325.837 261.237 336.024] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a77f722abc6c05f1abf1f51c0d11bf7ec) >> >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 309.769 255.14 319.956] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a516287ad9b64c230200191fdd60361e1) >> >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 293.702 229.995 303.888] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41abb11196531beac7285326a5394db0329) >> >> endobj 845 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 277.634 224.883 287.82] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a) >> >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 261.566 234.846 271.752] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) >> >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 245.498 255.469 255.684] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a65820f534b99b1529510720eeaafc861) >> >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 229.43 294.004 239.616] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) >> >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 213.362 305.152 223.548] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769) >> >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 196.95 232.076 207.48] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05) >> >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 157.84 220.58 168.371] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) >> >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 142.116 279.638 152.303] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) >> >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 126.048 264.943 136.235] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aefc0ded1aea7e08f3c9c55df76c75668) >> >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 109.98 325.964 120.167] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) >> >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 93.912 309.217 104.099] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) >> >> endobj 862 0 obj << /D [860 0 R /XYZ 89 770.89 null] >> endobj 859 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F44 793 0 R >> /ProcSet [ /PDF /Text ] >> endobj 934 0 obj << /Length 1923 /Filter /FlateDecode >> stream xÚÍYKsŰ6ľűWđVr&b‚ńĐ,S±[˝"Ňédʆ–(‹SŠTD(v:Ó˙Ţ]”D=l)r'9áµŘ]`?| †ň¨ʇ‹Ëđâ}Ë4O÷ÓQ‰âŠëÝ6‰Ž•;Ő´´űđ…RO'¶ “xo+Ic­fÚ†z•Ź–ł8cKň E/üđâëIC!\ťíę.µ•ŃěâîŢPĆĐ˙‡bčÔ«+O\j¦X&…2U‚‹Ź†tMĚ_@Ľí7ĂKŤęm«őÚ2Šúżą˛|߲,Ąg˱řٲŔ(ă6”ÖĘ:ëBË8ĺăx!EĚX’=ŠĆ´ăw5jÚk`úÍŢ•?úvl®Ó-5ŠFWb†Ťlt±č&KضChč „˙ +ęuŁ{Őö‡ŇéLUM]·Ĺ7R,ľÓÉ;ŚŰćuOxß"ÖƞَîBMúŔÁ…* ôZ7K™Í4ÔĺDź'WđGšH2&QüĂrČ1řŞY®nCZ¨ ÷(‰RP#FŮ(IÓhń]B¶QÔJ_€îĐäÂý;€„Šc™PĚ-ň1śł c¸{ ó!ŢE Řůźł g’Ťc<ČĎŻ@É((€Öh)7gŰÚŐlÖ Ě#@JJ™“ HL`VęU1›Î]Ęł×P§1Ţ}Î@ŢůŔ#`˙ äÁ|szAĚúś˝ŃlŰ'.‹č!ł}˘%küţ¸‰8§’ĘöôN&•&_1"k}Ăľć™jcĐčěÓ:Ç•UÔňęM7•oHpQş<Fű2e°˘Ňcyi®¤Î­ly“˝žwž·‰'Ť¨C­FŕTAŤµq|ůťĹŲGŹBj?,űu‹ßeѬű꙯Vw<ŽîôMuŐX‚ćď›$Ë"ďðhĽČ˘ôM’žĺ‘žLu6YŞ7Źłm/P;B(4şA°ęj8 ?÷}ŤŹ±E”A3Ϭ5c›¨ŕµlŃ›´Łďń˘8‡¸ż2™h%]¸KCt¤žz*X¶wXv}3dÍ"\ŘÓ¶Shě—ş ďqâĄŰ1×dkMę0źăŞ÷»ŮfŤŻ4ÎŮ”K:ęýY·g˙yž&Ł„ĄxQ1L´Çw|)xDt˛©¬¬1Ť9e…xÇA#…HOO˘Ńŕś2Nň`ŹT?*+0†Ť ÉÂ;ňEE[Ŕ„7Ѭł|ŢťtřTţćo_Bé­¶EIŹAŇ@’‰2ĹC&·4lî#żšE5ś&…Ô KáŃ×%juibÂť‡ ľçk–´—ÉŃߨôµ:ěZüß»1“Šqq<éCN]ł•ľ˛bµR6’ĺSś¦űVŹăÔő„OÔ­«í*;˘{[%ö=%l*dł\ô$YíűŹ Řk]Ôn&BŚ;zV -®ěr˙Q.‘Ş.¬Í EOľ” Ú=͆wup(¶%VŃ0˙š(ŘPć<ćrĆă –Ë WIV$ĎšĄ2ć°8Ů· ‹„e[ä4*óşFýćĹéĚŰJ˘6=qŤ7 [aI0ě[ţ!ÎĄ®N!ö'|~_®ľ=ëկ< KŽ}ĺâçZşEę§\üřÍě§(MĆGs¸i‰;n•Ä[še«°Ąd}K tĹŘża@ 1ľľđ‰Öś6şC|XžO¨UČB*çŻZ„k'¸ĎDKPĨńyŻ9r€mm۶•ó'ňKŢľÓźgł(ÁXΑ…ń¦‹Íb9B>Š–ô Éń4ÇdµŮ#ü…Ž2żcµŤm"ĆĘoÚŮ&"Dzś‰ŽÉ2M1wÔëjK9˙QĐŐ4ţ4Ťż·}ăĘ@ ‘:FQuáň+ĺć^{âëy"Ő`EÄŠ-Y!:’LçIjü0#aó¶±ČÇ‹\LdSN⨼,EQ, Čq&»G‘ˇ§ć)¸A)ĄhUäëuÄĺbOxÉăTĐy^$ä.ËĘÂů‘.™řaőĚÎdňßČedďTŠg­ë/6?÷ĺSĎú¤ ó+ďQ¶Ń,Ţyßš¶{µżÍhtŘovöQ)µ`­“ŢĐ!ţ1If1~ţ|á# “"Čë/e´=î>ݶRÖ©N óÔ”˙•fX endstream endobj 933 0 obj << /Type /Page /Contents 934 0 R /Resources 932 0 R /MediaBox [0 0 595.276 841.89] /Parent 748 0 R /Annots [ 856 0 R 857 0 R 858 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 937 0 R 914 0 R 915 0 R 916 0 R 917 0 R 938 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 939 0 R ] >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 727.536 236.151 737.723] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) >> >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 711.366 242.607 721.553] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) >> >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 695.196 278.164 705.382] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) >> >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 679.025 260.52 689.212] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) >> >> endobj 901 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 662.855 275.224 673.042] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) >> >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 646.341 224.943 656.871] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) >> >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 630.514 218.657 640.701] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) >> >> endobj 904 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 614.001 253.237 624.531] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) >> >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [176.92 530.164 289.367 540.695] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [290.609 530.164 393.841 540.695] /A << /S /GoTo /D (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) >> >> endobj 907 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.4 530.164 513.996 540.695] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [176.737 478.895 289.185 489.425] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [290.244 478.895 394.023 489.425] /A << /S /GoTo /D (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) >> >> endobj 910 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.4 478.895 513.996 489.425] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [189.738 427.625 302.186 438.155] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [316.246 427.625 408.27 438.155] /A << /S /GoTo /D (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) >> >> endobj 913 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [462.759 427.625 513.996 438.155] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 415.296 183.579 426.2] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 914 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [226.965 415.296 309.007 426.2] /A << /S /GoTo /D (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) >> >> endobj 915 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [185.554 375.982 298.002 386.886] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 916 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [307.877 375.982 416.648 386.886] /A << /S /GoTo /D (aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) >> >> endobj 917 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [462.759 375.982 513.996 386.886] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 364.027 183.579 374.931] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 918 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.116 324.712 298.712 335.616] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 919 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [306.149 324.712 381.715 335.616] /A << /S /GoTo /D (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) >> >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [178.254 273.443 290.702 284.347] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [293.278 273.443 392.505 284.347] /A << /S /GoTo /D (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) >> >> endobj 922 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.4 273.443 513.996 284.347] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [175.618 261.488 195.314 272.391] /A << /S /GoTo /D (main_8cpp_a93d34427c5ada45032539b77c78ab2f6) >> >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [180.74 189.67 293.188 200.2] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 925 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [298.25 189.67 366.085 200.2] /A << /S /GoTo /D (aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) >> >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [374.469 189.67 490.065 200.2] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [196.154 105.524 308.602 116.054] /A << /S /GoTo /D (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) >> >> endobj 928 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [329.078 105.524 438.945 116.054] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [462.759 105.524 513.996 116.054] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 93.195 183.579 104.099] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 935 0 obj << /D [933 0 R /XYZ 89 770.89 null] >> endobj 936 0 obj << /D [933 0 R /XYZ 90 548.971 null] >> endobj 932 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F44 793 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 963 0 obj << /Length 1296 /Filter /FlateDecode >> stream xÚĹWYŹŰ6~÷ŻP Ě”¨ŁčŤŹ¬w·µÝ§$h‰^ •ĄD’řßwxH+{}ĄÚ´4śă›Ź3#l=YŘzŰ{łě˝žPj…(ô¨g-×V-ß#Qb-ë ŇP†mÎăDÄE"Ę(KW}ŰhŁßLŇLčÝ\¬EŮ'-ňX>ňś€Ř”ő?-ßőĆËŢ—«Ř"Ę ó‘ď0+Ţö>|ÂVĎßY9a`}UR[ËĄ¬™µčýŃĂĆăăUEŕşVx®Ś€ĐáŔňa }ŞŁ)ϵ“En6|—¤…Ţ®Ákfó­ Rţž3x9Ľ”"ĎĄ°zČa6÷‘š ›CÖ‡ĂŘžMŢ/~Ł{möď>ŇÄČJdĘ'Ń\ť2ČŹ ňì¨Ä±f)ó3|V‹}÷0šŤŁ»;™¶áh<|Ťç§ÔT"[*r#ś›Ŕ‰I# ΞeEĚëă,Ó›˛ďř¶¨ŠťÚĢ2ÉXą\Żŕ˘.ę?†oúOšW5—´úŻ2t1'ĂE] ľťćëâ@Íë q;¶ u‘RxĄ­běśŃ{ä´Ź\ż=Ö!Ŕ[Qź±ü˙a@pَ‚ąrŕéu)ÎłáyŇÔ¸˘.ł‹í!5!ßĂ˙ŰîëôayóU…řgéęRšfÓ7Ńôaň(ßń†:!˘äoŽbqQF&K7gŚR(ńŚĽĚŘË{Ĺ^Çrß\ÄuÎX‚Bƨ2ă¨J P"Ź9m?‘…`€w$j˝#ŃzG˘ŠËôsťů‰X18ÍË´–Éč}[/ÜÓőBúÝńąĺşO C±áÓFđVđĄ™@ĆěA XEá…îłű´u_žkşÉ¨w[‘׼=é(j‘ř!9ĐQ1¦îg4śÍď§‹Ą~\&ăO †öş(/p:\Ő뤄(‰ů‚F řÇţŔĹ=Ě/µ]ÚaSĄO97űDd|Ż·Yš«*/EóDo6iUĄXÉî·[÷)łal¨X`ľ=ä;‰ ±·„Z:ć UŻJʧŽů®2¨%iyťć»´N›“šĆRošöż«?ď ѵçčt¶OđA¶čől=> Çw3ýś\Č9H—,oÓuXZnK—lOĚ|“&b¨J[ŢCţש—„×i Ł˘= žI†ßŚ—sŻÉěĎ…©­ôf´BvŤÜěß›čXá°F 6´äă­ĐłÓ>±0Đ6Â4şÔ$ŰUýT•(>+ž˙UéŁŇ‹–…ň Ľ3"9`·ąÎjD•Łö­Ź‹2‚‘ľ¬źýxőJ!; Řo7vđu·¨¨údTň?ťq+¸î–ČiÂ8IýUCóĎWüěĆáéČqČaíúŤÇĄ)ĄµYˇ˛×űîđ˘÷ŕI!â÷ÜůöĆxr€|ßřÝýÔâűt endstream endobj 962 0 obj << /Type /Page /Contents 963 0 R /Resources 961 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R /Annots [ 930 0 R 931 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R ] >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [196.181 700.835 272.863 711.365] /A << /S /GoTo /D (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) >> >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [276.679 700.835 392.275 711.365] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [176.176 657.085 229.635 667.616] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [237.606 657.085 350.8 667.616] /A << /S /GoTo /D (aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) >> >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [354.616 657.085 470.212 667.616] /A << /S /GoTo /D (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) >> >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [143.272 639.643 190.76 649.549] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [195.265 613.336 294.073 623.866] /A << /S /GoTo /D (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16) >> >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [124.291 428.872 240.793 439.776] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.315 353.765 239.817 364.669] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [124.215 290.613 240.717 301.517] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 960 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.918 197.882 240.42 208.786] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 964 0 obj << /D [962 0 R /XYZ 89 770.89 null] >> endobj 194 0 obj << /D [962 0 R /XYZ 90 567.688 null] >> endobj 198 0 obj << /D [962 0 R /XYZ 90 500.387 null] >> endobj 811 0 obj << /D [962 0 R /XYZ 90 474.957 null] >> endobj 202 0 obj << /D [962 0 R /XYZ 90 474.957 null] >> endobj 808 0 obj << /D [962 0 R /XYZ 257.47 420.07 null] >> endobj 206 0 obj << /D [962 0 R /XYZ 90 397.836 null] >> endobj 809 0 obj << /D [962 0 R /XYZ 443.182 356.918 null] >> endobj 210 0 obj << /D [962 0 R /XYZ 90 334.684 null] >> endobj 810 0 obj << /D [962 0 R /XYZ 90 262.03 null] >> endobj 214 0 obj << /D [962 0 R /XYZ 90 241.953 null] >> endobj 806 0 obj << /D [962 0 R /XYZ 144.445 189.08 null] >> endobj 218 0 obj << /D [962 0 R /XYZ 90 166.846 null] >> endobj 805 0 obj << /D [962 0 R /XYZ 90 94.191 null] >> endobj 961 0 obj << /Font << /F22 396 0 R /F44 793 0 R /F23 397 0 R /F14 586 0 R /F46 965 0 R /F11 584 0 R >> /ProcSet [ /PDF /Text ] >> endobj 971 0 obj << /Length 1820 /Filter /FlateDecode >> stream xÚµXYoŰF~ׯ P  €jłÜ]^AÓB±%G‰W’SI@ĐâĘa+‘*ʦîŻďěA‰şh;u.÷ťă›o†ÂĆťŤ«Ö›yëeźĂGľCcľ4|l¸Ž…lbóČřd§ýeţΠÔG–mĂ!9ŰŹWĽÝ!66/ÓEąćIqš­­ŢĽőgË‚ťŘ°¤8ŰE.µŤĹşőé 6"g`D}Ďř&w­ F(sjB-Tq­Ę0žejÓŢÍ–‡ëV{@’Ą.‘2aäĘQőr‹”cY59ŕDćz•śźOÜ®b~µáu.‚/‚8‰‹@¨fyfšyfĹN‹/d:–ç!ײa`!bU)ű€R„""ý/÷˙tF)ď!Ąx‰ ”Zżí°©ß^©7ĽSîÜ]Ńq“›ůőÍ<řж¨mv‡Ësr$†Í‚ôÁôApŹFsŹ%—_żVĎn·mŰćEpŮ»&ďkdő; 9č6Nż˙~BŤńÂFµŚÁ“ËŢ~¶l5n=7ę"ęś ›ĂTŘę×Â&f㥚-ľr5–Q¬O¤e±) µ~Ű&Ř,—mb›Kž©őE \'ąÚń—XDj1×›ϵĐe!Á¶E¸ZĹÉť¤'ĹKŮť&¨éUËř¤ö‡‹KľH#ž™Px?“Ôb? ×\ÇĘŇaÁ–ęÔARÁŽ!ˡ;ŘQ şyŰećý†G|y†MŹ!,§G¤‹E™ń)Úžč¬+‡Y)‰8WĎZ>Š×0‰Ž/3Î=łgVGëÖ±läyŢ Ë€•'ý`ÔAĽ ř|l2Ôb6˛˝­Ąoy¸QzdĽ(ł„kÇ7ámŇ8Äřx˘ńq"±uAł‘•^g­ĽżOÚ ö·qŁ}0î˛Ęľžv´OSF±Î#x•ZÂ3]Şg™ü‘¤B×ozCĆĂŽ/$9°ŠÎĆÁŁhłą¨lĚ·Ě" “|“‚"ňuËâĺk©P:K“8×´'ć6Yz»âkE" ®ĂĂô "é´…č4k[¶ůw\ÔČ Ęž†ń»2× K^ÁÚŤí¸€˛ÁCÍ‘QX„ODÝ—€_&ĽŘOn®ŢoóYŁ m‚lŰÝóˇGcú‡5eU»ŇĺΠ,ĐW>„%hn›‘äî­zăď†á`üˇí©¶3PŐµ™ä @9Ţ‘çľWj›0Ď«°WÝtQm\–ÉbWrE»¤FßÚśđt’nűB,ČS´C1žR˛ńf7×Uęő.®`?ˇfŘPůMxhĽ,ńú¸22-«z'˛í˙]Yo=*vÚćW^nD.ó‡JkôhKű“éHŞŰl(|h0ç8?ňv™fë°řŹč«môPŹ4ÂgČĄţ‘µ!ăyĽŠy˛ŕZÓŐ3š¦ŘËŰFÓ®/&ăţઙýÁ_¤É(ŕó‚×rěYLQ·>:HŁ›ˇč—ća·íbócŻą˘ů"îö;`”fňŰjÚWÁ¸”3MôÔ*Ľt,ć–i¦ć¶Ť˛ÍSÂŰ•Ţ. Oi°\.7]č\yĚŰ/tŹ‹ks1:tĆĐę¸7|8¶úlŹí§ĄĐ_ľ/ě?Äů«vIĽC{«Ć˛Á’öLT kć†Ô´;.ľsvŕߏ÷§ůeÖ]ă«©ĘĺĆşC@kĎgű¸gŽţcĘsQÍnř"^’e&$ Ă–˘:wĚÂbW®‘áÍI5W=·7ęuwöf<"ő:łăÚ §˙ŹŇ˘o;kŔ¬7®Ą Óî(čCý†J86wrÉa]qˇc˙uŞĎňŔŽr©­µkŢrµ–óBt™”=Ťw±Ş««Wő mË,őL­±p«ĆÍÓŤ›kJř먂ÚŢŠR·Ĺ{OQh\SžźnŚóbß»‡UCO1yę?Ő˙ÓÓů endstream endobj 970 0 obj << /Type /Page /Contents 971 0 R /Resources 969 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R /Annots [ 968 0 R 973 0 R ] >> endobj 968 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [456.692 622.039 513.996 632.943] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 973 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 610.458 153.511 620.988] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 972 0 obj << /D [970 0 R /XYZ 89 770.89 null] >> endobj 222 0 obj << /D [970 0 R /XYZ 90 739.935 null] >> endobj 807 0 obj << /D [970 0 R /XYZ 243.891 693.668 null] >> endobj 226 0 obj << /D [970 0 R /XYZ 90 676.964 null] >> endobj 230 0 obj << /D [970 0 R /XYZ 90 596.907 null] >> endobj 812 0 obj << /D [970 0 R /XYZ 90 569.922 null] >> endobj 234 0 obj << /D [970 0 R /XYZ 90 569.922 null] >> endobj 238 0 obj << /D [970 0 R /XYZ 90 545.977 null] >> endobj 813 0 obj << /D [970 0 R /XYZ 90 519.231 null] >> endobj 242 0 obj << /D [970 0 R /XYZ 90 519.231 null] >> endobj 814 0 obj << /D [970 0 R /XYZ 107.713 438.172 null] >> endobj 815 0 obj << /D [970 0 R /XYZ 107.713 422.284 null] >> endobj 816 0 obj << /D [970 0 R /XYZ 107.713 406.396 null] >> endobj 817 0 obj << /D [970 0 R /XYZ 107.713 378.553 null] >> endobj 818 0 obj << /D [970 0 R /XYZ 107.713 362.665 null] >> endobj 573 0 obj << /D [970 0 R /XYZ 107.713 334.822 null] >> endobj 863 0 obj << /D [970 0 R /XYZ 107.713 318.934 null] >> endobj 864 0 obj << /D [970 0 R /XYZ 107.713 303.047 null] >> endobj 865 0 obj << /D [970 0 R /XYZ 107.713 287.159 null] >> endobj 866 0 obj << /D [970 0 R /XYZ 107.713 271.271 null] >> endobj 867 0 obj << /D [970 0 R /XYZ 107.713 255.383 null] >> endobj 868 0 obj << /D [970 0 R /XYZ 107.713 239.495 null] >> endobj 869 0 obj << /D [970 0 R /XYZ 107.713 223.608 null] >> endobj 870 0 obj << /D [970 0 R /XYZ 107.713 207.72 null] >> endobj 871 0 obj << /D [970 0 R /XYZ 107.713 179.877 null] >> endobj 872 0 obj << /D [970 0 R /XYZ 107.713 152.034 null] >> endobj 873 0 obj << /D [970 0 R /XYZ 107.713 124.191 null] >> endobj 874 0 obj << /D [970 0 R /XYZ 107.713 108.303 null] >> endobj 969 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F11 584 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 976 0 obj << /Length 1886 /Filter /FlateDecode >> stream xÚŐX[s›8~ĎŻŕfjVÄĄűDlŇI×—¬M:Űi;l”Y ®ŔÍćßďŃlHj§—ťŮ>ŘHÄŃwľsEÚ˝†´7—ńĹoWk¸ŘŐâ;-@šçZ&Á–§ÚÝ7-c€ Ň“dťŇu™R¶Ěł•á ÝÜČ;WYNĺhNď(3,_§Ĺš/ą¶oéŘ3>Ĺo/˘řâó…_Eš%ľB<Ół‰¶Ţ^|ř„´ÖßjČ´_{Om5Űp͵ĹĹźHIŚŽ%wÜ#É- ™9š‡aÍĂRü04\˘—Łh¸śFŃhsńfËy´ BôpnŘHŹ…„ÍÖ€}Ľ/±@* ·ÄŽń†źĚCşBCN JÓŠ-˝.ĺŇJ=ÇhU'¬¦é+>'z•IpŕV-÷˛ŕ™ĎűŚ2šĘőuY|Dßď\0m`ŮC`WB¤ ,©ł˛ŔŻ7IqŻ”°NŠ˘¬ĺxĄÖv”Ý•lKSłwŇ‚+0ěÁŐ3-ß•ź˝/á¨Ë¬Čę%e¬dKZ¤ťmš+ü=űŞDJ˝,Ŕ8ý:yŞ»xN73©­e4źsÂô¤ŢlÓöť®Ţ‹š%Eµ+™‚č FoË}Q+MpÖ+€÷5,˘˙łŁëşą'ÎĂItT%GšăłÝ>'â"záą°kbĎmÎ )6ó°–hă@ß% xv/×Íř`•ŐUÍh˛5Ťq}RVµĽłcĺ*YĺŹr–Őr—¬’óuÉŘ~')lĂÉá’—Č5}'čň˛n€®«šn)YRmľ‡~Ç@ÝN·7 Ŕ–Łżâhş¸žM„ÎűńŚCŽNAdŕ{ş:¶Ő@ȇ-„N!_•4¨iQ ă“>*;Ĺ<'ň»xäe˘SŢ)6ëöУ˝ŻN;ŐŹ;őäđU-rmńkkýŐ~ÇyţٰĂo6Š–WópňRŠzžév×ô|[@*¬ĆíŮĺô‹‰žä{ő¤8‹Źőr_Ë\wt—úŠŤ9}gI|ąnW ‚ÚĎcßOQý•Ňë˝őÓ9=ś_©ES÷‰;ŁŰMÓĆ'ÁvĘ­eiŹ Ű¤^oΫľńU7|=}',m|=Z R\Îfś”Úµa'Ż‘:2ŰČŃł‚XéśKĘą^•ĺßrö`€A$•śTŮ}‘ä9{ŕx¸q\pçČqÁLz:€v:8¶éőŘđP|ß™ÝĚŁŃő0ovĎŔ…`Ҩ˛u-¤umé ř \O_Â×˝ë(Ŕ­KëY!—ĺ1a‚b†ňî¸ä zP8z®°ä°Üîr鬲ZYh„'/9UNMY)92ßo‰›DÝNäĺ•ÜGKWČ€ă?W+Ăat:ÇpLßó[z đ" bA ÓśniQËŐ–ĐüNă¶eÔ^oäŞ8şÝŘ,,yp µÝ`©v›‚Ő««™_ çńŐYśm| 3±uţ đ̰z€™Ř‡č[‰ .pU®wa†ú ˇ¬Ý…t AíW†ůMx=Ç=ŤeŔ/GÜÂCžÄĘrčtÖd™®ßFő7 ÷ŰĽ\©Y™ËIšÔ‰)đů°uF|"`瀽Mś°‰IĎK©ä÷"‹K ó™j…ŕ\xĂ&’ččŕÖů1[·Î·g ß`ń4ńSX=¬.­›ď:ěsu —đë5Útuu8za>ă¸kô«Çm«Dz81,HeD!sř‚|†“Ś×0A[ĂŔâQ*3™ ŔKGÄŕë@ iÎŘ4±1gĄDĹ–˙$x±9oFĽż4„ęÂAN2AßMŰ‚ĺlÖ™ža´Ęň`Ů„§}ě·=dÓ1±1°â=¶˝ňˇˇ°ÜˇěyŽÎà ߼§ đŘ1´Ş=Ä®N÷®˘uÝZ'p(ŮŇš˛Ę<)02^ńB4 –’7 )K ¬zý¬WęÁnvľ‰HŻë|3ś,g·ńÍm •sÍÇQhDŤNwO0DĆCŤ7śđČ὏ü|Ľ…SóŃ?"‚¬×ĽĺC ‡óć41R†•JéťHŤ÷y Sëw‘x5ąßYěÁ7hŰ)6ÄÉ^Ý×ýß® rżŮďۦŤđ·öú˙řčD\ endstream endobj 975 0 obj << /Type /Page /Contents 976 0 R /Resources 974 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R >> endobj 977 0 obj << /D [975 0 R /XYZ 89 770.89 null] >> endobj 875 0 obj << /D [975 0 R /XYZ 107.713 729.972 null] >> endobj 876 0 obj << /D [975 0 R /XYZ 107.713 700.831 null] >> endobj 877 0 obj << /D [975 0 R /XYZ 107.713 683.645 null] >> endobj 878 0 obj << /D [975 0 R /XYZ 107.713 666.46 null] >> endobj 879 0 obj << /D [975 0 R /XYZ 107.713 649.274 null] >> endobj 880 0 obj << /D [975 0 R /XYZ 107.713 620.133 null] >> endobj 881 0 obj << /D [975 0 R /XYZ 107.713 590.992 null] >> endobj 882 0 obj << /D [975 0 R /XYZ 107.713 561.851 null] >> endobj 883 0 obj << /D [975 0 R /XYZ 107.713 544.666 null] >> endobj 884 0 obj << /D [975 0 R /XYZ 107.713 515.525 null] >> endobj 885 0 obj << /D [975 0 R /XYZ 107.713 486.384 null] >> endobj 886 0 obj << /D [975 0 R /XYZ 107.713 457.243 null] >> endobj 887 0 obj << /D [975 0 R /XYZ 107.713 428.102 null] >> endobj 888 0 obj << /D [975 0 R /XYZ 107.713 398.961 null] >> endobj 889 0 obj << /D [975 0 R /XYZ 107.713 381.776 null] >> endobj 890 0 obj << /D [975 0 R /XYZ 107.713 352.635 null] >> endobj 891 0 obj << /D [975 0 R /XYZ 107.713 335.449 null] >> endobj 892 0 obj << /D [975 0 R /XYZ 107.713 318.263 null] >> endobj 893 0 obj << /D [975 0 R /XYZ 107.713 301.078 null] >> endobj 894 0 obj << /D [975 0 R /XYZ 107.713 283.892 null] >> endobj 895 0 obj << /D [975 0 R /XYZ 107.713 254.751 null] >> endobj 896 0 obj << /D [975 0 R /XYZ 107.713 225.61 null] >> endobj 897 0 obj << /D [975 0 R /XYZ 90 212.564 null] >> endobj 246 0 obj << /D [975 0 R /XYZ 90 195.191 null] >> endobj 616 0 obj << /D [975 0 R /XYZ 107.713 108.303 null] >> endobj 974 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 980 0 obj << /Length 2842 /Filter /FlateDecode >> stream xÚĄŮră6ňÝ_ˇ·Pµď­ÚY˘gśŘ˛F–'µ•¤T´H٬P¤Â#çë· đdo’yFŁŃč»!6z±ŃÇ‹ËőŇ+!F¸Â­wŁ€Ť<—›ŽŕŁu<úŮţř×ő#Ë Lî8°IBŻŇ,O„ĂŚy±möI^GuZäz®/~żŕ€ÉF\’s<ÓłśŃvńóŻlü‡3­Ŕ˝H¬ýČ|łŃýĹç ¦Xc}m·Ç"çĚĚy`ž ަӱëłÍrv»ą{X/֛٧ébŢÜK®49¸®Ő§ĺ¸¦oq}ŻEłLĘńIJ=ŁŘŃw9ćĆěVÁšúĐÔ4Ţ>GyždÍ~aKĺ×a c—” ZޕŞFIľ-â$–RťpË3m¸Ę„s3ńJ&˘&N ’®>ă{šĆŇ}É÷é×4"XQŇ·9ôˇiEßčpČŇ$î¸)Źdp–m2áŃYţďńÄfܧUô(•8@kňax– XpłőłÂĽEI-¸Ć¶[HóŠVjŤ_Eű„r%bąqGßN”ő6k–{âŃ”÷{LëŞ.“hövx9ŘŠmî÷ŘćqHĘ]QîA˝"BÚyˇFQ]¦_Ő8ý:Ń2!Ş·ŐšzÇL´aŘ».” í{ľkbĆ"Q~î¶Ež€ě-ÎŕŤRjZ+Ő7 v­čl 8/ř˝*X2ćŽń5Újô<XŐY‘ ´‡Ŕ#‘Y¶Ő‰Ě˛m-˛Š–"úTp‰¤ -1„%†«)ČzGĂZÓo…†P%4„÷ÝË"ˇ!†ÚQIN„–#ĺP ŕ|۸Ţ)¨Ô :=yí‘ďé f¤'Tű(ˤž<űô#Úť…rÜ€÷mßę‹<ĆĺQVa[Ě2üÚĆMŤ3ţ@á%„řXÔĎ-4‘ńČr%‹€üŞ ĄÚ…‘?NvR%MVS¨…#\~đČ™´YµŤ>q)îT´±şäŇ1@c™;ÎXŠŇ-žÁ <Óv9ů/ç홸†~Ę:t&ÂÚ„P}&ÂUľhďfyŠ0¬“SťÂŰSX{ ×§śąC{OŚĺŻôíç1Ą’ž%Ó …~3„ńÍ˙CźŐpĘLýpĹí~Î÷…i۶¶J°I‹°¶k›ßZîě™Ĺ˝Gj$×ĺ.ďčŠ65żéťěŔyŰ=‡őÎćvş\^/>ľëL˘ĺâNoŹčŤ®_(€v&E ŢI&Źîäxžq» ?Âr*Ż9{ľu¤đúU—Ž’ŇŘf†Şn¤»ÉźĆxŽąĺ_´ş™Č†Ů«OŁ5‰?üËQĎŠuv·…đnĂő§»ů»¤đL‡µ˛ ËRWdP m“(ĂęXÝlIᬵî}R?±©ÄĹ|“yö03µóţlëR{Ęľ©ĄŢ(ypâH+%°Şy¬ę´nd…ŢŠŞJÔ˛ľęâîú>|łPŠnĽˇ^yRΚćŤE ©Gq¬3V§¸¦yď{|śd‘˘#KÁ~‘˛+ˇdT–qÂëőb®ľMĂóŐlsywwżŢ\É ˝!xŤw»[˝«pK~çÂó×<Ú§[Žë«(ÂpčzĆ á˛ČĐ= ~ąßF™T;b‘Ťnk4DÝŃŔ…hWTu‹ö4†"$Í çôČ(k’J› ·LŰŃ­{’aŕ·VUq!´;Á w\©Ý¨G°aôP•%1űÉş ö!cĄČÚ])Žzˇµ—4ËÔ˘:[ő#jkqÄĺţříDaR@őĽ#´TŇx0mäýn”¤\˘„†#Fk2\ůw¨đšVąWJ©ťť\ÔÍ`·dÁűi€ävMFűyźT$e i˘ÜĎ\ďčo3ëéŘ­Ă•mrv}·řۆî¦#;óˇˇŰ@T:ö„ťˇ{ę[CG¬ľˇË9  Ĺ«ë$o˘Vî0¸‹;´ćÖĐőű@!‘ZJ 1*Ô€ ŔV‡® U8Aő…©¬YNĚ;°ű\Ńă†ô DéÔómŞY…Wá*„ ¶ą ż„7ď?Mئk§qĆmśa'~îşűŔ(Eč¤&Ś2‘/[µň(H’<ĘqĽAe(şóž@ 6…C[€ (Ď$k‹y;0Đ&XBBËčż7Q^§R§ČđKĐ<*ŇKĹ•pâKň5„×Á_žÓíłQ÷tő+ŞO5Ź˝$#·É D\žs˝Z°Ů?©!tɵˇ˘‘ĺ¨çę¦ÍSÖ}7™lËý@Ĺ"ĎÄ"@Ä"XÖ±–T, #€$3ez¬P”Q7=‡ŕńĺŕBĘmzʶ; Ü>&$GnĄ2mŰëJ)GĘůZ}IëísRµ)[¦ 9ŃR”uŔ·ůȧp: ôű/Ta·ËUxÁëý@ĺEçÄSDhOß÷ćA!3ůĐ{ô Ś9†‰/—„[A˝•˘O(2ĎŞ[|U~a»fĽű±b(±Ľ“…« ˇß°ăs€‘+‚ń´Š°|zśp±Ä© OękW(ó…îeVUf°Î4.ëPO8&Ć@[ ÚsĆ)ZaXĚçQľ…ăŁň•¦qTG4Bś$‹±Iô ńÔ%geú;ăzĚŤ´ťčuě!&6Ť»pÇÚlCĄDEą€ŃĐŇaTw`ĄIšŽ•ů_ľę´íĐéY•đ}AöŢU;z˙ÔŇ?ß^mnîĆ@ë§%}Â÷ł1w sl»ÖĎM—Qݔꂷi×x\ĄYÝďŠŕ(]ąŔŐŁü7Ž»0/U\® iáĚS1 ďA7˛öďó­,•”Ż÷Xě)‰QŁűXmrő‚{Ę:ŤTáDĎčEK%ĺíš<`0@pg›vĚŮ âRëđşo´P-5(jłNšŕz IRv~ď¨d)(ąűM¸[Pâ\Ţ„ď[ 3]Ö†BÝ•­Đ±ń}cš©kt1±dڎf2!Ă÷vyO|܇n[áA]E–4“4Čv¸É=˙ř[ë·-¶T8SÖ‰ĺů};©šĂˇ(ëţą^ÎChěoÂéjs‰–úpuő\ÎöL ĐŹ5Yɇ]Ń·|=Ę—Z_Â!®a DÓă·Ä•}.|ˇ™Ď+ĽMˇNJYŮzž.)Dň)çĎ x0léŞ:*ëžh[·Ž4OzvŰŮć!Ş*ýoJ´«»Üź¶ĎËmµ—+R‘V ÔęETĆBM ý‚ݝҋ›Ű¨ŚUŕ”˙=Ňu„Ôľ Yľ¶ ]3]Ń7ą ő´.Ůš|Ű=4śü÷xô_&řµ°Á xŹÉ©›ëĹŹ÷K°O4GV áěn®6áj…‡.GŃvNÚŘLóí.ö‘ęë@ú“ĚĹęçÓt1ż 7Џ˘M¬˙ÓĐÍ‹ÖÔŞ$“Áôű3·X˙ů,ń9˘@'Nľž#e1j'Ťö0ű4]ťÖd|đ\Ú=mOµÍ {W=Ô%:ŢąsąoÚ?ąÂđ•Ö69wOS'â¨mP+¨áĎĂ®8”qúôU,Î1=4=i1„ű19ţç¬Wů í;É’˝ŚŚýprüO¸o™÷Źđ˙ľ6,E endstream endobj 979 0 obj << /Type /Page /Contents 980 0 R /Resources 978 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R >> endobj 981 0 obj << /D [979 0 R /XYZ 89 770.89 null] >> endobj 898 0 obj << /D [979 0 R /XYZ 107.713 729.972 null] >> endobj 899 0 obj << /D [979 0 R /XYZ 107.713 612.017 null] >> endobj 617 0 obj << /D [979 0 R /XYZ 107.713 560.053 null] >> endobj 940 0 obj << /D [979 0 R /XYZ 107.713 532 null] >> endobj 941 0 obj << /D [979 0 R /XYZ 107.713 473.821 null] >> endobj 942 0 obj << /D [979 0 R /XYZ 107.713 421.857 null] >> endobj 943 0 obj << /D [979 0 R /XYZ 107.713 393.803 null] >> endobj 944 0 obj << /D [979 0 R /XYZ 107.713 341.839 null] >> endobj 945 0 obj << /D [979 0 R /XYZ 107.713 289.875 null] >> endobj 946 0 obj << /D [979 0 R /XYZ 107.713 231.696 null] >> endobj 947 0 obj << /D [979 0 R /XYZ 107.713 203.642 null] >> endobj 250 0 obj << /D [979 0 R /XYZ 90 174.604 null] >> endobj 949 0 obj << /D [979 0 R /XYZ 90 150.205 null] >> endobj 254 0 obj << /D [979 0 R /XYZ 90 150.205 null] >> endobj 978 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 984 0 obj << /Length 1292 /Filter /FlateDecode >> stream xÚŐXISă8ľçWřhWµdY^Ž™$4ô°M’>Ń%TăŘ´í3ż~ž{â`=SĹ!Ąíé-Ň÷ľ';·vľ~[ ľúľ“ $ôCg±rěD!AĚ'Îbé\ş1"ŢĐgŘĺ<]Š´XŠň:“7^€]tgVe&Lo&V˘ôHěŠ ą/śNš7Ů±Ł¦›ę­íL’ )ÜѨ!:YKž)˝ű‘˝“Np űAŽQ’„]ŚňJżx»űĘ tŮ~šV¨7Ĺ–ržéűűčeěÔăE§"ľŹiç-BžqcŃš*˛ěÚĐÍ{ˇÔáËđłň%íáKĄěA¨Ëö…ŘĐă8+*ń/DĽ!ÝoĄAJCŕ. ö Ł×2†˘v‰c"†<ËŠ”× sdYS+«bS¦˘ęâ…ç¦}9#e^Őyń6b ŕž~Í•ţÄň Ň8Š4¤É^Öó•P B˙’é6’ľĘ°˝•?:Đ.Ŕ*öogüŃlí­üá§«üi‘Ż.átÂČ˝ę­÷Â~Ľ%]Ů/…ďÇg‹ĺ Ž´l^¨Ťţ>ő ‚"˙z:+ 7élyútźÉTÖĆ‘ňMßЦfBÓ˝ę´XW+~Ď«J?©Ő€›¦ä ÍŹf0Ú,e1ż©TjÓfQÝţh>6…OMeGÓĽ._źnžÚm *¸ Ąd~Ş•¨Ďf_ĹPľ5ća(…DŔđF榲Ş~OEҸ\ÜÉĘî¶­úĄŃIÜ•®$0}z1ý: LňßtfÍ ¨Á…ęóôOýf¨+ł_EŁ?üAt­yÝ8WW:說Ą »)‰ÜGˇ8—ÂK¤™Ńţ¨ÎÉČ#„¸‹SłľĄĎě”ęSGőňÂHČ|xŁW“pŽČôŽWfŮ\?LÔ%Ď«ű˘¬[Úi­˘ę±˝mË8ë™bS÷…vrîQ`’ůAS ňZ¶‚H[Ys›őłG†č–ĹęZ5Uż­TDU6Ö^„„Şť˛5w)}÷ż"Šý÷ţó0š» endstream endobj 983 0 obj << /Type /Page /Contents 984 0 R /Resources 982 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R >> endobj 985 0 obj << /D [983 0 R /XYZ 89 770.89 null] >> endobj 948 0 obj << /D [983 0 R /XYZ 90 591.248 null] >> endobj 258 0 obj << /D [983 0 R /XYZ 90 575.739 null] >> endobj 576 0 obj << /D [983 0 R /XYZ 90 372.039 null] >> endobj 262 0 obj << /D [983 0 R /XYZ 90 356.53 null] >> endobj 550 0 obj << /D [983 0 R /XYZ 90 199.683 null] >> endobj 266 0 obj << /D [983 0 R /XYZ 90 184.173 null] >> endobj 982 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 988 0 obj << /Length 1899 /Filter /FlateDecode >> stream xÚÝXKsŰ6ľűWđÔR3 ťéÁ‘í&­›¤¶ŇKšńŔ,qJ‘uÝ_ß],H‰2­$ť^ÚH`±/ě~»÷Ö÷~8y±<ůö"Ľ”ĄQyË;/ĺ^ ¦á-WŢ{_ňه叞”)JÁ&;{‘f6÷ĎŞ¬Űš˛Őm^•Hzrľ<ůx"€’{²S1‹Ąň˛íÉűÜ[ÁüŹg2MĽKµőÂ@ÂXx×'żśp§VĹ$eś‡^,%ă1éóv&¸Żk˝5­©«Ć!źo/ÂhʉHXĚSo#WqiLq7Ú ‚ĺţž”É(é}pz: ąż 7¬LV­LM?]® ĂXŤÄĎŻąP,!~YU•H„˛—ţ¶ĘËĘ8ňŰŠF]ŇŘ•Mľ.ÍŠţ˛Ťvt·ł€űÝÝ,Pţ]żĶ:/órŤ˙±ßnŚ#ÎK]?Dżq¬»šÎůYnżqĹM<Ü˙éő‚>ŞÚĆŃ\0(K!ś¬)×?/`›8îŻ6‘ż S®ŰÍ1ŹIaĹyě’čí Uw4Zcńă‰8yh ÎĺýÚckšC•Ga:S Ş+¤Né+ÓvőL(żlŽFÚDtž×uU÷Ú®(Ľ€"vBbȨęš2Ă ]iÜÂ9ă Ţ>Đ{s0!]ę' p€©Ů\pÎýËWŻş~{ľ¸y *%†żRţâćě|ńćěüęćüęj&ą˙ć —_ëěŚrâ†Ć ĚNÚŠ:ŞÄ.śî/O_ź]žß8îŽ9é:Î_H‡$Műõ© đÍ„YAŔä€\Ż^/oŢ.~&2î‘…`/ŕ‰ŁhSb9 AeGtżśÉŘĎ·ćL·zJ´’,’AOAÖ´pqjLpřŽĽuŚŻóżĚóąä U4Φ^ś÷»i)*dJ¨}Cőş™ň[~KvtJ8"92Aäay1ąËµŇ}čn•Wôy‡Áp<{8KS0͢žř˙ ü(dŽ©ˇ8ŰŐŰí-h9'Ä‘?aşÔ…su×Ţwíóŕő¸lŹlrH™a?˝˝/Lă¶ĺ…pë65mU÷{@łę¸ČtBś¦O˘îŮz‡á7$ř‹ÜŮ…0mŠUŻYŹč=C Ż(¬¬ż#Đ X15!q2„7ńřŠwţD7‹7Żç§—6ěÚ÷ßÓ(ľ\Ř Ĺ$3şŔ¶Pš;Yń”,D”%Ă}Y—ď®_:I@`%Á $řgy“ézE“yI‡VT IB˙˘čš  Ë  ąŐĺďMż ř3đż2…~´ç t6]‡R1Ř0ĺ/)´‡=}®Č\@p Á„0‰üW¤µ„l@­i1wĚV`ô%yŮUTٹȼ2Íc™męŞ<$2čw ÝŢ’RÁ±ĐÍ ö:–&3M}M¤üO”o΢ ţ–ď`ż|Gĺ;PÁ±ňŤË{ĺűÂe@u˛YMVé™đ§ ő~ŤWźQ¬‹wEçÝâĺéŐD­†Űňµżšű€…"ń­`Sż·D±˙aJ…0f*I‹öçÖÓww˛°~“÷#©Ä`ň dd1Lă/±Řv¨żÎ„ľ.ňŐ”ˇĐ>¤ęStc!?(đ.(RµW Ó¨‡ŮŻ1,ZďÓ’z¬‚…' ćž§xűh›¶6zK ¸pWWnŽŔ> áQ1 Ó~†‘ż¤íŔ±+łţözUY Ľđâŕ>Ç‚(yâ7]¶ˇY]đĄ‹Ęޤx2ĚĐŤ ‰]ű ÍwnAR§/=ąUÁ\îä–•#şëŠ‚Ž^WŽĆ-­k}ëČ6ş5ČčtĐŔĚfzŇbňŻ "J«¤vMsĐóĐGŤHX˘ Ď*î¶żÂ"ĹAüąJ[›ŠZPĎqmiF;‚î¶1;(ź4ťi 6\Á{›%ĂSŹŠßŔjH±o™ĂŐ:_o\&ßWMľ»çőwşťÁ=PërÜ÷¬°óÜćeÍ}+†N?č8J•nŁ-ĚźÓďîU›ÖďŠĐîĆ˙b»ŹÚÝ1ě˝­G,áâ ;Ţ>Ńź6Ľęi}+ëäŤÚŇiđ>¦5`¨Š†7K=¸¤hĂTć»v >'± AkąÁ”G]Ł2kűĆćö7Äą†É© GV&Ó]ă„O ân{p4Ą1+× ‡, ăq®PG©Km€ţ]ćěqD ćeÖ14M{´-jL;¦ßĎŻË?´=r¸”ěsŘKÖhȸSç…ľ-‘« ¨d3đĘ™qŐş‰xNăĺ°°÷ęo\îŠg€WžŢŞ„;Ý‹­­ 8K3ˇ¦ÉAgęÚŕžúo:·“¬´W-ÚnďĹČüŁŻŞw*"…}eťO™Ňź ]ŽŠÂJĽ9q„9ÝŃópa=C?—čŃ(đń*C”öńţÁ°ˇż˛˘ŐÉ3ęg°ý M°&¸ Ô»o«Úôş+ľ5ÚľDNyŘÎ |ěz$ŕOß_˘ÉŕňôĄŃťeÖ endstream endobj 987 0 obj << /Type /Page /Contents 988 0 R /Resources 986 0 R /MediaBox [0 0 595.276 841.89] /Parent 966 0 R >> endobj 989 0 obj << /D [987 0 R /XYZ 89 770.89 null] >> endobj 551 0 obj << /D [987 0 R /XYZ 90 598.72 null] >> endobj 270 0 obj << /D [987 0 R /XYZ 90 584.213 null] >> endobj 574 0 obj << /D [987 0 R /XYZ 90 321.263 null] >> endobj 274 0 obj << /D [987 0 R /XYZ 90 306.756 null] >> endobj 986 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 994 0 obj << /Length 1142 /Filter /FlateDecode >> stream xÚ˝W[sŁ6}÷Żŕ­0ST]’sq.ŰL’:n_˛;Śĺ„ YŔŮćßW7X°‰7I·}đ $ń]tÎů>zôÎ'ÇóÉog{ÇŢ|í 豊‘7_y÷>(1…~’¤+™–+Y-ňlDĐŹvĺ,ËĄÍäZVâľ,R=Ž|‚‚/óO“é|ňu‚”Wč!ă…2ŔőŇÍäţ ôVjţ“ÜűfvmĽőĚ˝»Éč"†ýČŁ¸9‚Ę "ĂjŽaţňĄ‘ő_BČOňle"iM¨ĚIďű(‘ jĹ|x˝Ý,U.!AĐ/×öąĚšş©d˛qŻÚ¶Bág…ťjĄČQ˙ďFVE’Ź`čoצţşőÓ<&Ťµ÷čĺgmÄ,ĘĆ^¤,Ąt^Óň)“&7/Ä Śy!B@PjsÉŠ¦ThaăĂ ;ĺ/Ą~m×Ô.®ŢĐ W/î†kć^ěÖ4Éó¬xh=dµť^o‹´ÉĘč”bŢş~ÖF’|+ť[ç~ű´J•…Ů“¤iY­B“ÜMćÁ’ÍäDÝ™†nĘmŃر†L? ©˝}Ë_ě«;)36đ]FôµFÄX&Ž@N3Ůl+ LQbâ€AˇBçRGĆiU•UČJ‹˛´ 1<­uĘZD]¬öąI˛â3¤Pýů|'buV$łNĽ€„Bč_]^˙~w;=Y\hD¨t¤Ń?YśNOnN§łĹt6 ôofvY ţÔ ţ\6gV×ň¸%=őu A+iĄeQ7&‰‡€]]ź^MΛsfcꩡ`-óu ČýëHšFy»óĎËëąÝ„˘ţ&Š`í¦Ď’§zDÚ=Og:ăŞMrß/…jČż›¤Čmę#bWHk‘aĹątĚ\+ű=ÚaVÔŮĘM;i¶ ť(é^ŃPçyż*\é{«Ď4©’ŤT†‡ ţneË“ 8‡Ř/ şłżHŠUŰ"Za*:(ťźŚ¦\7‰îCűBç D1`˝ßkáEŢmiNyXUl•Ş˛dŮF^Éԓ箍śźď!dcbĆ˙«Ę4Bý®LE„úő…ŹÔmI˲˝:ô*ÉU¶Ľ,L’î¨mˇĆÂńâňúěfLÍ\!Mđ{䜦€”ă$ââGB&ꏜůŽ@Ş+Q•T/-ŞëňíÂü)ş$ű)ż†żÎý0÷“Â=óĽL]S¦=tĚ›şlSE8ůĂŠ„0©2˙k˘B§6a˝MSY×ďă«ĺ«đOîŰä’MGĐ}""*ŚŃ>î ]'ŇĉńîT€Ř›fÔM«Pí¶-Í; +ňkڧ±éX{„·(é›{őŕ®đłó‰wo@ĐçfÓňÎ-?öŞ˙ş*7CőĽą‡E€·,˙{X×ě_ďW6żĂIĺ—±« #ďn‡CŮVňëVÖŤ\}.ż#Ť>x#íěíţáăßűďĂ]›ë endstream endobj 993 0 obj << /Type /Page /Contents 994 0 R /Resources 992 0 R /MediaBox [0 0 595.276 841.89] /Parent 996 0 R /Annots [ 990 0 R 991 0 R ] >> endobj 990 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [105.88 211.845 159.339 220.691] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 991 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [200.495 122.043 253.953 151.109] /A << /S /GoTo /D (structCStreamInfo) >> >> endobj 995 0 obj << /D [993 0 R /XYZ 89 770.89 null] >> endobj 950 0 obj << /D [993 0 R /XYZ 90 630.093 null] >> endobj 278 0 obj << /D [993 0 R /XYZ 90 613.631 null] >> endobj 967 0 obj << /D [993 0 R /XYZ 90 443.45 null] >> endobj 282 0 obj << /D [993 0 R /XYZ 90 426.988 null] >> endobj 575 0 obj << /D [993 0 R /XYZ 90 283.61 null] >> endobj 286 0 obj << /D [993 0 R /XYZ 90 267.148 null] >> endobj 549 0 obj << /D [993 0 R /XYZ 90 94.191 null] >> endobj 992 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1002 0 obj << /Length 981 /Filter /FlateDecode >> stream xÚĹVK“›FľëWL9¨ ăyň8*’Ö^{ł«HäÚ¸( Ł]U!Ŕ€vł˙>=0`!cyťKNĂ ýúşűë‚Aďfż…ł·Wڎ.sQ¸CAžK±d…)ş·8ł?…ç¦R‚R{zµĎ”í0I¬e‘*oâf_äZt¶ g_f$ ˘­9éaŹK”f÷źJáü">znĄH0k†¶ł?fäbh ¶ë‚đ1ĉ)±J±n®o?n׫Eô"s™ő~~»ĽYEóą-ĄµX®wËŐ¦űÇÉR%EŞŞč®Tą>äÖßD‚)É„nć·ŰőÝĆÄ ŁđŻőJ{{%Ü“hĂ\PäPŠHLQSĹy]Usuh~ítF\†™ďöIüóú6ś0 }ßë…ňęnwż¨Şž°'–ďE5BüDȡľ‡ Xt‡ą/:a*›xÝ&íŇÓmöyÝÄy˘p[ßľ@g±8‹.±çš|¬m ö«ř `ĐţježúŘ#ŽÉľÍęy§@e€˝`hŃđŃtč n¶/e˙ŁčÖĎf¬UzˇçcIÄâF5ÇʦŇĘëK±Máú~Âă<‚iâ9ŘC98…•đŢéNU *’/Ýz÷ąncÝ x˘_rô€ëŹD'Ä©kćD†:Ńjł±9±€íďmU3”Z˙ô ™\ά¤€îiˇL1fš¤ß’‚2ŽXQ«l§N‘ŚQěIż—ěÜ÷ nśDkŰÖ|3˙}Ęe8đ‡>*5¨)?\`"ř„źiZëÄľŠłŁš Ţzř?b´ >MŚ Ečüąičzź?ôszÔ_eĎIť˙‰Őm /1&h•ĽŽ+ç FîcËa »}şÚ\ €9äP°µćř¶ÉůQ«ćrĆâ(ڎľFŰÁ…0žlG`ĺr!…Ä>pŽ=Á~zxQS=3VUU˙şřdV 3«Ř™UTŔŚp™VR`ázý°bfNiMś”egçëS¤ődSßŇŢ&h9´ł±77מŇř˙‰eo¦Ř™Ć*tbźÇµ†;Âô×ËŐňăŹîĎůúw_[e´’ǸÔ첮_JŐy2mŢÍĐ}+´ł (Ü«~9öŔ†BÁ]_‹T5ń>«M>ą7Fĺq™é»_öy’SÇ…”ľanBޞýgüř¦-hŻ#'u’CšE@ŁZUç ÓN`F>EuS¦×yxŽź˘Ô÷ućĄzĐݰQqj4†Dť?J}Ž9tčOľI˙ÜŔ‹ endstream endobj 1001 0 obj << /Type /Page /Contents 1002 0 R /Resources 1000 0 R /MediaBox [0 0 595.276 841.89] /Parent 996 0 R /Annots [ 997 0 R ] >> endobj 997 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.906 181.317 431.905 192.221] /A << /S /GoTo /D (LIBUSE_Calling_Sequence) >> >> endobj 1003 0 obj << /D [1001 0 R /XYZ 89 770.89 null] >> endobj 290 0 obj << /D [1001 0 R /XYZ 90 739.935 null] >> endobj 618 0 obj << /D [1001 0 R /XYZ 90 543.139 null] >> endobj 294 0 obj << /D [1001 0 R /XYZ 90 513.396 null] >> endobj 547 0 obj << /D [1001 0 R /XYZ 90 267.75 null] >> endobj 298 0 obj << /D [1001 0 R /XYZ 90 236.885 null] >> endobj 1000 0 obj << /Font << /F22 396 0 R /F46 965 0 R /F23 397 0 R /F37 543 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1025 0 obj << /Length 981 /Filter /FlateDecode >> stream xÚµW[sŁ6~çWh¶/0S+ş .ťéńe×»Žwk“N[ÇĂPf 8Ţíeúß+qIĹvěĐ'$qtřΧOçpXŢ+×®r5"ŘĐ6ܰ0 ÁŔ ÁBµ Ńz„!5öŁŰm1E^Śf|Ĺw¶TžrÉ6ÄRmé~T†®ň `ń%pФ ±˛X"ŠőŹAj[ŕ[nťPńÜ€ąň“‚j(i%S“(ÇI°Ů‡%˘oy 8fęźĹÚzçoď‹á*ÝŐ#ú!ÇZ}¬ů1T`D ŃMŔLM›Ę0 b2#7y9Î_V;Ë…«qĚŔ ˇ=W™ô*ď˝î«óÁÚŚ‘2tF$¦^„>ŕw‘„?Ö˘hđ… ¨S ô-jďaµ=`Ńc©ß…ĄÇňĄ·[—(gąY®€ńdčM5ĘTçfčÝ8ż4}I#ÂŚú2qęP×­N0L?{F…˘ Á;ĎKR(ťmxâÇ®#Ť0ő«ÔO<ď];>»|ă©w­a¤ŢŽĽůř·V|wˇB޶‰´¸aýĺŃ ť›‰="„haU;`Ú®l$ë•s\˙hS]hÇčô>ßşgÄ)GF…¬,ĄB¨ö‰`M¨‹‹˙dĂAşuŔ#1 3đ9ě釹Sg´S‰8ÓţÜabB×ńÍňF“Űůo4÷jŢ •<Ö’SŻJ4Ô„Ś•‰f´O‚,J“Î2T”dÇŃËĚ~Hą9źřyŐZßÓŕ^,´(ah!땎ż.4A‡©.ź•Ů$‹PHYgëgÍ&ÂEä˙ľé.§WÁ¦,J¶űLVu™$۸[ôo™ç˝ą;9wy‘üNI÷Y7Hě·"ń“ŕ<ůňŹÚéŇôJ˛nűśY‹&u-ňI¶r,oFÉő~%Kˇü}k OÂź ťAâÄ9Š©żgóÝ=Fá+SâS<ÇdřŚĘ‹y|˛EŁŕ^¦ ‘ň> endobj 998 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./main_8cpp__incl.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1030 0 R /BBox [0 0 635 224] /Group 999 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-0 1031 0 R>> >> /Length 1121 /Filter /FlateDecode >> stream xś­ÉnI†ďőůťDdä*ˇ:XB#!ͦĄ9 Ć`ÂH0‡y}ţČĄşşĽPF-ËΨΥ2ó‹?"Ú?¦7ćÇ$ŃH0!zĂAĚĎOć_ó}bŁ???›×d>˙ןßţ…?˙Od^ă÷ëôî˝!KćăÄdţ6mť;m9góÍD˘•…ľoćË4F]Md“/ä̶ĹK©ţŕmâłáČşŞZY°†'ż¶Đ[×]Fbĺ:ë\§bK))ÄúŃň řĺDćx7˝¸=Đ5ÇŰéÝK"â9kăfame>¶ľ?‡ůŕśFP#őž4ż?ľž^O—·śqf&Ý]µśîŢą3‹Ú9N#÷ś˝ć‡Ď10ÚeżąP¶×ýÍ€‰>ĚRŹ|Ó;>ö;wói{7·ă*ŕ%“Ĺ{˛<Ž p˛…ťXřÍŃ’OęŚ6ŞCO(¸·¤ ®Ę¦Śëu…%nĚ?OżC)üfkER®¶wĆéśŇA“*!oîÂ+ťÔýiW+ňŹ8·ľN™UÂŐŞ Ž×ÖxĂ2rŹ/¸ŔŹú‚¸;wŢ€ĽY\řÜg^ű™úüI}‚V=‚ć‚“ ]w»Ňö,[»ł_ĎŘŃ|Ôńżă?$ŢŁóčč°f7ŔŇÓ&˛¬T/Ďs×řő jvÍöÎfŞÚ‚¸€rä©čaE8ÜxŻkO ťÜŞ·"ŘŚß‡Ú wlŐjh˙՟FîěU ăe?ű´’í}Ş‹JĂ!ü˛‰ÜÓ3 ®yátlăLÁYĘŘ1c}ÍTp‚h· ŞňľSX–R•hŠu>ŕĄk{ –¤§ źúŐo¦ícč$ĘnWŞˇ„­ÝŻgěˇř)÷čťÎóó"Ç™ů Čśš›ś‚¸Ű$üçóĘ<á&ŁłoPŻWő–ęQÄř”,—žŔqkĹć*  ĚŘTż YkŔ)ą9ůJďŐzA“u Í îĎŰ©pB¬®ţn˘®Ťłś ßµÝÇěRvĆöö”˘Kż}¤6j˛1|âĽ*Vé!áďG®¨ťŠ‡†đE\@ÝZZúV¶łSËެ)./—Ľä$8EŃ[¸10tŃ3J†śIÚ7Ź{“öŃF‰ ż­0›YQ»ŞÓ•ŮąŻFďŞßQń„Gč9si˛ĺëů×ĹÚö6*^q=Ę÷ç'hδ拧ŇňłšąĄg5Óĺ˛3ľŇá*ŇH¶şząS<őŐk>Ľłđ–…M3+>a:7;ÉŐč]Ő·‚¤lôąŐë(±ą!tľiČOBkť˙PŔ%¶Ľv8xŚŢ` ˛’“I-G;”•Ś7‡Ë×ůl=B0¤¤ÂŢ(rŻĂ÷MPjŚąÚLşŞ˙»x3ýmc endstream endobj 1030 0 obj << /Creator (cairo 1.8.10 \(http://cairographics.org\)) /Producer (cairo 1.8.10 \(http://cairographics.org\)) >> endobj 1031 0 obj << /Type /Font /Subtype /Type0 /BaseFont /FreeSans /Encoding /Identity-H /DescendantFonts [ 1032 0 R] /ToUnicode 1033 0 R >> endobj 1032 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /FreeSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 1034 0 R /W [ 0 [ 500 833 556 222 556 278 500 556 556 556 556 333 556 222 556 556 500 500 278 556 722 278 611 722 500 722 667 556 667]] >> endobj 1033 0 obj << /Length 1035 0 R /Filter /FlateDecode >> stream xś]’Íj„0…÷>Ĺ]¶‹Aăř3"”éĆE¨íhrť 5†č,|űĆś0…>Ď=IŽ÷Ć—ćąŃăJń»ťeË+ ŁV–—ůf%SĎ×QG"%5Ę5Ë©3QěĚí¶¬<5zŁŞ˘řÉËj7zxRsĎŹĹoV±ő•ľ.->µ7c~xb˝RŐ5)Üv/ťyí&¦Ř›Ťrú¸ngű«řÜ SęYŕJrVĽN˛íô•Ł*q«¦jp«ŽX«zz‚­äwg}ąpĺIR¨ÚS  #č Ę@ Ę=Ą hGPé©L@'hč ĘAhőđĄ é)šBĄ1(T “'‘`ÜE _Y€ŻÄ]DČW‚Ż „|Eđ!_ůrś.ŻÄ_Č—…/ëA!˛‹ďč:˛·lźŻű<Č›µnüúŘ»?jľĎ©™ÍîňĎ/í»ĺ endstream endobj 1034 0 obj << /Type /FontDescriptor /FontName /FreeSans /Flags 4 /FontBBox [ -958 -462 1632 1050] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 1050 /StemV 80 /StemH 80 /FontFile2 1036 0 R >> endobj 1035 0 obj 344 endobj 1036 0 obj << /Length 1037 0 R /Filter /FlateDecode /Length1 3236 >> stream xśUV{l“׿çú•ÄƉc;Nâě|‰ó°ó _ě„$$qü€Ř‰cbCěÄqäÉJS P ”¨@ˇu›´©[…&g[šŞ±­U7©ílH(Uۉj´ ŰSAš:řĽs?›Çüů>Îą÷ś{îďüîý>„rHyóÔč,ůćß?&$ëď¨Ý˝yn—YÚ/?NHv岭łŰ¦d'Žtˇ|ĺ¶MîŮZ׾†ýËhÓ<>6şĺ›—˘śłuÎqTČż˘<Ęl~ŮřԮݭŮ)”‚ň®É™ÍŁ„ěů=!ĘB¶ŢÔčîY¸Äć+OŁlžýÎجöXç*“(ß'”¸ ’ë­{‹FfŃXŕ†0Aá(%×ÖI®»ľÄGý–‰…-ŻoľÁŔŞ˝†Ó4ZąRůł_oi qÔ^ľ¶±»/Â×ňkÓUůëŞCö˛ŔáŘŢĐZ%\yܢ{RťZ˘\ŁŠ4â*NŃ»ŽohŇËąRk«ŤíЦvX âJ ms5¨%ş—üŁŃ-5ŮŮ\Ae•,’čÎV–hk ŰJĘVZW7·´ÉÂŢhŃżÍ ;ßîö UŃŽěňĘŢČŐT”—«Č‘ĘäĹĹÖĘšzáÝŐ UžŞ&dg1uĄľ%ŻÓĹ4FZÜc“žsĽG¨üŃ}Şúëöífř c×>Á§ŕ˙áÖµô †[:C´©>čvÁD]óhHřÚ —kd×!l…kăřc~W¤–ŕ3ô‹9®7]b«Aġ7#YťŤžŢ wBÉšMLĚŘ14ń¦Ö™MĂ;öoś8wŕĐĄM,NJś)+U˘?5)"Ä áő"Ě:·BŁ-•3ßNGŁŐŮŰ:9ľgßŘhçk]ˇP—'ţ„~Ů—řţáůóAá.}kćęĚL,1›öYŚ1ŢEŚr‰‘ńs<ŤÍ ‘d"f^ᮿ´Ďącďľ­“Ž3žHÄ‹ľé⣠ďJŰGćĎŻ\áţěP|fz(1~+‘€±ę‰rKáéĆóX؆™…ąEP(űÁh oĺ"ysÓ_žňď,Ň Á ‘ŐýwÖVz¶oŘxčEg“ťJ]±těe»€kä=ƞݞby;çLĎÎďźń…B>ďş>j-¤H*…§âěn !í\x.ľŔµ,Ź™ ­ÓLŃđđE <ÔŇ3„/W0ÜÝhşŕ¬đ*{=@łŻÇó>Eo“zĽ Ú©Ł±2·żáÉk!}ŞÔ®´VRÁëuË)lh–ç}çÔ‰ÝűOBţłëŠ]neű6WU Ř\Q­m}kqu•!ĚŐ—ŮüÜ kz=MŐőů+uݦU«k—/ăšâm˛ÎĆ„¤3.[±m$RbĆVŠjRX# ,Aâ ąx—vŹŁ†ŮK‰ µ ’… ËA4UxkŞń ’G4Č]-úÖ“bŔ÷^)&ěÜŞ˘ż@äh/Ĺ»ÖOÂř¬˝­Ç'AIbOm YŠ&ýs±$á: “r[tuLÔÍÇĚ7’ ­-¬I‚Ýlţ¤.©°ĹŁfóÎ7şĂ5oŮÔl´XbFK¬&Iíţ¨—‹Yj’űöBs˛3µ$;qDjg.-śeoô3ăÇ1#΋>2ţ Í’2[4雋‰úX —‘Ů—Ĺk’rűB)Ă ĚÇâqc’ …}ˇLTu>QeŮó5ćUu5$Ť¸ľ{ę§ ŻŽä¶= JÉ× ľ?ÝjŁŹŰ‡]B|Ł´Ĺ,ňg¬%_ 7Č üí‡]ĎË7fôO&¸OÜńQ;©&ź“.l}P@PżűN,ĹX*±”A/ńR{ęÎódĆ|8ŻKÚ¨Q6Ńż9öóéf2ýaÓaŁIŽ»°­Ď¬ŤTOŕ»z°śÄ‚ߣhA(~ăŇaôR,!,‡±0ů]¤ŇHÁň>ÄA†~dh'ű‰…ĽŁ­ü*–˙˘Ŕ/GĹ$ńZÜ˝ ®’-äyD‰Šrv¬,"˝ ©#$Ě Eľ[đ±Ä&ó-ş~쌙0Őń(IJÍޤÄćIf™˝ż”ľBm˘ @!«%#ČQPč2‚Ěěý-˘2G2r63Ű“rŘ`öTf’ĘŚóe8K™Om ߊ*6o™ä y˘Q3ŤR´Ěhr™Fý¬&ťäv>5lBŢ3b˙ĐŃŔ endstream endobj 1037 0 obj 2418 endobj 999 0 obj << /Type /Group /S /Transparency /CS /DeviceRGB >>endobj 1004 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 498.262 230.941 508.189] /A << /S /GoTo /D (main_8cpp_aea681fdc68ba4b307e92a33c8a62ea08) >> >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 482.837 217.103 493.741] /A << /S /GoTo /D (main_8cpp_ab4a8982ff08a7f0ed68e15d851833d38) >> >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 468.762 208.505 479.292] /A << /S /GoTo /D (main_8cpp_a08a7e8a6abdc5cf6d2ac4e978e084d1a) >> >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 454.313 218.468 464.844] /A << /S /GoTo /D (main_8cpp_a8abd3ebb6e18277a43604c06f41e77a8) >> >> endobj 1008 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 439.865 219.026 450.395] /A << /S /GoTo /D (main_8cpp_ab3bc9e46a841eaef9e74d55e0045eba8) >> >> endobj 1009 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [145.731 426.019 236.291 435.946] /A << /S /GoTo /D (main_8cpp_a414bbb1046de58d0a2596be7b829448d) >> >> endobj 1010 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.921 362.651 148.839 373.555] /A << /S /GoTo /D (main_8cpp_a0ddf1224851353fc92bfbff6f499fa97) >> >> endobj 1011 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.547 300.259 193.102 311.163] /A << /S /GoTo /D (main_8cpp_ab7e6541570b5f939d29aa8bbcc1dde61) >> >> endobj 1012 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.547 285.811 198.084 296.715] /A << /S /GoTo /D (main_8cpp_a2e18f5738841433eb8c7cd9357ff6ced) >> >> endobj 1013 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.547 271.92 186.447 282.266] /A << /S /GoTo /D (main_8cpp_ac7fa490a7117a01e48e05784a6da30fc) >> >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 257.471 194.239 267.818] /A << /S /GoTo /D (main_8cpp_a904ab05aa185e4cbd7dfbfbf043caa6f) >> >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 243.023 211.673 253.369] /A << /S /GoTo /D (main_8cpp_a84b7343ea6e13f56b7a06559a7ef8b5a) >> >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [220.171 228.574 261.655 238.92] /A << /S /GoTo /D (main_8cpp_ab78424394912809ef271c9587d264664) >> >> endobj 1017 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 214.126 192.844 224.472] /A << /S /GoTo /D (main_8cpp_aa5539bfe92dba402e77bcbbb497eee32) >> >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 199.677 178.438 210.023] /A << /S /GoTo /D (main_8cpp_a93d34427c5ada45032539b77c78ab2f6) >> >> endobj 1019 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 185.229 195.872 195.575] /A << /S /GoTo /D (main_8cpp_a774499c04248e86e7f71ea689c3a7d19) >> >> endobj 1020 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 170.78 177.043 181.126] /A << /S /GoTo /D (main_8cpp_a7f18a204314393991d3da96356b2fd16) >> >> endobj 1021 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.547 155.774 177.601 166.677] /A << /S /GoTo /D (main_8cpp_aad1596787d6c1baa977de86d9a6f503c) >> >> endobj 1022 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.906 93.195 431.905 104.099] /A << /S /GoTo /D (LIBUSE_Calling_Sequence) >> >> endobj 1026 0 obj << /D [1024 0 R /XYZ 89 770.89 null] >> endobj 1027 0 obj << /D [1024 0 R /XYZ 90 517.732 null] >> endobj 1028 0 obj << /D [1024 0 R /XYZ 90 383.098 null] >> endobj 1029 0 obj << /D [1024 0 R /XYZ 90 320.706 null] >> endobj 302 0 obj << /D [1024 0 R /XYZ 90 138.831 null] >> endobj 1023 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F14 586 0 R >> /XObject << /Im5 998 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1056 0 obj << /Length 1316 /Filter /FlateDecode >> stream xÚ˝W[s›8~÷Ż`ş/0“h%¸äÍÁ8q×Hw»i†ˇXvá’µq:Ý_żlěng//Ž>}çč\e(­%(ÝŤnĂŃĎSŚ% X:ÖĄp%YP2tFR¸”ždUSžĂ÷’ŞZÂ6ŐŇišQĺ(OĘd—Ó˘Š«´,8t䄣?F!ˇ„j:bC%R’Źžžˇ´dň÷ŞeJ_kT.iXeĎL FFđČ4„€EnmĂĚT +L€V®„ĚúB\śłęč”Pb0`BŇ!¨ˇúiŮă»vt« (?NŁ`ö»#¤ź!â as/BŤ.u@—.téź qąϸHŇ,‹7ßÄgZĽî*ńúEÁPŢ­LäÝ´ËÍÚ·ŠnA¦@ÇšĐŕS¦EB—-R<ó8-¸ŮÜN0ěeÍĐ»NÁĂN™ÎćNäróĆNô0ţM1Ń[‹Ný«SÍÜ‹î5‘……±Hë‹t  ‰Ú„d„ęŔ‘4`™¸Ĺpă.ę逺ڷý4^Kš”ËC8~$Z×*;¨Oăĺ…Ł×Pńş*ĘIßDdÚ¦IţJů÷š—"gŚřO^Iâ,ëgů2D«MçŹÁ}4őY†B/”Gcš»Ëż´ÎŰČr™ňBŽłşÁβY7-ĆżIO'›H<§›8§{ź˝˘»4;¸‡_ď¶­7Ş˛M¨î¶/A_Ň,n\–ĄĹ˙Q†äŚ“˝Wb[Bř.ŠŠpXF ć°Ny’˝ńZDŃ»ď7©j{ŻîőaŰ˝Çđbáó7ýPŞGŐŻĂTżSýł0b¨™g±ţwÚÉŁ]n&`XĆ÷š/ŻĘ]u®›"˙ YÖ¦ŚGC@ÓÍC¨Ú=ÝI=8h–vňUÝĎŇ´¨öt#LšĹšOÓ»±…™µŹmĽY'Wj™NCÝŁ’—x3ULbžFµ§°~ë¨{{Rř(ź´Şěj¤Zťś$¦»-ő:Ű>R¬á Şňx¬hP¶#Űsmg<ŹśđŢ›\Ő«xż:qěČőř{9®÷xwÝÎÂŕę„ĂĽ_®ö)RZ(îBBě ĎWtÎ|bwÇ÷ůşçsJÜĄôíh¬ „ä0tÜG.l>gëÉ*Č<ł˙zČ [Ď Â3Ě]=‚{‡éT‰üńóÓĂÂw‚€iBúÎÔńćĘhî|tć}Wč}W,ě‡őźkAöýŘućýńb1sď3V5rľ‡ ž±ło憎?oĎáLŽýôáaÍ=…-ţş§ńĄÖbxčęqÚî팺Aőă"™ÄU|G«¶ p«ˇŢÝŘ`fEÚ]ť•[zžĂ. ŢÓ×~Ě/#_Ďó Z90ĄŮNYÝťě‚“uWqoĐłŐ†Ćů¬X•çIĽWZś'4. Ő‚*fćuĎe “ż\Ě»Čß:6‹[ Ç\Îoi|7IY¬šEţĺ4ď¬đ)Ńý¬6i±nŕ¶8í ĹÜ77+îΆB3ŤăK&—Şë˝'¦j¦Ţ7VqŽú–Ű9CÍđŽâMś^áÜî‘C›âëŢ9Ұ÷–őLÜHíCDonŠ]~/Ç ë›ŰG–Ş["Şq˛_⢠Ův°çĺ¶ęSjş~‚ “Íä*ÎŽˇĆÉĺ…‹±Ú pî¨ÁµŔ¦`O×6Î_Ů->®ÚŐ¸hĆyČ=“ć”*čÝ`Ź˙f›*P!ţŃŮ4b3 endstream endobj 1055 0 obj << /Type /Page /Contents 1056 0 R /Resources 1054 0 R /MediaBox [0 0 595.276 841.89] /Parent 996 0 R /Annots [ 1053 0 R ] >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [177.272 483.592 293.774 494.496] /A << /S /GoTo /D (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) >> >> endobj 1057 0 obj << /D [1055 0 R /XYZ 89 770.89 null] >> endobj 306 0 obj << /D [1055 0 R /XYZ 90 739.935 null] >> endobj 1041 0 obj << /D [1055 0 R /XYZ 90 721.648 null] >> endobj 310 0 obj << /D [1055 0 R /XYZ 90 721.648 null] >> endobj 1038 0 obj << /D [1055 0 R /XYZ 90 658.58 null] >> endobj 314 0 obj << /D [1055 0 R /XYZ 90 636.729 null] >> endobj 577 0 obj << /D [1055 0 R /XYZ 90 611.8 null] >> endobj 318 0 obj << /D [1055 0 R /XYZ 90 611.8 null] >> endobj 1042 0 obj << /D [1055 0 R /XYZ 90 549.869 null] >> endobj 322 0 obj << /D [1055 0 R /XYZ 90 528.018 null] >> endobj 1039 0 obj << /D [1055 0 R /XYZ 90 466.964 null] >> endobj 326 0 obj << /D [1055 0 R /XYZ 90 445.112 null] >> endobj 1040 0 obj << /D [1055 0 R /XYZ 90 401.683 null] >> endobj 330 0 obj << /D [1055 0 R /XYZ 90 379.831 null] >> endobj 334 0 obj << /D [1055 0 R /XYZ 90 296.926 null] >> endobj 669 0 obj << /D [1055 0 R /XYZ 90 271.141 null] >> endobj 338 0 obj << /D [1055 0 R /XYZ 90 271.141 null] >> endobj 1054 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F14 586 0 R /F46 965 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1060 0 obj << /Length 641 /Filter /FlateDecode >> stream xÚĹV[“š0~çWäLs!\ú€Š­;J§B;m]ÇaÜĚZĶŰN˙{@×kwÝŃöÉ…ś/çűÎÉIŢ(Í@yŐ!ŘĐ6‚؆Ś`LŔPµ Ń„!5 yŁĹ˘uř,®z8‰s [jśErĘ6Dź2mÜ(n |U°Ř \"3š”(U†#&bţ Hm |/WĄ@'T´3ŕ+ď´ç%ĆĐfڬÝ$Âk“lÜ„şÖŔ!őŁf5Ěyx·ö±=ŹViśaÁç™ôlŹ4 ˘CFéÄ5܇Ö[gPá„YÔ\%‚ďĐńZ㦆ĹßÎŘď~qG5*=ŤędźÍÂüˇÂš„EXőî4‚ÔU˘¦J)SˇD“öŘ„a•})´yR›=<ć1$> Ź“Łb̶ɑš\tćn2¨YĆĂVżÝ÷ťOc?ô\oT­x]5Ţ»q§+fĄ×Nß}š¸' +Óy˛Ů븷´kł§;ˇ-Ť°ľedRhY2Ká=‚lB]d_˝&šgÉPĘ2pťv)]ĎéÔĎîŔ?– CĘŘ®R%©ćŻôrśĆéiO‡”<'•W>Ż ýEq¶¨qťN~‘ÇaÚ_ý¨†­y&M˙_Ćłµ]/xTĂç?ăłâva%äţ»ÜőËp7¶ą§˝ä^ä<›ţý°˙Bż˙y:”sS.‡ß4ĚÄĹRWŤeÝVÍ},ր˒ËU”ÜÉ"óâ•gő•ňňęQíf‹UqTŃk«b–š5­'ĘM×;÷}ËkTűŕqéËé[ó7#ßbÇ‹eyjöŻĆÍ»h˙yeQH9÷uőäą endstream endobj 1059 0 obj << /Type /Page /Contents 1060 0 R /Resources 1058 0 R /MediaBox [0 0 595.276 841.89] /Parent 996 0 R >> endobj 1061 0 obj << /D [1059 0 R /XYZ 89 770.89 null] >> endobj 342 0 obj << /D [1059 0 R /XYZ 90 739.935 null] >> endobj 1049 0 obj << /D [1059 0 R /XYZ 90 722.92 null] >> endobj 346 0 obj << /D [1059 0 R /XYZ 90 722.92 null] >> endobj 1045 0 obj << /D [1059 0 R /XYZ 90 661.124 null] >> endobj 350 0 obj << /D [1059 0 R /XYZ 90 645.634 null] >> endobj 951 0 obj << /D [1059 0 R /XYZ 90 585.852 null] >> endobj 354 0 obj << /D [1059 0 R /XYZ 90 570.361 null] >> endobj 1050 0 obj << /D [1059 0 R /XYZ 90 528.203 null] >> endobj 358 0 obj << /D [1059 0 R /XYZ 90 512.712 null] >> endobj 1051 0 obj << /D [1059 0 R /XYZ 90 452.931 null] >> endobj 362 0 obj << /D [1059 0 R /XYZ 90 437.44 null] >> endobj 1052 0 obj << /D [1059 0 R /XYZ 90 377.658 null] >> endobj 366 0 obj << /D [1059 0 R /XYZ 90 362.167 null] >> endobj 1046 0 obj << /D [1059 0 R /XYZ 90 302.385 null] >> endobj 370 0 obj << /D [1059 0 R /XYZ 90 286.894 null] >> endobj 1047 0 obj << /D [1059 0 R /XYZ 90 227.112 null] >> endobj 374 0 obj << /D [1059 0 R /XYZ 90 211.622 null] >> endobj 1043 0 obj << /D [1059 0 R /XYZ 90 151.84 null] >> endobj 378 0 obj << /D [1059 0 R /XYZ 90 136.349 null] >> endobj 1058 0 obj << /Font << /F22 396 0 R /F23 397 0 R /F14 586 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1064 0 obj << /Length 358 /Filter /FlateDecode >> stream xÚµ’MOĂ0 †ďý>¶‡'iúqÜ·6m¶LBlSŐµ)TZ[Z!ţ=é2!6. Ä!rlŮŹŢ×2Â Ś­ž´nFŚAHBŹy 3|ŹÁ(Č66÷śťśç!ˇBčˇSu””ÓaíA•4…*ë¸Î«˛mµ†Ňzµ¨îD 'śđ‰Ď$…µŮ!¤ş>$< ŕíÔU€Ë¸ŽXY÷^HăWŇN}fD,U¦ŽŞLTj¤ěßM,âĽÜ˘@ý(i%]YDčpFh( & ڏ„˘Óˇh'ĎńŃpަ~ięÖjjÓźfŃĽű­är6\ěÎd~If.ánhČ =vFe&ĆMšW_éćżEdzˇí˘5‚úÄcîx¤gŹËî<ęÎ&ă…M2şëĎM"Řyˇqon×2ę9íő(ZM‡?0=PI•Şăw“{‡ˇÝd¶öäa“?9ţĽ”ë 8áČ~{oR-Ŕą endstream endobj 1063 0 obj << /Type /Page /Contents 1064 0 R /Resources 1062 0 R /MediaBox [0 0 595.276 841.89] /Parent 996 0 R >> endobj 1065 0 obj << /D [1063 0 R /XYZ 89 770.89 null] >> endobj 1044 0 obj << /D [1063 0 R /XYZ 90 727.815 null] >> endobj 382 0 obj << /D [1063 0 R /XYZ 90 713.245 null] >> endobj 1048 0 obj << /D [1063 0 R /XYZ 90 653.647 null] >> endobj 386 0 obj << /D [1063 0 R /XYZ 90 639.077 null] >> endobj 1062 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1112 0 obj << /Length 780 /Filter /FlateDecode >> stream xÚÍËŽÚ0†÷<…—‰TR'ŰŇIHëŘČ6Ó˘QeѶ#UŚÄ°h߾΅ŠK:-*ł@ (ÇţřĎŐŕ+€`2€'×DŢ枼±Fˇ äC„#ŽG@®Ŕ˝UlVëö'ůî·‘¶؉/¨ úĐqÝćq„ě1´R•2šbDT‰ĺ”e•=pµŤçˇëjۨy|ą|X­žVë­úţřą2uľ˝iwŔŰjËę†Oŕ~čůĐň˘#˝^Çş{Ś § Q}­ľ"Űu]KÚńČB s^ýĆřUŮÂ`Óë*˝°Znôuą[Şővű´UëÍę%4‚ňĽ[nw7×ĺĐg)O{ŕˇfńřçÄĽwô‡eX啸nzÜ<îzऌë»(¸ĐE˝łÝ‘o!RdŞöVÂŘűŰą(ü ŇŃŚŕţH$^ő¬Ľe˘gJÚnd1űhz·¨ŰÖ͸:|GYu/¦l>™Ş¤Â¨NWĺ‹·źKĹr=Ü”şěľµ0ęś™{:J„ÉZ|ČĂíZw$í ŽŔr/*Un‡c äćŰ·‰çźzŘzˇ[˝rw`ďV’ ]îPv1gÇŕŤg Cŕ{ăGţ•c(hăŔş$3U"ş¨ŕÓĂ*xb}uŞčĎT˘D„ÔX‰íBkžç߬K.ލ±¦qu•b1‰M_ ,¸P¬9}ŻŰ«D>ĐŰqD]b>Ű ¤ÇdűľŐô}ĂúsĄ)6H§<Ăšf;‘ď6V~ĐXĄzĘĄĚ•ĂW­°g§Ón<‹ąĘ/÷ďiÎĐLęőQb* F»ÜÝ6˘fČĐX„¤Îh”uxý†uřô_Ľ¨®ÁR3A})Ź•MĄ&çoň®›W˙«0ɱŃÎ{ĘSÎI•˛ m`vMójĆqV¤R'VŻd¨ś‘‚Nxi¸Wé"’ş¸SڧŞFWĹůAFV˛9aŐO6ęuÇ«čń4hÂFˇ:Ô›bTż{ş[¨”•: „hSŕěĐĺŕáÓ9k endstream endobj 1111 0 obj << /Type /Page /Contents 1112 0 R /Resources 1110 0 R /MediaBox [0 0 595.276 841.89] /Parent 1114 0 R /Annots [ 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R ] >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 608.529 193.242 618.716] /A << /S /GoTo /D (page.28) >> >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 584.593 193.242 594.78] /A << /S /GoTo /D (page.27) >> >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 560.658 193.242 570.844] /A << /S /GoTo /D (page.27) >> >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 536.722 193.242 546.909] /A << /S /GoTo /D (page.27) >> >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 512.786 193.242 522.973] /A << /S /GoTo /D (page.27) >> >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 488.851 193.242 499.037] /A << /S /GoTo /D (page.27) >> >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 464.915 193.242 475.102] /A << /S /GoTo /D (page.27) >> >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 440.979 193.242 451.166] /A << /S /GoTo /D (page.27) >> >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 417.044 193.242 427.23] /A << /S /GoTo /D (page.27) >> >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 393.108 193.242 403.295] /A << /S /GoTo /D (page.26) >> >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 369.172 193.242 379.359] /A << /S /GoTo /D (page.27) >> >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 345.237 193.242 355.423] /A << /S /GoTo /D (page.26) >> >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 321.301 193.242 331.488] /A << /S /GoTo /D (page.26) >> >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 297.365 193.242 307.552] /A << /S /GoTo /D (page.26) >> >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 273.43 193.242 283.616] /A << /S /GoTo /D (page.26) >> >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 249.494 193.242 259.681] /A << /S /GoTo /D (page.26) >> >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 225.558 193.242 235.745] /A << /S /GoTo /D (page.26) >> >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 201.623 193.242 211.809] /A << /S /GoTo /D (page.27) >> >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 177.687 193.242 187.874] /A << /S /GoTo /D (page.27) >> >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 153.751 193.242 163.938] /A << /S /GoTo /D (page.26) >> >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 129.816 193.242 140.002] /A << /S /GoTo /D (page.26) >> >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 105.88 193.242 116.067] /A << /S /GoTo /D (page.26) >> >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 620.497 409.724 630.684] /A << /S /GoTo /D (page.27) >> >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 596.559 409.724 606.746] /A << /S /GoTo /D (page.27) >> >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 572.622 409.724 582.809] /A << /S /GoTo /D (page.27) >> >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 548.684 409.724 558.871] /A << /S /GoTo /D (page.27) >> >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 524.747 409.724 534.934] /A << /S /GoTo /D (page.26) >> >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 500.809 409.724 510.996] /A << /S /GoTo /D (page.26) >> >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 476.872 409.724 487.058] /A << /S /GoTo /D (page.26) >> >> endobj 1095 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 452.934 409.724 463.121] /A << /S /GoTo /D (page.27) >> >> endobj 1096 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 417.042 409.724 427.228] /A << /S /GoTo /D (page.26) >> >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 393.104 409.724 403.291] /A << /S /GoTo /D (page.26) >> >> endobj 1098 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 369.167 409.724 379.353] /A << /S /GoTo /D (page.26) >> >> endobj 1099 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 333.274 409.724 343.461] /A << /S /GoTo /D (page.27) >> >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 309.336 409.724 319.523] /A << /S /GoTo /D (page.26) >> >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 273.444 409.724 283.63] /A << /S /GoTo /D (page.27) >> >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 249.506 409.724 259.693] /A << /S /GoTo /D (page.27) >> >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 225.569 409.724 235.755] /A << /S /GoTo /D (page.26) >> >> endobj 1104 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 201.631 409.724 211.818] /A << /S /GoTo /D (page.27) >> >> endobj 1105 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 177.694 409.724 187.88] /A << /S /GoTo /D (page.26) >> >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 153.756 409.724 163.943] /A << /S /GoTo /D (page.27) >> >> endobj 1107 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 129.819 409.724 140.005] /A << /S /GoTo /D (page.28) >> >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 105.881 409.724 116.068] /A << /S /GoTo /D (page.28) >> >> endobj 1113 0 obj << /D [1111 0 R /XYZ 89 770.89 null] >> endobj 1110 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1189 0 obj << /Length 1137 /Filter /FlateDecode >> stream xÚĹZŰŽâ8}ç+üHCÖIH€G“8™ÄÉŘNď´zF۰˝HÝ´–Fí߯sAÍ%\žŚ©:uęb— ^ĂÖ€·ţ, ôŤľką€˙ út]Óp,đ xŇěžţ‹v}hƗЧ!ńńŹü‹ć­[ůsĚâe§ktm<żµž~A0‘ĎżhŘýř]üę t,[®Ż€µľ·ŕ{ ĺgË]K®]«Ô;?O¦Ďď“éBĽÎţŇ;P3ţůRŕ(,^*$tŘOmËšŐ«ľ/¶YĘm›¦ŃwśR.Bą,OřÔbâaáć×˝Ł‹»‰%Nń LtŰŃР·˛EJęĹÂĎňĎ(Ţ‚#‘d<͸hWŃaôsóí8ńKČĄl÷ö++Ä1JÓ witď‰)ui÷<,!áF馌łěß Ó÷8Q’Gűźią`z7gńÔÇžđ$/T tjYÔÁąQ8K02ť¨Ŕ”ćµHÜÓ‘”¬ĐQȸRß8 !$˛>#µµą!„ ĘŘčvÜ2qé= HőľĄ!Šâ›WŚ:ą{A¬R¨ c>Jü†É ë·čśDäZlŽşiš×ű¶†>µˇ˝pÇR!Măą\Ç˱.ď 1ťO®"÷c9^,/“ĽNŤ'OSЉ(ý®š† ©—PeéL¬šŤŮ|¶TÍŚ̓pO‡<‡ …ľ(H$É7uá¶!_ž°ü_ <ĐĽžáđL5qB0ö×Íž–Č„•u„ę.Ô¸:+H’沫H˛áH BÎÔ ?î˲äÉ4 d±ŽĺYÇu´Gu˘«}‹]žŤ5^¤zj‘˛ş·.›aţąéŠ@ďv4F—łĘúŹ˙äNpr%i,Sq%á„ÉAţą,oŻŔ2]ŁÓł€kۆkuj4‰™Č&’<[~{ďG8ĆäxbuܬC`1Š˘Ăgc˛WWŔF]Yˇ™"ÂҤ,F×ěM쑜’?µ¦ą IÍČ7R6›D]xf„eéĘYŐ‘î8ZYyݧÄó°:‡l ßíŐUĆY»áŃŔۆÓ#zęÜ}ąVzŔţ ˇquňż¶őJÎŽ Rí˛.Č-łĽLAľĘKš:\çS%榒! ɡ0Lňn8/Ńn7vm˘ŕ.©gQîmF•Ă1˝CVľK)öCŹËĽ6Űű a(NŁ iĺ||m:Ř Č0EΗÝr\fs¶Äyb—Ç˝â—ĺA€*şÂZeƸ: 5vŤV÷ËŹ˛oŠe¬0vB¤ś.kfŁFđöFŤÔăÓ”Ú\—í˛ĘáRÍ|ä€ňrrrĺaš,:0ŮPŁ nLˇ&2ęgg±îîÜČűŐ…)š?űăĺx8]~şűZłą]ą[(ÂůL-Ś~3ŢëűÇôvv˝á˝ĎBh˝Đ±n:Úď{rQ®Ábü¦”6Ě^_wő»ŞôŻÖíż-ôlÆVÓ-üÚ›»ě endstream endobj 1188 0 obj << /Type /Page /Contents 1189 0 R /Resources 1187 0 R /MediaBox [0 0 595.276 841.89] /Parent 1114 0 R /Annots [ 1109 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R ] >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 727.536 193.242 737.723] /A << /S /GoTo /D (page.28) >> >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 703.626 193.242 713.812] /A << /S /GoTo /D (page.28) >> >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 679.715 193.242 689.902] /A << /S /GoTo /D (page.28) >> >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 643.85 193.242 654.037] /A << /S /GoTo /D (page.28) >> >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 619.94 193.242 630.126] /A << /S /GoTo /D (page.28) >> >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 596.029 193.242 606.216] /A << /S /GoTo /D (page.27) >> >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 572.119 193.242 582.306] /A << /S /GoTo /D (page.27) >> >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 548.209 193.242 558.395] /A << /S /GoTo /D (page.28) >> >> endobj 1122 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 524.298 193.242 534.485] /A << /S /GoTo /D (page.28) >> >> endobj 1123 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 500.388 193.242 510.575] /A << /S /GoTo /D (page.26) >> >> endobj 1124 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 476.478 193.242 486.664] /A << /S /GoTo /D (page.25) >> >> endobj 1125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 452.567 193.242 462.754] /A << /S /GoTo /D (page.25) >> >> endobj 1126 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 428.657 193.242 438.844] /A << /S /GoTo /D (page.25) >> >> endobj 1127 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 404.747 193.242 414.933] /A << /S /GoTo /D (page.25) >> >> endobj 1128 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 380.836 193.242 391.023] /A << /S /GoTo /D (page.27) >> >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [234.159 356.926 246.114 367.113] /A << /S /GoTo /D (page.28) >> >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [253.476 344.971 265.432 355.157] /A << /S /GoTo /D (page.27) >> >> endobj 1131 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [230.084 333.016 242.039 343.202] /A << /S /GoTo /D (page.27) >> >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [232.853 321.06 244.808 331.247] /A << /S /GoTo /D (page.27) >> >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [222.164 309.105 234.119 319.292] /A << /S /GoTo /D (page.27) >> >> endobj 1134 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [222.891 297.15 234.846 307.337] /A << /S /GoTo /D (page.27) >> >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [225.66 285.195 237.615 295.382] /A << /S /GoTo /D (page.27) >> >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [281.929 273.24 293.885 283.426] /A << /S /GoTo /D (page.27) >> >> endobj 1137 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [207.967 261.285 219.922 271.471] /A << /S /GoTo /D (page.27) >> >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [210.736 249.329 222.691 259.516] /A << /S /GoTo /D (page.26) >> >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [269.885 237.374 281.84 247.561] /A << /S /GoTo /D (page.27) >> >> endobj 1140 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [250.508 225.419 262.463 235.606] /A << /S /GoTo /D (page.26) >> >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [270.452 213.464 282.408 223.651] /A << /S /GoTo /D (page.26) >> >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [256.814 201.509 268.769 211.695] /A << /S /GoTo /D (page.26) >> >> endobj 1143 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [258.109 189.554 270.064 199.74] /A << /S /GoTo /D (page.26) >> >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [178.817 177.598 190.772 187.785] /A << /S /GoTo /D (page.26) >> >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [251.783 165.643 263.738 175.83] /A << /S /GoTo /D (page.26) >> >> endobj 1146 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [232.316 153.688 244.271 163.875] /A << /S /GoTo /D (page.27) >> >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [228.002 141.733 239.957 151.92] /A << /S /GoTo /D (page.27) >> >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [248.017 129.778 259.972 139.964] /A << /S /GoTo /D (page.26) >> >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [212.938 117.105 224.893 128.009] /A << /S /GoTo /D (page.26) >> >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [215.708 105.15 227.663 116.054] /A << /S /GoTo /D (page.26) >> >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [253.148 93.912 265.103 104.099] /A << /S /GoTo /D (page.27) >> >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [402.342 715.581 414.297 725.768] /A << /S /GoTo /D (page.27) >> >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [345.336 693.011 357.291 701.857] /A << /S /GoTo /D (page.27) >> >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [476.234 679.715 488.189 689.902] /A << /S /GoTo /D (page.27) >> >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [345.336 657.145 357.291 665.992] /A << /S /GoTo /D (page.26) >> >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [433.126 643.85 445.081 654.037] /A << /S /GoTo /D (page.26) >> >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [476.224 631.895 488.179 642.081] /A << /S /GoTo /D (page.26) >> >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [476.075 619.94 488.03 630.126] /A << /S /GoTo /D (page.27) >> >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [434.989 596.029 446.944 606.216] /A << /S /GoTo /D (page.26) >> >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [345.336 573.459 357.291 582.306] /A << /S /GoTo /D (page.26) >> >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.725 548.209 402.68 558.395] /A << /S /GoTo /D (page.26) >> >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [456.468 524.298 468.424 534.485] /A << /S /GoTo /D (page.27) >> >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [497.106 512.343 509.061 522.53] /A << /S /GoTo /D (page.26) >> >> endobj 1164 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [427.179 488.433 439.134 498.619] /A << /S /GoTo /D (page.27) >> >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [474.411 476.478 486.366 486.664] /A << /S /GoTo /D (page.27) >> >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [413.101 452.567 425.056 462.754] /A << /S /GoTo /D (page.26) >> >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [409.534 428.657 421.49 438.844] /A << /S /GoTo /D (page.27) >> >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [426.142 404.747 438.097 414.933] /A << /S /GoTo /D (page.26) >> >> endobj 1169 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [475.726 392.791 487.681 402.978] /A << /S /GoTo /D (page.27) >> >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [492.653 380.836 504.608 391.023] /A << /S /GoTo /D (page.28) >> >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.096 368.881 469.051 379.068] /A << /S /GoTo /D (page.28) >> >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [489.713 356.926 501.668 367.113] /A << /S /GoTo /D (page.28) >> >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [475.009 344.971 486.964 355.157] /A << /S /GoTo /D (page.28) >> >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [433.146 333.016 445.101 343.202] /A << /S /GoTo /D (page.28) >> >> endobj 1175 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [379.647 309.105 391.602 319.292] /A << /S /GoTo /D (page.28) >> >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.148 285.195 407.104 295.382] /A << /S /GoTo /D (page.28) >> >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [479.432 273.24 491.387 283.426] /A << /S /GoTo /D (page.27) >> >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [494.127 261.285 506.082 271.471] /A << /S /GoTo /D (page.27) >> >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [439.432 248.986 451.387 259.516] /A << /S /GoTo /D (page.28) >> >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [467.726 237.374 479.681 247.561] /A << /S /GoTo /D (page.28) >> >> endobj 1181 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 213.464 409.724 223.651] /A << /S /GoTo /D (page.28) >> >> endobj 1182 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 189.554 409.724 199.74] /A << /S /GoTo /D (page.29) >> >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 165.643 409.724 175.83] /A << /S /GoTo /D (page.29) >> >> endobj 1184 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 141.733 409.724 151.92] /A << /S /GoTo /D (page.29) >> >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 117.823 409.724 128.009] /A << /S /GoTo /D (page.30) >> >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 93.912 409.724 104.099] /A << /S /GoTo /D (page.30) >> >> endobj 1190 0 obj << /D [1188 0 R /XYZ 89 770.89 null] >> endobj 1187 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1266 0 obj << /Length 938 /Filter /FlateDecode >> stream xÚĹ™]s˘0†ďůą„™- ‰ \"bKÇŞ ¸ÓŮn‡ˇ-3|¸H§Űýő­â(`Ż!<ď›ää$90¸Ąş&ő˝!XI„"0g@â@[äYňŔś‚'ZöÔGćŮĽ-±j“÷ŇHJîRŞIýˇxr“|ú˛ĐfŰHŽO==s`JîߎERĽ§­|Đ‚\=`P?(nÇĘäg®ôlŰéa'śâČşĹq?¸űăejŤ'í nxČrÜgűiÖŢs_GłŻßRË+ŻŃ<3­ßRŕé ŤřěůĘámsŃ!÷E fá»0âŰţW9— sÜCve9A)VOUF=U·T]OnŚô"¶¸Ëćb ŐRúťfE<á0íóFCE•ňöýőă®6wÚĐÔkł6f$HËşüPDlź´·ĂrŕôěŘ&ˇ\„ěś4ąŹÔ·)•e*^¸ÄŇö;­„Áo˘2×m†č÷Ú\®®ýČö‹Ľ"®¬×ľëyÂNçď3sĐIh–Ś/DdÖÚŚŽ8¨Í˘ăq=6™í"(<éđNöŞőąĚ“Ľ{a¶Í|jF–żË§ďÓ9µˇfÖMĚńÄ´~2<hy őÎěqŃćśLöW¶ăŁV°śĂöÖíUWJŻ1ľsJćD—cĄIp_5˘,«Ëđ=é[†öK=ŞëŰnŔ:‹EŃ·Ęt7pşo3 ô G•…rŠd7ŔÁÁ‘…5ę­Ł(Ś›ŚٶI˝¸qÓˇş-çĽÚA€˝ő9 ń˛– ŮUf.˛|ě×,–ż´Č ‚D„X¶>Ĺ ÷ßÖdŠ+ńuJ=ͱR±8růUäÎöZ+GŰIÓgX¶Ł’‰=’|/äµ6kż [ŃŐ ąuZ †5q’mýo,WˇŚ“N‰ßęŁEú†ěů˛d–ÄN˛|«a‚7żkOeÇÁËĺ„T‚…®¤¸2uK1HYUuĐ \ĆŐ{(lx&Óáč0¶˝:‡m­ađŮĐiÁÔuꂥ?¸"- “ĄíUÄ,K§céČnK*š|Ć9ş9U=aÇrÓ•·łX“ŇéđŠ+\_#eóIęÇŐz+Z%:śeŮkŤď&7>ŞÂ‰ĎGĹ/ů -–pˇ ŹTtMĚl¦é‡ şO“Ű‚»ÇőFEoń~Ů âŻQµĆSI»°vŢÉ˙—ÖA,"ĄŇ™Ąý"Ĺ- endstream endobj 1265 0 obj << /Type /Page /Contents 1266 0 R /Resources 1264 0 R /MediaBox [0 0 595.276 841.89] /Parent 1114 0 R /Annots [ 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R ] >> endobj 1191 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 715.534 193.242 725.72] /A << /S /GoTo /D (page.31) >> >> endobj 1192 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 691.529 193.242 701.716] /A << /S /GoTo /D (page.31) >> >> endobj 1193 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 667.524 193.242 677.711] /A << /S /GoTo /D (page.31) >> >> endobj 1194 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [161.362 655.522 173.317 665.708] /A << /S /GoTo /D (page.21) >> >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [224.366 643.519 236.321 653.706] /A << /S /GoTo /D (page.26) >> >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [200.963 631.517 212.919 641.703] /A << /S /GoTo /D (page.25) >> >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [206.493 619.514 218.448 629.701] /A << /S /GoTo /D (page.25) >> >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [191.001 607.512 202.956 617.699] /A << /S /GoTo /D (page.25) >> >> endobj 1199 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [182.692 595.51 194.647 605.696] /A << /S /GoTo /D (page.25) >> >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [193.96 583.507 205.915 593.694] /A << /S /GoTo /D (page.27) >> >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [215.698 571.505 227.653 581.691] /A << /S /GoTo /D (page.28) >> >> endobj 1202 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [215.15 559.502 227.105 569.689] /A << /S /GoTo /D (page.29) >> >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [188.599 547.5 200.555 557.686] /A << /S /GoTo /D (page.29) >> >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [211.145 534.78 223.1 545.684] /A << /S /GoTo /D (page.29) >> >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [221.785 523.495 233.74 533.682] /A << /S /GoTo /D (page.30) >> >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [179.753 511.493 191.708 521.679] /A << /S /GoTo /D (page.30) >> >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [220.689 498.773 232.644 509.677] /A << /S /GoTo /D (page.31) >> >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [210.726 487.488 222.682 497.674] /A << /S /GoTo /D (page.31) >> >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [225.112 475.485 237.067 485.672] /A << /S /GoTo /D (page.31) >> >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [187.484 462.766 199.439 473.67] /A << /S /GoTo /D (page.31) >> >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [203.942 451.48 215.897 461.667] /A << /S /GoTo /D (page.32) >> >> endobj 1212 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [227.514 439.478 239.469 449.665] /A << /S /GoTo /D (page.26) >> >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [205.945 427.476 217.9 437.662] /A << /S /GoTo /D (page.25) >> >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [185.462 415.473 197.417 425.66] /A << /S /GoTo /D (page.25) >> >> endobj 1215 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [201.661 403.471 213.616 413.657] /A << /S /GoTo /D (page.26) >> >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 379.466 193.242 389.653] /A << /S /GoTo /D (page.31) >> >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 355.461 193.242 365.648] /A << /S /GoTo /D (page.32) >> >> endobj 1218 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 331.456 177.332 341.643] /A << /S /GoTo /D (page.18) >> >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 307.451 177.332 317.638] /A << /S /GoTo /D (page.18) >> >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 282.729 162.667 293.633] /A << /S /GoTo /D (page.34) >> >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 258.724 162.667 269.628] /A << /S /GoTo /D (page.35) >> >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 234.72 162.667 245.624] /A << /S /GoTo /D (page.35) >> >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 211.432 177.332 221.619] /A << /S /GoTo /D (page.18) >> >> endobj 1224 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 176.677 177.332 186.864] /A << /S /GoTo /D (page.18) >> >> endobj 1225 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 141.922 177.332 152.109] /A << /S /GoTo /D (page.18) >> >> endobj 1226 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 117.2 162.667 128.104] /A << /S /GoTo /D (page.35) >> >> endobj 1227 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 93.195 162.667 104.099] /A << /S /GoTo /D (page.35) >> >> endobj 1228 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 714.795 379.148 725.699] /A << /S /GoTo /D (page.35) >> >> endobj 1229 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 690.747 379.148 701.651] /A << /S /GoTo /D (page.35) >> >> endobj 1230 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [361.933 679.44 373.888 689.627] /A << /S /GoTo /D (page.17) >> >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [391.81 666.699 403.766 677.602] /A << /S /GoTo /D (page.18) >> >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.159 654.674 428.114 665.578] /A << /S /GoTo /D (page.18) >> >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [342.566 643.368 354.521 653.554] /A << /S /GoTo /D (page.18) >> >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [359.173 631.344 371.128 641.53] /A << /S /GoTo /D (page.18) >> >> endobj 1235 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [388.503 618.602 400.458 629.506] /A << /S /GoTo /D (page.18) >> >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [366.924 606.578 378.88 617.482] /A << /S /GoTo /D (page.18) >> >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [357.36 595.271 369.315 605.458] /A << /S /GoTo /D (page.18) >> >> endobj 1238 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [398.874 582.53 410.829 593.434] /A << /S /GoTo /D (page.18) >> >> endobj 1239 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [349.211 570.506 361.166 581.41] /A << /S /GoTo /D (page.18) >> >> endobj 1240 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [370.78 559.199 382.735 569.386] /A << /S /GoTo /D (page.18) >> >> endobj 1241 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [413.957 547.175 425.912 557.362] /A << /S /GoTo /D (page.19) >> >> endobj 1242 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [386.849 534.434 398.804 545.338] /A << /S /GoTo /D (page.19) >> >> endobj 1243 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [385.186 523.127 397.141 533.314] /A << /S /GoTo /D (page.19) >> >> endobj 1244 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [415.621 511.103 427.576 521.289] /A << /S /GoTo /D (page.19) >> >> endobj 1245 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [418.141 499.079 430.097 509.265] /A << /S /GoTo /D (page.19) >> >> endobj 1246 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [391.034 486.337 402.989 497.241] /A << /S /GoTo /D (page.19) >> >> endobj 1247 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.35 474.313 409.305 485.217] /A << /S /GoTo /D (page.19) >> >> endobj 1248 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [388.254 462.289 400.209 473.193] /A << /S /GoTo /D (page.19) >> >> endobj 1249 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.404 450.265 368.359 461.169] /A << /S /GoTo /D (page.19) >> >> endobj 1250 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [376.877 438.241 388.832 449.145] /A << /S /GoTo /D (page.19) >> >> endobj 1251 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 403.799 393.813 413.986] /A << /S /GoTo /D (page.18) >> >> endobj 1252 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 379.751 393.813 389.938] /A << /S /GoTo /D (page.18) >> >> endobj 1253 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 355.703 393.813 365.89] /A << /S /GoTo /D (page.18) >> >> endobj 1254 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 319.826 379.148 330.73] /A << /S /GoTo /D (page.34) >> >> endobj 1255 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 296.496 393.813 306.682] /A << /S /GoTo /D (page.18) >> >> endobj 1256 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 272.447 393.813 282.634] /A << /S /GoTo /D (page.18) >> >> endobj 1257 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 237.288 409.724 247.475] /A << /S /GoTo /D (page.26) >> >> endobj 1258 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 201.412 379.148 212.316] /A << /S /GoTo /D (page.34) >> >> endobj 1259 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 177.363 379.148 188.267] /A << /S /GoTo /D (page.35) >> >> endobj 1260 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 153.315 379.148 164.219] /A << /S /GoTo /D (page.35) >> >> endobj 1261 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 129.267 379.148 140.171] /A << /S /GoTo /D (page.35) >> >> endobj 1262 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.768 105.936 409.724 116.123] /A << /S /GoTo /D (page.25) >> >> endobj 1267 0 obj << /D [1265 0 R /XYZ 89 770.89 null] >> endobj 1264 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1306 0 obj << /Length 604 /Filter /FlateDecode >> stream xÚĹ—[o›0†ďůľińډI¸Ě‰Ž*M·@¦jY…#¬ ÷ßRvB’Ľ—äŕ…rÎÂ&ŁÇëôcňë(]$Ç) ?Xľ¤Čő ďßŰă ŐČ-:dĄý|©ä%ó))ZŮâ~ŕ±Ć꺓͋ű–°ĆtWńO„př‚Ç« ëčšő~MŁ$dSšî9Đ…¤¦q%pXŕÔîż˙hĄš·µÔn=ţ>ějPCřÚĎĂż¶e} endstream endobj 1305 0 obj << /Type /Page /Contents 1306 0 R /Resources 1304 0 R /MediaBox [0 0 595.276 841.89] /Parent 1114 0 R /Annots [ 1263 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R ] >> endobj 1263 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 727.536 193.242 737.723] /A << /S /GoTo /D (page.25) >> >> endobj 1268 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [181.287 703.488 193.242 713.675] /A << /S /GoTo /D (page.26) >> >> endobj 1269 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 667.612 162.667 678.515] /A << /S /GoTo /D (page.34) >> >> endobj 1270 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [130.787 655.587 142.742 666.491] /A << /S /GoTo /D (page.32) >> >> endobj 1271 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [185.212 644.281 197.168 654.467] /A << /S /GoTo /D (page.34) >> >> endobj 1272 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [153.491 632.257 165.447 642.443] /A << /S /GoTo /D (page.35) >> >> endobj 1273 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [164.819 620.232 176.774 630.419] /A << /S /GoTo /D (page.35) >> >> endobj 1274 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [131.614 608.208 143.569 618.395] /A << /S /GoTo /D (page.35) >> >> endobj 1275 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [156.52 596.184 168.475 606.371] /A << /S /GoTo /D (page.35) >> >> endobj 1276 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [148.769 584.16 160.724 594.347] /A << /S /GoTo /D (page.35) >> >> endobj 1277 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [155.972 571.419 167.927 582.323] /A << /S /GoTo /D (page.35) >> >> endobj 1278 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [197.128 560.112 209.083 570.299] /A << /S /GoTo /D (page.34) >> >> endobj 1279 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [174.692 548.088 186.647 558.275] /A << /S /GoTo /D (page.34) >> >> endobj 1280 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [147.414 536.064 159.369 546.251] /A << /S /GoTo /D (page.35) >> >> endobj 1281 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [172.321 524.04 184.276 534.227] /A << /S /GoTo /D (page.35) >> >> endobj 1282 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [171.474 511.299 183.429 522.202] /A << /S /GoTo /D (page.35) >> >> endobj 1283 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.835 499.992 145.79 510.178] /A << /S /GoTo /D (page.34) >> >> endobj 1284 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [202.478 487.968 214.433 498.154] /A << /S /GoTo /D (page.34) >> >> endobj 1285 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.29 475.944 195.245 486.13] /A << /S /GoTo /D (page.34) >> >> endobj 1286 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [184.655 463.92 196.61 474.106] /A << /S /GoTo /D (page.34) >> >> endobj 1287 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [176.455 451.178 188.41 462.082] /A << /S /GoTo /D (page.36) >> >> endobj 1288 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [153.402 439.871 165.357 450.058] /A << /S /GoTo /D (page.36) >> >> endobj 1289 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 403.995 162.667 414.899] /A << /S /GoTo /D (page.34) >> >> endobj 1290 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 379.947 162.667 390.851] /A << /S /GoTo /D (page.34) >> >> endobj 1291 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 356.616 177.332 366.803] /A << /S /GoTo /D (page.19) >> >> endobj 1292 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 332.568 177.332 342.754] /A << /S /GoTo /D (page.19) >> >> endobj 1293 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 308.52 177.332 318.706] /A << /S /GoTo /D (page.19) >> >> endobj 1294 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 284.471 177.332 294.658] /A << /S /GoTo /D (page.19) >> >> endobj 1295 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 260.423 177.332 270.61] /A << /S /GoTo /D (page.19) >> >> endobj 1296 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 236.375 177.332 246.562] /A << /S /GoTo /D (page.19) >> >> endobj 1297 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 200.499 162.667 211.403] /A << /S /GoTo /D (page.34) >> >> endobj 1298 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [150.712 176.45 162.667 187.354] /A << /S /GoTo /D (page.36) >> >> endobj 1299 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 142.009 177.332 152.195] /A << /S /GoTo /D (page.19) >> >> endobj 1300 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 117.96 177.332 128.147] /A << /S /GoTo /D (page.19) >> >> endobj 1301 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [165.377 93.912 177.332 104.099] /A << /S /GoTo /D (page.19) >> >> endobj 1302 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.858 715.581 393.813 725.768] /A << /S /GoTo /D (page.19) >> >> endobj 1303 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [367.193 680.991 379.148 691.895] /A << /S /GoTo /D (page.36) >> >> endobj 1307 0 obj << /D [1305 0 R /XYZ 89 770.89 null] >> endobj 1304 0 obj << /Font << /F22 396 0 R /F23 397 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1309 0 obj [556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389] endobj 1310 0 obj [500 500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389] endobj 1311 0 obj [500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj 1312 0 obj [500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] endobj 1313 0 obj [777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6] endobj 1314 0 obj [769.8] endobj 1315 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 1316 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444] endobj 1317 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394] endobj 1318 0 obj << /Length1 1648 /Length2 9497 /Length3 0 /Length 10564 /Filter /FlateDecode >> stream xÚŤwT”m×.RŇ-‚ÔŇ3tw·4H0ŔPCŚtwwwH”¤¤€(- Ň!H#ůă›˙÷ťłÖ9kÖšy®ť÷ŢűÚ÷z†žú•&›„Ě " s€łq°R**  ÄĹqbĐÓkAávżĺô:g(ĚAđYH9CŔđG™4ţh¨s(ľ±pp8x9řA '$đ·!ĚY v…ZTŘŠ0 ˝ĚŃĂje Ěó÷#€Ńś Ŕ! ŔÇú‡;@Ââ 5;TŔpkýcFs°@f…Ŕ=ţ#ٰ5î(şąą±í]ŘaÎV˘L¬7(Ü q8»B,żK¨‚í!•ĆŽAв†şü©Đ„YÂÝŔÎŔŁŔjqpytyă`qYc›.UI§«ÜĺŮSŻŤŞFî 6*Ů+*łř™‡‹'SI^—ä43¸-ş©’”‚eÎýŻ(˘đşŃĹ,¬ú5éq˝_Ö÷~Krc *—ĺS iWíě®-ĎV&&Đ9ř®o5ŇÚä9#y™÷Ý>.h=Ú0"M5“FI¸óF˘[ ŢęŕđĐ"~EOT€˘kŕćOşP8ľŚĐą4÷ÓťĹBśŰĽ2×ýL/39Bń}‹ţw+L©WőŞ'Ö'űFÔŚÉÝ|֦ɖŃžż(đ‰$Óťó‹¶"-rèšE“.]tz3 ň—«ľSŘ*†…(yĚOőŽŻŢľQJS0ř2ĚČŞ’(r_ąqŕóžľ#ĆŐ2±íem*ţ† q6ÓžŹePáť]ÎâcČ”.§şu»–hé˘@p›ż>¶+4˝Zř~{đi‰ţ…—'÷}áig§$ĂĽSM”C A´çjâwfqÁőđSŁyF]´”§›ýÚ…wŤűš‘ň =¬Ä§ĘłÝžçÇę,~l4L@•űvŻ+28†„˝-‚¦ja˝/üś˛1ޡ\5˙ÝőYńçX;†ky@ôőľçÝ>b&@ñŃĄâŐ3!ť‰.+ŢÁÂ~LDŃ9Ö‡cѶ45En{ ĐčťWÓL+3ŃW'K!qŰţZôÍć•ä 5q\k6ÂĆXě@"őˇ Ýĸčv‰ŐłÖĽ(¦É:˛©Xíĺ"hěo·ł÷ϸ¬Č^śf‹ŕPtšP==ŔLžý”$×)^ąyÚt˘KCőqŁ)'ëă*řdöZÖE-)8ąţČ‚ó¤Ő-ZőCŐ¤Ľčą´ĎůO´…ś„~ýśöŤu6Ż«¬ĘqP»8Ě:[ł+ŔަťÖ1ef~L=núAGć ›äźőz|WV„éÖ¤šÍ!… (~>Ž÷l{–3ĆđÍŚ F?™·§ÎîéŽĆéj…I DĽ¦ŃÓ;5!EĘŢ,0Ę;‘%Ş»âÂő%.Î6źŐ8Ú,1ó§çH+s$„ŰDu}Ź…`ńf`ěšăe|ň îîűzÎaGX¶ôMö»¤NwŃaËYů†k*#-™‹›LŤˇH_ Ë ćĆń 3oÉŽĂSo1ѱţ,/+GžZçr1Ŕ˘‰şÉ_Č‚»°H«wŽGuýÚ•Ö\)ŽyqFĹóËł§zŃ5žŘ¶€çĹę“+ný˘`§3ŢMŽ…ëÖ1%<†1Č×éË‘đ=ËÖ&áź6J·±“t¶-vËô&götFxël}Aů›ĎmÁĘ#~/Ąk}yĹáő5€đ‘C~Dět®ěĽ—™VÇh»%jč÷ůU^Ęű áÝÝĂz9ëĂĄ«×—‡ďWDĹç7µňż Á5Ü2'×1Â(ł ­GŔô¶ ňbŹ›-8>Áůađ­y˝Â 6>˙'xđŞĺµO7ÁÖx2Sm(?˛¦Ć¤^ŠÇsál—FN›5ăöµ 6<ún¬8íś¶U/Ń©`~eÍ[){ŘĘ&hŚľŇ§ŔqáąĹ¶—51·h$AäSc7éŇźâő3 ś>¤=0ÔBÜxUĽë˝š#”KĽ>@˛żU‚rsC9xvŽ…4NSĄdľ»e‚q&zűéV 6.RĚLNŘňiäÚŁŘŽÖ‘•.C{Ś\ę_ďźĂŁÎůšK$§™lHX_nÜ‹ăęÁ\G´‰—ŃÄY…ć*báď´TˇşĘidŻ]pź>Q|vÎřŕę±PcmĚÜ#Ż4WçmxöM?ÂŤđý •ý".Vć÷}‘®<>ě%ĄĎkóhxÁíŤř8ýÝLźx$Ţ·ś>JA CťZâ±ŃOFeĽÝľ# [ÉÄđ{»CQ·Äe˝=áďňú1µČ>ţ˛ltY4YfDÔŚď=mĄŐ5ĚŕB 8»6Ĺ-}9¶ޤÜU“¨Üż2ÎVl$łL­&ÂÔ+ęęŃK·…FjŐ±µ©‚ĄÍv>‹ ]őJ!@vd Ł0 oC~Ĺ˙*#‰qFü‘ŢŢfrVňÂR Mwů+âzy^ů›_ ĄË„[`b5C Ď9Ö§‰ň_ď§żˇÔ±­(ë뼮0;ŕÖË5˝µ!•™˛­÷ݧÖëďVŽďlş*LĐN«˝ČZ¨„Ů]kÉ“9LÜ{dőA´n]B$ł#a!\TcŢFT€ŁŚŤ-2ĎÖ€%Őj†”ÉrÓÚâďCŮBă OöľČz&Ó•vúk*!"ŮÍZňş;­ćS {`Ô»ůÔĘËéŻĚRl“jnőë<`î_›lŞÓÜ‹ę5;Ň‘ =Ţ39<kËŐŮ Tl"Ąü…ĘB5Df É7 ö\µLŻó'H›µT`^2°$AT! ćšd˘o?~[Ť—äTQݤĆŇeČöš:š”2w_±Cž‰ÜYý"ţ=…:ĎE‘ꉙ˛PtŚÇ–ŕ€äRDÝ­P힏ç6ś–L0e–µPŰ„Xů•XÂűÁáçŞRŐ[š*ÓĐŁiěyŃü/—á›X›Ç\Ěł6´ş˝9Ň{ü;Qt'“Ţ'ąÔͲ‘+ĂŁ‘-÷/vç•“„Lü0,ÔSčšÚR{ő‡ż‘Űk8í^)$úZÎŕ! °¦ľămřţÜ„ăşhŇ× €ůa˙-ą&+ŠGśXćéŚÄT˙Їcŕşň“Ö/đůTHGÚń‡;čݤďěĹ'‰oâµâdZKtŐ¬ŘćSgz˘qkĺw·HpŔň¨”4h†žĹwń€“”Á26:(^9§ŁAZu):Ęw<şJŢžţ§ëi?˝ç›ŕO‹m$-vCtDŞ=ç¸ć»µf}Ű· ę;ßßOs™Ţąćß;:8ic©ččVd]°oęłÁw2Ňwk«ę9=s¦Ź‚KÂ0„5yáďíú–L?enE"äµ!(ěŹS0ĺĽÎ8ť2ŕÉŕh±K´Íy>K­‰GÂúyđÝ•Ą?wI¤G6ůÝő«–R|Ő@(Gýȶpßâ”fL uČŻźźÉ^€.ĆT|í‚Ý;×ôýšÝy­‰ňTĆŕ-Rĺ]óÁ9ÎNPy€gGęfśs5 îŢę]‰d¦2"02~[°E’ř0ł<Ëŕ/G–;1Ćń†däb€‘x–âťŮ–ÄXGĚť·RƸűS˛ţŽ ß¶ýCkî@ŞmÉÚŮÍ%Ęjű¨%ńe“b‰—[łÝŻŰ&» ĐXé4 čöSŇHU1Ý1Žľ#?«F`˘ę-&IÜńŰKxÎťog#[tŞ Ńldř’ Ž'–w:®´_¤=k!•’+ĹńORýšWŰ·â-PzzČ‹×-±r95hjşŃi#ÄD|Žđş!Î˙á^»”žůš—ĚđŰi“äÖZŇ|‚đđŢć«h:G$›*˙î]·^x ´|Z]¬X1•Ű|;čĐ.éů鲣ߖcâSař./µ÷ôhřeCzmđaÝ é[ÇĘ@Ş.¨!ëÜűrçý‘Ý+ÍĽ6Ěî [ÎXF<ď'…–Îrř™Ľ…|îuË˝#€á\†ŰH'S‘(+cŹŔ´ň|ą Ąľ˘± ͲŁŃ»ŰRßIeú ěn›Ś±}đ±őUßţQů{DN¤Ďřťő·=&Űš¬V(:żŮd•¸‹ńó+wąö„P4Ü}µËĐĚ×Q‡65ë˛DZ‹í_±YéŔGA/4jŻ],“‹ŠżÚű›ŰrŔęX¶üĐÂF·Vý{döÂĚŽ˘XĄŞťN{Bďô÷О¦Ň‘ť; š>~zř~Ł™ş&®µ9[ăś‘Ęé,>.:ŃĹbĽq@Őř´ZJťÝŇ—Ż"ägĺĆž<2Ѥžt÷#ć?–A#¶š‘Žq?­Ëś]0C:ÂMQ?'ÝŰFµ·ŽĘÉXO1ě= ®V“™¦ä¬‹ DQ§Ă Ĺ•“ŔZiFpĚ\Ď®š—/{.µ…BŮdĆ_l†$Á>h™}_ęâ٨iîşíŕLî}w äîÄŐ[˛úÉ^FQ•µ˙Ő{\w–>T4*˛%“ ^Ó–Ě~ÄiĽęÜP"ÇH!/Z Ů™5şÔ0%Tsůmp¶ ŘÇ^7{—íř˝ĘšÄ§‹©‹™O|nôÜ]ŻK‹8‘I’K;1-w]6Ľ+W-Qćă»4»Ă¨ekC9Sł'`JţâĚf:Ćĺ“!cm.§ĚĆ©óŁőS)šw®]Q-ç6÷ř1béy׋#“Í[<ěĺ.‚ťFdBňśŐ!őbv]ŤőćD÷ŻJ.Ϩ!hE {lpŽŘoŔŔÁ3áĐ”¤Ĺ;Űŕ¦× ęîx2,k,ź08îóŇúA ż=~„ăXű§ýf•cÁÉ”k‡»Źtćšţűd<Ô‰ąm ”Čďóâ!Ô©MľŇč“´üBX~'Ť§.ČyĆ{µ"VR? –Ä~íěĎz>Š11Jjwö}üO+źT„ßböžîđJ˝ĺ“łŠmM˙ő‰L÷—¤ÝůÓăÁ}ş,ćfŢ„óë!kgÜsę t*HĄĐÎŽ˙„n?{ą…ďĄÜ=H&}m ˇxYścŁ©$ĆZ©Sá„•0ÚRó.ą oĆqŰŞXő‰›‡ŃĘŚaö˘ §“ýá˝X.ű·Ą¦ë !Żós­Vî@ĽĐqeŞ…GSx«¨ť¶ű«}«î= Ö2"Aeá%F‰FέÄně¶C…Ŕ›YśK¤Ő´Ř%aČ÷{ýčµiÓ‰ćoîŔ9uŰ6ëLŔş´Î7-k,%™żµSK$˛ä?nšzB”mçTĹČi´Ô•ˇ !ËQÚI5P•M8r¤^cǤźŕ=Ă7}ĺ«ů@%˘´ô &ókK‰,+‹ˇĺ4˘ČŮŽťÎ`6č>ăČŐ‰°˙]_» Ň)ĺ=3˘iľ3ŕíĄfU’6˙Ŕ`?,žŮŃ‹ü¶LÉ…ťm™™¸:Ëé¨FB´Cnb§Ç—Đâŕą&Ę;J»ß”t´‚hßńżX‹ÎMq”ětÎÉ'–1'ŔLĘë­ěQ8ߍ(S4ýů)YŹIĂýh9q7©Ďťgś}Ţşś­MZžt/o4„hţŢ·§•X±k=´ĺ( DĐ ™x`ČÚCi©ń^VHX˙!ďkČ­oŻ÷É»ćô)|Â3- s×])UÍ‘DźŮ^ű`Qă͆]%˝ťç(ě벝$ýJJ•[ɰiédKL†öXĂaâ2…foÍ–v)ď,Q\3˙Ú[“éáLŢ™ •ȇ5yÂU[LZÉ$őȨ8ë®ř0ĺĂĎÄĘďË»r_ń{’Pš3µčvT.Ö<˘2ů‰ą*޵Í]´y"¦Ľ/PQŕŘ„cü¶Ă”ĐÂTał_)Ůy­O0ÖóHÂY(…D°łĺüü<ůńř4ťBëé"lĎ7>‹ŻŁ˝/MŹ«ř‡L}ND;\ńľI?3«ůN™‰W㯥 ‡{™ÜëTŁdZqúş‰'›GOUËC,qŻ/iëG‰šÇţVj˛Ő/ň„wÇ’V3ˇ&°*á3JR`ąćaŚË*ânÝóNĺC\÷JŻZŤäü:żXXđö¦4ʇ„rŘ3éäą®§öşĄ&´‰fQŕ‡To7&|ÓUÜŞ^(ě pé`cWĚŃr¤á’gŘňďřAü}2Š‚Řť ^ÄÁÇ_`şc¦śžłŚ3ó5É1ąR>#ápuQóo ŇzҰ`;Í“fˇçrť*[da«ëČ·éäˇ1!Q~0ÄÉnÝľsÔć­ŔÎó¦ÇTýUŃĺL “éńŰ4uőÁ¦]Ćۧ—ÜI<$) ĆeAËÁD*+5°p 49fS±Ď˛*ĺŘ«˝ţ÷ÓŁVë±{ŽÝ–ó+H÷ť<¸•Ĺ­ ?”úö ”1d‘Żš…#=ŕJéٍ帪ŚÝjo>«}ąZ‡•˝Ł|ž–LWlóIeĹ*Łęs=ţŇşi:=Ŕ6şó™ź9E/Š`„{Sd »oăyľĘł©Ť{މ·6śäjŇVOLő4r˝Kl^ężtüéw<Ř{ %,¤»Ł"ŢQ|5­ß@”­J°eH–Ě8;EqŚz K<đ‹†Â”?cÝßńˇYáęX)ÝOrÜĺĚxjń ČSV‚žĆ1ď¨ŃV¨_˘,.)`J-LŃÓŠŃĐ˝ą >QoĆGNűü©uó|Ř÷3ǻɞJµľ¬Č*‰"ŠSýs: ČúkY§Č5â·ęÎ*s%2@=˘5ˇoĄ}%Áť6Hyžűy˘= ™íKş?˘Uł!¸7ĺXÔ śť[¨üpź1›F%"‹Ď\MQ=é'béîđ0ŀ⚊~N:ś§ţ &µŐCgz ‚(…Ä#žćôäĎguE÷„(šshˇ‹ÖZ°¸} ©%´ůE‡)n*…×ůôS‰c¦ůĎ—Śéڶg‚f˘oOK‰‘“ÖĽ ś7%2xb^ůâúŽF€9Ô[o€b,@÷¶cĽG˝¦E6ĺ;ćŘ…`”ÎňJŕ—ÝÜ“Ů,ęČ‚ăN0Pu•źGÖŻ…áAóµŚTş‘Úď¬$čľĂÇŁÎP±ďVĘŻ2–ŚĚ•xĚ˝:f’Цá˛&đ=Ćű›ö‚üíC¤ç™S˙űއÉđ‡I!V1s–:ĺź?Ç\­˛Ý÷äÖ’É „‚§Ě+qą ÉÚÖôĂ«®qČy¦.Ůr­Ţďʉ‹ťžgń Y5䆢O~­PjŘŻl9Ćxů˝µ˙×{ůďźf¶µ¶ôľ` ±Ę!~Ň 6H®Ôî(Ňo¦îů¶„řÔů^işń‚łçµ…CŮÓE^tžýf#±ÔĂE$ö˘7 ;=zCóeŇo~ $ÄwsWjăJ¬ΧŢEÎzÍD{ú&Ť– ž×ÂźĺÔň¶uű´uĐ·3UňŇE‹Š6§«WňŕÝŃśźS¨hEŰD´ËiKZDŞÜ@`âĆ ¦g|TVešó@qŚ]iKŃ!‚.1Ű!â‰Ő7sâ]Śě‡¶f_˙ó!Óľ-i„Ü FăăřÎü4±•ł“–00]t×a(m1{Ěߡú·U -OŤCŕ Ž'˛ľq U$:¨ {H)6Ł÷ ją?0‰Ée‰«%ń”@¸ŁŽŚ„`_o'Ą™Ăł~$ =ťŽ*óq÷–µ˛ýLŚĐÚ+ňą´S{őŃ,GIts ݶٚŁĂ‰c°ZD2«úzŇl ¬Aűř /=¦Ć–xA­qkDŻuŤ9Ck‚·żk0lżˇ_Ä-čQĄ´ôţĺ `uÎB· ź\%˙Žw3S“ ĂS"%$fß0ęTJ+Đfvjí·‹—,1Tö :JËËF<4úôíau`O”L– í:ÔM$Sdp:đÖ=ŐÉ@ŽvVżŤ“NiŇ/®Ź]řůw^{Ś+㍗}sˇvĎć nDIÉÔ*'ČëŠRÔďBÎx\™ĚśÔT©_K9<™(íÇąâ°űv˛>3ů±6©ušůK¦'|*n˙&-đXA›yD ˛swśŘĆ÷ebĘ띯»nŘľ5»Jű“šŘňPNU 3ů«9s .˝dfÖáľ×÷ĐZÎ!ż vMĹ«pÚĺĚđT=$`ç˘bÇÓ$6·Ďd]X€¤DÄ7ăęQ— q88íylĂZ$”‚|X•×މTnÎÎë%x»©O„Vζł2_›Wľë`Ú|rX‹”T>Űk„Ę@9Ú#Ă&Dfzú•˝ rŕz±Żđö'•â×ÜĚĄŕB!Đ%r©öváJÂ#Eď´›Ťšć¦®BQýËČb"űžµŹ3 ‰'Ýzjě°˛ Ö”ˇˇé°włĐÁJ˛|#7)u•ĘšthŢ÷WŁţt59”§śqţÉ» …Ź›;}Čv$2¨wÓęˇ 4ă`íűÔ UTff›÷H[ ”]LË™ř/,kďIµŢˇŐx–$Ó:BÁЉZÔFqü×…Iß­#RĚPëĂý íčžam‰í·ÖD6Eňň™<ź8Ú«Śś7ć4ŤĄĄ†V§*ĺóŔh+%ŮöŤŠq°nh·bűŢ44EWM(ł |­ÎÄŰa°®sbg&R™PÜb.ČBq\ŇŞ‹ĘóOYL%ÍŚ Ăd××Bú·w™+8¦"Y¨×2*E§ś\PłYÖ8ĹfyrkFĹBmŚ+ämB>žiŹóî|>˘\É;c×ţ`@Č'‹{ş«)bť5A 0Óţ8AĆ)TÂz©oOęÔ"CȤqÖÄžíőŞuě*Śč ®ůz&Gń6/Łžňů—…NIµŮ×§•>o˛·U&lV°ÁiV;l÷Łjˇv¸˘y,óg¸áűťăâgŠÓB‘C#v ÁnŘŘÂôŢÖóźĆ[r‘¨!âřü}GłTâ ۲%ކhłuFšTçO Š8_ź°/J"Çí•%?m˙ţ«V›÷ ŤÇńh´ă!ĺÖ;Ă›P™`^n«?ź°Ŕ˙śSŠťËĚ zfdŢFGĘ™fîŃ-Űg3©$YV”ˇRSR:c–˛h*7qű+«hÂVŮH[ŁY`KáLĐnYÇ}‚ŞÔň„ÜŽą «§‘X¨‹2`?xýĂ'^ Yŕu] ł Đâ˙XŔ̽ΚV&úMó^¦q_\Ę„â‹>˙ŽŰB ŽŹu+€ł(Ťk*ɉ×j,ΚĆöű¨ď ΖčJČĐ Ňř "/awq§”$úĨĂTbeŞ˘;|<öełíÓŕŢ´ĹwIz'–Ż*š‚%҆(ÂÚ iP@®8ŠL¬ŕőŇI·Ľż¦RÝo4ü‚Cź3Y¶kÎČŮvÎn,•‹1ĹF€·Áí5+(±ŕ1ŤďZÄŞ2aĆi¨ťc;Ąű;˘Eg…ŚÉ%{\r?Ůřm}r˘ĽÎW1 ÷?D‘ěÚôk\břnöâůb0pSëÇCë°vÓ¨z2Óď˝–fE¶˝;.ťŞ®„ą¸ť>Ó?7‡řŮc”¸/—Ŕ·cű­BňĘň űË™­šs‰iɄ޷öYëŃěŻ'PR—2ZÜëşN’ş#‰,”ű ÂXšEĺ*Z;Ěł«QňśÖ§ŮźÚ­¸uľ¨·áš%»ÖŇŚ¦‡Ě!oI*Dčh´c%ťz·rImS¸µ>&)ůЩשë’{Ź`řŠ"!|"p“­¬®+°2ŤgÝź(&¤Ž/śőTrVöoQU^xÓkBápX€ÁTł´$@Dd‡MtO*D|¤Őôę ·ň— ¨yâąWNő đZ8T 1Ź!Z¤'źßŕ>DbôUUSzťđţ©ÝńUšhXëâQdsH¤N î„oŢóówI~3¨č>wb"©ä8‡ /*ÉŹ„Ďś—Ňm˘žb3<7©š˘ˇŇŰ “śÎwkP7ź,*¦¶ö’âtpů°×Iđ{®ĎI7…Q™ 鬎 ]ÔěźsăÝąRoEó3#|­ I‚ Ź_¬íúgďv^H=ŐV¬q÷d= ąw«vć(8oś–áý¨5 âź!DÜřbż9)g›hé@[Š€ůçL´Íú»ć×VJ0(ť1ţ2Ó5mîţ&«V˘üy¬‡á^®¦`źvҡWĆo r3ąĂź¸x ÔöÉŰěqĽŐÉÎý9•?öŽÓĄ\ĽöÂ,}bNťĺíkhF~ŮJ÷Ą$“´Tá 6ę·w&€LbßýěÔśËݱ{׌.ţÝB#X€Ľb nUęěš'Č{Äżú¶™HÜň-m׀ȂöîóúVş»°/Ůu^ég9Ś!ęZşd3sĂT—†X8ŁGł¨HNyŮG5!Ć5~»Ó"»•­/H•QŹdFŇŘ"_ćuă Ů űR1¤W¸îNat1}§ ×µĎ@)ehňPFš°njŮŁ`yä@Ń>$/ ‘yť([>$óňfE`Ô­cKă·żńâşŢh˛—Ëkyv}Öę©’‰;ş®Bi¨…Bě$jqÉŘ“±=S˙,@ÔÍ´„€ŢŞÓ_ŐWöABš?ú‰Y– ‰9¶¸ŹNučŕŘe…+*ÉĽIiDQ­Wµ4ďűS[˛µĐJď–w Ö: ľé!Wň $cćłt~ %÷ŔJŇŹś„Ú˝ţĂöt endstream endobj 1319 0 obj << /Type /FontDescriptor /FontName /MCOYWV+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/A/B/C/D/E/F/I/N/O/P/R/S/T/U/Z/greater/less) /FontFile 1318 0 R >> endobj 1320 0 obj << /Length1 1542 /Length2 8229 /Length3 0 /Length 9262 /Filter /FlateDecode >> stream xÚŤ¶TZ6L’ŇH Ý0´„tw·Ŕ 3ÄĐ ")HJw¤”tIJ7Ň!]ßč˝ď}ă˙×úľ5kÍśóě8çŮűŮg 3˝¶·Ś-ܬ‡!¸ůx€b9 ]> ŕůq™ő!(řo‡ŮěęĂÄţĂAÎ B 1y駇Tݡ>ź°źŕE˙ĺwČ< ¶ €*vĂa–;{»BěČcţµ°Ů°řDEE¸ţ„dśŔ®  B8€ť'Ú€ =¸ ŚđţŻl„ł/ݧ§'ČÉŤîj/ÉÎđ„ ş`7°«Řđ›0@äţ‹3@ßâö®·Cx‚\Á$…Ř€anČw-Ř€< §˘ĐrĂţrV˙Ë đwm|<|˙¤ű;úw"ěO0ČĆîä ‚yC`ö; ĐRTçAx!¸ íoGÔ ŽŚy€ P5ŇáĎÍAEIđozn6®g„Źú›"ďď4Č*+ŔlĺŕNN` ç÷ýä!®`dŮ˝y˙ęě Üćű÷ĆłµűMÂÖÝ™×qq«Č˙í‚„pţŤŮ! ("*»Ŕ^6ĽżÓë{;˙ů~ĂHţľÎpg€’ŘbFţŕřş<Ŕ„«;Řß÷? ˙˝ĂáăŘBlk°=†óďěHl÷×Ů|WŔ ÔřűóĎę9R^¶pÔűßîúËkh"ݦlÂůăl˛˛p/€/· ŔÍ/đý™rá˙ßiţ)ŔżČ˙AµAż/÷U`vp€č_ĹűŹżeÁö÷ȰţűM8RË`ŰżĄoÚ żřţźŕOČ˙źîgůżI˙/¤č…ţ1łý±˙Ě 'Ôűo¤”ÝȱЀ#‡öż®FŕżFYl qwú_« „=ôź2BÜ!^`[mÂĆá/ ý« ČôP ¬ wü~lÜȆýŹ 9p6/ОWL`ä<ý÷‘ 0¸íďÁă€\]AŢ8ČÖ#wB_>ä„Ú‚˝ţHŔË#!$=€ÜçwG‘AĽQBÂa>$ââŽěÄż!Ż©÷~$wwýđ"ľ;xÝŔČ÷äD‰ uţĎy ÂÁü1@$â ˙wΧ^°ë_Ŕq¶qwuE>T‰,Čżö^0Ř l3;·uüÚ|ńQć‰'÷ŹágăĚ?ŚŢłsűÎş¶¸_=zřŽ˝2=xŮőLć]ášŰ©ôÝ­ďÎ皇Ť :M×~7–qşc?špfFÉ{FňvdŞ»i°©ąőĄ7ün]ü ^ Fý˘Ęśĺâţô‘vÉ…g—’WuwÉü`řÔťŤJa5Ü›’oÜŃoĚ 'ł­3&)0Ü4Xć^§găÄFîéTă8qüwŁň}MWřß^Nú,–éó»µQ2QšRĐ źޱřĘn%©>žö-Ę_č™ńú,‘O÷ź+y›g‹?­˘«ď¬ňśmĺ[Ďze}ŇC˛žPU\OjéĘ EVŮdE‚¨x¦Ůjµ“]l>3l·sL¦žýV}Ŕ7qŘ lh÷˝®qYěčá>OnĽčŻXk÷7*”ę–˘¶÷äăPp0‹\KŁIĆ(A ˇµUH ąć<Ţ=˝Á…IřÉ^Qń­ć¦O1:Q©÷…˛üŽŢú—×j¶®LMC=‰ź‡Ü‡kŢ[I><ĚŁtP°JgËNShť˝ĂŞ#ţ \;RÂ{¸RNÎ#_ěM§ż*4sÔË”/¨˘Ôůcş˘?Ň<ŘŰńR4—gß°Ü )V(W‡~}7Š{h«6¨O6$¬KôĚvkő¬´TÖ‚ě'Üđň°Üó•l˙Űďú"ˇŮŻ[u?´ąiĄ(ÉDˇśŻMvb[3îéËzĐ;ŐÇé?»Zj+¸ńä*Q‘gfÍźŐčVű)á7ű|F>ż“ňc 4ůëÓú@ţO-Zl(xé„‹o™Ó7ćŃ-[úë Źî¨dźčé_ä0ú¬ tNZŁ˙:¶Ćä -7/ěj ˝IA‡Ć±ĐOݦž,?c{ygٰdŕ)S3G]•6Ń^Ţí| Ëř°EH*9Ľ« Č+fM_RĎç$˝źJČt\őÉľ˘‹ixVáfţi‰ôT"¬ô™y› *Ó˛ĽÔ+měŃŤáwľy)eëŔzKź¤FR®C*™§3é§ÇpÔůQW™e¦ýZË`§cfŚełE……˛&1ÉJÚ÷)&éH—D[@!›>”[¬Š•hĺnTć‘*A%Ćl×'9ŐaUD K§Żf¬pcáhçhŰÎä”ňä“„“(ŢâGŠÓöž ŠB‰1žGzŻü*ďŕ:Ă›Ăɸ¸cV/ë$2hů€Ĺ~X)÷M?ťję/gŇ—ú—˛B—ËbŐÖ~ü&ŐOi%u"’´CŽk9…aö®őä©—¶„ ß$ÍÉ3ÄČ…2Ęľ¸pĘçW5wľźשr(TňeDů§±q˙3o Ú©»—6´ĚćË.捍‚Z‚ôfi–ç*Ť9Ş+oČz6l˘¨€Ë4ĄÇŞ—L€e1ľÂˉSćť4×.ý© ”ĎÎŃ3ôż™¨ń,¨Ql÷ł·s=VPó˝’3•UĘlÁˇĄńžg{©ĆŢÉŻ7L®VŃfb‚^˙Ľ*kŕNxĽbÖF±3ꏺčĄÂ˘Tśfág¶O´®ô‰8W¤Lár‡żÔ(ăď˘đYrŹOÉŠćHmâ(ŔďîŔ/»ý2\´,Ő•«–HnĂNńuäü»ůˇýD9‹TńÚŰ‘®_×0LýĎ–„Ťf¦,[Msą†´Ľá9­ł©é|#~/ş­§.ôę¶ß*ÖžŔw^®óňľé“}&]őëjŹßn’ ÷ądÚ»=ď dî*˙2ÖOćů}é;˙sxIç2 ÂňVJĹá+űV¶¬Óľ"ćc±ZľGX3I¶XĹ}ŢÂçÁmsKEü˘P uޱ'K1÷ÎřÇĘL%ź‹"ŃmŠg}¬ńël·Í*7šW5SľëZÄ€GďůĐŐ=l&ťČ0 µm,} »ŰN]ŇőF“áĺyĺN ÖĚŔŮ÷WV©;»˛–xíN;3 -ĚÚ üŮb´†2ěz˛ęĽ%äűB$%r™2ąËçPń ߯m¸lŚŤ3Ć0EĚx¬(”÷(ˇO}ugŕńDí]úŹŮÖ-ŤѬeîÔüถ$SăÉFDËwÔq-řŢë[÷ÂĄYU-ç D&–´ßN6oŠâ]bť€7-cĘš †Ćô¨R·éí˘şSŮ}ŁĎČĹLlbhÉe)C‡ŞdřÁڎlŚ‘,µ˙¦!{콾y%WöAĐRá.1yy~K“bt/zI‹vĎV‹ú±@Ż‹–fĂƆŻ÷žüŇÉŞÄ×׾?őÉşÄpĹ;ßÍQ…¸8$\5$¸“ņľ±â„úRaťuΧb-Ąí P)/k<Ć|( †Č,?~"í1-ĺŁĺ(YďŤ&®ŚŃŕěµv ÷],Ä*× ß24źÉnz5ţź¸B‹G+sÂŐüôiémČngxý‡gćĎV¤W®Ô/ôł­Żßǵ˝…˛Aí+Ú3欿•G/Ň7l•L&M~5˙~{ Ôá{üqđ% TtŐĹ0żˇp0ďfńb/ÇÍömě‘O\;ÖĂňÜÍ<±)jőLĘço‰K\q#ósJB<4ĺ[Ł4”DD™TÔ!w, 23öOľĂ ÂިŞŘ1ŠZµÇjŘ?v´‡ň´ŢĘČP x„',}ć°lÖ^ü®aťF1šýÂŇ– RÜQ’ĄňB°!łßܱ­3©:äpžövůČ(çO~@Ĺńć96ËňúĽşŕ“q//ÉŔs–á1ĚŐ›á·öLä´ Šóö5ÁTÔňźq»Rči_®—ŠsŠ8›çyzQ›¬*áX, )T -l%S°\řś¤T{ţýđg ­ ´ždlźĎjá©;ω;çţÚ,ĂŐ‰¤ř!W€OÍ3Ľ©r9Ë ˝řŢ-hŞŹ’ŘOŃkdb+y`ç]ëeč}Z;G4–ÁđśŃç%ErˇłÇq;~Mx\ĘŮLwŹ«¬čk&2X‰\ąßU˘ÄVšńĽč)Ęč ͉(µŹ¨YăâąmŰ Đ Ĺ+6LÜ™7š'‘¨â+ßómďĘ:®÷PăË o–9š#%z ˛ß­u“„’” »µJÔ*ĹŕË)X…ţĚqXiéďb&ÓIV̇k·t­Ž…0•Ķ0Ś 4źk‹N‹îšF»‰F ˛Z­•ÓâďşÎ]Ši&ćďöąŤźö&ÖÓIcÚ…ŕĄ[Đ-†±đ zC}p7&řŤH>y.†őěj‰Zßçţ`Đ*ř@20dÔɡHü|‘·ŔĘ»äŤNö«ţDsťwO9J úäGŃ[š€3[Ë\ «Ľp=fýjÍF5‘J,NÝ”©]3×ü´›>“Ón’=°sŐ 5^~ÔůŚI„öŐ/śaET…śÝ“»7‡ăj!m“ĘoX?ŐJ˘šęH¨Ě® s×ď“ŇŰĚŠŘEşXZo˛†axU”?MX'ćAuúťG¬Ć®Ë)Ľ0KŘ;tUőlr\,¶$iśO›Y_GSqĘk5i|Ők—ç-^¤Y/uŔ¶_’ďY©Wć>ÇšĺdŁ~îö˝yEě±z ľĽĐ¸‘#đ‹ď=S‰«“ĚýľŰ;ŇŽž“cé2:GJÓłâó·ÓCx©µ´oś÷.˝ś]”ďc,ŁÓşÝÚ ŕcs˝›ö{[&î1ółĘá‰4u ç/ $x~ź_¦Ő<ÝşâéďJŞă´îőń.ňˇűnůIÖ§b âCř/~)ʉf,L´í“ćÓéNcTP.ýSĘÉ<'ś¤ů {ĎYú‡8X"?±M¤˝őžż< ű€–R~ …ËNý,KŔ¦KĘđ ^nŐG*&ă-._í+,Ě^Ű]h{ *‡e‘ům?4ş©źW˘ť"%4!aý%4{rłqń]ŮśaĽÔ ó‚/i8eĎFHóB´ÄY’_DµIöö¤ÖŤ}?˛ÎžíW±™×#„¤YĹęÓˇ%·î† 1:]&Ńç¤,Ż®śĽ+Ř!µ”‘ý?;ÎŚŠ˘Ô»te-hteAĐ/;^Ő–YÓ&bź„4 +,oěĎ“D>$yŰTNPű$ čš×1/lĄ{6›ŢÉ*qGžĹ:°Żd}JÇř3¦ňrá&Á B%ŻĽ; o’gÖ„úHzFVęšDhůk¶ԅߪuł†ŃÄŕVLJ%E%KaX.‘[X†ÍŰ“Ć׾Ě$ď‰ʶ˘ý8şW¤&±t( îŞk_ «ŚkŔ‘LÜ‚~ŃqŽ §*Í go ŻË¸¬Í?捨GÉŠgńůTlń@µĘQz›Ô«´:D ¨4 >ÜH6Żă‚ö¶¸7ń…>ëçĂLBńL‰X—'°™u÷ T]Ž/Á¸ 4D•Śă7Ýĺň-?Hj=jÔ‡ONŹłŤ:W›Żó%-¸MŹW T5Icn ô”íhĽ– ‹¶ÜŻó×ÉYSHMŐčéÇŢ9?łŠTN*_1ý<^)čmŕ˙Ą»kłóW&©`Śţk’É»Ým”Kú T¬ “Eă(Ő·lň*viŻÓžÉÎŞ<¨‡Éw`<o$rx4h¦®îPbÂý#řĄžëť7H ˇm˘T<9*N+ú šúůâ±Ç&(äQaŇBń‹ËclT8éq’¸ť!őýňĘŽ9„knd®dÁ^ I8<’sŁS••Ů#/’+ć ]â,I•Ś›s©ŹÁ±ěvcëŠ>iVő˝őR9k*6(ŇzĘ,I÷ÍńűŔ0”§$AŠÁÔćk†U%Ý' rzoďć5±ŁqNŇLú\ŻCڤ`덻©×ßyíü–“Ňvľô®1('•o˛Úi¸Ť=ś 362¸őż9«­o0骍¶Ŕ śfvęĄWn=ŇRľÇęzKgyY%ľńiř8 nUµÁ#űѧ ç Ś8LłKćY夂„R$Bő(nišöľ~l?’N(§ČŔN•Őr“¦ČŘD†˙„ÂŤPk4ŘŽc0]Qę ç­¦Ga&ľŽóV~P4š «FVhÖmŔJýŹš›ěÓqíŽ]ßÄL…Ę÷φťA[¸A3;Z/Đ­2ę÷ÓÖś/®đĘźş{/0ą'-žĽsDZó·qéäj÷~I»ř|2ăęÉEŰî#®rÔVDűDLů8«U+¬kž­Â¬ô“FѰőÎe“\˛Ě}kĄ‹[IěŐ÷Ł.źĚ°4eSsć=Ź™6ZüQź5 ЕݞŃŢĚšú« uĎ(*ŚwV¤šťHUă/ČąÇBĎi kÓĘŇ ±Av#!·/tyvŇNo=X{ťxY‡ôÖ:ä›gˇŢ7t" ä9x&§SrŐĺÝN?k-ę*•Ü…,•Ň^ÔÎň\ xßLŕŢ­D®â¬ľ®â+‡˝˛Ľ–—ôwĆäܰ+±u`˘ą*ęF}.} qi5cńíł’Ú™¸P)fžgďNÓuW—™";™ŕe"{Y`ÇâzçqËŘÁî7bWÂź4ň§gb1Ńs¶´uóŃ 2"Ľî’X.RöŐFPI^ŁĂę¨ŮDˇű=–Ţ&…¨ZnöK_çFţđďđ"Ř80ŞĂxňáöö=ĆńČ÷Q%TĘ´Řç$ęÝq”dĂćÓ=:gnő1–ľÜkô5+I€UMs‡URÎţâ—~·©FŹŻM=ć7Ż9âɦnuľiZŰ…qÎ7·.…f°Łg °›}ĆNě·í‡@ëocÝkłĆR$:IŚŻĽJĘFŃ®8šŃúěĎůźwÄ )§ĺ¤M§Z´Źş¨áźŇß일Ä;ĎŹŹ‘ÜeďÉ;IQ†Ĺf˘5•Ë0üô•וŕĺGÜjt÷ţştűQxýBTĹřWĽ]nqúúęýČí5'Él±ÂnaaĎöwú¶ŃNŐy=‘Gms&´•XÔ[Žóř4,ßfe¶Tń8K7^}ůÜ„EliĚHK:˛K9X­k4ż’ĽźÎéżůĽ˛g(Ż:é—ÜŘhLŕ?V(çŮ÷¸GżO¦o ׎âí}n|˘¶ż8F$ĂxłÚŮ8ăpś~Vý#Ĺó+óMŞŰs‹‰t*t\ńě6żm]€ĽyW0ľ˛ű„đ˝N÷íč{Ö >kq/Ɔ·t'tzb%ŽÖD{óĚ Ő¸‡Ľ’ŮZ÷űé4®†KA”^Ď?~Ćl–d_=řĐ^ű<šq‰.o%4ŰĚU'äŇd)b%GšWię´«+O ýĄk“ŇŰ“žQKí ´FŤĄËŠűŃ9ϵó5­Cu<ýóŇI|eŇŮĹÁ-ÚK´Ťäś‚t0GÝČ=aěľźÎő‚-đÍNÚÔ>c.‰÷mńů—˘%®Ç¦{:ŻUřé›s“îIGb4Fź/2Ő’`ŕę|ÖŽ0ţµĂ݆N9%˛NjňË™a‹~ř•ŐZ [¸jJG!LdQ?hIĽ[ťVŮ­"žŘ÷ëŰţ@+ V«zĚóş÷+A·r´.ϤV”zyűCđwu•T şŰŽ1\ş=÷Ч€lXľ †íß÷˘¸Đ[źqPK[Đ…[űű™Ř[l_h Ľ(> ëg‚ÚuIĹlŞ4Ąâ ¦njĆâ’<ŢVéeĘ2UkGB•žüx™”ÝÔólhŽšŞ1Ľm˘) n ÝčMd`ď—Ý"«°†¤Š5⯚ˇ-‚˛ăv¨­‹ ¸LU3Ââ$Ľb ůÄÔXFîSM}ÚU—˛wý _8¬Í–iT®Ş+5CŁŐg-đ˘ÍŽ7GUOŹo ŇEü—˘î^3ř„M)ăçQe`˘ďě`ÇÓ=iRÔˇă˝m'¦0·÷|/ ynZť‰µzęnIb. 1.şŐŘĄŮ_ug@;Ź˙Ä'\·§S2úaĚe¨w3ČăÖ˛KŽŤ:ďŹńĺO˛j~]fµŕ=6ÝăĎ[IúéŁë×Ô•4lfRdF ź}í* U,oŮ_»Äpâ|ŕxë÷ő­ćrŹš^hlłĄlč\~;€h8l+˛H-&ŮHĎ÷€ěËr‰´j×"Ĺ/XýSµŽµö"doŢöŐL|TŤ^,ů`üN»ßŢ ŘKě˘ÉÓ˝Ń?Řa·ńÚPąŔFĄČ-Ń}ĘţĐmúYý;ŔAodą§đSŔídZJÖŻc+ĺÖ VŻźrðřhKĚŁm¬&<ô{y|9 ŹńSY¨Đ¸FŽß,8¤ ę QŇ+¸Ź-ă8ßʬvP Űs.ë"ěw€‚Ţ’îô>/eiUżÝ]×^¨'Ú,JW<ĘÇgŰŢČ‘‘\‘şÜ§–MČ’đ .Ć™(Pę7°*ěHm~ńnŹ'ŽŮLź—XWZYĹŔăeÎ/ť]H߯íúĄ]Ş%­í;Îőë×/Ś|›şźô ůńz#„é<Ô\ÓuąşĎčăş^č:Ą¬H~đ^Ť­P‡UŢi˛ß]_'c˘=ŔŚşĆľ†ŇČřy™'Ĺđ‡}ßëQzĐ‚Q,bw[ÇA·‹…ügMŤU‡@ś)dŢ´{<˘^şeĺţ|}Ű$ŢŚ—R[ěoőUżGzaŃďycĹ»ű$,ç˝ÍŽňq‘1jÝĹi`úSµ2 z îšîŤAô±ąďŮ‚cÝXkŘZŇjŐĚŞśy b4r#GX!í-á¶ĂďÚÂ^ü.Ż/l®‰Ĺ«mB{Čxţ~Č)ÝE\’qeޡ#M?2‰ťouDŔIĘŢd)’b ]"5§FÜŔZť°ęôĘ.ëzżuăvNÓR‹^î_®°pR)čr?Ż3R°čzę­PĆxŮçAÚ4NŚľ SZŚtü˝ /z%TˇWZb{?íľŮľ¤¨RŮ{´ ”íqýŘăČgóş;],@F_e ¨ń,=®źE›óTý+›ôŐm\ăÜdʢo‡€&‰š¬q6“÷l¶ÍCĹih9ŰD2ÂëË,~I`ěćÔ €ŞM­ç<†u¤Á~ćŞUUšví¬ĘʩÒ5ĺBŤŁDÂ\ŰöîÚ§‹˛UŘ iĹV7řź8onŔÎH›»Ôw@s”ŐŐa©ÁíTŢ}'!Ú\3źl"úଶůcÝ;›z—©ŮZLĽÓĄpVĐ™HvÂm~ô$?‡±ßťö÷·đ ”°›®ą0x¨´FĆw™Ń: ̰iUŞb˝ëLźP¬]0č™Eڱ@YPHť˘*É<č†Ü„L‡…[7ĹŞŹ3üĂe–†2ůÉő,ŠćRŠQ“»ąťíi˛!)Ë&üŞ•”Ěůĺ8ĂŠUNyJ„u†KyŽŞÍhÜďť[Ż (Ęş¦śđĚ ĎęCLÄĐáŻU• [ ŁľÄŘĺw˛őá˘WÓ8EŹcotnظ$GĽrNŕŢ©ív¤˙nJ 6ŕ=(6¸űĚ^FdE,…Ůŕc —5É0®Ž]Ţt$äĹ5ZřĐnŁ'‡=geA"Śáéé_9Ł9hčł v84R­trJşhwŻuë¤V‹WÚŞg5Ę{Čš93#Ů>¶LIaëá<Ł^’G—’ĆvĆR˝^ř~äýŽuMÚš ”NńŐ¤vß> endobj 1322 0 obj << /Length1 1425 /Length2 6103 /Length3 0 /Length 7073 /Filter /FlateDecode >> stream xÚŤxTÔÝÖ>Ň ÝÍ€t-ÝÝ]’ĂĂ 2C¤”tI#H‡€„4JJ—”(HI‡€€ ňŤľľ÷Ţ÷ţ˙k}ßšµf~gďgď}žłź}fÖ°łó+:ÁÁjp’_H(PÖ5¶€@ PźťÝ‚„‚˙¶ăł›˝8Lę?Ę^`$ʦâ€Duá0€–7 $—’Â@ äß@¸—@ĹÁâĐhÁa`>»2ÜÓß ââŠDŐůűŔâIJJđý(z€˝ @×é ö@U9@ĆpŚô˙G .W$ŇSJPĐ××WŔÁ!÷r‘ăćřB®#0ěĺvü˘ Đsđ˙ˇ&€Ď0q… ţrĂť‘ľ^`Ę…€Ŕ0*Äćö ŞŚ5uúž`Ř_`ťż|€?‡úWş?ŃżA`ż@ ¸‡§Ěs8C `€ľšŽŇÉp€9ý:@pTĽŹęŕüŢş@MŃŕ€bř‡äńD"č/Ž‚żŇ ŽY㤠÷đĂü_űSxA¨s÷üÓ\wÜř÷ĘsrţEĂÉŰSĐyč ÖTůA™đ˙ms#b@Iqq1!ř!ěrüUŔÄßüŰůŰŚâč ÷8Łh€!Î`Ô~ ÂÁ @zy˙ÓńĎľŔ BÁ.ţżłŁĚ`çżÖ¨ţ{AüÖ@”ü„Ŕ_Ż=Ů ć‡Aý˙ ˙ÝbA=%%sesŢ?”˙ĺTR‚űů…%ü’â@€8@BB üĎ<˙:żŮ˙¶8@ţěî?2jÂśáÉżH Nďo">”Áőgl¸˙¬ Gé ŕú·üĹ€ Ô›Đ˙y~‡ü˙´˙+Ë˙*˙˙Ţ‘š7úŰĎőŕ˙ń;x@ ţ(={#Qłˇ GM쿡ćŕżZěńöřoŻ&Ň5#Š0”Îů…D€˘Ů!5ŘÉ‚ąţĄĄż›Ş…ŔŔpä×˝Š˙ˇ=;ęnA ZöŰFMÖ?ëŞÂ@p§_#(,&pđňrđÇG)µ ˇfŐ ě÷[âA‰  8śá^řż+t@ 8Cî¨>¸ţrţ¶ Ĺ‚Ž^ż ˙¨ňöňB ĺoi ¶ó÷ú÷ űAřKópt¤ŰËČΫzEz_ţ­qěŐµîŘdË1$ÇÂł@Wśő™‡JöNµ4ŁO +٦çčyŽ®&üĽÉ [ÉÔ(D˘©l(ťđ ;{ăfr‚ÓąLJ<ŤÝ =N1d$¶·Ć´ćL3źż~,Ń+˛ýâsÉM7bŰJrŕ(» aɤG&(tďŁ?±da[CŽX> I$ó˛Îň6Ń4ťĽAIĽTꌧýćżať=ňńăŰĽÁ§"§ĹÚ}uâµQä´Z,Ł©C´”)yZŻhJbĘ•ɬ´ĄQ+ö+?f‹;R†DĽ›]ô”Ăîę?kńn„‹ÍËô®ś2Řmćš|$¤iMŤuĺ«ʦÄ^ç„v1’u\'-ěäb`7v/ßęÎÂË+.-uĐß·Äă<бýZž:ąŁbxDҰq×°÷–m˛Ł×‰ 0®­va·•«}ą§R4Ҳź|˝Łd9v"1żR¨ôÓ4ÄŽĽâŃB焉_·Ď›Ź -c¬ ±é=3!vĎÇ»¬˛^Oôuqflűi4żŔ’·70j €.1JĂŐî˙đ1ůđIĐB_ü­ż"Ľ§áčŃţ¶ŤůCz•pÝ6ěKŃŐňł¨VŇbˤą±b Őťá ;á¶»µm•pŤŚ@|!jżZŠá=ΞNoÚ 8áŐĹws=fFŁŐôÓ˛Ă춤YôóéYPfµ[Ş!:¤čF®B/Ô ż”ŐNóFC •ŻleĄË˝\¸‘ >Îsđ^çIš<ÝýCćĆŕK¨<g%†ő¨Ö6ĨćłM•GÔ&É;Hy¤v•ţđL"‹ćÝř—ł/lÓ|5"ýi‡ś5—Îîű’5ä­ŔuŻ É3VN>{×ôY^`ĐĆׯ†Á"[jPŚŚîłű~5ô8%3ČT sĹŠŢÚuéF–÷f+S? •ŰG("ĚŕŤO—}Ú Rĺ{Ó™ĄÓódG?ČńEn”Ww?`­ţÖ’‘C=mtĺc¤ś±XŠ™g¨âŠOK4«`ÇW0D5šGÜĺNF•ŕč ÝVÔĽ2°EŻjĚö]Ę!/sŇÖpç]ŠDřýHfŠ;015ĐltÔž¨GĐ=&8·¬ë,:<đy“4i]Ôöc‘©U‡]żHa?[#"*ŤLfĹ€3QëůčrOĘß [««ią®üyăľüZš'Ď|¤„ѵě˛"xCť8MˇD/UĚöD$#Öd«ńľs{€Îß°,:˘Mź;˛‰°(1űy†ťč1^¤:AÉ÷TŁ€çäggλŃS¶¤*®Îe6‹łł×•2F÷ćżż\*@;s*źůݬ×Ű ˝}ˇ`bşźÖŁ“xČAűůŽv̵¨»ľ,őáĎj…yS@jĹ(ßG¸ę“ęĎîčď˛y$pbXżgÁ>¸üţjbqgöĽ#ÜvíGüÖŮ© é}hFŇć+DGdäÁäőu[î“­ţPÂ3ôµšŁĄ©Ć5ް.cÖ"餝Śko[4ăX|E±Ólq%YŇĺbŘr¶ÉnmvRĂd'ëăéËJrAěqţŕŔéÁa…ÂŮLŢ' 9˘;7• ‡ OŘđňFÓě§ąŔ*B˝Ęp´cWvÄ·ŞÝ“ZŰš^ UřćVŤŮű͉ˇ‡Ę›óů9>ôĂSGd4-Ë•D<ĺV?Ƨ׮Űhw¬Q2Ů`‹apČbčy‰÷&™ţ˛ÍKü˛óŤtiŁUćNĎŕ¦Ď"“¤;?i"UłFŞż§4ťĘđ ͍öP(oJęÄ(Ҧćc®c€ş˛<+{xřc©/ËNCć¸xÂh©‘ÁŰçWmR·]︇»Uď-î”:qÖômőĐ󷵼F¤°I Ž^ꡏ_ü@Mŕ1ú¸Îęš®żX‡čţäëóĄĐčYó$śb ˝&.WGŁô]»ö‡ół–8 x–A–ţ㥅ąwđÉítÇâoěůq€dfŘ7ôśçy“ S•HăŠáb'ůŹ ”ä\–Źű/ÝőĚ›-_Ş-Ęě(7fîş7.÷á¬r˝ź›´^d'˘+^ßxDv ĹOďB<"ŕło*Ei ·Ú)k#‹üóÉŇ’Ţű0“ó>J.)dęOWm%ľ{ą„‘Ş;¸ż X{ÁHµŹ\|Śq­ΉZ2PnÚőŃ;ÚfU&(; <Â),°i*R¤N~źÎ´]ϵŮf6÷e5N˝˘*®íLoN°âUhw(űCť5łJt4ĘBPĆŐCÓ—ŃuL řˇ±e)`F§Ď*2¨-VĺÓ (?ń·5 ęˇgKť•ń÷Ö3šµčÜĆ·k´‹­Š›émoşĐî† Ť›"k4“0?Ä„n1ăcXž¦g`peR™sY7šŻűűh¦+ !n ÜŠ$kÂTßq8qńgXSuź™<¤‡Ś,6ŕlűţŕ@PO©śÓ­›żINBX_ł™ÇĐç§k´ËÇ\”GhSÎRŽ_·çÜ‘ ŔęŘ2‰Q^ ěG>jOČŠÂ*‡3ň>•ŚôšśÓ|Rw«3=Ôľ ÷s+jŔăĂżâuŞźů… O3Ş˘slh…!vŮbŔźwžvqĘLYv­bů„Żâ %ÂâyTĹî=uŠţROĚ ´Q®’cű‰ˇ†ŕÂ2ĂóŢŽ6‹ĺ÷Ž_ďGŘáxéx-üô~Ň€¶ŻˇËÇĎ<![r˘pů¸ü‰ŢýłŘGçooŻŻ<) „6ě¬eöÉ•v/ _ABč6=__ $2Ťŕŕ RŃĹü,"’0fĆ_půĚPlRtVvá$¤]Xě^]=çö1¤ş—  ®RÁ¸Ćü0öUŇľCĄąá.{@ä,ŤÖ˶E‹şâ^¤¦?°żűąćě˝Řë´{%Ś*÷Tß…§zzÖ©ńTW|mXÉň9öŇźuš€IŔî–Î`8KFđÔŃXH}íŢ–ęĚ‘â_ŃatFO ě“LĺpHu“će ¤ěFăqO˝WLué«×ćŮ łĐîE_6ká X˛:Sd|ĎŤ;şĽŰ8gŇ™NÚ—ťĽ¬3±J¤µ|şk«©¸±.;‘BČähîeůB±bý=(-óö71łČ}çiÓ¸˝‡aÁ—×3A˛·ń9¨ß3˝búA}Ř;É/ĺL‰Á›[i<řŚĽ.žŠˇ|ő|odÜŞ…ĹH•‡Ă%rżÎ¤gÖ5?]d ŘT« §ng"ŤňÖÚăĐX|Á®t´=DˇĎŔ›óž§GZŃđ&…ú†ő̰[»“=Ĺ™‘ňuCĘÝ%&łóGl'’ŞĹíTÉn˛řOläŐ;ůľXuvÄb"—ĄjG.ł=Ť˘ůJŮ;›ąŠŐdk]_NžŚ3Żľ^™mƉcŠ.Iž:zaŕLóŻćŚoŢx Pü|Ł‹á™WIąuĘÇ7>öź:›~$Pź÷„ř]ŞłÝŇG–îM µMÜKUAýa˛[m<;Tß“.KSűĆ™…ú3ĎhW•¶ŕ¶/v¬Ńýv.…ĄĄ'9„ Ö.…>=MʧźËY°ĽőČQ€R™ß˛Î)kě\ĺßçN=—‚%ă•§çM莳WZŃ5 P6xŚŽÔk*íŹ ż$iuWÔ´‰ć¦Ö˝"i1.ţ|k™ąk¦ OŔĆÎNšă¨ŕ±MdJáĽ) ŻÓ\sĽ’Yť(yzŮÍ4MwXOv»·TĹ›"Ş m‘)zäĎéq€É6Ý “ôd±ëF/7ě|˙u“łL/W˝éx +KŽ} büµ›MěLÄBN«(@~Iĺ0TVďęńť.G!cBŕCjGK.9ÖĄű<;Oş‡ÇÝ+üE®ŕëqWhˇg±˝„I*ľëmW6%ˇ]ôÉ”űNĎUS)GJűžř†-Ń®e“ °Qš­m»Ň!ó.ÜŮÜÝŮlD÷ë(1O@έEßëH:”1Í3NGĎ~ä_<őd†Ö=K3üś‹é¸VA)čyv§ůěIÚĂnµéűv?çIS{`űä†ďpn‹=´9¤ećz °ĂŞWm.Ţ/xşGXT‡­ëłµĘĺFŤ,ŹŘX~™,†}9̵™°0D3§y¬żBăA$˙<±öĎČş›z* ®'ăvď3îOÎđíţNˇZňE˘×ŇÁĚÄ'Źč†ä湤ÁI ňŹŁ6Č­˛E™´c\˘1+vJz+·‰ÉâóLjŇsś¬ěÚAö†ÚÁźŠßnśz«DĺĄĹźq„Ţôß—¸™/ďŘv¤óQń†¨öđĘ ‹•Ĺp@%Ď-Ú ä¦`.çxšjŰRň˝ČôĹdlcSý Đ ‘›°˛‡ué§j} ą0wóďîĄĹ•]čŁuś/Ź˨ň){eLË_.č-ß×;ą-#DH˘ĺ˛ďŃÓ}ÉśFrZd8QJňŞJ4śčmbăf;Ĺß°9Ť÷hËڦ˝;ř…¤ c!‘˛Ô‰Î‡ö‰%z¶ećĹOf_¸'ůůn6K¶jżAľ„š<śf˛ßÍ€Xrý´–5÷ŤKšR\~üÄŔ’ÁQâą´’­a’~ešČ·Ą»"Ťް ¶W«šD{·…vúŘŕźöďđ™łŘ^ŻÚ‡óKR ö—né6‚C äß ďÍÔ7ßa"9pÝ݉+s<éÁ»ŮíŘ«¶Ű–™ľĎäĹ$9@2ôVŐ[Oć5ÄĐjý¬ÔW(a×MŃ _Ů%D–5/ú`GDÍ= ktÜî;Ő5SŁŠÝNđşkn ›KĘ9gWľL]ő·ś‹ Ł[Şoۋܪ˘Ęú‚XË›>ź%Ďă [SÎęÄą˘'Z’Q6r/ÂĹ$Ü)W¦ÝcÁŃH}€ĆWă7tލCř–jȨi“nlF/bŤş–ßmłź˘yŚćÁ·2íjĚonE–D„1ˇEĂůŞţrD¶bóŻŢV~Ł´J*–íJ_lŐ`3Ň·Ďn*VǢ˝";5Ęj»5ýÍĺáOI`łę —´'«ěĎgĐ‚@®»:âpNyt?l#O˙Ű—}{˛ÜrĎÔ¬ŔÖŐ MqjĺLíe Aßú| śę#ĆďŘ^ţ`šVÖ9/>KiĄňËňĹűÔ]ĆřX­u%‹đkä¦jšÜxTP‹´=&ńĎö+ć÷u&Ö‡ yl›ăp0z«úSS:·„ŐjěH˙¸¤Źßś”·“a •·•żĹK'Ö´ŞçŽĽŰoôŁlˇu~ź8Ĺ}O7Ä-^*“ô¨h3éăĐľ‰vÎĺrQđµq.3ËíµŢ y´/¤öm—É–XQħoh]?×g¦ŽˇEřŽ~Ŕ÷-“Ö•ďŁŔĄŹŽ÷.rďXçřO¦Î±a‚…j–ÝçÄž:)Řs ·ť{‘NĂ=—ÍřJ?©­^ţ»0‰QEo±ßŰť}\ćĂÜs_%—©”őÎ㛎‚\Ö…*h®ăÉE€t[C–¦˙ÜŐ¬7Ł{±ž^°zÁŻź‰ddAűFb‘Ć—źűŮĂąw=Ť†®V–^W±Ň7{ăg©‚SĹ®xű—ęĺV§śt¸ mĺ_ł>m;Ćľ¤;?©7†’ş \’iép|hŃHVB×± k<ĐŁ(Š‹ÜľŢ¸¤RÝĂáŰ› ĎĘęRĂÉą)řĂ´@CfźJ¤fčL—„§[内bަ±÷š·?‹Đżů:ť"ĘŁđŁ]ÔzćJݶä¸^ý°¸8Ižt°'»/A–nI“ÝtqőödŹOQ 6˘ąŞ—!'=—˝Fhă€hŇăŮ~iŇŢ–Lľo‘—5ašˇűÄşă± `ŞqąóĚ«ęÔÇ飞˛“Ë•Oe%?—˘×®˘wÇÜ˙ ůZ–=ďî’ą<ÓI:´úC GÚŰjĹ|Í>{w҆«sżŻ_.íQÄ@§XOBŮ,˙»i(9F˝ţϬďWĆdX´VßvS—3Ä*iÇě˲T371[sŻVAüŤ“-XgĘćúő×E3č®nâö[hYo:ş%§C®ó8nvĆ˝$f˝nE Đ KŽ.@ܢŃď›&őęÍ÷Źâ°®]Z'‰Ő‰ŻVöşx‘Ľ1)»q‚<‘*IĐI«~au3‹¬†›L“ů~Ěüýző¨ŐFŃÂfU}Ű.ç.ÝÖ ÖKŰĆë-ŐG捆\.)í­Yť/űîőf3îŢödą¨lßsŮ5Ý—ţáIżJy) ßĐďL‚ÔsG«^o8Ĺśůť9çPLŻ«ŠĹÎ)H=“ŰÍ-lp™ß ŕ1H‹ó\łťâÉű±\9ąmârÇŞŻŁK捇îíŽ +Áőá` oö‡|šě€$Żî+lťĹéůŚ#»ŮŢ*”łnäľ*.qĐďŤf!-«+~ôIŰŞqhŤŮ6ŇÖÜŚoĘlĆę8H c˘"ąŠŔ« Ą„gŞĆ:­|ą#}^ćJĘ„xM=l^ŕšNĐJ–Z­p!ő?}Áw endstream endobj 1323 0 obj << /Type /FontDescriptor /FontName /NBBWCW+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/asteriskmath/bar) /FontFile 1322 0 R >> endobj 1324 0 obj << /Length1 1399 /Length2 5955 /Length3 0 /Length 6908 /Filter /FlateDecode >> stream xÚŤtT”kŰ.Ý(Ťô €„0 -)Ň -8  1ĂĐÝHIHI‰¤ ’ŇŇ%)!Hww üŁîýíç¬uΚµŢyź;źëľŻëegŐÖ㕵BXB•p/Ź_ ݎg, ŕçäăç bgׇˇ ™‰Ř  H.ţżä‘P0 mSŁĐq8@ÍŐ€DÄA˘âüü~ţ‡"â°Ě  ÁPCŔˇ.Děň'O$ĚĆ…nó÷+€Â=|(úŕw:@ÖŠ„AŔp€e uDw„€z ŠňüW NI[ĘItwwç;şđ!6Ň\î0”-@ęEşA­ż4ÁŽĐ?ČřŘú¶0—?v=„5ĘŚ„Đ wAg¸Â­ Hş9@OU ĺ…˙ V˙đđ×l >ĐĘý•ý« ţ; ťŔpOÜ` s€´”ÔůP¨0ÜęW ŘÁλa`KtŔď›J˛:0ŕ_đ\ HĘ…Ďćđ "đWô”áVňGG(ĺBôë~ 0$‚»'đĎfíáw¸÷_kÜĘú+W'ŕ8ĚŮŞŞđWÚDôŹÍŠó?@ťP-đWy}O'čo'č—ŤŔ×Ű á°F€ú¬ˇč?"o°€BşB}˝˙·ăß'"` –Pśčźęh3ÔúĎ˝|$Ě`ĘŹćŔ˙ë÷ź·§hzY!ŕž˙„˙Ţ/P]V퉡ĎÄ˙ńÉÉ!<ŢĽ aďCa$€~Š |˙]ć?řüo«6ö×ĺř˙©¨ ·FţÁ€Ţß8Üţ˘ç_’áü»&Íe(€óę›ń óCĐĐ˙·~§üßx˙«Ę˙‹ú˙}!%W‡ßnÎßţ˙Ă v„9xţ€¦˛+ - Zđ˙5„ţ‘˛Ô ćęřß^U-Y¸ šâĽ !>~ˇ?v‹ĚjĄ CAl˙éďU {8ŔŕPm„ ěםĹĎ˙_>´ę ö诊 zaż]P´¨ţÝWAXýRꀰŚD‚=‰řŃ$xĐ2µ‚züć7ČG Đ)4F_€5Iôk­…@„ÍŻń˙,ÚGôŻúW$­ľß4@7˙űü[ęP¨B49Ž€H„ŘU„4~/“epç]Ŕ›_lzgÜ!Śâxím«Ž˙JyÄYî™UÉťľíooÆÇ}¸÷ľzµfÎ%«dŁ0;—ĺxs>_·Ú@™­ô6C˘)Ď—É÷ăun?3Ĺ1˝źh8ţ3T´MpýĂZŢU“ËşÉĂm€# ŕŚŚ5™#›Ő´ŤeĚʶę56#‹Ą@š¦şę«>şÂŠ‚ĹžË5FÓ]x.›Ć¦őÎÎödtu¦˝yÜ^*RFIGĺĄĆšŐ—ĐMGźˇVă‚Á!'|&˙6)î.]ľcǶcĹ‘‘-¶ŽßPČh×' ‹ŔL@jÝVŞjhîŕč‘dýéĺ‰÷š]jŕV#R?I Śî…•pB6= {ă›Öšź+W­ÎO$ą lŤŮ2#őşîôí¶qĘgĎE9¨ÜŇÔşŚ\XoM‹sj‚ >eŃů ¬0l2Ą7­^AâŁ#2 ŤÎűj{Ľf&O÷‚‚âŽü]‡Cٵ‰WʇŰëărň—řŚŰ†é¸Ą÷1×M5,.U4Ž"úÚEŢň@(-§ś˛ćM,«ż7űgâî÷™#f„VŞ6{_“D+—é-đĎ]›gŽż)1ĐżQĎđCńĂ$ őҢ|k»r–MşŃXĺŢs«ď1+ő¨:řŞŇâřSôÎcđÝkŹ"”‡%éďUofMGÓ„ľ5Úy}ňr^f~@ŁŠ—”_Ý4•KăµUę±xMi™ĘűCSĺm"Mď>¸P†\ž;?ŠlÖăçx «j<éÁőý­2×ÔŁô™BÎí\O ĘřÚĘůŃ ›ÓNh¦Kç r(‚EOţÁQK=Ú5P&gŇÇÜ‹ą Ö¸Ě`z›Kĺsĺ÷SgpCŞL v›Ä!Kl\]-VĹ›V±çiäm5÷9˝Ňü(?úđGXr˘#WYU%ŤŇe˝(Ü÷úŚÜ¤Ć2űQÜ©‚šfňĂîĄEĽŞ¦ë7¶ćKBÓ†<ă»Řo[ľą¨s_üţĹ ŕO$‹:Î]]qvĽ§%®f‡7›Ţ95ů2č_=uÂ&¤Ň¨í–KŔ{``ĘI·íž¶†&«ŹĹL—7XxجCÂ̋ԿúĚYŠĘAv>‚rć;î;^ÄŢ ęüJřÉ(§°|¬ÝüvÚş—YVk&ţ™¬Ž€×hźIëŚČë™_Í™ňî¬í©ţd›éşyŘa(ßŃ]¬‹kޤ–mî^ÚMúřľÄ+09›ŕĺ§ÓBź ˇŹ…ÓůO$7}ď CČßrĤľ?‚ěęöOĂEślż˝2ˇłöň:’‰|ÜË@L5IwÉa|Q­†F:őö“5żÜÉ^ 8Úă;Y6ź×‡f&¨QÉ‘ŹşßŞý(sEć«pLăđ' é1‘2HIN*Xx·,ZŁč/ őö1­AŰ/=KZĂ:KsÍŢE„á%ć¦VŞ uL mđPbĽËĆ'Sś`ę€|?>¦´“śďĹŻt‰C ĘŇ´„8łI»7źÔ;âĆŐ}ĺľ%JŕüŘń.F‚ř'‹ś3ž—*LLPSDRŇ‘ÖfĚ’uqőIĽ‚§r[~Ş„ż‡ŰÖů°.“Ł%›^nXüł; ‘~n]¤aě.}îŰ |EaQő»ĄW–#ŻÍ}–a2ÖĂ›ě/YK@Ł+ßçŤď(äѰÄÓÉŚ-ÝŞţ¨Đ‹čú†˙ăĆ…ÓAP'ŇߣĆČZ>µ 4Ä2ŕD5€ ¦ Č*Ä&#3ç[řćL}%Ď—EŻH§bđ¸ŐçDý ň\˛ł¤ĺŻË>ÇD—úĚőfĐž}S¸ýüónöŮ:.ęśáf%°űÝö4AčfGs˙ë¸ŃCĹű’›ĚI[mŽ\{±jMdzî4B¬‚U;»Ĺ‹őŚď˛*qú‡*CĂR ę¶Ô’WťÇ>)1i™5MWűúIç1at·zŠXéRhĺh.Ý#ţ˛äę×SÓ6ř>=eJĺĎôWí÷“(_$ ¤fޤ7LÄt…”Ü‹dégÎüĽéaŮů,Ř8đáűĎYp„wÖŘ(M× řÜí‡,®<Ôž-ł‡˘ †Ź+…_ţĺâmĹ]—Ű™Ň÷Ö^iô‰”(öł’Ç«ślrČAxľó1ş€ö9ëčË#t’h›éÍ«FËFă4¨Pďs…{{>^©xugćÖfőĂÔ ŚéŁEoG6^Ąn`ŚĆčĎŇP–¸dă<´E83f&€ď-ýSÁČ&şŮ⮓h±Ů‰ Î-÷¸™ĆY®g…Ţc襭Ţ-¦ôĐÓ8*PîłbČ= jĺ‰hĽő˛ÖŠž/†™®apGnĘVÇëK–„čéÚ.†Ń ÝöGKĺçÝP!ÄĄÇé+ŰÓ9śčű%Đń'!Â$nďła$O࡯"ĚÚ©ËšĄDŚ‚űiă”vŮý§¬X6Ň+‹•X‡ÍďÓăűúE:+ŇÜ`H*ö´Ě .°Â.˝\šźuÉKą´iŻ{h28ˇÝŹß •ö_Ą0%ˇx} Ř6kÔ=ó¦l ľŽĺ^`ĄšB*Ż™FMí/űöŽ‘Đc ZI¶“}WȅѢĚ,ÂĘňoü‚›oł#ăű b÷neĽňsfăďL5jK+ś¨·˘ís}Ą)Š#îÇŢýÂGčZŠ@řuŢhŽ‹ sCőkĘ/1‚Ö$ÁŢ/“]‘4^üÇ€,Ĺ#¬‚•!vVŽťěáŇäĐ$Ak±ěq‡ËM«ŕźşéĽ›řß*]Ŕ±¨30îź)»o»îµăYpÇÜX®0Wá~p/‘’5v–ľ2“Ëťěě'«Š#ĺŇvY?ß"lM®izďi·ţÚčY!NWJ¤ScE—wŠłĄ«Ő"ýßF„:`„f±3”ËxPZä ë¶éĘS^Ç3|\ËbO™€Ôí¸Ťâ÷mNÁń_čß?:żł&‡“Rldq2`ža—/7|ŐÜţĺÖ!™ţ[xDŐ1·3‰€P:G‚o^š°A?੠ÔĹźľŞŚ‹ÉL}bľm2–ü`ĄŞĐ3ÎőĽ1aëÉYţĽ’Bţjř­¦O„¦a–úřs”3oeű¸{łôşÖł»÷;#î:]HeÇP.ŻÔyz±ľÍÁ$‘ngÜ@ŘźŮëCeĚx÷öźPÄŇâů¦ľăJ./’j™TQ·Č˛ďĐßr|މîTOWJÚĽBĚÄZń4ň4µřVgżĺÜö$ĺF`%(g·¶ąĂඇ"˘4Ją((MąI WR¶ît{Bő˝¦ăśźaĹrĐłŕ;HÝ»L˛9®×ž’Ň›ý„Ď6@ÉY9Žz6("¶«źł1)4\GöťĄ{Ź"ŮÖbŽn—LGeFČôŤoĐ«§Ŕeó°e^đ{rŕWE/⨀ęŮđ˝ŢD]˝ÄíëxĎŇH[TWô„łBE>1Ţd‘Ú7ÄŻ(°‰|{óJŠ©’A}nŰšŕ?µPÇ{~[(“›ŚçšI'\Vgo‹źAŰg:9¶á]őSUŁĹ é÷ë_ŁHć2¸ _vZŕčÎ?Ď5fÇŞŇţĽ.˛3j±ÓT`ť„]Ž4ĄsŇSÍló ö¸”ľčČk9/Ů ŃvzBť‚Ç"xF&3qÂ1ü&5 A'˘ .öxÔŢ  áń©‹x'Ś®ŞlŻ#ÂZZŰ­CƢM’’¬DĘĹaŇvű1ůÔYćbµĆňMb’ uĆÍ­+Ť-3ĘĆL:Â%ć>Éß™e;ź‰Ą -/Ć–*ó—¶ť]K-Qiůń‚ßŘDRĹ"•üld,¨ĹÎ.˝ON]mży°ŹĹ/ů4ă3ËÍ®…źŕ-ĘÂZíjGŮuÄL;/#oŞDIŞ#m¶ő˝G„Łťü^ŘŁ”©¦ÝÇ"(Ź´Ţ ŃĺoXßI0˘űřQăt~ţ^Ľ˘VfqylQ%qř\´ö4nâű (LK‰űÂL_NKëG)wÇH„Űd5®ďµĎÁ*ý˘‡©g۶š[‘P p‹jpćU€1šäJ¬VNU,z§ń‡9 ńµ‘ĹY…ępEľ–Ó«|á–piÜ6{×·‡E?rźn™°ÎQ›’¸]ůżÎ"Ç) |%D§ío9‚ő…†}ş ÓŹ‹‰ĐĄ*eÉąNĺeÉ)vTŽD°ÝK·á;ź˝÷Îwć˝§7xĂíyT´ČöqËćŻ  n"Ź´úĹ•hö=ŁĄ?8sâÎÎ<¤ÂĂaâ´o•;ľŚ4ŻA莜íÎő›ýĘĺýfI*Ž6°wŮí 5ŞĽc«ť‚żaÜa )ţęż.üę^Í(sÁÔxž>©ĺS[!±Ř”ÜҶŕ©4˝ł:xGz  ś`8˛-0˛ Úv°uO¤×ר^Şi3§fĘLë5ď>>r„b©ĽnIĹÚŔ‡~{äđäî«É·űöi^)üתź)ŐÖxueąµŐ°ş6??¨ŢĺęťnwĂy MĚýxuĹćőĂ"4µ9î„áĎ|dqĆuxĄäwę>EÂNqu)Wš=Â5ŐůSţ¦¤ňŔź›ň,]+^SÝÍďÇE‡Žü٧ÚůÝ–uéMźŐU1G˙<źęäŠái÷ą|ńÎŚ"¨`p‰őÂúąůčeĺ<7î!€=ŰśôB*µ{Ű)+šŞD˝ äĚłńŤÓ™Ł1ŕ­(ĺţ~aĺL5XnşŮn>D1A¶Ňśô¤Ąí'ťľŻźP+“4.‚ͧž T3*„ĽÝćéiŰWőżü¶śđĽ)šSkž ;V6ĚHMHÝ8ýÝ]>Ć`&cď3gdݧŇaů©{HŽfúĄ[…ˇőęmŐb†FŤŚ ť†»o-ćÜ)LÉ+îqë‚9 9ů6}ęŚR× ŽŽ‘ 1lĄ}ç#c:çĐ؇cˇĆšCžOŔ‹D#cš˘~ňťß.`ć ń˛H˝óŁUşčSĄřOĎurŘTő#ý¬ŇŤ‡“ÎiŇj†fŃáú5äő+ŞŁ>ĂĘeĘÇ ’Ě×d‡źŢÜl=é(ŃB2m¬ňFň~ß"Ę‚t±ż4ÄÖ•ŐÖˇn\şJű¨‹E¨q!”÷i’yĚ #ôNpĺ9§LëŇGM:5Ą{ŘţĎŇŘŕG˝µÓůkÜL‚Ł ˛˘D;ä~kń§÷ł©|j’4…ďRîű‘ôč¨>©†QsO^ä,Ç®Iü€7–]RmŔz;´ž‚Í0gßó;}ýćůĎ n.$Ě4l¨C)Ĺ‘Ě7§łçĐé1ľ.łźĽ˝ĺʇ$ö-¬ÜŘÂndÇYTő“Í”šyyÚť&Źíš»cźApł‹r{5¬—“Ôs DŃÄ+{ů‡"m%_ŞB[@ĽčřÚÚ.ŁžťĘ_f_·iŘ[ë<¤#«łôUçÎ ÂőŤŢô6Çl¬ ´,Ç~ţ†=śĆżc Ą"Ucm§–ÓIŇ,j?ěźf´MĄ 5~QČBŠyަÚ÷Χs0¤¬ćóD\‡ĎĹaxýŹNĚü—d‰¤í'Ą)Đ-µ™ő:ÚĚm:Ń ‡8“Ť‘ăü©JQYˇVýDí §˛Ś,ŤÁ·Ot[Ę’;đ¬w"đ§y’⛢A«IÍÝÜ îďú%HÝűˇĂ^Ĺ:~ÓcôU’qúéĐůę1Łn`ť…Pőd§î±wn"+ËvAŠY>Ú`ßy˘ ^ą^žţöą´›ĺ—?ş`SWĚţí~_ë$5D?L†ő8ĽlŰ’tYÁpď÷ÍňýÔ!ŘĎĺ Ç{ˇ˙NL¨»xĹO°S_„¬¨°đ¶ĂYĆč-Duk6O)Q—…s4y{Ť™Mú@gëđ¦vxá5#I6łśAqFëĂ»š[—‰0Qú·»ÂĚbTéHą•Ž$“iIĎŞŞ†Íđ$ é¤kŰ€˙ŢăŁuîg@ŰĘJm»µ&ď•gôÁÄÍ ň'î”¶´'µŔ2'A¨ P5CöÝg.ŘA›ý˝µOźb?+á@Ü9ŕě·ü$ŤshŚĆMeŢů>,ő<č1Î'˘yŕžŕŁjŮ/>•XĘńްí+"wąc‚Űťď­ŇCß|ľWygbôčŻ çč fšv›¶3e´ ס_B˛¦ůxű†ŠWź:Tt5>*Ëąz…AMu-9¨†µÍ«\8ÜńČ‹ ů°q°ŻřŕÔ<Éz´„"79ŞŞŞšßőDn¶nŘ B'sŰŠ-GŮ>sRdçë|›ÎdÖĄŹZÝ?îQ°’7I'ŞRęÜRńxK•··@0»ŚîjQή­¦C^<Ěř‚µŰdóů)=?}§×ڬý ™Đýăögz"CrŮ{9Vcëĺf+ćŇyńöĆx˝“1‚b],ÎÍëCśÝÍč= ¶X”ďˇ$3‘ î% ˘`ĎłĆXÚš/ů ›,áđ­n÷Rh1U=‹Ý[BßwÔžˇ,}#s^~˝×g¨Öż|j=!NÁ‰öć>Ú†wyPŹxíąµ$Ó–®˝ęńś~ŹŇ.Ýx<Űk¶z±Ž5™őŮÍů±ĹRfË…$ďBÉ´}­wĐZ@®DďvvÁ[ë©´ÉĽ.ŃĹĐďTú çÔ_WçI‘”bŻ'꽲I¤Ż‹pŰ'ró©Ů}ćÝ!ńË=›šŐDLÎQTŃ>śĺKńnoęÉđ5ˇÔV5Čă Ě·řÖG¸F#2ÍvĽŮ2*ľDzV?f04Á_h–-ąs$Ďślot*!ĹĹĽ"äŤůĚśµ%Ó [ŔVĽŢ$±ÜDÜĘőiEÉŃQ/bsfĂĎ®“43:¤ś€öE˘ţÚG”sW%Ý`Ť 3q‘zĆŘ9śzN§źőş¶Ř—*Á">’őÎő\N‹jmśy89¬ń}E9wÚnYµ:’ř'¸HČßml$ú¬äer endstream endobj 1325 0 obj << /Type /FontDescriptor /FontName /LAJUWJ+CMSY7 /Flags 4 /FontBBox [-15 -951 1251 782] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 49 /XHeight 431 /CharSet (/logicaland) /FontFile 1324 0 R >> endobj 1326 0 obj << /Length1 1612 /Length2 17354 /Length3 0 /Length 18194 /Filter /FlateDecode >> stream xÚ¬ąctĄ]·&›{Ƕm»bsÇN*v*¶mۮضmł˘ »ž÷íÓ§ÇůúűÓ}~ÜcÜkÎą®‰k®5ćŢ79±’ ˝°©˝1PÂŢÎ…ž™‰ `iküĂYŢŢNŽţ;Đü௎ś\Ô häbio'fäähMb@ €™››Ž jďŕádiná Rű®AMKK÷ź’LĆ˙ˇů»ÓŮŇÜ@ń÷Ĺhcď` ´sů ń˝Q¸Xf–6@€¨˘’–´‚$€JRA ´:Ů”~ŰXšä,M€vÎ@j€™˝Ŕćß €‰˝ť©ĺ?©93üĹvś€&–·ÝM€˙¨č@'[KgçżďKg€ą“‘ťË߸Ř,íLl~ţŔ_ą™ýżrp˛˙kaűW÷LÉŢŮĹŮÄÉŇÁđ׫’Äżăt±0růÇ·łĺ_5ŔŢ쯥©˝ÉŹRú—î/Ě_­‹‘Ąť3ŔčîňŹ/c ŔÔŇŮÁĆČăŻďż`N–˙ ㇳĄťůF@pš9™Úťť˙ÂüĹţ§:˙™'ŕËŢČÁÁĆă_»í˙eőżb°tqÚ1Ŕ1łüőiâň×·ąĄă?Ť"mgf`fú·Üô‡Ăč\N˙*Ő?=Cý7#S{;€)Đ ŽQÁŢĺŻKŐ˙Ë ˙}$˙7PüßBđ ˝˙oäţWŽţ·Cü˙zž˙+´Ä#Űż đď đ÷†±ČţąclŚśţ?ćF¶–6˙‡ ˙ŐPřď ˙p¤]ŚţCŘÎü/!L L˙Z:KXşM•,]L,fF6+ő/ąšť)ĐÉĆŇř—Ń@ĎĚÄô_tŞ–&Öv˙”žýß* ťé ţ/I˙ ťQUSTEú;í˝S˙eĄô—{U‡żýĎTäíM˙×â {w€ýßHĎÂĘ ŕřë‹™Ůç˙ŕí_0Ě˙ą–7rq˛tčüM™‰ů_‰˙Ďç?Wz˙FÜÎÄŢôź^Qq1˛3ýŰ^˙KđŹÚ䇓Ó_V˙uâ˙&üë5:č4[[¶7áýi•–™îR‡•;<)¦ÓßË >ěPÚ¨ZTŕ_cßă—¶Ë]iř^ĚĐ4ÍóŮî±tîđq(Cs4Ú‹iCŮ“ĽÎÇ÷!Ąî+@ݢčä¤= dÔ/ELżĐňşY”ŰĐć`R?Ú›Tţ®_ňE0ÝÉęsóLíOęZŕŹNöä€äk’Ú‹ń Ą ä[]áůEâéóĺŕŘČđPĎdß!mN,,9Ż–oň9q’‹‡ˇÓCŁÉ'ä«+§ŰŻrJ8ĂER[”Ϩ ŃŤÖpł„đpX gA‹6yúś˛_ΠKąJ.&ËXqľ?ѲD3őtÓÝŔŕć¶ –śťz·µŃ ]oÇ’. ¦Őśźcó(FŔ˝ěĐ=’íŔ®Y´w9‚c?tPhŕč®DĘ„çňGG´MŽ_ď:h-Ś›±D†?lŃďráűßrN¬F' ˝@®槲IÉúćďžś8ęEĆjٸüMZąG:ŘE ·7»Ł?§.Ľ)qč4Ľ‚K§>„Î2»%šž–lť–ňő«łŐŻŻĹÜ€P$(]–šĂwžě<Ç@yB€-{[„v=Ňjg+ŹĐí”&¸üJJ—~D­F ăb#纣x;Ňŕ÷+?iXÉ<˘÷˝Á”/I›ÜäJr*ëjQ¸ç:qSŘPíćx‚e7†`oPâBżżdTíP,•ůŠ?ŕâßPĄ÷9ö4ňÜn˝¨˛Ůéü<ŢĎ7׊DŮ” ±/MđG[ĺ‰A/Ąä;#‚ó”ĄIsßRx<* ÜćăĆ*TŽHBiA-…lp?ŢAß]ĺ I܇ľ«jea=‡#ßşU…µůş2쎋÷A§¦`cUôÁ}D“vs^8h˙Ő Hx!Źu1!˝–b¶R üúŠ/éçbhÉyę#k{“ËXܸ Á4ňŽ(ř›|‰JG®Ť®3#3ľ\.č‡yX’xË*ÄĎÔ¬ś«:ő foRŰ÷slłM*ĚZý=Č-É)á['§GóŘźY©<ˇUHÁ<ŹŞôGm9^IbŐb)µ-)ÝHµc[ž"Řęő˝t ĘBÍâÉŞ9ŇšĹô‹†f:”‚ÜľK0r’ťPňď"ýĚ_嵊Bň¨ť"¸3o÷Ą_Ii 4f^ šĄŽ?‹ŰĽßčˇř“ŻÜëa~C×[ü~J®. v3C·–2Ř‘śß §ę(a Tť}*“`:fC-©n0hť}ăÇQ7çÁë8÷š^ę‹˝ţ©˘‘ł/ŚĘŔ<ĽłzvŮfG‹p°âyÚۤö;Ŕű›ž¨n=üüQP´»}@XÄNzKĎî‰8µM)Ě%—ݶΊ…tqz1y™$’5í­ Q8>ç^ň‡ď;Vą¤[?BO«9źNq -†˙2źkŽI|€.䬲V˝ă¸ÂĆě©ŃP=ýB(‡¸ßW`‰•ÜËJýľ?ßLßŘ;MW%>ë7Ix?şkÍę¬<ăŤýn›ŽnŇŔ“1™Ď3Ußs–‡…T‹‚µŁYe˝K{ĚčĚo^ͬ…ő»Ę’ m’ F­—…#řĎD+H‘ł¬­óč⦣#«P]i _z©É#CRYÓ•bçěižn±ý©¤T H•E ăáí'nj!“ P>aćÉ6Să~‘Ú"“ç[Ž'cŃpŁ“…Ĺpn¦CQěuA-zpOcä©>ÄbĽXćQĚ?( 1ďŔ–E·TŔĹéx7=ŇUČMäŰ;ĐdÜżjć˛u8ä–1x]‰ě[.hW@]gÜRĚÍś_ŁĘ8:ʤ†)i”şJaO.Őx×´ýź5‰OÖ÷ÜO¸ő.Źfµň+>l”X7;´Nnąö‡«OC_Pż]Ő<ÂÇ:şd6ý&i'ľÜ“`áĎJÎÉD‡ţŕ…5‚ŰĽ˝NâY’§X„Č7fĽH{Éa/đ&˝1ř• Ö3Sb‰¬őč§[Xmýk\ucHmťoËrÓ׹-E‡2-–îöŠČwżĄĆ)Ťň|Ű*úm؇“ö¦€ux,Ě\Xl!2P…ŇŽoĄň[š I5—qŰÍ»˝‡đY Ó¦ýWđ"Ńš«-[ ¨ž#;†[ž ç\öűĄď;_?d«µvÄ5xĘ|­5ČE Ź•[ážAC"1cÄŕW@Đ»u_â¨Ň˝¶Í)3Qür/3eéűľ­˘ĘתÔ_ŤcÎňżI©® ŐŔŐü cř%Q*KÉ9ľKFśń·ůj)0¨—†Ćd˛‚Ďýéx’źmBUźXźLrĚa©mü¬¨U9ERe¤}ža¬dYďăß©ë×â1†Ç[čç\a´ćnͧŚ=ŁĎúťŠ^\ÂÂČŕÁ÷ré9ť IdŽÝ–Ô˝é=ńŰoL›RN±J•µß/ ¨Ňë˛ŰZ%®ÔFoşUźjë,qÓi1özZŢ[\E(+:ËĺÄ”°ѲK÷蟸Üëjog˝•Ź 2Ú_!Ď6ëDg±şú^‰<:FČ—ß@·ň#ľô, 0ś'ŕKÜĘëKčŢ:}ë®B§LĹ[Qć‚—z‚wđżDÖ¶ŠDábíeím@çAÔV×f¤î-v%Š2‡e'V\čaˇ`ň{Ég‹u¬ĺé÷Ź4źËJ%çâWÂş¨xm´FÁ^6¶t hfµl˝ŠéçLd÷ńe0‰?ľ~7 ·c†QťąÔů€Â·’üą†ú¶Jg­˘â45ňĹßA21K TÇ?ş(vĚlRź«ô—±ĘŮĂÝú%q˙%­ ţŢţÔëqT+(ăŐ\¤jźó˛ăĚ؉×4‡›Dć°[n«4.jţaŰXCt Â6‘ L l/˝–u ­Őü6¸í™Z~Ş‚1&í CK•ŽDJď žgµ­ôă•Ř÷ĹnĺgÂţ! #zI2"ôxv †fŽ· ôĚ6¤~Hr›[+žlšŤq¨>ą†í;—jߌ3lę:Háö ŢnM_¸ż€˘żţ:M±&X˝ŕvN‚x©±çn߀¬ľu˝’Ü…yŠ]¦=ŠâÖ—ń)-ćÄÁ"hĹ—|¦©Ýí¬¬ďćLë\šńÍgXKʬLÍW϶ŤZľ–+Ä>‹° q\Ł SBl` E›ž •ŁĘűdB‰IV´e•H¸ $žřÓ•rá>ĎďćBtëÝű´Á=ý´yŞRś˝1‹“ĄŮRíĚ©—ćÁ|Ž©’t˝¤ÇŤčü’îfŰŘ ŢzQżÍ%ÎCľz§_„NĹ~¦’88­šlźĹ™! 9ľ<ó»Ż ¤l~ˇ”+đe!Ҷ!äСi&74u›ńlŕýÎa&?ő4TZ\ď— .Á´yqI|6[s°C+hu˘÷ŮŢqóÖßrG ĘD)!h뵩%‘řś¶±ď¨xˇD‚* Š_é€+\С d˙úS }ş$ÖëľÓĐĽ˙2K̶¨I‚IJ°$«Mm§0¦f´ĂŇÚ…Ř'×ëÜ-˙ńU«e÷d™b9ú`0\ěC`ťeyűŠ÷–•ŐeOg°©3łúŽÄ†­đŢśCŻ˘X('ŮŚ“vż™¸šöS/ż&ŰN8Š’Spߨ@ë.-Š ™u«Ź€ĂM3¶«N™´&Šiż“ńIĎ»ÉüNC“¶Kú‹Ô,n5u¶~"”졚3LĂT¨P=>ŢżQęĂćşy=FV0»řގŹŇĚCID:¬’ęő±)ľů‘ͺ䍜ɱĎ6Í'¸}&rúú^V4ššËu’ňĂá§ÜÄŠŐ]›î‘ľ|oÚ÷Ç&/ĹZ˘Ć¤‡˛±ÉHߊŚĹŐ­UĚ‚hŻíÂBI'şş|"nóžM%"śÇÖ?äâzŽdlŔfuph)R=¨u ·Akߍ¦z(Úĺü+ =˲‹ĐĂD Űç—¦çĚH&7AĚ];>•c蜸¬äćxbóbž[Ô;®`ŹŻTńhĺ®ú÷…Šńý‰©LmŃlŽĐÚőbfO{‡ ľ°ÚHŰ)‹SU –3J´i@ÚQWö̵”ŞJ<™ť‡‚PÄĆE±ß@a‡öahĺň˝?ŚţUćËśŰčwGj…/Ćţ,):Uµ-Ă·$ĆŕMçË\Ť ćé “ ,…nű5đ‡ŕŁó°Qj™ÁŮŚWá˙s¬ý)V·Pç>É­ 7¸ů,é=ËŹęwÇÔÖ[dł0ˇŞ ¬ŚÓż„Ŕ›!?‘ý¨ ®GnFŕ éÂZ[CTŘ–Dą\)NäRŽą‹Łef@ ĽÉď Vť<űŰoŮ»S÷¸HOŕTV-üÔ9hÜ–Ç/ś´8Ěß×ôpp¬KŐ{ŞÉY†đUУض‹“ćÁསţmřKm«ŕ/źĄ>‚[n•ۇo˝§·nŘŻmčŮRŃämo?˛hIń–겞fEtĘĂÖq9a\e ď9` Ňň[ €ŐŔ!¤NöRÓʡ7Á yŮAěŤ_6ąrj\%Ř1dD1¬H~9<,d"ŔeVżć”_üü#o}Ź$T¨żÚoúD{@ăŃĆČ%ŘioT„˘Ż[1rmă·4#Q§L82éVŃń ĎfŃą>ŻÂQ›É0ë€8ČÔŽNŐDoŁj…Ęü‚óŞ™›Żr˘ůŞ3‡¬=.QY˛ő(ÄqŻ(ͬŃj5Ľ[¨„˝ŹNd4Ba۶dë-™pĄ¸T.pěö /,0C|űóńsäPNQu5ęÍŘene’g#W#¤‘ŤI$—í‘”‹H•3·»–0Żß€óŰŠŹ ±*đz0?©×ľNyü! â:ľz«c»¤·Ç2>’ŢÖ—Ę—ňÂĺvłĘôŃO–uζĄ_očąízv„„5pn…bí}ÂĄEťHZŇ},ňwpĐň%~7é<µ0`Ć?«˘fß´_śGäcdsZçč8¤…|s˝UÖźęy{÷8Żn™_v|‘aÂňÝô€e÷y“łoł_® :—­ş~dщŽßeµăě‘—Ďş`Ö_Đ2·äí‘I´‡Ńt9úŐ˘Ôe{<ĺ´1|öOĐŽÇn€Ű/' ÎÓmFŇÔEĚťfgÁű/*twArűŁ%Îྡྷ g,+Ž}I0OĎ)TýąŹ„đ(Ô)ž#‡ÖëOé SýF=sfg źö!˘őíáçckf´ŕĹe >&JŇöÝżŰöćňlÔšŰꢗ¨ôĹתLŤ:AěM]Ůő śZmŹ0Ôë˘*•bfNÖ Ć­;MĘ#ĚU2ŔĂ—ăE'őM*CO×ZZŠClµŻöĽĹLMDJ°n'SenÇĂ”C}˘L˝hsš$5ëĆPfÉAvbOˇÚ¬´‡›ű­¨˝´ýkť}KŁź?®°lř›ş7©;˙,ők7ß9®(8f˘fŇ8€OŽŽ©ŮÔPËa‹ąôËĽK¶'‘ĐvĚ´(43…čÓQ9źě'CĆ4NIňC)lýQ˛“őPŁLć4É*ô5z·q†Ý˝ú—çv‚˘/Qâ¸î~C# ĺôŢO=)s¦ĹqS·žŘpčĘ8Pw;äĎŁçţ{•׎ ąG»5ßä.ś4zuĆt€ťýő> «Ažävo šłSW® 3…Ľš\ bE¸ćőYďK 7´^˘…9đ…̵Ĺ5ÂČśăCÂoümÄ“tt€Cľ:FČÇŤ.€/ÝŞZӪШ)ępŃľË ;”ŘŃ›UžňÔ»ďc…uŽţjƉ»]8ó†ţŤĽ§!ÍŐ`PA&“Uö“ću—úNPĺIŽś @H>"­-y€…úëŇERĹşĎßÔwÚy ľ†Îmł˘Co|d+Bş2Ů&HÁƆűuŇ˙6S¬ęRJZxw$jl'g›\ľĎžF }°l®]_#[/q:Ľť_, ŘŇď÷˛ŢAÔM‹96Đo_Q˛é– ]/‚tČ“¸q^rĎşs <ÓoóÚuú4îµ™ó9čňŠPš†54úíEčíŰëjińŽŘŞw”ŻĄ˙Ůý ŁbĚøômt©uŚ6–ÂĎłzwÜźćĄ_ úđĐž˙€ÜĆč8ßçő3* XîŮX†iH·®¬uu t‹V„SËp IâŐX/­yęKńdžßo~˘§č±GłńR'^dÖ“g:ű ŐŮąľ ÇĽ áÉ&JP}˝Ęíź­†6‰g SÂčß•Ď:VßD ˇÁE'_*ůîÍ‘pŽ—†NlTꀚđ„vOĂŃK˘H‡Ó‘±Ţîus\†ľűÇ AĸˇĚ1¤î*Ö¨›D‘đt źÂ‡»«›ŮUo íŠ!ó»}ą^6µĐËo[:ŁÉ¨čo„—%ËÉđG†YZ fßBh0>ŇłÄ=§‘sÔ6šk¸ÓP‡IĄüěÉł¦mĂpxkG_OYv¨xČ0ë JkOđču"@Ľ2tĹ2随Eběz^ż”X…ôÂ%:>»Öâ&?H·+r‘žľˇJ~^iă*LµńšŽíĐÔ€ˇđ†—łŚIŔ7A#ÜîÓÂ_h2J3łÝW­`ýú%’ëíëOÄ@ŞeyG‡ÉßFńăl©ÓŹŁíą!E°‚@:iŐńźż˙Ůż’'fşmGőagĆüóűřëq‚¸~ĽJ—ë÷ ť•Eu“Z•´Ćgôş—Ě|4R#$×ňPTNÔ ńęűT¨ó îhb w5Há0 sÁ®`Ş$ĘÜś_LęÚY,G$ď–J´§¬ k=ö\ó„ć`‰™}ě‡mšŁßƬOkr1ŕ9ŐňtNÖŐýýzôőE÷łĺ=ď»nŽIT^P×uG^§u°$îď˙ ď -š'Ű?dLJ  ý©—h|˘!anrű¶G“ÂĄ>iI˙ÜJXóiă.ý(ěÍýmU<<Ą%ÉĽ–^b‘9ž› >HÔľÁ3Ď+ě‹Ţö„:bÇ-\”90kOq}(ŃbxoA!ý˝(­ě‹´'¶%pß{C™=ěpłJé˙KÖ€÷w~X–Kń xVL˙Á×<˙”ŠŮGAq[˛=ÁÉÜím= Ăł+1÷Ŕ“C}¬ .,ÂŁÜŘöNü9ĚÄĽĄ·ď«U=oLŹ˘sŢü´¬ô‰l{óÂĆ LĄŢšM%ŽęĽ{‡§oPQ]yűqž1Iw˙é‡YkÁŚVz&jNżäČ÷릷y®T3t4l>ýĐk>V°gęBcägRĄŇs.(ążq7…Ö›‡$‚Ćő—ý%UÉŨđGžAMH]Ř·µ—#ć˘b‡Ö»%+&Ę?Ź>ŘQˇ5Á«âsMŤRě˛oěą*ⱦżĂArU룲ń(U›¸M§Źa Ľ ¶ť÷Q Ü:víe·Ś¦KŃßř´Aü‘’Žg:I6o‹m¸¨ľĘă*v5ţľLšţÎů’SÎ͇ŚjćBŞuď"VG'oq1‰@¦}Ł ŘăkÉ Šzű Ž4ˇ…ą‘ŻĚí™[ ËčÍ/+Qn;âęż-<ş’Üě#‡› źxV©AćzÜĺ{7QäD _o®Ę6”ś„$&¤@Ţ‘7ěhÄcÇ™ŁŽROU\ą˙©(†Ş(?ďý{Ç›Rß´K®«&F É ŇFrÖ7ĺ[0Ă×h(™¨Ô(Ĺ8{Äiń ~]-ľf”Ďdyţ^SŐú3¬"ó(ÓŞ)&)HŠÖÎĺÎJkőN’9|[TM´}ëöŕŢ@LĘJpOťŮ˘¤˘GĆ˙®»ů=^MŕeľěÁGÔNÜäMŧ®‚)Bőo×űŠ!ZXżżŽFŐ¤vra˛˛*ýÎý˛űęş6j:Ą°jq?ź0Ă€ATp"X4B˙§tި”BóÍAGůĆž»Ę1iđýí ű^ŕÝŻřW’y—=™±9šśdŘĄâ~Sü '›vĎvÝřŤîdŘjR8= Ř-öVČ“1ĆvťşK,R©ĘqEěň@4sd[b™·üÓ/źĄą€ťÚ±Ý̡Ŕ`bŢVgUŤ,‰ˇíŚk(´©•ŞszúapŐ÷!d:ś÷dĆ—EźŔŠtÓÂáI¨“[2rĽFďä.˝­Ř¨Ď šRőyËq)Ć çD˛°ů«™ŁÖŚ3·3AbˇÓHá)gi†îfîžU¨ahjQ+-˙1îô ˇ–Äá<«IöšGîjPZąZíĂÇLýś%Ţ‹h-ČD m˛Ô•̈́ڽbć”4¦ÜŽúëDoj˝0ČfÄ.ŐΗ#-Ű–ÜŢ®bA+®Óo<ć"ąuŘT×PęüB‹3“ą˘ł’ţŹŇE”š`liyÚ«óeo„ě±fĘŹŇöÍÍ8KÇYG–»3ŞÜv¨LÚL¬ÔŞ‘*eă|Ě™0ĄôŇăůä±ÝU…Â~GFÖjőč?ČĐ]ĄÄĹgçĂě2ߪÖŽ˘‡Ć"`ů©Ńnf¶důĚÔđśźĘAř‘Äíáǔ$„ŚđS0f˝!WBo]ŹËŚëG©ŁÎ—nŻExÔ§ HâĹÉčeoS˙šć˝ţr;mX<ˇwËŚ±ÜôÔ™ř•!-ěżB~Őˇ0’s=š—,? űÓÝ!¦¬#e%*3:K~nŰ»°Ŕń›ݸԻbĘúL›äÓkĂ™+‡ľě.Ôţ»#s´’L b¸<‚©dřMEâ°ődvř-łŇµlťO&ł||Äı3„«Vy˘­ł5»Ó1¬c„(Öeö#-­—u|6z𩉀aíůň!ÁÖz¨%މÂKĆ “t(<ާ4Čĺ AśÍľľŞ’UH `CËä–BN† .؉´Y»/s¦ĆÝä1“xtAŐCቆ†jC…¦?ŠďkŮQ7hŠő5€łŠ7 6TŕrXE]7żZ |늚ą‡ţč`/?ý~Ů˙)Ö—®µ“ŤQp~QWÇęq§sc÷ëj§ýye~âô&÷N€zJ‘ĎÁŢZÝ3# É@r_K\†'oĄ^Ŕ#„˛ťë¤}ť´ęzĹI— ľŕ §ü˛‰`Ô.bŠľHA%tĘŃQěűZÉMĆptFUa‡w›şŮBÔ}Ę—¸ĺ×€`®Ë’”C.úćršÂk´cŻłŻ‚•Ť8ý–ęw?Ľú/)H|Ef‰xź?QB›mtâ8ý5SjqS "°哚ڷ)ţÇ»÷{Í˙ńyĂ'B¨ IžV˛‹Íu©!˘-‘?ÉUˇŔŹ0ů*ˇŃŽr:É—¬ŐbJź~?üŃ9˝a‘‹Hb©¸•Ë’:ů*®Ŕ=Ţţ´‡2Ňćç˝ii‚h‡­EF­Źź‚›Čß“NÂęCv·z±Ŕ`kTâÍćéÚhE ÚÝËëXEcŠńń§:\ÉËlSŔŔ:Š–­Jş)ĺĽ6YnüúüŚ8¶㲠ôV(˝K.Šd2úŇ>˘9ş§]şĹéc-źHä3yG™&ŕj-ÜîłW ŐCĂIŢď­Ý­lŞ­˛µ°Úb® Uc2jXtYź- ™úŕhq  kv`ń´,§ŞŞµň˛+±„&¶5ZÔ8fĄTÝyˇK4_·ő|R†Ľ??Ĺą*éf˙ýŃNý®AŻ*Ńܦh@@`­…´PÂméz;šĆ«™ČÄNËë˘ö4-ă‰~µ}Ó°[8á˝ýś§¨Ů*ŚÜ¨9¦QŕŰWfą8†M`\‡=m!–®E®oGĆĎřG'ÚŚ:üĎŚ„˘ŞraS€ůéŕ†ŻD»=BĘuw^˛+ő‹Ć‰™„_{qéjđL’V9ö+5@”ĆÄč‰Y̡Ë×ôŇÓâľ|TLJ´ŞqA@Oę«\I­Ž-h>ÔŚÇNŚ rćÎ4®Â¨@h…·źľr=;`ŕŃ*”+ĎÔŞŹŞ úký“$ť»ŮĆogv'Ž˝q%Ârĺ7.9{ÇíÓ1ľăýŐ´…9; Ć T˘Ń ůá ©’BţZů”Ťúß7+a®—ĺNĆŚżéŚ[űrŠŽvŐŰ[˛3ś}WĄC;vňYŇvśęčŹIÇc§1ĚŢSŐé&čbĘĆßŮě–Ü/_ŃPˇpg j|u_’HŔ,ěxEf=|đIŻÁ!Ä&¬˝2Wď|¤ÚŚ;¬jęTąÔöüY˝AçęÔšŕÜŘ“ŰJËvźÖ2²Ó}e &«˝Ňˇ§ď#w—ĂţµÚ7]zPŰ”[•‰‹«nGˇč¨ű(…·Ý] müäŢSw~:žĹ)Ź(ۧp6éŚ?˙-Ń2¤ú°†ß{ůýRĎ,4_Šăóĺ»tNýe‹1ÖŢ!ęTËž>És˙B•VÂŔąbÎ~äŃytř`EoľńŽ~˙ Żç—Ń0Š™slö?÷«©a›•jhú—Xů©ňS Ě×Á,[>ŁV[Ä$U´îŕş <öš°JUO?eŠdén<¨Ů[ËŔvyÝ+W »Ýc`>äŃĚWčd˝Äü´ć|ŘńlÓküđŇ_vžý˛JiŽs/ň\Věą;Ě}x:ţŞŔ\7óÂŕ}Wń¸;2ô°Ĺ l˙#śY.)}A™E…ş€›?¦1FÓ1ő9ĐßËt‘dt#ŃD-T ďXÇěkr… NzO±ĘuĺâHç˛Öîŕ¬ŹŇ 9‡˘Űtßl6Päg-Ô‚ćE(Ł6ŽGý_c‚ç}€ó°˘ BaŽPŐrFH ä©uŻPČůYG=•ČÝb/-âŘ–^jHŻ* ł~kńéŤ uhĹ•f–śŇY=$şµ»uAĽÁΉľ•`Aę"k5Ç%ż±nX$q^´»8&1˝Eż—u2Ćç+`\社eŽfŃägőO›€Ž¦_•Ţ»>‘ …PŞđžŐÜőýĘí ´•ŠĽyČ@w‰¬)Ý˝}!&iëlĺÝdöPj†b[¨žËżz›‹şYYúŐŻ}ÝÎĹÓÄĘžfltsX4ć•ŘŰR„_aé*i)Ç*aś´Äé, ÁRŹé®Mč…JÁóötx|µ <Ý Ů–âu)1űEÁ¨čŇĘŽN!dŽiyĹ$Ąš›·ZÁ…•d¬ëáÜĂĚ'G§Łxţń{}'ÍzűŐčmô†ś˘ź˝NśdbŻĽáPµOÔŹ‚qFdŞ™ Büďx\@»&Ň Ěß)¬~¬ąśßb>˙­&k|Ë ż _ń{­Kˇ4:Pşîč—Â=ÄľË*Ͱ«XµŁé¬oří.ÂŐŘ&!LfĎkĄ›o𠦕’Đ^­0«ŹG–2ľč-`S:ŠýŤćŹŇ0°žŇÚČMKĚËâçýŤ(ŃéĺÓx±ąŹ ĄŠvĹr×:tnôb‘éN1ĽŻ¦Žł9ÚĚS,CMp•šVÇ,ż‚®K˘„&ŢŠ+ŠJtĽO ś˛`+EŕŹä ”M‘ÍęťŘ)»Ĺ™a MÎÍŇ\Žńß\ž®s+U]G0ľą«Ĺt[v,1ô$"•%š5˘„őŞFŃhyšËŰžAN¤Ě¶™ÉZ;ľěú^8ăÎß÷±fHŐ\ň÷6Č Ábć%3— Őq7,`T#Ş"“vę(GšvOT=p…ü“éžDqó!ś<őÇEş€ŇQŽ;×rť fH´C ĂťšŚńhŻÍ0„Ę!7Q_ú†fsF«UXń;Ń_&FTŢ,N‹y‰|ĹůAÓr?Íčş*}§’ϧȇsůöcb sÓaÄ’ş&YSSpš8ôË-ýdĺ—{Lĺ|©8s˙§ çŠćţÉu,~4˙x^ç¤JÂD6d·˛Ĺ’’$"Ç«5m]3ý$˘™×oÝ&“I¤#ďÔ.7•ŽşŹ9;fĐőĂÍmÎ6Ő;ź&ëĘa\Ä}Qđ% 63÷î@c{&oßD.ľ[óëĘ…ŐŘŻĂu‰ąG Çy–Ĺü”'ľŚŇžPz¤KŔ‹ďÔU´Ąřçžeń úš:Ó1!Ä›ixWX›ă|‘ßź±Ą«á§ˇü¨©nî ¸§şÝ«lnh`xņ,?–iŽ2Đ7@Ú• ›(Ý@şsŤÄvĄ›!ęŘŇ~$öÜ<"¨ aF<—ňäÚć>u©„„;†Âw1üaĆQ›ÂB,tĽü"ŹŇ5ížă0áPĽ(Ž2_r 7 }N'uOĆÁ–Ž—îřu­.¸fŹŐá7Týe'BdHwÚŰHjŰi9fi4K,”čŐ°\úýÁxmń—·ˇăůłď8gŢoUBwOŠp˝ĎĽřÝŚjUš†×ŞŕĹ Z7ĄÝ€H€a6Ocť‘ĽĎ—ťPäáAó9˙𲣵XoZąJ]j(p_ÚŃXű®Ps·€ýžśŚ˘öčk™îÖŢv¬Ŕ—SVsŁ 'îĆ­6üľQł.Ś(…›,š I"Y&PCNˇf¬™EăKqJľF?÷oöĐHČć …h m8xvëňţ{·wý–xĎRŤHĎtz;ßF˘sűí¶+°IguŮ:}ěɲŔÉܸßδbô2é3 ˇµyi ˘ě3_ńV˝hAőa˙të€_ZĽMŃĐů•¤¸ńSóąë?P ŇuďÖą-qOií͸×éą[ÓQ ˘ ›Sfv7 ŤÖÄB Gb®Çö0w[şé05˘Ú7°s,˙ü35(ĺľäŇaLdî xĎĺZ™ľ§ü*BN*KŐĄ¬UtćŚ4,ß’ÓŁxĺÓń“ĂM"Ëj3â–äť¶ËĽ¬ó;©—i_$kě|¸OŰŽ‘šĺ3w¶Ľ'ł9­ŕ©ÂśŹx†śË\Ó„ŔEL~­Ĺ›ź: y3h¤é4¨\—آY’ÓRČa”üĺ „–rxcśĘÜŽłe@}ĺ­ |ĚdĎÚ#őRôÄŚĆąaV’Î’})0Žeω×VâňĚn_;€ţ"ćɓЮ1Ÿü΄Ň:ů“qŇ(©+'mź8†á]wT_ĺ6Á7 ÷Ú”RDâ¬7ÁH‡`č‹#ły6‡÷Hx ů8sĂjOgâQő 9ŚI“DÓ d?uܵNýŮ̡€žÄu˙ť}a˝¸˘l3I=ü’5â¦tK* ůw_®ć˝ÇĚ/ťÚľëÓ“ś~éóĆEK¦bg|ŹťĽĆ)™9ŁŹSzŢśŤ'Í6ę vÚ‘ĐÄ>¨č°üł¤«Br?#Ç®‡R»!™ëű'uÄnwc?%.˘ôx©H¸M0ŕ[Í‘ßčÔ<™o"”&Mś'*}gÂ?zÁî1kUUżV`űßý9ŐŢb ‚O™‹rĘ˙ä5o|Éń\ÜÝy€ęˇ üúBLˇlI0ä&ÖBÎ%!ëKäXIëÔD¶ą‡äPď7Ć ÄRôExr ˝·hY‚,Óľc¦O‹WLŠl=ŕE ĄţčůŇŽS±{¸juâç%Ć©Jb3KONꉊĺ´B#Ń͸=QÓŹşĐ¤ŞÉć›8ŕvŤCfçvš| ĹmÎ{ś.„sôţsÓ—ţ:ʸŻöµţ żéÜ»ÇŢçZ}9Ti˝ĐŠP±T$<~YM=˙PĆîXQičđ\¬Ü^ŚIÝ(."Ëĺ»öF“-ŻD~jŠä`DzčJ€IÉ1®“<^^ď*vřĘa33K˙bď®ĆęQôé9($ěaŁă ͉“Őa›qş9€+] Ö›˛´‡Ż‰#‘ÝČ|ąâ˝]@]Ď®J;,Ş<)Ńp3j$”…ęđŁšik!ᏠÍŢťł5˙aQ`JyMKc‡ŢŽyŕxW:›Šż°ŇOŇŁť)=Hź;ĂŁ<ż0!…„‰D¶PZUĄ7^-C„ßÚŃ+jw¦µóń…”¦ň—ç荟Ş0ą†rÇQájď?Ź ĘţţÖDCo'VŮVÔĎi|Ĺ+ţ⸟•j«ĘÎEŠ×qNvµ“oĺx^‡´ÓXÝŠú$VRcu÷•ĚNă-EĺÚ¬Ž×ŕŚžß·@ŰöęĂűóđRçŞsOdN±áÖ*”ZUß0ű{§ŠŇťQ{ůÎ3Ç(xz.~t4Ň×ýĐË3\2[M´űÚĽ4ĘQsV…Ţ ţÍwĽ+*Ę6ąG3ţť 熿?""íîőcž¬1 xĆÂ…Ű+Dž}ĘęďĺňÂ`;€iaě_ÄŔ0Ł‘ÁyÇ9|?E ;s°čýFjŘ, —ćú37ęÄdVŹZwřĎֽҹňŽ—S ň˛đ&4 t9ŤĆ1_2”E;@ü[aÓqW”©pÁáh äH‘żH‰˙ź©î"ŹÍWŹCui«ˇţTpŠD‰újw%ÖuSőTĆj ^ÓřBBC„ľPÄT!Łi&ażś«ůbŘuéudšŐš……€ÇﬨDR3ł|&c`·őÚš°JţNŕ=ÜŻŠbO+ź’h^6€VÓĺźY]Ę_×RĄW;ł|›ňÇj! řÓü㲋Ó>…ü`÷ĎnF tBňi~@?ɬč%NW·üÄő'5/Ný+“ŁčřĽ\˙”gÎëD<HWě&şÓęçKŇľ˘÷\5w5Éů€_.f±Ú9K9­pnŽ}řžĄMŻ{(‰%î©?†pypďűSłČi.ąŐ77XT‚¤—“!Mb‡ąĺ xŠůš{ŃQk†Čš>‰\ŹaŽ9°Č|eš‰úŤĺ t9µí÷!ś›/öxq•˝O¨|§\vśĐęÓÚö€ŇŁćŢ3‹Ă&wŹŽŔĆű]#ksBřé=_W”R‹D[¤š®†>(˛–­„Óť‚AÚě·>Ć™i;ŁŃÖ°·č‡÷ŠOâ4Ň!›"¸ŤN$Ab‡x4łqď tSŁŰŹ–h˛OAĹü>!»»ŤţrÁĘŔő"ôn‘€×ËůNŠ\ĄľÇ<Ť8Ä ÂÇ‹®ą“˝ĺXôG‡šmp}çsŚd6pMB(ś÷ë8®`N<#Ó6„÷9D7dZ^č]%YpRßě•1Ë­ÖőNE´)Š{@šŠĘWŤ0ťçg%˙öŚ[ŃCtprT9­ŕo´b{M(†^›žŐŘů1MÍ˝xÔ6ňf9{đ–cŘŃZ•Ť´®’ęDzćqÖÁ´”>yCŰ6Bđ–ßřś‚e#©Ć@<(°J—Y¤;öđ_ąŠÚ"۬0ĺ肇»r,먬p:ďV+?Ä6”—(5‘Â/wŕ^eÉIÜoĚ>FWa~…¶ëĚ-!óäR \śÔGOdłĄ lă[+5澆·˝OÚç"šËĎGŻŚĐ7 RÓ ;H_`Dx±q ™­ď›óĺ/K÷üp•J2'¨đŁĂáŕŤ2®pMżČ~ź˘Ó52IOř;á¦e×ô|n˛Ĺ8 d-–÷48ÓÜŹA{OŔ*ÄŹxŞ.ˇË 1”ţś!ŚÍ˝sü%ąoÄvřü†+ń¶FZ=úáĎŻ–!÷9ÍŐ´ť»‹ ›Ćh2DěěĚpXŽz44>Ymý…ßŰ4Éä§ö‹‰Ő‡Ęú',6]tŚ çtĐý\¶ăü˘PÁ·+źŰ:,/#ŠÜ8~˙ PŠ1Ě(Y#%˙Xňr]|±ď=Ö }ŕÇtóߡýđćyü–Őn'6Ą<´Ş'ĎF{OTš„m=/p°łµ;Óˇ¬§68:6Óüy\,đö4Fű%Vč׆-ËęĐÖěíHPűSن¤ö–@M÷ćY¨Ü˝U'Žó ôü>Q:€ą@i…Ív/ Ĭ8ą”÷Z°cÉ˘Ż©Ę .?;ĄB)Gés™#őŁ;$‡o„›=I:”T8÷†mbíâuš± 8“~Čg¶âś±®Ö}[ywüI-S< ¦\€D˛°ú´PD€ßOzĎă ,*ąňh®±UĘčµ6VÁéO©H™\ üł%đ }4•Ăl›~Ł·ɲŹOÔŰz±ĺtĂ=43Św·ť‘ÇĆ"9_Í&9ćĘ„NßĎ5Ň…ť’łv±Ż[!ejŚ 5ÎťÔĚ·źžô¤đ0>9Ĺ)i˙t?N÷šî´R@\tňuŠôĂ“8ÎčëŰ@='[| út±ňRÂŐ´ńżdho  Ů!{ixmĄîé§EťBďÓHĎhŠ«ßÚ'äŠ-„Ő˘ďÇëqGGüAôź—mşÓXňDääěݸ;őŕ A,r®Féçn·@tZ)çEý¨ö_ľ8ć”hżO‹óü×.q÷Ą·Wdł:)ěA˝Śą´Ů(L-•¤‘ˇĺĆEĽ‡=~EłF ;„ĺľĘ®bF'ŃL®Ľ_1đúćž7´őĽĄź+BîČ@«ŔŰH•e|d=Pţr×M‘Śnľ—ňŘmxµřěťçŹ”ŻŽÔ¸Qg¸Ě°ŽĽ˝U%ĺQ—•âţˇ +U^廋eX(ÚálZŠŰ…(TĘ3InIëŇžB°ôź–úů\»GŹV4%ź˘=«ŤĐ4ŕťšä2ńcʶź 2(^ŮÇ…ŐoÄ‹]ô%N…–ĄíŘ9‹  C|S¦!4¶|úľ‡Đj<ÜpXěčhšˇÎË1>7!`˘xŽŞĐD3hĹ çŹőTV.­LîqŮ™‚˝Ďç·¦»ń™X׍Ăň€©¬Ż¤ťĐĘÝŃBG`ł0đŔE]ÇícLii¬ÄďR·ß{mt§HoH,ôÄč’(w‹Ż#ňIÁ¶*_…Bp9'ŞJčĂÔ #Ŕ5IđŁëЧś3_‡€ĎgzšĂŠŇŔ“-cęn8K»Ţąxă…g-ÔiĚ3\151ť-żĽM75w˙4nx=?¤${„+účďŤCÎç"óĽO 9ć%:ĄŔĂ%©ľČB7níŘĚF?[Ăš…›$¨€m^ł˝ąĺ >A‚ůó W Ŕµ\ĺ%gÄůŚ®™™?ţ@%Čüu¬ ŞÜŔßᲟ˘ć©vC:·¬‘ĚÝäĎ{|™ňăârmiGO 5”Ŕ0“…»Cć<Š÷(Üŕ•g/(*Ń1NLÔ’żĎÜq­úÇe>ͦjŻjˇőŃé*¶O\×&ňuş‹dŚ2—ú—7ŘřÎď2ĺ·ÔtéNďłO±{”DŹ›ôwV}*ŁŘťˇŮAWüqačhýď0Đ夺5'¶Ś7Üě ' 6d©ÓŘ9ţţĐĹ}y°Łw_‰šNäţ5żúĄŁú’ďL¨—Ż©ť3~1~Ž–ó•ŁŕXáéF­Ľ°4sśýđJO®ÁŐ{ňťÔbĘfĽä!.ñÉćˇŘ3Í5YĘ÷¬»WµŘÜ1C˛@;Ő©+GĚ×ĆTIő*ĄJ.L-ĺ?ąäuÖĄNK łv RęwŻă{§Âś}ZŠꪑ}i¬ëe6%ťís÷@üžg&bŕwĚ:Éo©4ţCDö‹$ WĚÍ!·’lć˛kwÉö`¸¸[ĽĎtŻ.Ę´şkĚgmŇŽúy AEN$ł§!\\YˇQ;zV€ë˘dÍŚ3ĂÇ!(łHŮ9×ű]Ľ?kĚŠ Š!}Vę+ADVDFn5h¸„O™»¨C˘8Á,ÎJŇP%U[áíŁśÝDMŃ>™˙âŹ%•’6˙ű;Ä"aź#+uN]\Đ"¬ŚŁŔ±ŰbŞń÷jŁ ¶wźLŰ^Đe,qäźľŐv>?m™…QÄBJ ¸$dav†svŻV#Ł„M/U§hš‚KVK•ÉÉ·D/q« m«óü¬ ŻÉb°2łgWĄ —.Iwó‚o|ÓVŞIDÖ[Îąšžµ7ąč’Ů˙óbîÄýŰć%r+đŐbízźĘI;’ě…©ďÎŮ šYŐÜ%!’ř;௭«…k ŢżŹ¨~z=˝H/Ü”(­ń!‚”rc°IKş±€^éÍÎëîF‚!+í’Ióą\6í‚p}ÇŞ0:`Üu±ů¦Ć}0ĄĆ·°bĘUŞĘÎWů)ŃŰŇÚl€§ó© ňšp›rL…r˛ţÖ™±Ôe‰•ëÍB‘ŠG ëŮţ°şĽ¶JšVüÇ|Ý X΢ń˝n ź§SŘVŤ®}Š2ńř5ÝŮuďh´™óý¬ Ň#á÷ŕČŹ\JżŻü‡‰0´“ö*ž:Ëó)†mivŞ8zş­Áo.&±sŢfá”ÎŔQŁ';wâĘÝ• šă[Q$yK7¶NĆ_%:—̦™µ<őMÇÂ`młă©§«Ž7C#mí©ŻËzÂű‡Áťšťî]%IJĘĹž$šÚĎ–e2dU#z±áR|ČÄă’k}úźsyb1ĄÖuz‡M¸Ýó4&ĚÓ$ĘČčWlźF$ üÇłńɱ˙ OëÂ$ŹQ RĺŻL¦­ZEDš*tlüXAĎyOţv}ö…ŐkČ.fÂ]‹čóé ĺç÷‹9ĺáFßň Á»lűÝ€†ŽD\„ËűćLŞ’^,Łť—¨^j ő0)cjšâ˙‡HŘ2µč5'žřö”ŻŢŚŃqţa%Ł­]úťôe,Äó›'‰iRIQBK×D5\ëDĚĄśLFăů™V5H˙€‘XŹL딎hĹ,‚Ú4ÜágđpZ’ZŻý4Č)…ŞÝŘ‹p*yç0xŚŤ űŠg˝g"‚ŁŰdžyI&O ~ÜźŻ€nVh@$p *Ň–Dpś‘őĽŕô©v€ÎBţ/ZGéXmU$wŽZJ!üĚAšZÜE  ˙iřÂÎŰÍHŃ\·?D_â»™YŁ˙[Ć)]!gíŘÉôjɇNúŃľ¸EĐn§ká'ÇŇ™‚Săź™ŇOô4Ó¨c€cOĹUľ­6·»&3–Z}¸‰Ş9Že(?XGŰ•ä endstream endobj 1327 0 obj << /Type /FontDescriptor /FontName /TXCSIR+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/Z/a/ampersand/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/five/g/greater/h/hyphen/i/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/q/quotedbl/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1326 0 R >> endobj 1328 0 obj << /Length1 1626 /Length2 17043 /Length3 0 /Length 17901 /Filter /FlateDecode >> stream xÚ¬»SteíÖ.šTl[3¶mŰN*vĹš±mŰfĹIŶm;©¨băÔ·ÖŢűßmť}nöů/fkăí|zúŰG“śXI•^ŘÔŢŘLÂŢHĎĚŔÄP°´5vqV±·U°ç–Ł—73µü•łĂ’“‹:™-ííÄŚ€f<M3S€™ €…ŔĚÍÍ Kµwđp˛´řP©«hRÓŇŇý—䀱Ç˙Ôüőt¶´°Pü}p5ł±w°5łţ ńí¨jfţ0[ÚD•´Ą$T’ ęI3;3'#€’‹±ŤĄ @ÎŇÄĚÎŮŚ`nď°ů÷`bogjůOiÎ c ;ŚÎf&–ÝĚÜMĚţQŃĚśl-ťť˙>,ťNFvŔż=Ú,íLl\L˙đWnn˙/@Nö-l˙ęţS˛w:›8Y:ł*‰Iü'đ‡đźÜΖŐ{óż–¦ö&.˙”ô/Ýß0µ@#K;gĐĚřO.c3€©ĄłŤ‘ÇßÜ98Yţ †‹łĄťĹ! 8™Y9™Ú9;˙ ó7ö?ÝůŻ:˙[őF6˙ň¶˙—Ő˙Â` t6ł1g€efů›Óř7·…Ą,ă?ł"mgn`fú·ÜÔĹáę\ÍśţŐ Şf†ú/#S{;€©™9,Ł‚=đoJŐ˙Ë ˙}$˙7PüßBđ ˝˙˙ČýOŽţ·Kü˙÷>˙gh #Űżđďř»dŚě÷ @đϢq±ýąŮZÚxü9ý§µ¦ŮżŃŠŘŰţ§Nhô·%Âviab`ú·ĐŇYÂŇÝĚTÉhň`ndó·_˙’«Ű™š9ŮXÚ™ýĺő_-Đ331ý‡N퇥‰µÝ?°˙[efgúźđ˙Rő/đŚ*˛š’˛´˙‡ĺú/CĄżCTópř‹í”"ooúż˙„±wxŃ3spčYŮ˙Ţ˝ż€¸9|ţ)˙ůżÎňF@'Kw€Îßş™˙Uý˙řý×Iď?Âۙ؛ţ36Ş@#;Óż“öż˙¨M\śśţüŻË˙·ę˙yţ×Ě›™ą›™Ŕ®-Ű›đ[Ągeë°ň†'Ĺtú{™Á†CĘŐŠ ýkě{üŇĂwąľ×†04Mó|¶y,ť9|ĘĐŤöbÚPö¤š]ŕűR÷˘lQtpŇ2ę—!dśkF{ýY”Ű˙ÎÁ¤q´7©¬˘_úI0ÝÁęýç‰ÚźÔµĐťěŃŃ×$­!Łą µ®čěś"éôé‘rpldx¨ç˘ďŹ67†ś×Ë7ĺŚ8čačtßhň ńęĘé˘>ćâđ]fM”!ÁôW{¦ĽyőŤ_ămµĂŢRmÍăť­|ŠF ^´íc©˛Kíé|˝¤#xËŕŕHc|&qÄ«z|ďSĚ/ xŘŘń#ě,';c„ kU]+U„E/ZÄoz"đrYw¶ř1O~ö”™â€zc_v…wăĚŁ(ł®űľß <"ˇÜ—ŕÚ™ž«×ŁHĆë%Z•|Đ7D1âM+.ŘS”~aéąöm0pBăsśĎ:Ěáaúíz&ÖíNßvAô>żÇŢ'üňÎŽŻÝ1甄óźŘýÉ(V<$Řőű&ęMÁ§yĎ(ŁCZŐ¸mfé}ăňŻ›­+zUܧńv ű76“joĽ…`âuCHăFd7Z7nÍü~¬YŚvw¤„ÜŐŁxjC‚ÔËrV·D+<~Aš:§§u\2ˇÖŐuĆßÎąe~ÝÄ˘Ü¬Ź ŞĐţ»0i öv[ŮÚR•!:¬:Ż `ËI_ýŘ=ú;Ŧ> ô†wÓ|ziL`_i?€2ÓeGöp˝P«ţ×îÝQżQÂĘŤ×đ•ëuÔşKN´EËóZX4ÓbĐőýhl‹9\!ć:űďłôońÉ+:\šL0`ŻůĎ]G~aűˇX;ËŞ4>k'˘¸|®®pDľű"dGU¶×G×ÉŹCw( Bꔡ˙ŤéÄYÇÄx ťđŘç×ń°Ę`ăÎÉÖŁPvĚç§nB÷_вĽé}Ä+Hş)üNŁ—*ÜŽ€÷1ĂW@˝Ą‚¬¦˝Ú‚aÄQÂf˘ľbšW$ÉŤ»é";(,éËă»äÔ™€÷Q¤=ŚrXJ’őŢ:€’†‚ČłÔÎ & čg˙qş9}nB:ë’´ĹJSĐ\ąCăäcµ ř•·`×µkDŕZ„*= …ΚBL/ôĺŮAlĂDŁ IŮLjŽÄ'X­¤ÄôMÓ•˛óŞPą“qq•ŕU‡áů`V~ŰnŤ—4!^Đvć.ž±IüL#ŠÉ©W«Wü–g6Í;Żü'@r=ť°ć¤WLëÍ!ŤëÔŻ(në«!ś>>OyÝyűÇěôź^óÉßůŽäFĘë&(ř'ţĚAHÔÇK¶y¨ .ŠĘĐÓDmÁcC řϤFj«ŇŁ\ Ěqâ{¸vđ3ř+ ěMş”ĐÉ_ÂňÎu±LIu¶pţÓËR.o,ÁŘ6ĂíVÂČßď» w?u … ¬ů ă„"ŘŔ˘e~l˙ôgiŁ$˛ń?ÖˇERÉP9ŁÉ´Ą©‡0vAĘ}°v~|‡áý)ÖúŮ3Ůsŕ·ÓR$¦KŔZµń`b"±[X ‹ Çcç,ňíMĐÂgđ.ý”„jşŤn·ľvěfjÓ©˙•*ĚOĹž¶‹Š*/ý—™2Ös[ĉ‰Ş›qvu¬:\ÜűG;éL/ý‚zݦ~­Bw~OÍľ?·;ÍDd|´>R§¦›ľÜ÷ó_)ąáušn‚oŽ1Ţź č¬ÍĆőwŤ\Sii ţÍłÉXÔÖÎŁŹ~ťzô*:%&¸üÂă®+{`'ÚéÉKŢ !@žđ Áë¬q\Ódx/dͰF’ŐÉ58˘…[Ë8@U.ř·ú.Ĺď„D‰iÇ1„ &éCD’‘ÎŰwúŁ'Ďnö†…CžQşbĎ^Ă7)ZŠ )Á‰Ř´»,Ń·€m™ÔIŰ3$_ž{Q|<Ę PâG„âsőÁVTÂţˇĹRĂî8µyS6ŠéĹź„E»qP«! ű~xN¸s}Áü#şigŁäŠĆuö«–”vUĽ…¸Fߌ| ę °G.ĹsvţŢϦ1ëŞdKˇRP5ˇAČs)č©_ŘÜŚý†P+Žo>Ą[IËöC:ĚĺOEJ© µrS¨± ¤tmxôfđ\dőˇ)ÂEđÓPr9íUśËÁV Łó$ž»!!Ąď“˝ 1…rL,<ľňg$ş`ˇĆhe×ýśť .´¤*–߼“ZgÜÂ4¤ I_m"L‡ő_‡3 rL0a~îV?GJŚ”–"ä?t|V «óÖLiŢźŻ«Ô_ŞÓ-ÇIźČ{N§±6Öó67ď“·®Ž_ Uó˝¶]ĺDpg˛) +ÚµŔ‡ď“K÷ …¤h}Ŕxž¤‡}ńĆvÓ ĽŻ:Ľ05Pűö’Ŕ'µ~j#>^ł·ż˝\˝ßgD9WJ—ůýśóvDfč}ˇü9t‰Š`¤"É»Q/{LŹL˘‹AXz’xđ%˘ úlÎ y•®äY§óËoVĘ=vĐ»mß@‡T‘Ő“ĎËÉ®´xŹ®1>ěÜ^EÂĽ’Ě®^®ŕ ­üĚj±»‚ąu‹”ňe¤m¸Î Ć(˛†~‡5Čč=şfF‡jěČŤ[¸Ń™âô Ěg!UĹÖ¶;I1ŕ’€WťőűKÇfÝń«řĘ|ľt˙k®mÜŚŠ†ĺŽP«–G^Â+ía7 ’S”YĂN[9´R&ŽĂĚŘ×ďŽĘDe+Š"ŕ‚ŠI˘Ë8fáĘXđ{˙|PßË™o­€ĎĎ@ÉŔŔ2Őýt:Ń[-üqccF“q_*6çžľ!ţ1„¶Ă7κ׸öčĹ1Ď6áR˝ĽÁůýC6ýdh-6ŢwâuŁĹŁO±›@Ńß„«řúʑů7cć+v»ńúZG·? ?đÝąOW'jLDýů€÷tŻkíu<{ą/JŢ…â7ΛB‡6Ű ú¨ťŃ¬őg„ ÷ «ÚŻTľCçfŚ/Jf 7ďŃó9,şş°‚ ×ĘŁĺÜ_’u… …Áú9l™ÚşÄY}dś!ËiD®—ä[T8ééô¶Ä)2´=źM %.Š÷ůFX]şÖů+OŽ[Ź ˙2碪T‡źëÔPÂÇ»·ćˇęě!ŽRR“h/«R_´Ş—Ú Z<Řú!ĐŇá‰lôÂ×â˝Ń©ŻČÓýaÁa0~úŕf»/W~{ ©Nea—»m_1Č`"4ôlSˇ<¸;n9ác€śVýńKxUXďíŮđ禴@f‘~ÚR`šĎŃ€ö÷ŢqžłµŽ±Şgďéăµ=É/×!2E¸·xi<-łŢ^ڍ8\hŻm˘Ix¸Ůó^Ď7śl˘»A6¬bőwŠňóúun|RŕËßiŔüUÔ…(%28u©Ň•sQäÝBžą«Vý®Ű>ęž’=‘Ôv­öýź¦„Ýż…Ţ@¦VŰ8¤Ď㍠ăŇ×űę}§1ëőQT(€Vô d rHá]úUfŁŁ§y§qî@˝ď?Ď›Aďç"KŤóČxJmbR!"Ľ Ůnť,śÇH2;ą˘ 1Ď AÎ7N¦N±‡Os#5ĐňPĂ•ÂnęŹ9I“ń"‹´lD÷…ŰľűŢqăîśyawŕ,\}›¸q3RGyÔki÷s‚ďVpPm*0ÚůćQ‰YťŻ>?3Ä`´¬uM'……|÷žVşĚLŠ!PĂš¦ÓŃSG AěĂAĄÔj‡ZĂ:G …™Ć9ŇM$ű3|Nmа$xWQt‹ęŚ÷ůxŞĽFÜv_öř>ö†ę„ňŃ·éÎđ˝Ó•`¬r®Ę™ĽŰu_|„ŁŐĆşMőd§¨>H5eźiJmă-‰ĺŹj¦š>;¨˛ÚX.oó qÚcëŇ:ěż°&˘Çh‰ęÖAS·d#ĎIď á7‚Ö­pŁŚčÖCS7 Do•IަżúÍţ40ĺs¤uB§OŢʼn}VşÉţ^ëé™×Żđr±ÜëśËúÓH=SĐ˝XhY‚CµřnLľ0ȉ®/÷é‘^§›¶Ďň{o8$áůY3jż/éHTŕrtŽęaÁË÷Ŕçq adżŢe ô&K$nźOŻ'ŕĽC©ńÓJŞýĂ·-`ŮNł¨‡»_äŮę.ś ętŕúÖoÄĹO¶Î´ČpĄ>T6ăř—~ň V2laS{LŘ Á<'<'ˇśrc[EŰö„´Ôg5 ;÷CŠĄEíh¸¤č–ŇĘ© Č{y…ńŔÖ®čŢÖ~˝˝=+JŽ)2EĺÎŇ{±ţřuŢH7ýMO«Ŕ-¨áĹ%,[.ĺ öđ}jąť –ďé–üČĘxŠ™„0˛#qSĄŹĽŹW3úęţ¬×‡gżÁY/Š8×4Á"ŰEHB´­yľşł{âuËŐ¦Á|Ě•>'řfóTeˇ~j§:˘4í‡i<ćEY¨T? ţ×nqăłé5_MĎ´Eů(Ť?y€vŮş·;^".úę·mďg"áQoŽYÜBšŐyÉŤDIĂŇQ™÷Ď@pĂ[4ăđH¨ßüÖ`ßÝ,Ël—>+ŠÄćÄTvÝü6AqÉ]KJň‰pĄ)â¤Č)ŻŐţ(“'a( 3ô訅zŻmH)_8®ć•Q¦kžxîd]đRýÎ4ťşŕŔN§EâÄđ.ÜWW^D ä M1=‚đ"¬śőţ>żŐö”qőş9°ĘőkŠĎʆZUř×ףbčŘm'‡ÄŻYŁ“µÁ€5›Až7Ţ=oa“?Bt‰-Y‘Hä?üŮěĆ1p=’)đ‰37ĺOČ,Ô˛ő+ ¤|Ĺ&ťpSĎŻxÓ>6ę(3üI·ŐĺśúSĽ`ń{„]=şµÇAŤµµ¬ §ćZ{f‚U\ Ŕçî~‚[LQNă¸Ď|5nUbţ±ě Ď—ÍÝý)ĆŁ(o$űđé˛i'’Óá1o‰ŐÁÎÓ5xnmś‹ůuKŁőn~Xž%ËĹGŕí)ĚL~AĽwfeˇ/w5ĹoÓ[GN>ÁÇ)¨ÉčŃŘYŕÄNŐ9‚Ö¤©&°¶ {´éXŞ-‹4’í'%¤ž «¶Uđ>¦´öÇ×ŃEu¨_4ĄÝd$Kcż»ű;˝ ŽżśűźL(ÝÁ ‰Ě™‡­•IŻ É- 3)üšÓKôh3çԙŔ[+Ňý¶Óffˇ‹›ěxSđ <Ŕů®ńjÜĹFžěÝPmŤä! C*(LşËĽ¨ygĹz[3ó[-Đ"ΞwŻO@•mĂŢÎhebĺDŠe‹¦Ľˇ$51Ą…Udř`˛·—G5ůß`¸ĘóMQ˙ÍÝ´5…Í”şÜÁBĽ…ß›tÁ *O–hż÷v~&đönŐÇŐ[ÓDöJnťÚçü˘p ăęl)Qp"ś·ěĄOý •îÇÁ‰%XćqqK‹{ d“4¤ĺQ~öŤ ÂóeE„łež­†Ľ:CkśR!GČŃĺ{ćÔo†”}S‹É›ýQá~™[ëH+3śýbYx_(Ž'đS¬őµĆ©[ŐW&çgîÚŁ?RrŢ;;¦ëâ.[UÄš űF#Ew®Io¬Mí}{ FH¨Ć*mx?¦Íř^ňYhÎaâKż9M,PÖ‰ [+iaBB䤆f矎űV‰€ĎH”x+TËĆ(žÄ|řq†o«µÉ¤âň—đdw»h =sŘçpĽąÖ–ŤIôžä(ňÔÁ©č_P˘őş:`éŞÝ¶FCŽQąóśĐŤ\ón Ů)É÷ ”G:Ă#fě-ť`—wÉgľsţÄŃ»ČŃ_Xĺ ĘT…Ď.3ŁiFn2úr×)Nű­8‹w†MâôËŇUĹ=ß©‰ÜzäĐ–óÖŠXü/jQ$îÉ`e´ć ë VzÄDš ăĐĄeęqߊÔSďGÎŚ(u*B řűčÁR`Q —IwäęUĹźŘsňÇB¦M«:‡ŘŠo”Źm˘wR‰ XRmÜ…LRÓ rp$°•+ű”F!H«ç~ŇAŽí—-­aZÇ™PĘ,É”Ó{oçć ^ą”•„„đO+r¦‘9] «oŐ&€‰±š‡+Ş\bq>ŞX¦Żo…Űd–—ŕDMM$Љ •ŻwŽŁËfřů—â1{+¸‡K*©+éesŇéBť/T^ôÍő{‰d÷9Ľż®C÷JňšŹăňťq#׋çĂf†$>v*ŻWTNľ^ŢÉ›áčói¤SvŚW‡îK ´UkdŕĺÄţúěŰÉ<Żk&¨nÓŰĎÍBzý"ĄhB¤ÜeĂŠZf5"áľźÚŻçpó(ň|řđs N] µŐÎź– ^ď­B+čçáůś·\ŔÔŻî‡ó¸Jr‹0ĂĎó•Ľi^7˛[[áÍŚ cľzi{ÜM<7\ÜrOľĂÔ‰“EXźýt’ÇŚt¶¦Oě=Î÷X¬§Qý*[rM‰tC¶oʨłĂŁ%l‰‚ž.ű©[zĽZ“«}şš~•ňćW× ĹC^ř1S· xżçŰOł%Ó«ŃË’ôdšĆÜhąĄ_¤Vë6©EÍś‚)ńc!ĂČ@V®ş.­żÎ»;˘˛§–µ+>J?YfÇ—[~aAnńÇK­Ľ€´«5˘OÜęv?,:˝ j¬°Kîlmľ]™ą˙±XAőł’«ô–Tuv%qăQ–ÚqŻ+îäJ„ęş ąÖ˘Buô( łÇĄ5ť˘¦Śłóľ­űÓC¸‡0¸"ÎÉŔL·Í µŐâ|Kb™€™pRŻEén=ܦ< ”Ĺőm«§˘Á;î^d‹Üéułő×ĺüścYŤ-Ť2;Ž©„řTdű!:•°Qx=6?îCkźşjs/¬«ă(@OTçý8×R&$ÄîĎUý‚!qŠ›ß„×ą°±±Ă ť´3RÖËĽÂf˙zĹa_qÖáŔ`)Z ČŔTłOŃ ě#őłÝňv~AI¬”W™ţűíE79©„7MňňęšŢZă¤TŘ™eîŤ<ěůĐq8ńrČ®T‰ŮPŕ®3j‹aůf™«˙;Ű:K¦Qá™—˝ŞĎÄŰ»Ł†:ó.öIÄpʙܙRs|ÓMę5?Ŕâ´˙ůÖPĐ5¶&ŤńSěÓ~=<Ş`¶5Ŕx‡öZ`nóű]Ź$ Ő¦gâ±>ć±:§Ľ¬Í%§Î>»u _^ÖĽ n`]y:ŚT^uŽłLČ„NěO„ ĽQ‡c›€jîŘaćÍî>@‰hµyۇ•<;ó[5c 0J6](ęćjt"/x*? †}ĺë"łě÷ĺe]fDkČ{(®ň±ç6ŮĹ Ď"-ę˝Ŕ _ľšHÇ8˛t˛śáe"Šą»%E™HČĽ $ă,¬yĄ´Z¤ŽŽĺđřÍšŞtYP*fâAź]?pň1™Ž uĂý_‡’ayJÖĽsÖ?;Ź=hCę}ŔĎwř?•kŕ|#Jh(unOÇńŹaÜҦdÖ쯇{•®iR9NŤź-éĽYáĚžcq iý)l\şe€B?,ů |ßщšš˝…b.CT$iŮůř‹ZhĄ碶Ăy¦FzzýÓ÷nđÓđ@6¨xâel bßv“ŕć9VÜ Îö“X=ň<ŞÖFžqÂ<%f™4ŃĄâNű…ĺQÁÎęíŽb6™pɸĄü>ĺRgZ­â­ čAÔ9‡lR)ĆĽÎZ9c˙H’ŕy3oB„Q-o]‰=Ľi"™Ů˘×X®ŞóŚ˝(bř6ńŁál¨ńĺ?wĘ4ßËO°źB…Ä˝©U¬"Lé ‘ŠŽe®S3›=UëçěC›Í–żÚ8űĂwR„_¦,4¶cűĽ”„ĎUÔ$H•ŚYY/ň‚"‘ŘăâĆm:Ŕ+ÖčÜ.Žą4 /Ĺ55%ĄTDWĐfcDţşĽŕ ĆÖÎ~ňâA.äŻĎŕv-.óüćY ÓźŃr”™!Kí!`„ä<Ť$:ó)IÁ,)šßŁśa5ť¸*¦AóÁ×Ô ď!š^ż`$îPjočş&ů^ě„đžú»ŕćĽÎ÷şëMčÖ·Vš+85…—xŰš*Źî–ŐUéq‹ĺ†ó5śĽĎ΂$?j÷ź|íKĄ§wðz×`› éÖľů~÷’G%3±ľ¨˝DçÎäCĂ1âę_ę@ ç7¦)nOeó˛<s`u%†š|4“k9LŤÎx–okř`)ŚÁ Éé$,aWiGj‰ÎŤ/•6vŐA¬MSĆSŻ<¶ĆB ß‰ó@ßDÄ1˝Ą„łG¨›ň2“©ˇ¦B†3ţČűšUŹNcĘF‹H¦÷ÚAĽtßńÍB84€ßĘ–-סʚ}»gřťţ€´SŁî54ŽD}”¤ý]]ěţ^.1ď—Ŕ±Őç޶1ˇźłşĽP˛AXN<×±fΖčZJk/CĚ…^í)iŃťP¨gć–ż=ĚÚ)&vj°§ŐÓ`ď¨yŮAĂ·ó.t᪒ĹZŇlLé?™ú C×%]ă;Hő—LěXĘyř‡Óť˙ Ăs߉CƧ@d—°L*K„«ÜśŔä‰ôs¸‚>$3Ě u×R8­s—Pł ą3c·J“Ď7\Ĺ $;.ńňÄo§bĂcâŇakĺ_»V©+ťÖÝ‚r cáQxr=Î>Ś—píä˘R5 Ř»ŽkO/ÚúÇ’cG)ż–®‹•_Şé°›»{ ?H˝×•ĂĎÓóśÄÜ/ú`^xYő_ľĂŢĺ2(n"Ě"•Óóŕ4oŢ­áz é5(Eęw¶;~âăëCnĐÚ!ˇ »6łO“śÂ7_ĚŤFQĐP?şíźp^0őoúó­˛\@†«±u„1ÜĽíů“7®Ż©ľ„ŕzVôeC•şTRĐ5p¬ Ú{Í€.Xb©ÔÉšÝăSBňi޲Ă~ůGkÔ¤fëKĄťČ:±Ć(÷}M}}®ÇńńĚŤMŇ<ĎŹb,ĐGí¨.čK-ůń6kZźźßa7ˇŐéJŮ™±We âa@ŕ\č^}•Ę^,@%Q7„íS7Żřz–6č%r'¶äQúłRiĚž÷Qk÷~ rgţţť i.ß]xŕ<32ăËD?ĚÇzy=”°S+a™vŐxűe‚óöĹ—¸l™Ą×ľFř,ÉaĚźžÇ‰ÇTßSQ V @ú@‡Á»y~«lL5>žăÔ€ 2yžm XGĺ°˛ČöýŕćRç9ăđA,öu€Őů–Po©„ĺý“č;kk·ć] ʏň;® TU·%B-Ę„×çŕ(í¦§:…éĐśZfä©©⣰ŘÚäńÇ7¶DÉUX™o|ÄqwBZżaČFd—°&§nÜ×T -$=Ľŕg›}ýl˘z§„HXĺ·t¦EFŇĦ%z]÷WÓ/]ę¦âU/"­’pď0qÜĘö_玹Ö]óK W‹b3_kşĂľĽO©ĺřż×e>ŃmĆ ŤU¤Ú}NÇ˙<#‰|J Đ5®Ô„\qENĎćWŐő0ÂDVY@Főů.»|ç{ćLZHăĄ}Ńv)Źůçmň ţQ*Żî9|BP;5ÁWÔFÁ­Đíę;\ą59|n‘ÄÜ|S‡çwČ4ĺE&çľŰŚŁĺôV·’Ć+ÄöÓ#3R÷J›rEŘosąkZÁŠjJ†ĂćţřŘ4/92‘ügűŤŻŐKęŞÂá™ L@1ZWŰ+¶§1úWSůo˝ń´. ýŞÎKâb kłřT¦—ĂĎ•ŤŁôa>¸qj Č ˛ž9ĺ^Ë/Ž;“ପ–HRĎ4VŤËFEö:QŚś1k ßý*KÔph†ăAGG ‡żQgź#3•W¤ä1]ÉŁŔ_™~öˇ‘·p»'Uň'喡طg Ń˝îˇŕÇÂ˙fŁ…¬ôޤĐĆ'ąt,ť¬˙B‡Q<ď'Ó”Á ¶eßI˘äëÍv&¤˛ŚćĽŮÉôĂ™– ECÁëýřVvÜ´A/“ ęWŤHř5­;1X60[­ůk ư¤ć\e őľ:˝ř˝ľ”ÔoJ3˙˘ KÔŹf…e’ü5ÇzBô~­đŔCÜůúMŘSÍ*’ny—ôš+ĂNÉÂjx!„¦€“ç>:ťŃ8ţ™v8&Đ_’FÎD?ŐM´Ó&ľh*݉-€Č„ĺé‚ţ’_}VQGôU¬Ő~öŰNI3ď˝:ŮÎÁ^fţІI­î°µW&kŤJů| —uׯů@:lűt˙GôŘĐ>5ŠĂWéóT’C-Đ/Xęd=[§ŕh¨2â¶JbŁĹ? {¸ĆR# ľŞG6`Š.ËP• g˝ČŠ•m2Y20ᇕ‡Ň©˘¤-YŐ{XEÓÖüUşď¨ˇ:€‘µşŞ’wČ«V5ÔBSśnłm/ř¦ő©˘ÁçÄÂëĢĂďŞĎP EŞXĆü“?`.ٞŹEúCwBPűGÍś=wY lAt'5ʉçşß„¨\R2Ł»‹î4u­ťnwńeuDle nMđćˇ\†:rc\:,ѵ7'űQĺ‘{§­Î*ş°ĎĹ×mĚĽ‚Ż]ó'řŰbŰFńVtÓĐőHVě•ŘÉ…ĘŰ0IKFM–Ýşi5­[ÖE2˘~ޏĄ¤„5f ăçţÂ-Kľ«‰7%ú`ľ’JÇwămÓ.ŰÜ|-çŠ\ř÷o‹vM"ËÇ, \ő¦×äîZ]µ&§đşŞŞĆ ç“sMő)˝4·ĽĚ;zŰ”hĽËSL˛Ýź§pmůóśm¸%ßwžď…đŻůÔ8QT-ÍĚcĚî8Q\·Źe×s® ×Ád)ţüüMż©Ź v[D‡eĐřYmZßł{cüŰ;Ń6y«çŔXÚÓ•©=fÁţĽ’·÷Ł‘ˇ02±z`G¸Q”dW·•PËůԞ…b?dF$#`¦ě?s—×/ 72ń±…YKŤáŢ K%9óę CÔNF…üŃ^],APő>]Î Î3Ś÷ďô®Ż·Ń°Ôžźý‰A)Ţ˝ťőÍ÷ć ->"•š?NéI‡´ůÖŇŹO¶ŚćŁ6#7U.ö13ż™áezÓěYŽőK«¨¨A\滆›ˇ"űM}Ě˝0Üă}\ÇŁ#Ó•ç-m-ExůWňéó‡·íuUÝ®!§`ŕŘÎw€ňŁ´@áÎqŰDUĺžÍk˝—ň@áM˛ž `ŇŰVCŔć}˘íâŐşvȸDËT.kóĄŁCdÉC±lŚ«ŁňHcZűńM –Ż«Ĺů'VË%÷=ŻY˝Ç÷fyéŇáɬëĐ]žx<)ŞéĹŠúΓü XJiŁ–°ya@Öżühţ‹u›Ö„Ăľ®Ąg´şšNĺ b%DÔT&D&Óżr&;Ý”?¬=6€'i*dYtďrJĹQ%}ˤçě*…ńĽN¦$kdµ~Q™ÖÔ®§ćż›(¶6µŕŤĂzňöEéŰRK×§¸ąźÁR°"×iŤ—”–AÝěąaŇ@đrśjUQś™Ŕ *ăeÖí^=ţ.ÉDqŢĎůfzçÍhW^}Drˇ)ĄYô"‹$O=¸úôűŹD˙Y`iŻÂ·}Ş›F†5{ÝI˙ąúăč…íUź´ŻŠŕ<&ş2ş6Cž.ٶĆcg›îăżąŹ#ëvÖŃ™‰L¸^ŤÉT=OďX™ˇ-Ňj3Á`ŐĐ—(n±u‹ś¬F&ÓçŧGt°`woµÁY?}Jţ:Ż ľ:ćYC”N~(âjŐ•qŹ•"‰żs÷öĘQ¶¬§ëu¶yëzäTĎ•vŰJĂđv#ŐsĺS†î˝ŹÝ*ăˇÔza(Ű>ś];~¦oťéRôşo‚vZý ?‰ç0#\˝KŽSX…xŹ•°A-m¬ŇŮ=ěŽAťXE%9đ6—©g+Z˛†|pc@ćř©áłwú `k˙lUËÍ´ýÇî°'xŇ÷ۆWm»¦KIâ¶çďHW_äÝ·śľ·tĄřqĚ·Gü\+ňšúÎSľÝhŮݦŘţĆ8î0háŹµŽ ľi=¨í(¶ÂpS=ße|Ń]w†vt×ŃĚ}u÷ MŚIÓ=‹Ł{˙'7ônË…9†Ź/ž*—5f‹Ô}QîÚŢ.ĐWˇxŇóÔľç$Ňz\ť1ëíĂ`Ěňα?ßÚŞľ ý ×Aĺ!ÜćaQ‚»V!äŠSęşťă^i±0¦Ëo đš«<śÉsíQÎV“E\5vđ=íÇ@^ęď ś‰čá™IZ]XÔÇ}.»ćŚÝ±E^šFÂŔĐťSŰ™’ťđ"Äţë‘{ĺ?ý:^šSUrVĆ’ őméôGĐNˇ€Ě’‚ŚHştgöN¶í {Ł›—Ćq–“}’ŻŚ¨‡íĚM˝®ńsLHY¨Dęá‚ÁqĘ,,łŇL?ďЉľ1AG6 HŃ‘Ľ‡_¨ź_†§Ž+ŕ§8J› Ä&*<Ü]ť0~§Cáp΄ä`zńô>wuEáqÝϦ9=é5âVÄ-¸ ˇĹ<¤â‡™sÍ3€OŔ-łdWf´ ů(3`öd´j BĎÇŘ!h)tÝZĎWĄ˛[yĂĆř"4VĎCn˝‹ó¬RR°ĚçOt ¤(1“Ĺ(—MĽ_ĄŠ:) ňłK˝®[1tFÄ`mgYҬŮrÖŐź”NGśy'î„–‡ N?ä2/l"{™ŻűÇ")d XÝOĄŃ }®îýw|4ťwśK”ć´zÜÁš Ň;ž=D#oF˝ůBśTŽ*’Ď«Ą ­nL˛ýF8ńVr‹YK*ŔkáĂäĽjtőfr-¶ ˇ“ ´ź–”®aĐ)˝Â.JÇ’ĹHö 7)´ % ŢÄöd á§óĎ++yŽCAVĂ";U–1ś=µ/,;C¬űÓ`6}×ÎOҢ1'Ď/Ěö“l¤cA­ĆčďýÎÓŚŰFĽeUź-˙µćM\Âö÷ť#ą¬ą‹úŞ­ÓöŰ@hOUŹ…Ú| /ö›ŇV#%Yfř.Pj0mŕ’{r:îbĘř†#Oň+ÝytL·;ÜI&]ŔŤ „=©„¤ßú˘ŢŕÎ Ń-VÔ®_7=šmĵXTČëL׳·žśGc©Úl˛źätžw¬ÄýŠ,śUo¸±*â\éE•Ňřě:ń˘‚•1ŇołŰë,L㵬Jć¶”.Şú˛O´üNZ!j;×Ĺř„ÜVöÔYZMŁZZ·Nßó46YtíyVŇ=÷Ó(H‡Iůţśîý+ëh_ĆmµĹ]°oéć&ź‚üć®Ć»ażł VvYóČYf«ÁSbôÝ*#vß Eż˘ż÷® ‚ŮéŇĽ˝©oÝĄ„„z˙.…š´Ýĺ5äyČ 9w4¶Ű3f䇥'şô‡”*ĎO&!ąi¬·[’ś€ëü /¤Đ›Ţ!Ę’˛®bŘůµ^]?ɬ–ękľ¸»X« Ćo٬’ůş`Ë %ÂîÜÓ›čE”UMQ—QŰ垀»=ďŐW€«EÜSÂłRW ‚ylh'aé%˛š ÄĎvíňćý÷5LëŻŐWYŹî÷ąŇ…ü4 ÔSĘr?Đ´…‚şú|#$i'ęý”$$ÄrJ¤i‰é§?Śr›s*ě*s˘>I<{Q^›¦ce›W¦î羢F>ř˘"ĺv57żY±6l0 #0C[ŢÓ×=GÚ}fě=Y¦4”ě]Ó ÔsXŃ/±3Ve6±îâ ŇŇ Čže->0¦ŐUăĆÇ ş-2Z± •'­+Jś)™ďě†LÎúf-“xě‹U^‘&]j:ב¬¨óQ«OxŹÔ\˙:÷śâYý§ĐP]b™…ăňNfMžWŻĆ:Ż0«.s6ŘTx´ÍTy/f™Ů ąÖˇ?QYă ć;rÉ(”Ö0 »ć[+ĽµĹ7÷"N'Ő7^ŞÎGČß™ZţC‹Žtž%jźúS.s­šőüqß+ĄĽ¦ňŽ^q F%ĆĄl;jÄŰj'bá>óc}ě%OQé“2€s´ÜýÇ&Ćěő”Đt:-,Pŕ«f´çs–©°đŞěŹ¬ŘĽé…şB¶›OAŐc4;ˇď©Z 1Ä2 Třf7~Ĺ`‰üí×–Uá ńCN×öhíWľ"×p¦K‚ç͵(‹ĐVUP|îhZ٨Ľ.l‚Gă´Z”Ô…łÁ›opWËĽë%}~b/)µĄd sČŁzČZd ™ˇ+ fő[ů÷ę¦aŽÚÓł¤bťšOŠ-–Ş‘úN(Y㇌ňßůŇÖ!¸~ězGNéíZşZń¤śl7!¸Ü ÄqjŔ^ZŃ’ťß˛S´äĐX<—ąĄ3ăź(řŃĽĄG-Ńš4 jÔŇ裋Őx4ŽgÜá8§ąÍŰ|ŚĄ{Ó‚+ó26Â_Y°ßUŽ5Rß@nĺä|q?ťĽ÷—lsÇSŕă j5¤K%öŽť~_µ¶â¨rľ—8g6Ôž_r7]¤vF®ľGמůÂYQ»Ő†\G­ńvÇŹ”­×ĎÄݦÔ‰ŃÍY¨U÷*©‰ř1)‚Ši˛ďFAąż®KËHĆ„YUpŇ mČůˇáµ÷ĆäNý[ŢsÇ÷§č¸ľZéĽ.·tłdZb4őŢżXж'IÝŞÓß#1ź‰ĎŲ́<ť­qVĄŔXË‘´Ř”¦ó?«µ§`˘_]W µülÖ_ŠR:ŃüY!iŻćßöŘ‘ş& Ţ–Hí*<{e]µĹ8Đ đ ňíîęĚ)‚ŐŁXˇ˘“Y@ÂéuFX:ErY„XwÜ«3o_!.7µD¦Î¬  '?@Ť ľ5~Ľ2sƨĺ%ĐF»ÖÜ‹ń-~Mč¶ťČMt‘°łA2JE.QGfÔŻ#3Â7É„J[¤™BEÓz]çŐOćzW±`©d“X‹´ëAYAůh:ŽuNV:»·u$ŃE‹+ÂňMl çxz‹’FźB$e 'ąę#UJÚL®í`N‹  $i/«Jć{Ep7ĄŇěĆŇÔeź3DpŤşÍ|^ŘđifŤăηźÚµŤS©-Q¶>ŮXČ<ě´MőŘݰl>Ţm…m ‡ÁzëF`ŠľjTż®‚ĐB‡8ó-ŕ Óq˘{Ë1 y]B ‡Ďąń÷2ń; bĐŘHŃË7}\™\ňÎĎ4FIĽ{”-d1ŤtřsŠŃ%Öôĺ˘9¨ZĹŢŽŤÚŰwĄl“D8ďö‡€-–śŞŰzÚ=°ĄUçYp, 2ĺ8¦UC J÷ jcA‡ń hbßg‰µú¦úPl?p)ŮjáO}I™ŕ.¸î^{<´Ţöpđ¬\Â6Swńs! Aď+Ý"I?Ę {>zkUvßüWJ~n¸„q©îaf=c»˝RQ3Ő$m giˇU%¶äŁNĂîŢ<ÓŤËĹŢíŽ'Ć˙Dî€Ŕn-ç:˘=(tĺ­H€.©—Ô3°śAÜ™š˝č­ęďôŻ?SgS: ™o$4Óőţ*Íyľ C‹Ň%"çAó˛Ką±ŁŁAŐăÇ< …€í§„ĆźnĺË1´Ó†ŚđőzŁ„tZn_^j„SĎŹ)Z±—‚ÝNVÂ]圯Ë&ţŢżŹö6gK®1ýÓ•)ŐŢЇůE©a/Ęźn0ÝgďˇčŐ¬Ą7˝‹ą÷éSh«ZY_W—ő\µĄ ¶ĚŔ{MĺúCâö|Ě÷aßW’Á|og¦Ż®Çăt¨>}ó3¨ĐržoZ-y§í۶Gíě7™ŘnŔ75f§rń4·XdżÔN*}©·NÇžţ‹STOďŔuӵŭŘó»S0,đ°‘úűţÄËQÖý˝ť y‰‹ĺŽ˙Dż©~ç()±+Z’ŘQµţ¸O_ŽěwôGx¬•s±.?%ŕá6Ě…U¸•NÖU tń°ő®eđD@gľf|r·Řř~8*·ůŔ‚ĹŠqśb…KGĽ“óťYr)V§wwd‘`łÓ(şf—˙ĂbŢí×LvłĹ%SęúYĆŘ–*§ZWżťÖ‡şŘ±ç &ʉ«¨4Íާ¦FY[úç‰ě}Lëf0×ţŕ í§}Űw%?W˛­’Đč’—z‰ˇk‘FýyżŰ7¤°‹´_ź"yËTAS4]ń~GąÇ©őR‘<˝zâ—UęLâhuŘlU/ţ pŽđ8Áh/ęaćŃÝČŐ;ü¨űY^07żď’ÇqßÝ;Ę]Řô%¸ŐĆŻ†Ęw3W uůX`±ăÝ1ʧ‚|ý\Łf4Axôí„zpÖ9 +ń  dŽtĽ‹üđc0ÄŽżFе¨˛J0“íqů'0“8’ Ţ.-?ă°`CŠţGÁ¨@˝˛×ĎźÜAŞč\\0‰l 5úz„ˇcBŤă™Cčq‚ę„FŚJF‰¶–Q˘e¤A˛4NxbŃ?Ö}ŕ‘"z:°á‡}śŽzehnřÁjŰmúdú*ŞjrµĚÔذ7Š-×9y’Pđ@ç Eq™ńÉj_Á=Ť'h¶‚ť%PpÂąu,ŇEąŘšK?®‹Q “VóŠ‹üÖ›¨–śh2îčkőçOż@Ű–±m+SĐŠŮST{Ě‚ű—utńL áIĚ/î‘tě~ďłĚi;8"ňŻ%ńа;ż^i±Žś[=<»Öíj?vňb:|Ť 8¦‰;Ňî(a˘TŮ)&vď:DdÇÍMeˇBUĺ“!&ĽÍ:‡Ě&jŕ“ÄܺˆÜ*˛a˙?ăűů¶Ěšâ§:Ë3°ěęg,q *idËč€ç»Ťö;[ň´\ďĐ—ś™k[´ µšHꏵ˘¸ÚĄÁ’0ĆŘżfó3'pLĂ!žć›RěŇý2eí’›&é»l~­§‡â)ą\đćčvŰ{Ö3łÓé€Íţeń:HLîđď$îRí·sč%—Bz¸˝%,¦{ŐźĚó lv]p ĂĺÄ|n‚ą ]ďĐŕvˇŚŃŘÝ0Jy-ŹÎžnČőË@†ą$ŘâŮé Ú ¤7`ý5ÁwśS0§dŕÖ2n\"{0ťŤŢ„ĆxON+ ˙A¸TĽ:ë.âŔFíf€¨/ †N…S‚€•żó=Ď$¤ŕ|‚ ř‚í8kţ5©ód őU2]ýzĺ4‰EďzÝi]î‹cť»ÔpŐ´Y5ݬˇÝÇrܱÎ:„ĆS›śżtµ˘·) 0géŰ7)ľ ’|€(Ľ>řĘÁa(ŘA‚ł8š rü>\ŃŢÎîÂâN<KśÄušÎđ#puľ)Ą âLľ¸¤N5;›óí[=¸ˇťáżv1>(µţ?nŘ;î%ńŔ†9ś'–ü‘9ý*´»ý¦˝ĺ¶o+9ٶż‰Ć^v*­pĘ‚ł2Ü= Ncç%ÎA‘xŔoÖhŽD$Ł®ŞyĐNä™8ř±¶“.ŞÉNţźÎ:IÉný;őoZŢglź=ímM+Iů7ŕJ\rPá>ĺ?^¸W¨eGěÎ_|Ű—TĎ+˝Ń„˘ŹM6Î_If™Ł7䪱ɵĐtc`ű›fŞ”)Ŕݞ@MÉ©–Bž„}ýź Č>šî‡5âÜÇWŐÁ[‹˙ëňŘ,+áÜ 8éIě3lŮUăysé´Ô‡­jŽ:Ç®±s×ÜÉu’¶Q.śGU‰Ň^—°^ŐŚĘ@zYe‡„Ž~9_)sÉ 08¬=ň"äć_É*ů¸Së •Ěö#~0˘á2ËRş6§î—…úűŕ >]^™Őm’QŇ6اšV"őI«˙<¸`pöŘ}şŻM‹’ ďÚçaI­(ź0Ú«żqěôѲ¦ó§Ť›Źşł]˙ăh•VbSY7žd¸«§ BóË@DÇP¶Iç¸ô-CJHă^±Mů&h`żŕĹAĚ(|eCYI;¦ŹFb–šQlJS™Í’Ŕ{ŞF™d´ĘF'ŠG\Ň÷Ékf^ý´¸¤Eâ¬FxdM^ő!EüKŢ#régXóv0QÖCĎŤJĘteL°]÷yfĄdő­ţAŇĘlĆRÔYĽ%€¦…˛¸ieÔNŠ4‚áŽÂÍg¨±©ČÇúŇRĚéľpńاŠěYËą§<­öJ©űűCľ3ńżÍ€&Ţ‘§B0/ڶ$ľŕ<–Ęť>¬ľÜ śţ­Ë! vá¶ŤŹś2= 7(ß(rŔfܤŮDňOúa~¸±‡ĽťFp´•­)UÝ‹5Ď›ą·(—ő(_Şř‹vmmĽW‰ěpą­şÖÁdÎŻ?J}łÍBŕ9aUj’dřËő ďąó÷föż#;xÖ"#ü“Űc0ăYdz>˛ĹÎ#–¦ďÁ°Äťáéu#ô’ôŃ$vNë~O…vbĽhâT…Ú–żŹ)tC BČ!·$u}¸ĹĎĄ,8†Ęš ćö)T˙6Ë‚rt¨ endstream endobj 1329 0 obj << /Type /FontDescriptor /FontName /VRKWGK+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/X/Y/Z/a/ampersand/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/f/fi/five/fl/four/g/h/hyphen/i/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/question/quotedbl/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1328 0 R >> endobj 1330 0 obj << /Length1 1642 /Length2 13106 /Length3 0 /Length 13960 /Filter /FlateDecode >> stream xÚ­weXśë’-€™ŘجĽĽĽ”Q°ť»…™ą€FMY–žžá_–ż\Ćî˙DŢ#-ĚlTď\@Ö`;­Ó;Ĺ;P8™¦Ö €¨˘’–´‚$€FRA ˛9Ľ7ˇällmał0Ů:‚h¦`€ő?°-ĐâŻÖ™ŢąDFG;‰Ĺ{ČÍd÷İ9ŘX8:ľX8ĚŚlťŢďŔ °°5±vţUŔ»ÝüwAvŕw›wěťL ěčähâ`açxĎŞ$&ńŹ:ťĚŤśţĘíhńŔ¦ďž@°‰ó_-ýŤ˝ÓĽŁNF¶Ž'›Ó_ąŚA …Łťµ‘ű{îw2;‹żËpv´°5űW ™‘ĐäčřNóÎý×íü«OŔęŢČÎÎÚýďhđß^˙Q…“#ČÚ” ‘•í=§‰Ó{n3 [DćżćEÚÖ `eů‡čl÷OĚäđ÷Ńü53´ďEÁ¶Öî Č‘Yěôž@óßS™éOä˙‰˙Wţ_‘÷&îżkôźâ˙éóüďÔÎÖÖ F6ďđŹ=x_4F¶€÷]üµlśmí “˙'ŇČĆÂÚýżŠýwo Đ?Šţ¶ţ;ö~[łwuY9™Ř˙a¶p”°p•,śL̦FÖď÷·]Ír°¶°˝ ü÷Ýľ±°ü¦jnabeű—ś˙€@¶Ŕoŕ]łżËgÖTUŐĐ’§˙/6íßÎJďá¤ęnüßLň`ŕţ˘úňěđdd{/…‘ťŤŔËËŕĺâđú˙dý›‡ő_gy#' 7€  +ŕýýźŻťôţŤFÜÖ ük„TśŚlďS÷†ż`g‡w±˙^ďŤ˙óü÷ü@n Äĺ°  ejFšÓwśś11ťž.ÖAv%uŞ…ůľŐŕNźÔĐ-Ţ Ăçš ¦ú ľ×÷ůC»—=şýˇ.lkęÎdĐiˇ9mw>ú:U7ýľ?ł~ rÚ‘F¤çŮśÜ&´6‹úţöŘWeýâgX˘‰6vřł;Z_r—|_LŠ[;o“”Ú¬v´zŚď‡GT w·Ô}Ăýť0Ý{ôŮ1”üF8ŢI‡¤‰Nî†×u&Ż0Ź.Üw7"ľŁ‡ ‡U·Pb™pŹŇgÉlÍ;Dď„úŞź0’ݡzËb-ŹâşzŹ#&^N†l EÂ3eg[í ć›hęĆÁ˝Ó9U#ź5‚¤‘ΑRWy ]‡śű»jUńŇá,W9§~üĐĺÉá.ĄÁz†¶Çëůő Ç.§ý'SčĂývź´|éOŁţŠAîŕŮcÉű9ł€çőňÇIßă€2Ďô˝Z¤<§ŢŐ«a)ńIťSŰ hpçÎNľ–ܸ‡®Ck1pŻÝ*TúenąÚĽ˝.ťŚ4ŤŞFw,{kꞸ1Ű(¦”öun:ŚâŔ꫆>LL*.bôśż‚xÎŹ•ô«*Ä&GOhëř0ęŢ+¶şŐŁ%¬ç 6´Lyş©=Ť}š,ȉ›ÖTľ÷ ńş>{XÉ’PŽĽťÍÚŢ hťˇĆo LhĆŠfşu„ë*L» ČxDŽ]ZÂl“přÁťÜbg{xO¤,“˝8eŞVÎPcź]fŇŕ±G+ďÚ<ŻĆ@~ňc”_ű>RrNÇ—‚b·ćÖŤí>!‡o]I‹Ţ.şžXň&%Ľ`]ŇGrA]‰™_K7'"ś¶Ňw5hÂTŔpŢŰŻ‡­RĘ>"#P”< Í«J¦pťęŐ®8CóZ hÎ}ĂMłĚωľ[%©âA™ „´¦ÔrŃ.đĚ›ĹÇQ‡®ĄiŇ߸[˛Ď›ď?Ó*čÚXňm.gá˙eă)ĆżSCpxW.•nëŃOбmĂXB_—ár~Ń5ĆVŰ˙\‡n,Ę…A MxŽŽÁbłîËF;ę§ –•Z—O?Ië­oz‚=p_îW7Äâ…ĎŁ‡W&+ť.VÝ·5m e23avŰ;ĺč®3tjĹ AŮ~b 3í›w˙Xz®´zIPÖ5Ĺry)~⑲U>^%1 l¸Â™xJšqćšśr‘Nö€v=H—¨«@!S?&m<ălÜöó3bĘwHßÁ˝–ĄpĂ7‡Ş řŃ@řŤ<8ŁI&?<ű…ęâ«Á Ś…T Şy3Ů—¦bëy ÜDraż<ŇX„ýČĚ–„ľĆ]ä^A3¸TŇ]Ş(ú«&âÄÖ㵟g$Ú¨śŹG˝„±0[LfÖҤŤ‘a8Ż•?;“<“ťĚ⇠¶JSçKÍ Vc2|t3ÇH°R¤pp<żě´ţvă“"2X`mđ nŰě}áŐ¶˙Ľéŕ[aČŹ”%běÔQ‚“ÜńI‚‚&’Ţ+`PIhâ°EMďbX8;Ž8o­=ú^—µ¸ĘO¦’ďî¨ű`Žą˛8cĂm +˛|ĺĐz¸ Ž+€˘Ł»Ë­ÚUn/Ý7ëh†říĹ­p-¬$üÄÉâH‹ěIţ“Ł@Ń…ÖÓ˛é-‘ýg>s§í< Cî)ď;±Ó‚ž‚łą‡ý ás¦¬âű ŢP3ÚGB:Ź’)ěů7˝#<ľ„đş,űfůQŻŽQwtQ_‚žîĽXJe/¨~ççFĆĹ.ŠĄL Ň€śŘŔRŤ—îŹ`çÖá·Kx’!ÓĘÓ“KBÂŻĄ?$ł™ Ë_R'+iíěB˛üŤ/…«x7oíˇ-ô@…@ýVşôT0UÝîUćőo"âţÖŁţ2mĂÁĽ/+tŻ5Pm×ÚN6dÉ vŞ3P žžeµ1üEŘŇ(Ęą\q’˝d”ą“ ľ$)ćíŕůg´ęl'’ű,('Ż.ŕŁ9Ŕ ‹2«•_P˛QRDZ!ö,‰Č7‹©9}3™úY–aóÓ ¶4-F¶F»p÷Šfn©ôlc]^j^z.’“Ý9Í9čš2Ňď¤ô ÓzË‘žÄo¶©ř)â3»uuÜEű€/'WĚ$*@Ć?Ŕ±E†ÓhYń`fKě¶â±ôËÔý]s Eí˛ć24ÜĄŃÖ©xę‹7¶Ú`(d÷8IĚŻF\“) &fg“ŕ-*żÍ0˘ëŘ–*®»f:R›m[Ͳť›čxţó‰ˇâ#­bűřö˛“™€é[âb…±`Ł=m‡ŰîĹpÂř­ň»`ʤÓČô[DŽ%Á.j˙`QFđúďĐź÷;µ4ŕť–ˆş)á<źŘ8 ŠŽrT„¬•ÇO«‹ň{QXćőˇv,=x{%č D8Ýsc™e\˘ Gś–Ą¶¬ňęK¬ŕNióšQŐ}‹~'®Ó2ˬăöŞoŻŃ>çÓ»;ÍŰŽÍ/ů…{¸Ć;rŮäŐ¤ĹÓÔ_žŰ•S˙üS·óÖ ŁjÚĹŢÖýüjÚIĚ Inxlpą_÷rńÁĂI“÷ÖCf/%ćNhr$#:D Ů‡šg/׌©Ň»Ć"ĆÜ,†·ľ°Ţ8Ř˝z—NĐ hě=ç”§čí.¬KŁ? Čëö|^®[Ą± Čj>-A„„Ü«ÚÉűTü…áSŻ˙EÚ ‹”#Xán.—0ťUŁ`ş0XĽ.dUOÝ"/SţÖF3ż ’X–8+słO´ĺ…qŇĎěž!ď"Ů p?#V¬.[ýę8S\ˇ€®Ę Ţěau¦f6˙ŮŕxGq˛ÄŮ/‹qßNÇĹŮ(<“ş` 'ŢĚ&ţé&?¨j†Ůça€M·pĄę€ŽqcÔ€XŃfBĄguúýŢ>8e;&K@97 ĺ|ěó…FöşďÍ·|™ń)ď8Eé?vň“Ľ(™_ĎĐľő;čŕ}Îó`°ńŠŤĎRqµíz†Ë”żťe·Ç팜żŐaŁPŽę˙ú­nľ*‹jO˛ŢŤšŘ˝ ł<Ť€Ëűvđ=0_§$Ŕ¤ľ„µËř <)˛“LMNAż$K˝ü´„Ţť,ĎźÉĚŁK ¬L”Íź×±…” ‡Ť1‰ŰF š±ÍŤďl€U-5É‘BNj ÉĹĘ[»‡ćÔ}ĚŹľáńAŐ€Og¤m§ŹźŽ$†Jp_‡RPi¬AÂfPWŐňż}úĂ#…Š—ąż1&!Meţ+"0ŻF…ęĄD÷űń´‚”w ŢŚľ÷·Žóy¸1‰,ú´ę ζ o_ű>đ¶-â´ţŢÍü2Če$Ń›;9Ż.ýĄMOÇşnpˇ©„Ú‰é¨ń¬g>Şť ŁÇŃ“G‰ MI™“›%$ÚÔŕL|„0'C!ťşQhĘ3@ü‘Bäoś48č¸ăŹ''ú-!ôN:}ű¶Šsü©:­Ny9š:Óo•µĚm졏'›0*;cełŔÇ„Mľé^ô›ü'97™Ű9Uˇ›DáRŃBí™ËľÍ ý·¨(Î}łî‰fŽÇÔβ©PÜ›Ł5’ &Ć,ŰÇáĽ|Ś·0FzśŚQÝÜţ4÷ňYAćCtüŹ6\d_E2 ¸dÔ tI"6ś\z?P+$5-K>Q, řTBN0&î}‡®Ô/…–@ Č:+)ŰEK1ęźáö‘BMYŰČČbTĘTvv¦aAëłpĐLŽ“-O<.]üâĚ E;^9źaír˘]Ňzś–8€'Ű©–›>|°}>&Fв’7|ĄĽyĎ/ď3jĺŢŻ ăŇä?*N"ż+sü‹¬qfVúĽ,ű·îÉ…ĐŔýË’Ž/‡đ¤đşÖ8¦dŰŠ&l>čĄ0jl$ÂĐ đÍ”Qâ{”hžúl¶0ź–C >ńŮ[@kd†řď MöZol§p÷ű qGş5´X^E| >Â?Áąę1żu;4„l€kaJŰĽ«ŽS{W6Ž9|y>­Ňĺ.“đ#s}†Ż)Őź)•6PÎčŔ[Z1ţ^hŲâšŃqtP;Î2Ţz4úóaűăúďsI)ÎK°ű`­ľJčÄľÝĎć$ÉÁ†8Üaţüë‰âK!/(e=…†«‚IÍĽZĚďÂF =üe¶üÎŚ›Ţ3•KUP­ő!†*#b6¶OđD.9ĎDÓ”ŁoDK ݵ_?±S†łÁ™Nˇ5Ľd¦|n5(ă,os"ł?‰&z–źSZ˝Úá6żH1^{ď˛9fĹ!ߊ§1Ť°ëý©Ž¨Ť÷t?fź‰ß@TJ›«|LŻě«PÂđţĆŁZ‚›š§;±*‘:Ĺ—M.! W„ŽŃ˛Ž9ˇ9wU«ůÉmÓ“sdtřŘG´î‚č34̤6Mî„ŇmG· 9·cţHĺr*tőŔŢžĂb%VňsÖŔÄËČÚî”,ü>Ő*ý/ąD§ĺč—(5Ú ď§ŔŰÔAg|kĽH§« •×ăH:™+·ď+>&•;¤»m—…ş»ľOTQŞ|4/bóĐţ.ĺ‘Ä-‹ MäŔO­5KG¦*[P7.šü÷o$§BS«^ůŢ"?ŹŻä†Đx^~śź0ÓÚcÝ«ŚŻôNô´ÝŰcś!XŇďQĹ Óńáä58´ťpf÷· S|i+ŕ§2™ »Ď v‘AY©D1"âÔ\CĚÄ! ×Ű˝ Č‘ĎPžh%Ő*EěSĹ9ŘŤ¨ş›Š:ł–`sę|÷´Ąż"×Nhł¦Q=7ŐR:źúě\—ś|ă°@YôĎ˝‘'Vá€ă-őđ¦îň¨Čđ˘eÚ¶šť‹ÖŹ—5Yq!čŽ"S‚ę˛ĐżëwŽr™[荺&láCü2¶yrlěŞu_ÂÍáý•J>ĽÇë•ĺ=–<®ň;«}é$·Ľµ%’„’°>»š¶ rŐäqŰm/ßh:,ýÜNzćgqKÉ[HŤvÉ.9ߨh$ŃÝ($KpA čŮŰłŃML†Â&Ś)ř^*‘Ąîç­¶…?ýÉsţúB4ŕHú¨z?ˇ9' 8«Y“Ł’QŘ]jě 5±m ŃRRyŢ{ gçŚ5ýł‰*•#qXúÄ ţŁ!~ęůŁźýć躎·…\â6ŠŔvŞŽ>%=‚‹‚âB™ÁŠ/)śńµËF·tBŔˇčŢ,f4ÜT›’ÄřnŚů…̉-·ęMďdÇy.ÔqÚĄÉmwä!ŐýÔ»;!TĽé¬•a&Ę®U‘ńm¸‚ÖŘŃ‹ň"žV˛źřFoxÝáÍ$ß ˛KröÓ‚Q\źě; 3b·<Ö]ŃľOsLE¬u$ ㇽć†ü pTФߕŻPůUăýa$‘` ě4gi'·ŮTÝ»ťĹÜWĎ>‡*°[mÓŕä1ZA–űńÉĽś¦™TÂĹHÜ#frÂqŘŁŞV.ëU@[sň¨ŤťÖą©8>uX«;l|v"úźĚ9BŁ&ˇ’­sRŠŻŢL<Ěo2ßđMéĹ}ňbÁk~ů;‚Ĺßľ=,ÁôŰ1Rç˘c °eĹşy FŽ0wĄł‚€2śśQ©"Lčŕˇáőę=“ŻŤßŰČw™¨$„±ä>k ®ŞřMŽą]ˇ“e–8,™®ř‹e¤b^i…¬ę>„Qśd_ÝŰ#æ—łHŔ1Âdß2nO~dÚä éźK[Í9řR+ýŰ%ĚĽËF~0c«%čÄQq=ďĂťG¨ŹÖ™sv?G(®'{{DóZ?~ë5HÉ6,F·ÎY‹¸oöY–„Ł#¬ĆëF™÷fä¸MkÍŚ M»ś$Z`ÉŰőÚŁż´ńÁىˇLĂéł§?Ś39G• ŚÝ®˝<.śžů×еО7'\$Ă2ů´őu:ŮŞ†O>mŚTÁč`z+NżÚąŢ«Ę?GĂΨ֡«^í„ę•\Xˇ‰Đ*”ŹUřyúwĐRĎńĎxÄ×&®­É:ŻŞp˛Bôm ě[Ó—*@šaĂ@řü3߇±ÝË\\~LĄ7sůÇŰęÁ·Ą‰üćyckHŽ „qd•:±vcĘ?•®±ň ĺ.í°&uIFöŁhž®Á$GŢ7‰Ť4xt‡Q)ä,NUó‹·ĄÔm-« kŻÉV&˝ Š0b¨Ů™GJrDÓ̤&686¦•ńPžz2N5@ö±kŠ(O9§ŔyŰ@MťĹÓ]?ÂŃůe‰’Q@âE&©O’mÇyGyßÇôĺ®ŮĐIâ»=D˙ě) ţ$GŐaŘË©Ö#N-Ҩ4D¦öÇ2Ęj'%#–Í…Ć˙Ď*k*ŹëS÷©Ę8Ť°™¨%BĐ#ľ¶ˇ”­W­ŕ·kGŹ'lŻÓ¤vt$´˛űZщ@7ŚĂß? úa|˘"ŐwŇă:_±Nă ^©ZLŐëRFx¨fbť–h¦zĘĽ„­Éގ&€ŘßűĎą"ÎĐÖ»ËlmlŘş–.ŮŕGç_ŞĄ±Ą|ÍÍđ"ÔéQó/9ćˇĆfj›úrµíŚÜcˇz?aˇašËI: ßZ Éßv˙ČJŔm´Î‚sWősl“§I(`ÄŮĎÚÍľťÎ9ě©děqF(™1Ó>‹Öî®±O úöA-ç!îşŮĐňŹsĚÁ!ćOŞÄ¨»Čxü›†íŽźľĂëÇwDęTóYÍÄuµ@ş{¨A …aAfµr†ĄŘˇ—çX,¦…•?.#’X‹&¦ĹĄ’l çôĄh¤ł;«ĺěd)oÁĄ˙mÄJHÁľ&ĆŹçlš#t^(MĘ6ř>Ë ˇÔ:ä0hN¬Ĺ°†`g Żę7snzB|lýŢ,?ŕ;»őĄ'· \+¤ňÚ}«ĹÔŤrň—l @đúŘDŤřve}Ę(8´˛yĹţv3Ňć´ô»Ľ…µŃŔ~’„Wôlä€ôŠúÚ…Ď›öźHŢ$÷T‹­—ă€p̬·tŮŹ“M!J›k¤pj§żn[x3őµoéšÚ˝ZŐs}Q«}d’hűüçÓ[ť›ľś}V˙>ĺ§{é}r—Ě‹üx©a«sŠzjWn†óʆjc˛¦?Ĺ-łVńCztËĂó™Dcř9äŮ*ʱŤťGòžküKľ»Q’5Í#Akń´!/ şŘŁŞ­fIâ÷ĂÇź4^ŐşŚm#Ž2°_Ż(ˇPˇí=jÝâC±fńjËÍ”y°X­'ză 6ŁCo‡m§ęă'{˝-°5+˙Dý<;Ęú…J męű°+Ńra/×5ĎJľ,Ż{_hĹ ĆŹýY†‰Ďâ·°ťŮu &Š]tHFŔôäí§Lńmwůá±#u9\6 ˙yäe,8k»ôcö† yJC·ĐÍMf""¶äŐ‚˝ýZ TĺĽGž%€Ý%ă2zęóŔď“_ú>ŁwAbëżuV~i:.şş—€ý™ĽXT“ęÍŕ×ÓHEKcΗe ź<ž Đüf)MľÚoćôE-‰ó€Ő‘ÄÚLÎ0oâś˝0ťr‡ş›W¦Vî컬dv±ŔXňµeF×ÓÚ˝˙0ĎĚ:ęţŔ[};]¸ď#&IúäŮËwHŢdyrôsW•)Éť$Ć˙ʦ´`Y˘Šźů¬ehÜWś¨ىÓ¬§Î÷EmÁf ˘űŮ7sę45Í©,Ë m'[ZSTEůËŤĘËB\%Ô–BŘ.˝ń¦_oęîMmą˛”Ěéâ ru?-|“R_uăšž÷Çü-‚Pď‰#ÎŹ$é<…S :Ľ7hp TăH<©ô[Ĺ–„BĎdQ¨ýiô¤‘oµ±˝S–‘~#ĺés¸ąÓ´đő{NŐŠ·>f‚HöĆďPŹĽÍaVžT7ä={[¬‚+ń«¤+††:!±LĐŰIy:ŽÍ?Ľ?ŤµgvżŠ*ťĄ;\ĹFµĐ«b°óCS˛bý?§Ö­’.ň¦1"ÝÍôŘ÷WŔ1ił{ă#oč.uÎWĆ54‹¤ŻN|ž¨Ľ ĺĚ1$äáűH¦loă[5 ŔŇ7bWÚ‘\Ö©ŇKźĺ$ÓĆôęśEL¶ď§Dµa0Ýś·íĘD4BăˇQrŃ«“•˝R°í®©6ŔEĐäŻíô6vD =lîÜ,Ć”®Ţô-‘u0Š<ëŕČąŇé$wČ2¶Ëy='ZvěĹלř‡Č$v‰’¬%§B¦FŤ«]ÝÇ+ÉkéŰÁűŻŮŞČ6?ÚW—2€Ë0v–XŚqćĐš®uSˇľ61*ş7ú >ôz“Ź{DŠ\Ħ<ś->ôHUŃŢśt7v’cÁHÖ{RnËo{›3ńleŰRđRM‡RxZ}w“¤-eĚeh« sÂ÷XÇă“W9¨ěćŃůüö±‰Ćuő<Ť¦ÄD¨Űmd‡ţ4´±źů”Ś˙ⳬ·TZ§bpKđnáěIăâkň$ç¦(X«¨řqs4…@‘¦Żýmp]wWŃyąš°ŘtS;xI,0Ěŕ­W¬§űḳř–ßhŹgLŽXŮ8čăá>N 1)Ó_iř¸;íÎťhmËŹýňżé–RÓď–měďŔt˝Ś»5&R},Ë^Iy6…QAŕPX”î±lC4¦V~Dw=.Gó!hxîŢűş6ř›·f”č–ŔnŽüŐOŰIȢFŚďdwaśd«%Ďö®ˇf ëd"ĆGŕɢ4­‘Űú…\‹€ĺžą9©´GíY´)Ń/µř©M&˝¸ĚM)8VKłĎZX9L9FN„óQ§Ë4ă«ÓýÜQ‡~ç·„Ź·†l‰ç9Ç#ŹúT.›#{X­ ţţ…·ÝR°G% 2og(ÎĹVR,r@CŽŽťˇ+ńóĆÍŁSxő_|ü&P•;ÉËy奷} q.Ú`nçśQ°%¦ÓwŮ;ˇä»_bZŤ†t ~ŕŰ–uřúKŠ#ęď'x^×Y.ŻĎ]Ď‘ź$"ç“ďjé ËÁr97ź™!X±«’î&ËÄĺ:Ó¶Ő¶S>ŚšÎÖć=Ľ¬FçLÜ?b¨ń 709:ZčĐ÷Fżu‰Ó#E Ą“'9Ʊéăiµ ×LëݸŃö®śíńŞ[ëm›cL‘ĂX÷v”_YÝě™,µů%h1:~áîju?©Ňß+ŘOŠšÍÔsÉ';ťQV!E|Öy¶»­ˇxpdU•6Řv»u~\zĺŔ@~bI3ďl ‹¨,âýĄłÎ»QÔůŔ|ݱ"ɧ  x¤żŮXÓŤźˇ§p˛ Ě=9/šCżš“»Űcˇg* ÎmÜŻÍ$ďXZ+ţÄčŐ*ŇÜŕµĺcIÝËJ皥Iň$Î^Ůb x@.uY‹áŔ:×9Dé5h† m4ňnýČtUJë—îm,ˇ= _Ä~|Ä"Ą×ĺ¶/>{”Ĺα°¦…{*{Ü4§R]®C ś?űfŐŃŔă’'˛Eéf€qµ˘©!ä„Ě6̸̎at6&ęŰŢ:îGó¶Ęk›Ţ¦Ľ©ď3möQV Ř ŤÁÍ’Ňöd0ť8î…đ(đ<kŕŢĆ^Ĺ®L:¬Ĺ  E'|ŰÍk­°™U% …b‘渹?¸ ‚¸M"<ŇY8ő÷·>śžV±Ŕ†YŘň|Ś^s‡»µÄßňŐë3!Đđ9Höµ$Gu(ht7"ɨ,<Ś\hұXla¦EůËaČŮĂ?\íĄćeĽ`îđ쇇k-¦:ÇźýŤŮ?ȶzRbFţvúÔ…9=MĚUË@óÝA]űý«€G (ĎËHżTgMxËʆşIB°y¦"ů€×CeF!`h†˘íRgq@h$ĎşF%ŞÁ†ž‹ZwęF3źâ%–Rš' âK–(.ů<놇ćá7F&ˇŃ¦©ü\JIŹőKŕU‡ßŻ|éă˛\ì@:¬c÷Ôó|CU§CzČhZ2Î^Ą„<›šÔU‰Šk‚/˝{,ŢĆýQhÖ84QŇ»Ţ Ł°Ď…¸3Č s?)]ŰCRbXĽ(_Öˇ ´CeĎső“m„ĹŇW4„bEĘ!¶ĆíÖ"(vVĆmôÝč;p_<˝żéňi¤  oy ď^ŽKµÁ ĆŢ7ńĽz˘yž]GÄŚ7‘řăĽ:}Ţ´Ô —Óra8¸čµ=÷6H3Á˘\}_X¨k¬…ń4VçŐęQ â§_IÂ:7ě)łúh séşßčdpM3© šÝ«Ľy÷Rü??Xá<—~ěi…|lÔQ0{I}f˘€Ř ŕ,Şő5vG·hÚ‘Łd§·´ ÖĹ$3hĆ7-iľůłš¸:%Óš ×jĘmKĎ”FţĘfČĂ7üô<·ýňľTÚ4ÖĂęÄ}«T'Šp»UË);Ížý†`ÜĄďyťs˘Ěç˘6ĄŐmm»˙ödµ’Cᝥʰu-ełŰ,€:7ŔuűăüIÝľťĆ%±Ů¦0g”IV!7©ô Şť vư\˙ąöYˇťÖ đůšź }őÁąRzę fOĆSw[ĽĘ‰qVŔ‚»XgĐcĄŰőňxźäŤ3©9!čZŁ·CĹmÄ–Š /9¶¸_X|X%ن1S¸hÓ?“čćbľ­'ţf¤ńĽÂ2öý9[@Ă_ş,ŐX[XŠč%\˘¤N•a&đşe¶i: ÄFqłnP`Ô r!Žw0”EÂjč[ťoë uÚą+d ąŘÁĹ÷‹Ŕ©Ď]IŃVď·ő׫HPamđRŇórRĹWO6ŘĺőŁ”:ôH2üĽĂK•€6RjÁ&6ÔA˝⇵o3m*ţĹ:5.˛zÓóŐ–ěö+p·č ňĘŞ«˝auÖ‰dŮ:=}^e»úa)ßQ˝7Ń#~꣫ů‡u6ó^˛ÂVÍ_­şAK MëFŠP"icGhĚ6\RîĐš,ľÓ"ďQz!đ·şDŠĺşe!–y`¸Z2í¸˙Ş@z®Ő~>W\.,ŤçÇj*ÄËU)ˇ5ż2„Ť´>ô"ă&áŹtâ¬ÁäAĹXm¨Đ‚<Ęl%1ô€¦PP ňOť}&J_r)e† 5d2M]˙Ô¦GťěÜWÍ´sż@LŁFwáf‘_Mź03|ńWË^éyÖZč…0ˇ Z˘ąpçď',9çé ť Ц_ć•oÚÝ9„l?É}ýłż‰…íMM~Ě}IcRŢ•ň‘)23Đ`^c+÷ÂŤw ż| P°Ëâ=î‚%pŽłý0í8ń§ŤéěŰŚěčTą¦Cƶ{¶Hę\g8,öő\|žŻóČRËëcIĹn~˘‰OCjş–ÓŮĘŚ]0IQם+?Źŕu*Ľ0ęü?ÁoÜć_ô[EÖ±J@=6đ ŽÚTZŘňü’»¸ŕę]†¬bRoč%íB=˝vRue"„ĚŮ×äup÷dFíâT ĺË\ĚÉžÓX¶ÚaI©L[iŕŇ]őËđuŞÇIVĚđh@Ú–‚'Ě-÷fb3Ví Ő{˛ÚőĚČ›Öß4ĹČ*»!ýV= –‡ő&Áž›RĽí;ÜÖĚlĆ缄^h|ÖHŢÝ˝|ňoć•îżFÎ=i˘VÍëjľcÎr#V:a]LŰq˝._XŐŻ˙1©Ě6Pi’:"şIčy°Çq˝Ť—s˙l5“f¬…ÓĎVS~T…tQŞ >ĽŮŻ@±Üâĺí¬8Čč]Z§DŽTȶłXţžt čĺe9׼eÄĘÓFňvŻUÂ;öl–ż–*ue@ęĐß´š*Úáľk^ÎkÇR¬X·P˘·öxÁs^"pÝ;:<Ô;źuŕĎÄCţZ 4)*OőŘL‹/č\Ĺ`i.‡ WWý1 Ç•GŠ{ÉKşL+˛Jy«ĺ©’éÍ»¨×Ě[qó CUôsn#:Ă*Ľ0Đ–g­·ĚÁ€Wđ{˘ťBʶRÁcnd€+¨ŠO·6c_5č´=-ݲľi†ěʨ´µrC“?ÚAD?ó…A5ű›ty5frď€@I°~Ô‘89úؤ,dŤ¬ŕ ©I´/ő\ 3ě­â żÎď«Y42Ő´ő~ć&nÓúĽZÎRĺF©ŞÂ’°«NŁ:‚ŤĐX —‚C¸ťÔ’* ±ĚÄaîu§ă˛¸ĆťąKăa«iÉu$A Ť–ŽORľŽ˝‹´ş ÁĚW$ź yĂ+Çe×33ôŘ­Ź"ôLź7˛ăĹůČw45®Gîůő0{ ë|úů›‘°ÎvjF–ĹW0o—^łÁ{VÂIȆcV1‚.lÇőż¶ ŞŤÂb=\G_˝ŇUäkÄ˙řZi"Ű:q/[“Ňân%?V‡×—ěJ·‰qgÚę^dY l7 <=‹˛X_9¨C¶T5vdĐĆÓJ?…Yí/'§QsY¶WBÄnOÔ»XPýAí endstream endobj 1331 0 obj << /Type /FontDescriptor /FontName /XTTWYM+NimbusRomNo9L-MediItal /Flags 4 /FontBBox [-200 -324 996 964] /Ascent 688 /CapHeight 688 /Descent -209 /ItalicAngle -15 /StemV 120 /XHeight 462 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/b/bracketleft/bracketright/c/comma/d/e/f/fl/g/h/i/l/m/n/o/p/r/s/t/u/underscore/v/x/y/z) /FontFile 1330 0 R >> endobj 1332 0 obj << /Length1 1630 /Length2 18910 /Length3 0 /Length 19757 /Filter /FlateDecode >> stream xÚ¬·ctf]·&Űvî$۶}ǶmŰIĹfŶm'VPI*¶m~őĽoź>=Î×ý§űüŘcě5qM\sͱ79 P…^ŘÔÁŘLÂÁŢ•ž™‰ `egěć˘ě`§ŕŔ-GŻlfář+g‡#'u63rµr°3r5ăh™ÄĚL,,fnnn8r€¨Ł—ł•…Ą+€JMYš––î?%˙Ś˝ţCó×ÓĹĘÂ@ń÷ĹÝĚÖÁŃÎĚŢő/Ä˙µŁŠ™ŔŐŇ `nekUjI+H¨$Ô’föfÎF¶ ›±­• @ÎĘÄĚŢĹŚ`îŕ °ý÷`â`ojőOi. ±„]FG3«żnfž&fŽ˙¨čŽfÎvV..ßV. g#{׿=puXٛغ™ţ“Ŕ_ąąĂżrtvřka÷W÷ čŕâębâlĺč ř(&ńď<]-Ť\˙‰íbőW p0˙kię`âöOI˙Ňý…ů«u5˛˛w¸šyşţËŘ `jĺâhkäő7ö_0Gg«ĄáćbeońźĐśÍ,ŚśMmÍ\\ţÂüĹţ§;˙Y'ŕ©ŢČŃŃÖë_Ţ˙˛úź9XąşŮš3Ŕ1łüŤiâú7¶…•=ă?ł"moî`fú·ÜÔÍń?tîfÎ˙jŐ?3Cý7 #S{[/€©™9Ł‚ëߪ˙;–ţűHţo řż…ŕ˙z˙ßČýŻý/—ř˙ő>˙Wh 7[[#»żđďř»dŚě÷ @đϢ±5rţ˙ůŮYŮzýźĽţ«µ†ŮżÓý?€I»ým‹°˝Ĺ_jţ-´r‘°ň43ZąšXĚŤl˙öě_r5{S3g[+{łżÜţ«­zf&¦˙˘Sµ´2±±˙‡ö«ĚěM˙kéúWţŚŇŇ’ę˘ň´˙›ű/CŕßApUőrü›Ű˙¨FŢÁôţqđřĐ3spčY¸˙Ţżż qł°ůýoBţ ů?ĎňF®ÎVžťżu31˙«ú˙ńüçIďżŔŰ›8ţ3:*®Fö¦§í ţQ›¸9;˙%ů_ ŕoŐ˙qţ×Ü›™yš™Ŕ­.;đ†ZgdgşÖcçŤN‰é ö3ʆ9–5©Ö:ôdDnsWľ×…14Ďđ|vx-ť:~ěËĐŚ÷cŮRöĄ™]ř‘Q˘nPtqŇ3ę—!fžiÄř\-ĘmAhs0©ěL))ë—ľCÎt±:Ă\=Q’ąb|{tDň7IoŚÇěFiA«/:=ŁH>~z¤žé»Řǧ͍‡%ç5ÂöO=%Iqő2tľo2ů„|uçt©^ĘiÓ¨EMVóđĆ[v#ţö·ŤÎśyÁJdń% şÇ$´l/ëqÇRś$@G<):«*ŁßĐ˝,}¶Â±vŢ(Ŕ“a“˝ÂgŘ˝,™AVĚľů‰ŞN%$5Ľ­žh*ĄÎÄ…’©¤ĄÍ?ËÉÖ€'H..€-T8Q™˛#T«ßĺęGĂß RŁš1Ôđă H?ĘoNË|čńýމŹIHHË:ść,ćúUą‚-Np—,mŁK¤rÚşú×č*$´`FK\jť‡ěĺ9ë+nŞÔ†]31OŚtůťď]Ş~[źNOo†8{0â‚ áěŃ`łléŚWÓ¨–TďHą,¬@śBľ?[ŞöŮҢqÝHs3ťNô±îv~N§HZvßwŽÝ^ÂlŔăÖ.…» ZAÚ$b¸çw¤…¸‘z4™ ĐF &Ű™ZMŘFo—v4ŽŽyăsÁwq;°x㕝ą÷éuhŃ70ő°”*ŹőüÇh rÇ=X_w÷쥄üĽL˛˝˘ĄŹP·ţźTPl­ů]ǦLÇőYw¨ś?i –ĹĆ6ă&µ„i čŞÓ=J-2řžy6›Źr9J?ĚäČ5bxe}iűj$MÉŞ4G¤Kä~հۡŘ…—„y6¸¨Ł<ş{†8b0?Y…A€€Vî{M1ä;á‹bŤçRtČď¬V ¦Ę8ˇą»JBP`¦ů kţíuŹIŠôů5/bű—lö¬.öžVXl;1Â^·ń,¬iaÎ•ŠŤPľv Äíj ńA'ôrOäÂtďđŰÄ#nw+ňVµ:¨E‘˛ú3ôetą°*éí‡xąNL™ż­klÂ.¬Xś\mJ†l}°ÖËźN_5-<ő˙P×6E«fzŹ ęŤ$©ÇjdÍ|éĆů’•ů»Tx;«Ö'ŇŕxĎPW[oçř9°OW%×°¨1srđ^Żw~˝ĆżzHže·NRă÷»°b2˙Y?ők”Ë›˛& ›ĂĹ[‰fť«g§e·MÎđ_5âĚŇî5ŽqŔßäˇpąŻ[<Í µCíƵűÍľô_XéҨwj7ý9­!çSßž :r۶<Ą–\śSý2 Ş«.•—FEäě`Řo"wÉőäH »‚/  3vĂd]fˇlisô•Ä˝ Sˇ±‰Z[Qru¨ńí¨Đĺ¶Yô"mă¤C_‹·ĘçŽĘţś—®T.>‡AÍ1#a/ŐSžÎ['çěńDäńČ_sÖ^VŚtóČG&ĆăŕĺŰes»úü!Íń ‹+á»1*R˝ Ćo=>Mďľš×™óý»Äüž›0Óů.»…Ű/~ev!öűIˇývüxýdu;‚óg9oÎ6AP öüŇK«%ă;H„ŔLwí"«‡ [Á†F¤0ą Ź“}4BË7UĄoU.ăOĚ™śđď %“x¨#FaĽ—Ů0h(}_řÉ€ĺçg—ŁüQčg8ą”É-eřňe÷UúßÝK&¨mő ľüî Ě[ę±yŘřhçRm™ń2âa„‰‡7;uď+‹44{šYŐn÷9]4&Lő;Ňľ?™h‘ ż~ŢŔ^!»ż^«°+mĐĹĐnüünL–żfE~kR¦KlżLŢ‘31´-.{ćYB!E`DUVËvă7&äJĎw†Ă—‹ť¨›’ięQf2„ĎŐņ!(ŤÍ™Úçł3–…@/ݤ^řö˝“ŇňŠAlIîĆaó°íg­DöĎ÷R;˝äé;~ ÚBĐ×”Ýŕ E[´+Ů:˛Ľóű(T0żľ}łǦĐGpaŢőÔ‡cJd¸Ż›Éz#DéfU:]qśÁWÔ±ť¶ n±*ľŐ ué’7ÂôˇĚÜÁwz2‡ŕ˙pqJ­čŬÉę,•Pý¶·ë„ÖÇ7Úş@ ŔN1â"FŚaě¨NaA¬# l›*ë|9háxîÇůK áľć˛fí­á9>}jÔeLŰCşípTfC˛E ~I®9ňHcĂnšťVnıĂ6QCr ÔÁî¦"Ĺ|ú=r.‚Ť Žl_/†”ašť>.luß[UŻá!MCéj¤ń‘&™ćY?{´§@ë—Aô­!–$ěŻIŃéurݞ¨pn뤸:Ą1˘*“A.ŐÍ9}ÖÂťš¦*Ż${[­Ę[ťRěú Ü‹źŻ=X˝ŹÇ롦Űç’ŇŤůčaIŹ {F“<ÓP`7 /uÚ”úëčÂÄ;Ś9ĹÜT/"ĘęczÔŔ®ôHK Hř{¨Čp«>7V7Yiú5WJ׊°*ĺ<Ď—…ŔçdYĽC‰[l_1“3&…¤Ül­jár#ŘSí˛;“Č8: íßŇ9ž§~ÓřŤúú÷»6ż_lélĺĚ°Ş‘Ĺ2]Żl)·˘;w?eÇŔ—¬đ™)ŁßË·­.ňŚâGńźĹjö{…çSÇŢLs$ŮňzČQθw"Ý ţÚ^Âşĺ—:Ŕ•f  •ę/ľ_·Cořšî8Nç´**UTew-"󮵄˝ cŰâ…VQű€Ń×čę<G •m÷¶VGŽËo¨Đ«ĺÜ —Zâݦ±»o<^„ÜW«9—÷{Ě=›ĺóîľ3s`żłgŐ5Ż=^u6Ćh{Ľö%ţŘśËÝY@`0µ¬p (_—UÔëŔŰ hÜ’ä˙"WőËď‡|«**Đo ˘”23 ŔçŇ)~ć4ř¬L2©6RĄAč¨Ň†(‹’ŻĚçÁ?C Á:=ŮęCP˝Îëíé#伕i©ńűćénZ®‚ΩX&„Z’ë̡X‡\«)©”AĘÔ˛Ŕý®3˙gV&ß7ă¬fÔSĆ—Ě)ö7¤†Ťö;ÉĐţÇ€Ż˛avťĹR„ŹýerxĆ/Ů×Ehuc4ýÉâDęvç~v:UĽ_pl·ö"hüťó=>»L«)ˇ—Á_±ökŤżo©°¤ż äpXó©ă”nÂě{źěvtďUÚöV°=K¬T‚X .©pŐŃŤÁéF)ĺ4?e‹?|–­˘®Čľűc–ąť¤ą‹÷Z:kĺM‹Yۡ`325që´¶cšs ĎňUFUźNp˝¸XŽT§ă'ŠRoöśÍV'OđĘp–ÜV?Q|tŠŻ˝áQÍ$äŤOĚâ÷×ÚęÁ˛p˘ćń®9—ž^"1´wzwÓ/złvÍ8 …˛Ă ô<üM &|Xő=…6ńLëĎq˘ ¬1SÝ‚ŃÓîRE¦4Ő_†+;cî=A(’ţPp’‹CçYá×űcZc±=%ĽF1ďmţD´\xŽÁw4 I]őeÔ1 ¤¸Ĺ ]çáeOA"^uŞa =_Ż`ëů-7XŠU¤%~'ńŤo`4aPŢP°ËĄ†N…ç¦M•<'+Śňu°˘ ţŤüÇw2“'ékľś™g¦î`@Ú *ü’ë­“;ű{ $J1©ćďa|ĐËC´Âh%[Ă•G UĺL1#¤Đ‚ żIr2·©<'ĆᕼŐ8q8Úů2(J0śŐĎO;‰'|fímoňˇ—-~úuŞé3Ť÷0ky„%˘ňZčm¶Úl‘Ď_Ű~`Ňîö‚FżŹĘ˝áeëŚĂ3´vzR˛¶őnCę§Ř: űĽD’¨‹&l;¬Ëńq‚íyý¦]w‡’Q:Ý2r‘(s¤›8ç“_ąńîĐ$ ʦČ·Źą'2«lŚ'=xCr ŚaB1iü±j˝)•ĺşT9ĆŤ‚áq„OcT9¶NąU!iD»o\ ţ€3•+]RDř!ű^ć4ę;E¨w9úď ýúwČş·AŮŃ…WCĄüăťëptŚ9iöŽ?Wś02!şżĽ@ˇ›öĆ,­d iźŢ©óX´Íő°sXDŰlămŁŻĘ*×ôÁaŇĽ2}«íČř~ŠźťÜ0ążÔ?š–•ťDŻş´A§Ü‰ýđk“m›ü-Q«Ëé<2i!XŢë˙V8[ŽÚnĽš¤ěîíčHY/Ón¨^ą‰g[lvŰhqÔć éi;łRů ­uÖĹEl5§KÉäYri+7a˘7s†ěDď›gAž©oĘ`g·dtAż¸’KFŚ‚Q‚ç/&|@Ä ,ŽZ–3řaµcuŤö¤}čâőÁ!¤^·ÔČ÷Ăű…ЧZ§#‘“Wbk0ŻzQĐĘĘŻg9ŰÄť˛©¨b_' ‘ÄŻňÔíţš·řś2¬{¤s'ŃT+É(g#cmQóç4M-¨‹ň[@»í ”Ý.Ł©;Î\‹… Tżąaaß7€V~[ĽŃ-âă–“żÂXĄŁýńĆnóM5ęř.éĽ]]Z9čĎé~CřÓi‚‰­›&“]ľŽrv€íţ®‰“ĎŃ`‹ ©’ętőűŤ…ŮVýYă%ňr2Ç4’ŔťřňüĹusłq;öď!Îţ%^·zvo÷Źu~2¦8Ä®ă)CBlY†”TAUŢĐEއÁŻ_ěűn©gVá$|3‚;,’ôëŽrđ/u,ÂČ<ˇßUfŠ|ßNş3 Ňłţă#"QŇŃ€ËsBx†BsA›ś(ߍ;Üš°-$٨°lĹäVÜVé rÎĆó©fľ;íĎř8ŮŁcęŃŹMO ^ÓˇYiVRl“ä?=˘ÎU!+KíUuŮȢ#úf`©}ümq‘uKo7ë7˛őר¨mŃ 8]R-3„ýG¸B¤ľWJ‹í>łÓp}—OţuâŮi[‹~ż§>"~éΦÖ:†$žÇIsĎqgŢÝű%ßkKz™!Ţ]‘P™O~ĹĄÍ Łüüq:'ëHTa‰Y°¸÷;:­4y ł?qňy®#Č$<ź¶Ýô“MÝ»ą ?/»ń aBÝĂő˙>ʼnłçÔ˛—µa܆yO|4ęĹö7Ök5‘ĺC%9<ô3AµhĽ‰< ›á ý\—S÷I/k–cl?>ovwpIň¦í‹Ó˘“čóŐÔô, §őşţ{ąĆ>°Ň8łĎÉ0-)Ëű<—(·3Ý׉§j6c˘©n‹ˇšâdÝşŁR­ŕ˛ŕkŞö•ťň˝Oëř4šnţÂŮÜěXg_l´ŐŮ$Ó‡€Îhö´$M{čáÝ.qń9%4ś‚EöÄ‚jFź.\1×MŰe8d5Ś#h&“Ő=lKg)mh9ÔváŢăŮĆĺrÂíË|]GŔř[wŢĂHç z“˝á× Ľ›Żú©‡őhLŽ ÓR*ęč˝íť"8ˇaÎrš‹evDˇ]4EýťĽçe¤έŁv^˛đź{äÉcíă´g |EŻ‚ŕVµ8pîI&/ŔÔ«95E<]áI ĽgҡĐ­!Š\nr¨ŤűčM*P”,‚‰›{¸ŕľ1][O[»"Í!RĎď$·Ăčâ {áĂáÚŰgLŘ?ĄCďĆ> Úž,Ţý E:`Ö–Ă—d{D“©¸)m–ąú#0Ď"*y 9§üT­¤ß9gşšbîhҵéÎ9"§i˘z÷Á™âW˝_Ţ~O8_¨ŢÁž¶Ť8 Ą,‡Ň^řć<ůâˇü2µcŹ0čřÝťĽĄ>†C]s‚m×[ĎĚnŞMĆEgfĄ˛bÉaJR…˝éf—2\Fđë—G~ŚÚ„ÉÄ€)[Îô­ÂM8ÄMúđř›O\‹•±˛ wή®'sP[7!“ďígFäËŇsR+ýťţ=ďS7 G6 6 Óß‚3ŹŞ­›ÓeźÇżă‘Â5ÜŰÖÇáŐˇqkN„hÄEK#¦D×›r˝ZQJ2ĂÚ’m=WŤuä;­= Ű"młý„Ľ>źÄlÂA§Ö’„—¶ź…VěŕCöH"_˘>­^’z®gÖę• »e€óU6×1ôbú˙‰Đmt-Vbqµd–ęIDG…´S«ŃH_¤¸őÜ‘®5&ęŽkăÜosś5ĆĚÜ«P‘|‰Ń.q’ť űD=n mpŐî0í`]»ü‘i–Ç”těčF7‚żĄYąLľ¬R|5˙:Ü:ł°ĚĽ[Ŕó9»šUĚiÍŇ ăăóôhťOĚĆ‘xQďdËNőoÜÄĂ·!×Sh>’3yB·"ś±ťi´—¸vY:îśűŚÝÝY*ľ×Ť!/OXrsűVći×Ďz~ ˝Ĺae8×Lň°g[ľwÖ\Ó0z31ÓÖ¶r' _v”1‰OŠđZ0~„E?&őŚBł~3‹žXÄ6´XO&•ëšeľ—P'ťzUohňXőšÜ‚ܶ›qÂféŹ[ł´îăHĄÄů1Ëö%-ÜLö Ç%ŞŁ1—O°ëiÔ BÇ„|Űm"ĚĘ"hDŮŻŻ¦8ń9öç!° 4uÚö“˝Ö·çQµÚh¦ęé4xŽ ˙& Aż$ś( ”`ćRóĂ­¦|Î ç™E^đć°îqÚ„”bƨ„޶Úö;'EŤł%ô;D:›)=~Đy6z ·rťĽĘ’A#2¦g%®–ÔL_´óׯîIMód1V*oŐ6ŹŢ°^»¸đ_ŽÚ^=䯕M s¶J?vHřS03Č}pLy»}Ďyµ7XAď‡Ď Ľ§ ŞaßÝcâÉŘîĚ|íRO ¶™g˘OKä…Çéźľcţp8CŤťv?GE·-u1\Aé¦pąşXČ đc¨‚ú[Ęě«MŠ@ôR`¤ń5IŤ– ČâFłí{ ŁX§dĺ ă.Ăáxć˘č€ëcć{ŐăBâkG7ś-ôŐŐ3ëog „×ĆD=SsQwIÂ)˘ÚøŤ-<íJ;śz6ŽźNĽU›â‰«q=^Św‡¤v–­3Éă7ÝF?»ŻĚ?aČS>ł+NßňÇ’đ˛’äŇN)ÇÝŢC™^r?ĹO%d‰‡ˇ= «úDwé}bŻł$ Ż{S˙ś•Îăîę^_/ů 6 š2Ó|—_[‡ĽîŰx“.bôď€îfWšŐjsČbM™Qݍ…ßě¤oŔ¦ÔüŘ|©(â^đh‚ŐLC]‡ •FmĐaXąg˛$DVcš{Ć˙h~©Ž“ĺ»Pž˙akŔ4ńk-Ä4ÓżŹśĺůiP¨ ćÖł±Ë©íŕ#dŃźFł5C*pç“iČääˇf~â‡ÍZ’‘ÚgVĺąÄ»*7Ž-´ cnŚÝ»fPPÉęµďĆhź97ź’¦”Wé]5ÍŐĆo4CŁßÔ×a¸ŕŢřâ=ÜAˇŰ2“ŠžB°Ž˘o1TH;Ç*ĎFŐüH2ĂŕKŹńBž÷©~žY%k› NO™ÉC– ň° ®ŞĽ÷Ťš #[›1%´TD2‹ôoŚĄµů Ŕ$b\ČĄZ˙BźÉůmĐ`‹Z‰/.ÜÉ.-$ŐÍ@Úţ/VŘ Sű |FŹ!í:Vż_PśŁc>ĽŘy¤ľ^{§Ťňś`·?-ď®ŃQB!·‚· ¦ç”ř!|8%I ă]|١F@¬@†?3ďWńf?…ÎV‹â0?_›ŚęU!X¦jůÔmÍ÷Yť;pbN’ŕ¨őô@–óíWŁ@!Öň}|`Ŕf*Ý(ßí˙xsSťůŕ.A{t]c¤cb— řrĘšm»9 Ç\a—ŁÚJnQşŮč¸)-()ék鏧9PÝߡ~‰úp#rTÁâ¸m3>ˇđ•ÄÜšžxćwZ×$~Ý\ŰűŘeľ¤űAśÍîP áW)°’ćĎĽűۢGźŹH†&3˘ĺ»SG´‰*ĎLŤŹx™ÇíĎ-ÍíŽ&(UĎ §%V~‡’"íO´ëîD2Şźµ(óýĘ‹*3ĽŁr©®†Żc±P`Ú Iö‡î®źĺG™B¦rKĺÝŰŤ­÷>›o(çR,ĆÎkDćŔÁü¤<¦Â›Ý ďńŠĽTa3˘NěŽp'OsĐs‡¶ŔŇ÷Ů6´sUr†wm÷Găh1‚›#1D/Ććß ›ŰŚÚQí^(ѱä„ńS«đ´ë1l°keü陹Ń4ÖĚča]±%!\®ďUĐ OزE8WU ĘĆ;Y"őô±^0¸5|U߆x€$‹ McPtő””ÝŽźĬ:ĚT]®ç8a ˘ČŃľĺ'žMĐDŇÂ]-(şůîmŕC¬’Ăc±ś”UL=/ÔŁ–í0„AQű……µĂëZűŹLh®Íxwm:jî’'v8óW9nćÝńŔç0Lbđ‡ăł’y‘é4‚»Ş'mŽ?ĹÓZ!ž [ŽáĚş›ĘŐ)% >Šî:ă*I-ě˛ ±ëŘľCŃC]ż?u0>Ó ~[6¨é‚ŐM–z[—ž^­‹ý´µźg|tC˛fS}p’]\{–ű’2ŃÇÖţ´éÚ÷yÁ!Î_óĹDĄˇ®Ń¨ű1›˛]–ČzÚ‡ĽŽş­®P•ZxĘI߀eŤŮş>ŞXŮ‘ÎÎŃ•ę\s…eL•ËÁPjëí-tě˙–`G8e4˝5”EéB7Má’W•×ű¬Ě¦b_+čű—h|”ËŰ|ěii HÝí˘şŃJTŔşŤv‡‚Őę’o:yĄ72ařĺŐ-‚÷ ‘ˇ3Ëź’\3%„śj¦© §ŽZEsV}%¤8Ý· idYŻ(ż j0Z6Řo±ž±ęśçňăŕ™Ńg{KŹŮ%Ý€HEŞv§v˲&×d5ńz ďľ<=÷§2Ć{ńš“ íⵑ®«Ą,M"¬.,˘ú®j˛‡f ĹŻĘ~G­ŻĚ€ŞÇNŃď°ÔŮz+RPő§6K$ž¬ţĄ#ÍÖ=âřäF˝Sž ¦ô"łË›#Ů€FMcm‘LĘŇŁÔ«§‰7_=ZŢMFÉúŮ7ËLËĆ()[˛ř¶KŁPĄtî^&ę¦ !´'V¸…[YÉM—šďj"ËÁŚę2±_ đOźB¸FŁÎ^^tZý`ŕčäÝ·]ľiä÷őYŕ§ŤŚű;ŃsŰf)JfŢýÎ|ŽäĹÇŰY›’‹Óq}łN«sÂuŰŠxnúé7ôެöśęśń2ůyBH÷é=ÓU‹Wů=f#‹Eˇ~z©¦R~řZsłΙ»<Ţ‹¬Ö¶h_QxŐŽÓđŐÍoZµ+ACgd‚řR¤”m2[D‚m¦‚H÷ЇRMşC"ă¶ěJxÝá),bˇ]ˇ†Yĺżkjq{_«ľŞBÇY CşD…T˘’ńŐahý‰ŕ1ľ*żżGyٵ@›ç9ßLĚG„ŽV<ČÇ,ô;%ě.vüdP}zHĎřöĺń…-őBţ¨ęä!0E8¨t?^ ±ÓDDč ňňŤ …î|=gáôvá6şfü2=(Čľť‹BžÍŞ:ŇCß§&ywÇP­fÜ\ü0# c˛ŔĂśôźkŤňa0}ĚPÝß'‡děö1Ľ;Őťw%M¸p‰Ę¤ű.6YÎ.1˘‘nżű17±Ľ÷mLOć˙p2P˝†Îvšsçwµś˝µ•ËJÝŕ´¨ër8«Äqép®whkÔQ«ŔMèjă=;`ź°ę]’öaźíźm ďžÝËI)B° ÷NŠ˘Ĺ"Kö;.%îöŘ+~řłŇËMÓ.–%DŃ‹—o8‹T›zYâÍ’Ś‚lŻ€AtFq”Žt>8§–úM˝łˇ*˛* hŔęB˛B+˝ÉÂŇLĐÖc¦‚IĺSî4HŁň ä;Ů&vę˙^O«Dß]ůđ ĘR D™ˇ/ "¤Ŕň”sC¸Č> ,Lk7 "#LĘ*ĺŻČĐ. ¶AE@!üe.©Ou¬™dśoe§—Ă~Uę5aj\‡j‡YٱĐÓ°ŐPQ?n „v¦¦ý`×¶]ϬԺsśzŽŢ7î˙¬-¨üôcĂŹŰ©Żí˘éÄí E%Ě\ͤÎţJYKó¸_ŕcŤ<?­šş`›đb$*ż+Źxö†÷ŐÖĐř=ŮĚ‘Z¶>OcLâ­ŕܶ=ŹĘ7Ú«=~—’˛ű„ůŕh­ěěśČź7Š3@–C9V•< 2Ní}ŚĽ{Ężví*ě:0Rč>|Ľý·¦ň-ćŢś˛iTWÓ+ŚgĹ™®Ů2ew3’©´ó9=âčŞčO`ůx/1l)«ÖżÚ‚Zü9őFw ĘBůFlČ-—HÄTĺZĘa”ÓÓź´éţ:SŚ,ç×,Ăł ąXe$ü1đ–˘hń#¬Ŕ٢"taÎťeĽ'ŕĽÜ,őx™ňŚÚüĎąe ĎżEL‰ŕÖí¬xÍ^މ3ŐÔI~Ł5őO)ęoRă+ý— ,ťý¶ÓsŠ?.*“·Ű•+Ô?›ĆČÚâh{ń‘ěIÚ Ë„s{{T_njGżń‰á‹É{şěm:ë÷áşüT˝…fĹA4÷MVŕGeŁźuɉ¬: DřŁ-ĺˇ5îqxóŹ»RFMWˇG ¦@¨!§d“bQS3X/Ç+ö$! ;§jĚbŇÝĐŮôąiś`÷67ö§»§°”~JqôéO±Ćh-ôÂß;uÓł-2‹ŰO*ú®/˝Daő»ž¸aOj‰ëAs±xńEíTTCˇ‹–žnŤÚ–ôď ß»ôÔ·Ě ť}$'ĚÎ FnÚ\XČ8É[ě~ô»ę Čâą§Ě/2zdĎ$ÔĄđAN µµ‚+E«ŻeúÎR.“J)”Ńú˛ŐbŐÇ„?Ĺ{N…ô¶ ŕ_íďCô Ď@e3C/’F“u=ő+ş;„s‡»čńf»®CV2V¨(#.$©gaŁňç‡{ۆnˇ9éÉNô,ś+ă4ÚBď]4JńŇ› X0łFŻsÇʡD;Iúć"›GČ ÂýŮL5j˙@­ăü®ű ­ňč'ˇúvŘ"ýEâű©0á3ŘĐkÝ>é¦Ő‚P˝=Şa’˛äĺí}_c”đýý5Ü™Ç@ű*'ÔV˘/ÉŐóËI’ćŮTˇ&¦ČűÄ Í®<¨ú˘Ę‘;m,™ź¬X‹ 8ęF>\ŚDGÎ*‚řÎ9,yJUĆý DĐ)ň l#,.E"s‰đˇnl%¸d(L%ľë7QĂć-ŢCXżú¨zŢ×Ȭm^•™V† ĽÂ…|0“×čĄr,á$é\7`‰ŻąU(óB*G* ü°ëÜŐ‚nÜűŮYÉ_çj”2šĚŕt4RĹł‘|@Ĺ!´çĄŮÚKĺtĆZĘ˝Ć,ÓĄ›s]K} ß´UJ +:Ýş FČ‹Ánî¦Ě{?Y·jUíŘŘ1µ$^ęźÎÚ"~Í˙Ü|Ý]â[YçxDuĄ!›FÇ®´¦űdćëtÄ7v –ÂöüůU‹ÚĄŔŰ\Štľö.OR‡§d„Ť ĚBÉ‹c}¤dłŹ,HóĚ-D‹şšŻć Šbe3Mö˝ľééťżőü‚5—›]×7Uę%tÓÖ_…±`D˙šÄŇ­P^ |ąĺ0ľŻorĹç:’S+BoëhËÍ·ó'-Ë™ßoµ6 H˘¸ĆD{o3P§-B w—‰Żˇwôűq“OvvĚ)>ÉL9Îřˇ«=Ńş †˝8}ęfԌʆĽŕ±Ţ=¶ż;ÉŽËv1­5%Ź÷C%Ľ c»ě>ŠŘÚe†‡~mµ’$űlfÖqüfB¦Ävť!×CŢŮýlMO<í ;y7uŔť.äN0_ŢVř˝řq@g˛ꍧ®–‚<ňĆîÖáÇ>}`8xú)ŤfŤ‡žÚËŽv~“p1Iń4˘µ ĺé6śë¨·{ÎýĄ‘އ´Ü@Y39ĎQ 6µÄ…ŞÎ^¶ŁÂđ|©bJĽĂ¸ÔyěJL1f˝ôŠqť`źśóťZŽaě¤ń&]YS´ÜĚí+ĎKŃ8–TÉkÖî‹Z™Mń»­‡Ě†ĺőu_>žP!Ěg:ľ%ÁÄ˝^&+HńĄŁ—F ŢÂ0ßÎms‚DPëdőHnňôł/Űô#Ę`Ç’çÚŘęU±ńĽ agc+ĺFër–‚·¬É‚Q 64É6°/h«qöL§ĎóŁ?g˝4>ŘKp°AŻqť”Ѹ­ĄŇE‘­˘vÎ’™”÷ôĺ6H©?KwĹrüŃ$‚–,k´gřc±|ď‹™Ô'NSăěţ=‹îy|Ĺ” ČlhGµŮz&đĎŕ઎JęÁ#‰÷ńCřpč4¨’vNцÚ^ŚqŰU˛$mžuâěř‹µë3ĂËŮń—túÝ!† ŁÜXÝ…`EźtśŻC˛ßsďű^›¤»`ó”ĆúxŔľz/ëŔńUçáŇ™\yďŬĽd |ëPŢÇVă´9ĄŮžTH0IŃ+>pŃ%ůĆ©ě\Pµ› ×óĚ…Ť<ÉĂÎ{EááE¨MUÄéQ¦bP:ś-RŰ2‹2ÝĚ=zš/Ę’%‰«Jô‹W Nž¸ÜĘňâhfŮh}žú»|S«?¸‹Ě’b׊{KY˛ß dޱ¸Yk8-čź%âĘ qQź8|“÷8¤•"q˙Ş×‚„e“x&|DgÝ›”š"łKŢOńł k¶°ú‰†VťçD*ađ“4łĄŞáVµŹŠ=Á¸ăÚŤ6§<§µz8Y Ôxj\K‡E€ĆšőW*9®Š_Ő qŞ z˛ńŃĄţ óľ .VĹ؉–Ŕڦ®Uë"Î"ó/¬ŐT×W6w´ŽŤ ŐaÔFý“‚T§˛ű!eâí=č›óůęmAuhćBĚCăÎ*ű´Ď ęcç÷yĎýW `n{ůÖPĹx‰ď`ďBŻÄQÁČ!µ§÷ ĺą{ qB’fC±tq_8{•řLÜńGeÁív!B ʧżP~˝č,ŘiŞ;3›ĺ® |@î`&:dL¬×Đ3V?>SđŽ2‹Cď FΡA®şÂ ŹÄ®kęwÝ7x­ć¶ěç8»y:>Ć{8·j„#š|˙ŕá,†l—C且űą3’E@ëhZwŞ×ć)ęÜĺjÝmÂÚčţčPě>:*í™çđ7xŞäłşv4Śh}µHŠď9çiőĺ¸/¤ç„€jTKĹ˝˝Ő¬ÚÓc€Ř\ťű®ăÔÂdVz{t5řP'uř?yFOčnŇ=Á}ľ˙Đ4üă'śő’”ËY°‹© X“¶łÚđf–ř LAťĂđŇĄ#%OXl†0xĎ[ł](ťÂl§ĆĆNp´ŤI÷¨éd*úÖĚSŽĂw?˘v+hŁ­Ądé­Uľ‰ěs płŢ¶Ż!fŽńZ>SĚl\Ěýčk|mŔ8jLBŰ÷Ó5Y|™kŕúv@ÔmđÁH0Üźő][(aÂĎÂ[ ‚W,›ývý†ĚUčç#Ú˝ĘY íXF˘ľS¤ 4_©č“*łś=l%VKň‘Ó–J‡]ČN‚Í”oŇ;D ‰ČX¬™Ya6Πő>-ů6°z"Al[Ď®řëji™Ćďj»KË_Ô®…— ĎçX‰–‡ŮąAžá/EĺČąWoNzPë´ĆEĆÖšňJ; |49¶¬ŰĂ>˘ü”—Ý“)IÉ/­±‡ů*NôÚ0¨”›ŘޢćžÂi'V2÷Öv±€­ő˛®ôóř\±Ă<˝2/ę.1¦wĺËČ” 0$7Ą¬ŇčcŢ0[ąó许îbÔ0Ŕ9GLĚäĆ|5vÁS#ŘÍçŁęö ŽW·˛¶ŽXZ1¬ByĄÖgÔDC~2Ş_‹S™^ľ¸< îQČăX©0FŞ § ÁÔáŞć0°V#•pÖkŃ_B÷‹®;ŹËd5ţi˛Żđ#(®L7<=4ŕ+‚Śůŕe›d•vW=Ä‚t¦&lvr5ň_őAĽ_ť·h.“í¸Ţ˙8щ=F”ĽlwE#sĎ—3{Sü3Ęö#çÝź’Š=㉠GаçÁ­›»ÂýŹÉh‘çô ‰ź–G1ç\˝1`Ź’ř­ş}ÇśmŚęJÂşŘVŻÚúŠ«…!‹PŚÇ“úĘIşŤ>P‘–ÚÜh«A1@ŠUoë”E„Ď0>âŕ ›o€!ˇĘź-ńľMG‚đ[\¨ř»@6Ť§~­YŠCĄÖóITŮ\Ż,OK„€‰Ş4![ÔÇŃ'‹ŰcĘwř¦´řr«ÖKíz$ďňů:(­šołş?lzËá®Çéî{wőÄ.ŮUúŹSrĄŹ!eëľÂÉG«Ýťx¬=ýR›—‹ÖŹqXŞ ÜÖ`\„~ľřEf[*˝ĚtĘÖv†“Ph.ŠŘ,ÉŞ—§­D|>yŚ’řWä­Ŕ ‹:׼ṎwĽ3uc8IăkďŔŹČž¨”îßČÝ w%łĹ‡7ĨÉťqËzk 7…őkŚ; Ä#©€I.ĆžĽ„q3ůH. ŐĄ(Ď`gÜ‹~…|#oĎ­·XHú“Io]sâ«vZ‡q ĺPÍ“=ŞkđÄuUHúrI9ôä0˘‘ 696XŃ;ćŽhŠĆQ"’Đôq4×M~Éf,ŚŻféZËÄąąţtc·op΀ddÝZsÚĂ.uĺČu!=›ĚŞF)ce+ţĘ´ŃÖŐYy>·č˛ČhSV Ü0¬]ŁŠî.ßŔěůń}ŞPf{ŕçd¸“ů. ]v‹C ˝ŞHÝ0í]˘ ý§éĆţCŻJU–j3żr˝}9n4Ba Ă3zŹĹµAŘ:Ąäč›{°ŰéAzµEzťĚŞ„Ŕ źˇ`Ř8ë¤Î9:Чζl„ÇhV‰ZŹ=`ĺ;lŃϸ¶ř;?k`Ě]iž˝cŚɆŔž8bB踭Ů ş+˙Â%ž‹řŔŠđ†˝_ÓÖWŔ»ă+‹OčɰĆŘ…Í˙(>ľěń‡ ŁÓj7F^őíT€ťtTĆźÚ&Łßß[m+r?G˛=ŁM/ÉžŞWTí§×ă›^ 1mɶ‡zŐ"Í‚Ď ×…îl˘Ç oTfčŤĘgŻŚ†´Đ»]­‚VT*y{˘LzˇóNT ĺ3$<—•ŮöPóž+ěäđ«˛YE66ŠKţk‰¦¦l>=¸Săm#ĎľR¦®S|¬µt8Mč˘vŞCŚB¤Ć·]˙6ŰÉL•žTˇF7xćĺ$&xĽîĘÔűl0ť«”ióţ6Ýá;×±äBŰűćp±Á}<’yýt„Zš‰Đ`˙…Ľd€ąµDŕÇéćšk™ÖťĐ‘nâç Ů?pŐ4Ą nŻ„ţŔ°›s3ו^H‹[Nˇ%¨4űę›Î/mŃU‰ań»ůW R‰!ŤX^ă«"×F*gćIŐ'q=iöŠQ 6ěŞT˙eeCÍwWs29u d€ÚuŽ;±±íä¤S$‰şj…eÇWg®ŞAšsx ÷°a>l±wŃ %ţ‹ĆOă_ň–Yóg„yÄ=śÓC^+Ľ}’­%˝´?¬6 ®U䏉:˛>YÂé:÷'V˘ýč& ˙kçłĺŤu[¨ÚÖ-Ô¦w«üX(đZĹ\ °>Tc ˘OĚ•Ógżv ý5Ç)ÇëÝüI2±k;P§5ň![ :TMÚŚŹç3ŔOŔ¦KH@ăýLo~¨bLL4IßôgŢtŮ˝´Ż|Svá­’ăř¬¸—›Ŕவî¤Č˙NčzkDS“+ZvĂ:ÍvZľEś•kµ÷´- Yg#Ő„‘Jz¨ÎYYÇ×Đ¶Š˝ŰŁ@YG_‚Y˛ű¬„1Tçonâ¬h]ŘŇPІ2ŐÓO‘mĺ6Ă)<ĎvF"— ď@˙LźCqżó;\OC¨Q€rŠŇKcöI͸L^]žeS·ßé–ŻÇŇ‘ Ňôo®©ő©—9 ÎI@ó4t;\ř]łé#S^˝h+*X8ćş‚ÚÄ+Ł"őŢ]çF6źrÉ“śmMÎ…Ô3—ľ- pV5+čÎăyqÍć;đ’ úµšJ~ô„e ĹÁRý*ÄdDÍÇU_<Ë–<«ô“ĐŔ4hŮ9«S̉9Îp"€…ľ3Hďť0sݨ]ÁLÖ\ůnTĽ˙Ǧ&fŻd[±ß ®ú†@µC0qSˇ“î§»µ óTO_Rł-yKAˇ3_”ęeÝB›»gO˙ËŞfč’˛BWýü'|(~‡ď"÷AüuôŤł1źô¤M&;×qZrĽŃÝo:Fˇ֭ݵÍĺ !édî}ĺ|şTöwźÂxż9"~/6Çö Şt&!žł˙ĎŮĆţű·ý$ĹSőO÷¦­Qw`(˘ţ¤7XÉ(/&Á< #YŐŃŘX:ÎiʱűĐl¦Ë u˙©/e99«ÉL ü„âlđ iőµůçŘšĽÜ™YůőR×ÔÂFŽcô˛ Z-U¬âšG¸Őôůń0áuŹ.Ň<[|lě=iaŕq±lĚţFA4orvÓŽ\Ĺ5Ac7űÂś9R‡őî /Ü®UÂłî_˛I–ů!Ż_śĚYĎqâŢţ›>őjPës”Ž:Ô(‹ĎĐpíäP‰:Iĺݍţ‹‰Śą˘lϤw˘@Ý'9fKĹ _·?LÝIłJC:IxűtX-ŹG¬P-8©}ÄuŚÍ Ěz¦ŐYęě-’äďţĄĽŠç 30÷·Kč<íI__˛oËÔţÚŮéXŇ~vV‡PJ¨T"7¤±)|đpžu9R§jŇ+řŔ$~›5a*íĚł{p+;¬Ź—ľ°M9H9­íÁťŰ€gßáôB#€©ŕ¸ubdĄžĽ‹wΡ(,żo?BůIŘY4UÍĚĂv8)ĄW¸Đ‹ťOf~ĽŽ"J©/GjyźL÷ëta)ëü¦Úňľd~˘j»Ă†yś ĺ€†¸ČH łöđČóĐŔ[{<`ÍÂCJ†Ő\Ż ą¸@ĺ*żŕB¬‹úOu­;¦¬HIBšH `oqĆ\¶¬ĚŽŃQÂĚ+Gť%Ů!ŁÜő~·ůónź`HR“zEŠÁâ:’,ňuĹtşĹ÷ŕč÷c©›˝/Í@Ę9äI­ř4iôÉühÉóFć~WUZ<žűV,&‘ 1ďHrʺ۶X¬éŽ;–梒 }gĘ Á‘Ş,Á.  ¶,!oP5„ Wë؉žîsÖ‡ÔŚ$ňęÔ‡oáľ‹b¤ă] pŔÚBpY•M?<¸yi°ÓvôbËb¤n{ďë1ÇĚâ| ¦ęlVg]˙ńcE™%ižN†ôát„.O˘ž5č!ŘżńÖ>üÖ;ĄŠÍ@TZtš Ý6o€­‡R{5K}ŚY„?îŠFŤifm9űjŁÚK&Ďfř&·ůĂ–[fřďçĘx¤h‰°ŇÚÇΞĽD¨sŐ––ÔEŰÂĺřŰđ#ż•µ5ŞĂě–ŢjžGŐ¶˘^#şĄS«4ö‰„ŐűýVl—éhÜű4»ĂqĄřęîZý77'˘n'ź/Y3-Ń珀2±·ŕ«…ŹĹ^ąrľDÓl ď`5DwGS #č”÷­J"6e«őŢ… ;,‰šz“Žc Ť†Š=—śüşŕ%Ý®9ä)„nź“Цď8Ć• 33X1ák±s ž;ݎíÜ–(ň‘sŰ`ş¤4şě6yˇşZ[5ÝçżTÜHëŰ•gJ‚F·|ěüšwVÚQćĘ DA×htůňµ¬®'q~ÜŁş0´Ć“űGrµ„MÁÜ´oÁl}Ř'é=ă©`üˇŘcűś —l›Üň¨‘ZUĘČ[Ń'^¸=ýĹ Č S-Ě#ŮĂ€ăłzŻüaˇ×ŕE endstream endobj 1333 0 obj << /Type /FontDescriptor /FontName /IIGVCM+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/adieresis/ampersand/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1332 0 R >> endobj 1334 0 obj << /Length1 1647 /Length2 12791 /Length3 0 /Length 13648 /Filter /FlateDecode >> stream xÚ­weT]Ý’-îÁ]ÜÝÝ‚»ś»»»»»kpwMp N‚× Źď»}űö¸ďőź~ýcď±WÍUłŞÖ¬UăJRe53{ ¤=Č……‘™ hegâę¬jo§hĎ#Ď  ´p•q1¶|`””bN@c+{¸±   4M¬¬J€˝§“•…Ą €Z]U“†ŽŽţ_–ż¶L<˙‰|x:[Y€ź?>Ü€¶öv@ËĹ˙ŘQ ¸XćV¶@€’˛¶Ś˘€ZJQ ť>ŠPv5±µ2Č[™AÎ@€ą˝Ŕö €©=ČĚęŻŇś?¸DśĆg ©Ő‡ĐĂčđDp:ŮY9;|¬śNĆ —Ź3p±XLm]ÍţJŕĂnn˙wBNö;ě>°2e{ggS'+ŔGTeqÉäébiěňWlg«`oţ±ÓĚŢÔőŻ’ţĆ>h>Pc+3ŔčáňW, ŔĚĘŮÁÖŘó#ö™“Őßi¸:[,ţ•=Ŕ haědf tvţ ůŕţëtţU'ŕżToěŕ`ëů··ýß»ţ3+g ­9# ëGLS—ŹŘV ¦żúEdn`aţ‡ÝĚŐáźĐéď˘ţ«gh>’06łŮzĚ€ćLŠö.!Ô˙3•˙÷Dţ_řEŕ˙y˙˙ÄýwŤţË%ţ˙˝Ď˙N-éjk«hl÷Ń˙3€ŹAc |Ě€<ŕŻackěřkŕX™ţ_®ĆvV¶ž˙ťóżďÖţ#ë˙ŕüwř!D@ 1°p0rüĂlĺ,iĺ4S¶r1µŰ~ŢßvuĐÉÖ üůďóýpbfţ7싥•© č/58ţAf˙^ÇnWŔ¤­$..ĄM÷ßLŰż7+t…ËO ŕ?"i*Ř›ýçâ/*QQ{€7 '€•‹ůă2~\GVvß˙GŘż‰XţµV0vq˛ňč2323ł>Ţ˙|ţµŇ˙7 ©˝Ů_}¤ćb 2űh˝˙4ü›ş:9}(ţ÷4ř¨üźëż/č4EX[¶7ĺ ±ÎČÎtiŔÉť×ěg u(oţRRPgßçź±ĂSmôRĘŘ2ËűÖáątâđz K{8ŢŹmKŐ—cżÔŇO#§ŰfÓ7č'7.WD÷OŢ™Ż®ä ˛ {±FŻů?¬Ô]ĺ7Áłz˘éÎÍk–-Ě^Ł·–bä€pÂĐ—,.ź@Éň8Ó°ëKÔAľ;fÂÔ-:Yő¬7­€»ćŐ´O>’LÔlYże<®Ť 4ŤµŘ-żňI®S«ne#ŞÝ‹şŞ´ůăc&殸LŹ~ë‹%©o’h.IP%='ÁMlc»I—ů(Ś}™cCł ˇD÷JĚ:&»˙í$ŞZ§fÎ$xҸQÄ\Vm˝síőŇdÉ%í7«ŠŮ‹Q1ďk0,Sî3vĹô𕥭®HÜä¦ď—ŘVneŢ:ç·ĐZNóä<~ZáçT•ŰĂc(͸ŘËş˛]xÔ%€^˘·DĂ·[ůŞLÁ˛Fś±vA“ęfśćą•ŕů/apňU„f´ éx –‘*źüŚĆ;Ą;!ȬÁńKĆ1ŁKý±użâb±o#h{Ďý‰_ä…/"hŔí3ő3A–Q< á×ÔÝt7ÁÜÍý$‰•WWAvžľÚůŢäĘŔ;x#C•FŚ›Ť„ÍĎiĐ%q¬Ł;ö“n©őH˛çv€ <ęKyô¬Ýřđ@]?śď­Ă Ł$a€çŐQ)ş§‚ű'|Eę—É*ĄáYÁ‹9ôVµŐm­č$J`uŃ€gSîěl)ĄÂŠwt‡¬_É•-rUěI! ݡ]mKXźI+ľEb_Ń"cĚC^wo%|=±Ő•¸Ý”<¶ŇĄNaŐ[+‡éYKŕz¨Z/ŹÍŔỞaj@rŮ2Ô™ł!r?ŞDlbEVÂKŽ“çr˝+ĐAE›»=»Qën9)>}÷t'Ř4,•bR, ˝ŹőÖ@©öŹv°ŁFĎ›ţ|ě.çí»BvKď79j|qôčűá"IfˇĺM[t'r>ő5 m„n4 M»`łčí^d•Š/ÇSćNđĎkMpu€3ľůývć}Mc  1]ĺlíᯣ€m\Ôâň+űËřŇřÓ:tĂÔýËë»ÝÓ2#DiRŠ‘řŞ´m)‚eăđëŹ,(-*+¨a†jŰ«>tw¨9Kăçv+/V%Ú Ç.8ýx®źŕjz»KßK`V¬ľ‡)doB%”ä€k đyK. z WäܲźşQ”ŔYÝÖtšźî/¤`…Črt˙łň×3»uîí׆K01íńÚňŚŻˇáŤ"ĽókuWĎrNSĚĚč+eŃuBÎCŤsRßs×ĹŰŽQB¨Ýß1ŚŹ‡·dCř@pţ ´sk#đ 0ˇkUűŰŠ­Ľ˘·±± ÷PŢ‘JíhÇú˘ĎÁ$Ęx}— (^2á—ą219lžrÓ–­sżgŚ^>źWďlŤ >8v«sNźÇŔwCŻą!°l0Ă,ĎŮ”śł6]´ĄB¬¦ŕ˝Ô|AŚ”{RĆśĄď9Ű üL/q$ŞűćE5Ťíކ+jł&zń­ĄaťwZŢŤ{i¬`×ň€‚ď“É·Ł)űýěj)ó5xl7I|WǼφt—U¸“ŕŘx?vôtS¸<#řS2M!5Ô­b.<ô¶ă ‘Vx‡U,©ŁŤŕžKő"8YD†ë&쀅>«f>Ýý´QŹ&ĂÝ<Ô”{w×L‹ T\ź6^ťM‹˛’`¶±$x€q¨ÂęL7¨WýťâÁë ßÖ öfĹÁ>jgŘě«fýń«Ď1cĄűžŠ+kŽ ţÇČĐͧ•…bŘ‘oîÄôę+mĹŞ¤ö\çąq§ XÇ íV׺“AŇř®"%{ŃĹŔqűç·Ç‰šhU—vHżQęűßšć7l)X{fÉĐŵ_°ZZĹŇ^µUbă15H ¬ŐzµâÄ9Šz6ůŐ‰–– YŽ+Š é§Ű ăŁéµŔĂ—iŇ!†Ô Yűá†ŇóۦOcľDz@l=´ďšŤŻÜDʅݢüä¸ °ôc·@Ńč•ůą7č졒5”ľŚ˘¶Q‚ţ„*q|ĆΓcni@Ä$޲|đ»÷6&są ŇX†:ť6¸HĽâ÷ÍÖŮĐőĺ“j+ÍK1cMţ˘:¬čJ·62HÁüŹReo<ň]PÇII¦Nó-;!)?f­ŮÖÉť¦ßÚ¸NµĽ„5ÁěĹżË0±ŮQ@ ÇłvźĂÓř$łdO6"¦ĂŻŁ Ô4éÂn˙[*†—iĄ˘ČqÓýäłP*ÇłQ›>TTş^¬…ńěoé3źŮYŘEĚ&YŰÉ˙^”{°•UÎLăi ű*3& ű,3ôÍRÉYéĄÜ7'řÚȸ&°̧ôxéĆěÔsJČúöű‡´ÍQ…˙Sźűä#7+î6ov®­Mxĺdgrrč~~¸!»Ž¨­‡Ďp]Ö”˘ĺ3×6?_¤ů¦µ=µUb>tžQŢ}ą.µ¨đe•ńîöl*ąoŁ’´ĎÎşA»Żl„\ń¶ÍźK±ňLۧůí3ˇxĽh.„éü–]ÝE7±bvÝ›SýźĎ‹ŤÉr´o_uČđĹJŹ÷{4Éöެlë|1[ů€)¨ŠDágb—Äű‚ś‘­u?])şÚîbb]“E‰ľśř=¦Ă%ÓÄ#hU×!ń˙Ůb‘*äYńő0ó·â;‡+ÓOÓl yŁě¶%C9±yâż%Dł®3$Qyn§nw-Sy÷âů>€`ÓćK‡ž«M†UdtŐťĽŻŽ×MŤ÷Nä6PAZ ? ,_ůaµCčĆYž‡Ęä‘˝˙)5ٍ߉$ČrÓÓ8ŕl?—Ż‘µ’0~đ‡(®) nľĄu‡ęZNâkçp‡—‘0Aˇ/ °1 ¦ťQ"Ě>Î;Â~Š2‘U Ë3m$.-^e¸yü|QC…W*Âş„ p‘0|÷řćůł ěrGiŔńZĘĎ|Ű‘('*IČtDś˙m@JjáQňúiCÉŢ…Č®{h"ÍěŐÜz+†Š_ýNÂS˘Ž1iXĽ FaJ+±3Ý~62U ÷›Ęr@h-éDĐ ň¨-ň…h‰a t5Ç5¦ëŻ:ÎŻÜ92§éČn˛3rn¤`‰ş”7árRxBŠóŕ¸JĚĹoř©<ŽS®Ú‚Nšv1méű@ôŁ =r齏q˘NäOĺ %4lßíÎuŠňŘ&Óa9L7©LÜWŔܱ­ŕy˘owN˙ćŚS×#1™¬ňůÜc0Ő˘tŔç9÷O…¨Ô_Í„řhď—6¦Čµě‰TŹżŁÜWźŁŰKelÝĽ<űUÝČ×É*[a´Q™ŻÂ ŰŐăę1>SáŃчħĺjy1Íő˝S®jUÚóđ%oiJwŔ‡oZîSy/‚ŰěĘg‘8úsşĚŻZň…ŽBnŚX€k´c-Šâę*íťYí˛÷h™¶¶ż§‹m#ďWgtP~úia„xS čuNEĹvéţn+T±qÂ…3±obř÷Ž…….'‹K‡ő…"•iëýRŹ=7YŁE«}-•×9“=łžäňă_/Č«]^ĚɰźnôżŔg˘^/űZäŔ‚mşÖĆ{ʸS»‡ĄŐ^…†Ňq덒H+€ß Ěť6XóŕÁ~ýA8ćýeř śěa4ŔŰQ.ťaęam€Ŕqj›‡-ň'3Ô1Ń2ĹĽN?!¨I)zĹě5ÓöĽ7ź¸óŢŁŚlŮăFâďŮ}ĺUąŻ­+Të y–2Ú%h'Lě4Ă0wĆ_Ů¸Ł¸_ “éIő ]ÂÜÖá(`čť·ľćľáńp»ă*s €+Ţ%7‚4 ą-Ś-Ŕ Ű“Ĺ¬Šž‘[UŤcâ-+ťXȱfŹő;g—řčÄ-XX‘‹˘o‚šý”µćňY¤”ck^Ô©Ü}_1DĎą3·ä¤ŕp ,z.ĎB&JťŐ, r¬őp¦kTżb‰˛" Ĺř€ťéâlqä†"Sé‰O!ě25ZâŃžËާťĘ˙ňF匡=ÝłcŃ<—ź]<ë)˛á&aŁŘ})•kużo™g­č´FÂ*Ź—Vß‚QЎŐkÉEćů¨÷FΞüÖ(Ö ÇŔ#*k”—@•‚@ËaQ”Foę1~VŹÎŤ K˛Ť®mô\Ďř©®?źčQńŇ{LUEĺŚ@…ő›S n‚aě¨űĹbpÉMF/Ů1 Ź©j*câj«ŤüTŘ}š ő7»]s-~™ľ e­`®Ň¬t_NŻfd,ăą˙×i]µŐ±Eäu3q†bŕRú©‚Ĺa¶ÖčZç·#Xôr+Ëf@:´Ž>Îć«t¨üř˛V±e¨Ź8‡ńKjĎĽsĎ~ĄŽ‘QľŢ3HsÁžĚŃp‚ÚcMQkT=±¨2zĽ­3Ť±Ě0%ŮgąŚú“ˇ˙ÉŞˇ[˙>B”6űU“Ľ4]guyôüŰ*yŇĐőćbL$ŞĺeŇ+ÚľxP]ÄńagNb"çWý닉¨ýłH®[n×ç¨ßBĄOű@ÔĽ>\ĽÓđJp9$UBČŇÚ<$r†ňőT>‰/^üGäD€ä#đ€Y®ÜrÝŽ­Şq_*]›ŃnÝwĄ"fł A™´h§WKÔMşSŮÍ×7ę'L48ÚF/ßA/q¸ęÔi6á±îĎZ$R¶Gť{Ď8ĹWźhÉ÷Ł®ťŐćCQ¨łdĄžTwÉaéb2ř˘‚űňě"¨¦,§!źŽ Ć©4:Ä'۶ş«ťĆÝ˝ ď5ëž÷šv@íy–óĘćm˘Id;VÝ ×‘üĚ«č[ű'Á”µŽTű$¤ňĽGŻ4ČnŰE‚đ2!óC<×~g-Jí/–ŰŤ|Ř:K|äÖ)̲(÷m^>î^ÄÇe†W}żŠ°N75T[Ő3¤r©łŔ C?~%ĺŚBçóŃżnŇgm±-›!††QÉčÜĐI-¦Ą§ëHľntVěş[Ŕí3‰ëăI>ŹŔlMŇ7ů%˝­é*Ăç–.ł;žŢ9§Evă][\ěa#z@ËVG6­_#…ÚÁpRÎÎĐôˇäĆë'äśóđźă|~\Ł_ď_ĘĄˇ¬ ¬ťFçĹ3\Ý*D 2č|8 9”†´`űˇŃ%„ăÄ‘6×îĹvŁd^ĺú}tx. í,ćúB·”Ę,~®Ŕ°ř87«yÉyËşŁ÷hwi9ř‹Š­Ł™˙°ô;†"š/÷8TÎ=RBëţĆ\s#"‰^őžřęŐý|ns¦ ‹Šĺw"d(Ĺz7ű »ôOüů0$U„"ባ“Ű«Z¬!_Áćą0ŚS#—óltŮ`¶Č.oB o>7䯷u6óí” a4zĂ«Đr¦hŇĺ!ąÖn«í†ôTDžîđ>cXô -¬MX•ĘϨF­lţ;ßY-A&÷đ!€±TĺÉĆ«ć Ź˘ž‚˘Vűד+łtU®]¶üú‹Y•Ö­i“O^„ĹwŽ›Aź•ľ‹ iý\^Q vÁ7®~í±©đ<˘~äĚđ|nßTS([»? “\rĽl4*ż ˘‚0'„JÖXąVtăqRčťćyh_\úä ¶ĄQť­Vř§ /C{óG|Žä˙Ô˛dw1é„”?[#†đĄŞqî&ÉĂ ęPÄťpł´»â6iřŚ´S ‰0_&"”Ä˝1ă4,®`U}Ȧ¸ph$ľčJ>ŻđÔJ–GOËÍĚ~_$ţť@ś¦ÔlÄŚă9-iŞŐϡU۾Ч"O¸Ĺ™7×f¬Ö+:‘»xëB¶ŁÚQţRő†ÚŠ%Ú §}«ŽC±âDTa±¦WµŹ^#Ď'´ČgÂŞsß4ĺŽ_ď"U‹–@ ľŁvâcřQi|ca‚zL; ގǸ-ÇjÇIÇÚţPĘD®(u“ŃÝŐ¦?F"arGčŮé8«SSÚ¤ńáh ©HŚŮĄĚ=ďýeŮ]ßŕ ™G'“«K‘ě­=_üŚŚ!ha‘OŠŤ”í|±TOSTÔBN>˙ío“^©' ™zÇ[^úAÔ;ń̮݄:-łqm˝•«~K5ů‹6W¤‘ő+ä.AľGfŇ!MýĹi˝˝l&e!/Ů~7tĘC¸äÄó^ă[}—µNU&•B·› ¶¸ŕÂH‘ň‰ĺ˝Ľ¨!mă.ř"FŠôe›·6 «ţv­ Ax˙(dŃÝťÖ]Y8Ĺń÷ůŤ=·:ŲGŠOMŤ!KłHŤŕä9C!–Ńn÷ľ¬DMĎşgĐä|©“N±â‡úż™'t2Ö±\vÄA\Ö,«}¬ß#eÎÔ)ńH©w?1r}ŠţEJçYÉ{%ë•LćuŰ[v­ţľÖűĘg€÷ŐĂý€Ü, )«Xćŕôh’7¶‰NtÜoĺĺ{v§‹á“ÂOKZąĺ7źź«ÁďđŐ]sŁŔßk,éŃďp8ľ€;ńM>Ł×•¸ÁŮRE A ¤ßOnW$‰žÉBŠĹč+AMLNOś_R§řÚPˇ-RK–,Žg”.™`ěĘ oěńĺó á¬cöˇ<®łŃĂŐB HśďŢŐá¨(’ĄFşT˛›,–Oşu®řµZ=őÜ ťžV/bɲnĽŇĚŔĄ'gă˝<:×–<† đigk®sˇŮŢ·^fv¦Ń©®V9P–‚Ć2÷O:‡ă˛ÍVx\ćž8ŻÂ´űŠŤ`Ó«Ă’X¨xĺbĐŽf•žDvşĆÁó“Ú2OL†¶µrm&×k™,C_MäÝë§/lß"EăÜJ>ĽúNRő‹Ű=ĐA¬űDV „ˇ`#Â0ěéέš{ęf wGéH•fr.ú_{F82Ŕ©Ňď=ËlĐ!‚ZزyYž_u#Č6ŠýşýoăFćÂ]}×r ľ#)˛Üa¶ëą ®[~ńÎz[ÎĽ94×â®cÁá—`ăEw†÷’ď=ŞëYeě!Z’ ‘Š.&!$cť,kĚ4Őd¶P®üAé+CAM{*m>73˝gz(2ľ±ĐŽŔg•#8Šń»úŔăá…ąDtH!óëź[o,ŁĄ5(]"T„Ön¬ŢosŔúĎlR¸ť)ZŘvz(Ąô‘Ż~ʇ‚őu­_âçiČPĽĄ…Ş4%2C_jăčb%3ęÚŰ]é,‹ş“ÇFj|CHp–Ŕ|Ý=3˝0ŕ‰ÄţB뀙$Ł‚4ĚąüÝ‹éVÝËxśtŕ9oÝs|źâ>Žw:rw۬ÚŚA·M§•ć\–Ś%Ĺ!łqĹaŮLx^3‹šˇŮş&[%Ć‹;ĽşˇíŻ·J{_˙řy­i;Ő¤ÉkŮđÂÓ¨y”oݧŔü$X!Z>ĽłŔ“ť·AďuěIÂxFCýÎ×µ˛2˘ż'blSń¦`´ć×SĆ,`ă"9Öů˱ĐËńHfŮ%h65Cę",j8ŔßË‹­źéöEě±ÖCGf'-Ś?Ą«w/Úď0O€ v_ŤôÚŚvp:áÂŰČrR–ëÓeV»ś#joŽf•›\ wäx@wá„©šéV=ćlˇŃĄLĺ'—}®`JAͤdd;vľnTF­âćďqóIÁ’Ή!y}_´Ť} Ťlv’ü^*!RăĆĐ~y&FlÉ&·<Ť*|óń8Żnflďí¶Ł´­îFĚ„9݉höűAšłct¨,ţ"2 zíľĂ3Ź4X˝Kěx®«>š /Ř,ĺ8:c}z“ »ĐVč¬DşÇK~'R^ĚT3ýv@ŐĆVʨ°ňĘ=µÉP“qî!Ł{\=>ÄŘÔEý°Yđ‚ĂpŘ aÖŐúŠ>é­$Ĺ‚Tô w6©1|őÜWuĚ»ř¤¶RÓBTQ&•şzô™ęóˇŃ"LHľűĺ8Î24.d”·ý])›ěŐäÜbP.˛¬J7LÔ 0ăöł—łőB5>w@ć·ĘţíĆ#i˙xzIňpRŞžě˙şÓRqMîÍ· xźQźš`—Đ[˘g†“µ ď:’×O«6eCť¸’­ţRľg˛Ńž żÜşä˝ *\úz[{˝ź±ĎIŐ¬T„ţ”ˇýú¬@Ľ6îÇ犡ëĚËńŘZ˝đgĽę9ڦźĽđ‹“ɰÎ 7€˝f¬_CísÜlJţZzŢź7ß4hYdŐ"%ř´öăő:\MűĘ;ŚŃ\¤5ŇCŢ ćm]a^6!Ěó‘$–HQ˝Qüâ†g^ ‰Ş××z\Ƕ‹Ű試+ÓW_×m=©a§@VĄ\ٵÁ^S8Ě™ŻŘ*ŠîMrÍŚ…Ĺ?óCM,aé8Šý‡c˘8‡ťö Ö…!˘ űb¦ťq7Âc» ĺb=]35hĐ=iĂç*WQŃő?: Çzą´"R=ĺ÷B é nđ¨yöŰííKąmYÔÔ»»ć“mšˇ÷ĐGXífŔ*®”şuURF+ …éŔTZZr(ąÎiP2¦ř†žŮĚöJA¸Â0‘쇳ëŻi×.(EĄY¬ýM°UŞPrF/\Š'ʢsYd8ŹxNü®W\'x]b źf®2/Ë8ŐŹhLlů€Č%ëCMł‚,¬í‡Ľ(”vjBě˛Â<*óŚ‚81FEČ“0±ŁÎ’W,ßÔ ›?öžř* ;UׄűÇaď %ç±][NĂ2q^ s:)]Äí\ ć\­@có`›€ńľä ŠÍ,âDDC Řvł˙›źLÜ'Ăüę0 Ż(}ŮbË\\ĄĚţŮEQżÚšë.ďM ë‹|â3C¤-\hń:>'ě{,SŹý”c|Ś'1o4?ʧ¨¸2ąű0’(Ăž¨Ł eďÝ6[É_Y$»,Ľ“(4\™¬‰ŚLCŕBU6ZÓ…TĂ}Y‚ÍÍŃ0[ÓÉÚPľkŮeU¬ű4Ň@ĺĺ¸á€Ú`żó‘$/~i‚ö‰;ľĚ_dq+vőĆ7K{»„P¨šQűé'ó¬\މВnĆÉýĄŃM Aľ]+śß›fćŚßďGźő ¦›­C‘ľEą™BFń—ýCÔ “iJw6eŻĄLéŕ&|t,lon€Č1:/ë8a;ŞÇHĂźŮ4ěř'rÚŰ PxöO`X4ěťa:ä„ĚÓŞĺú"›\mÖtŮkéTÚvU€;3Ă×4ö¬Ő‰©ľ“)N“]˙JÜ™hžŤĹß dŘúŢ›§ď®F"ŻtáŇ7!'‹dO‚!Ow§3^ĺłÓkIřKş°î^)«=Ł˝1ÚČ ěĆŰĂ #GË~]!?#·ź KĐ7˘JTé&Ď$ 8rîm˘YĹoŔŠx µ®ěĐ”¨0ç ă“Ňî1ČS˛9ô'ý÷UP¶r ŃlP±ŻÍj‰XĽCç˛÷ˇęg¸]ŐřŻ5N/Ú}Xµžá†ÉEŤph´b™ąŽ#Úů‘‰~žĺŮÍ<îË›PÁ§Ú…˝ý͢Oa؇]D ť‚\Ú°&Hq8ŽA%…ťç[&Łť8úTăÓ-Â{Î\5ĺE(ýÉ Ô`G·=z î°W¸‚lňź4Zsk!lni’ş;9íľ„+'\]@lmA¸ˇ­ĐCxA:ëËĚŘßµ"Ü_C M“ĚwŹ ŘňAtsG­Ôg0ÁSJ»7$óĆĎÚ)8€Śâöâ‹«–„V™+Eîz#±¬ÂsŠmöýĘŐßŘ ˘Çlĺ%;˝ç6{D1QÂ>qĎ9´ĹĄVRď*žŤŻĆUCÁP|Ő r•ď?é$őQÁPnJ¸)˝—ˇá|< š7ŠĘ É®űl+0k“»ÓŃéăGlé\FwsZˇ%FÎáÂ9oţt|0ú!ˇ/qŕ“ŁiyżH»BŔĐh'oXzśTĘűh Á˘]ŢéËĹ"/ç)GÄ=EË)JвÖoŹkJY}©)Ĺs Ń'Ćnm” ‹AÉw±¦n䢖Łë hµŮ/$»­¸ßsîÔeŰkÁÚĺNFoKŕ)řÖj_ÂôĄ ®żŕ&má—ĽQd{9ÚÂMBdOđú«·V‡…×r‹đčFQÖXr8Hčn, +‘U).n3é‚-9Kl{ŐK_I˘Rń&Žp?Ű…aYzĄZ’ ·mnü•äáý}ű0 _Ż<ŁěŮ>"tŮó:ý¦­|§W©őűë0ÓăNsb}Đ"čá ąŽ\‹Ş)rďĆÍF čj#˙CLĐ…}Y+ňŐžgW®8§0Ź^WđUęĺS©ęę®5¬CX5‹×ŢOvľĎů8gňżČźą1î§}Ś•Ł#iCI´·jŃ’<żXÜŞDUéĐ‚‚)ßě «™¦Čúłµß»UĘn­ °´}T5:5Ô˘ú‰ ô×GňË2múH~¦OP6ž ä3ÍôźŢ¨řâáÉM¸ń[ŇyZL~‘ŕ+´td’5ëBďR#WÝłiĄBq&bşlK)2%×ŕWâCŐ”)ŰkfŚä—ń ÍÇ*ę*Ěä®ě¸ńŢ#CúýÉ9°Ö^Űö*ąTKéŇI~PGŇžż4´ŐbʍDI÷jAŠŹ\b zI!ŹU?VŁFP§đŻßAť®jŢcV\nM{=Jo] 2źH5Ä äokR6 9Őë OGÍ2ßďłOÎăFő{ő3 -ĐĄMľ»şÂáŁÉ}N˝{ž:BŘzĎ𱱄nS°™â§×h˘šŤDđíćĆ/ľée°tBäKŽ9‚'Łőp5Vĺ_­n-óďČ™ Ą3iL—×”0Üđ´)ňPŻp­S;űŕ(Qp0ÂLąuČ­Ňťßőß2´UĄŔI±•Ők&Śs˙8ěÜ$»Ł q»čI”ÓňŁźŔL>EÎś°GC^ őZ đIC…sVź·Ďövcç~}N"%>ĹÁëa}5‚ĽAź8 …oÇÜŚ=ä^“ÁĚŤß\ČË;Rö‚«ą;Şď!řüîâNjz‰§ŘŇ‹c1ďkcziŤý«V˘8qX¨ĄćÇćVŽZ÷"=Ř»:ţ=(@Ň2!Ä-L™Ť0Čú«‘.*Éy—`éÂÂV§K„#Ń*Bvt~PK„ŘÉ«ö:›ą!J”z¨rý´y7WcWâ:Ę{Ćź°śÔ|&Źíę§}ÄIŢš]F^>×];Ćiť~Gľ#XĂmcá&ěµéÉhŻçč‘Ř]Ţ"îŘ5×ÚČk+ !R·É'­(=}ÓşHžČ!jĂLqbá3eşň·ęÇ`2ÚĐ´Ö§%«&Ă/&hş>MőU1/î«ß ĚI70'9ÇË q\Öĺč­­ąo ¤RŔÉĐ}#öje§)mb—ŠŞeľHĚ^ys@ ĄýŚY”~§ÁÚaQűµI`ćČ4G®·¤ŇqžH‚ŚÄ6·|%s–·ó­ż«5ć/_dJ{żď¤,×s®đ3#Ô:¦ÁnĘű°Ĺ”(˛MKĐ3HTęĘŔJ•O×]á¶BÂâđÇa(9­ihŢ«©aŰČ't˝[9‹O«§Ć¤™ 8 ~*čn7/Ëô0ěăž–h´Ů¸Ść1óvIÓ” 7ĚçÂŘżĹD©ˇąŇ$ëŢŚ#źżîB)”vŢ÷ ¨­a’Č_PĘt˝ĺ} 1Ő@Űëý„#…Cš1š”­’¬_Ž’ßĘpÍş5÷řÚŁV-Ň}ę|B_ťŮ}¦ďµŻŇ*ŁýDžÇŠzľÁX2’]Źcżľ §i\a< ńĽ"bű…Čľ Đq˙źĐ‚S>› nŇ–Řş‹çV:uIµ3uŃ w"Iš•ÉqŻb6“{=0lĚ€BpTĆC°/r9[sm 4 Ć/ń4Q‘ ȨOküaľŚ/qÚKĄňĽ˘hµp“\$ž5‹‹¬Z—¤|b§bK ÍĘý“©%HťI,ťgä°®\é\ň9Ú‰Ű|Ů ‘EK±ąOßđkÔČÎŽ'Í($íÓh*.,/kC›ďÎAÜElÚí2,~ä­śí˛9^'ăľL™îÔ1¸đďZ0ÎĆRôΙNK\=ĘłČ<9äéÜËâůúíľ)y'Ž< őóm×n̆wú°ŻF(ŇŇ+×ŮläOá-€Ą¬eCëO"xŕŐ]|â´16›ťŇ@ㄪ؛kNHÍńłx°K0¸büK EcŻ®—âNĆđöz R°ţă‘V\ÎOkye…ÎĂńęSÍ˝ůśôą•š†âĄ}»›üů^“çł,5q=XÁ­ŻŔÜß‹‘ĚmhMÇjđźÚÚ5ľ#6ę´J041ńĺ|ÜA˝rgpҲŢa GG»]vCwËz«Ţ¶®e ŻNů˝Ž]iŚ8BXpÉTÖĂŁk¶čĄúĚ@§Ž˙™őřÇĘŮ ČheDĚx×´µŘť×Ď·lx ‚¤x“R`ÇMg¶ú¸dď™úĺ8ćF1/ŚsŚľí›”;*[ë5¸ňl®„î//ž9»te¨:l|J `*·Ý˝¸bäYЬţŢ·ŘOq§÷ ďÝyTŕ{cÁC i–ÚđI]tBBö×čSÇj+’[ŰŰ®b59Ă{î‘j+Ôĺ0„Ú>˝»AD‘‚Töő1Ű {ąÔoRůź40*gyzLaŇč0Ůź6W{ĺćťäâżx$á0¨Ľ˙ ""ŕsľ…w|aŤeĂĚC­— kH?›ÄVWÝ[aľÉńé’Ű»zŃsŞ”âëZä vDi‰-üNš.N¸ˇéIň}@˝{NS¦OM0Ćý#şć : ß9jvȆîFŁ{AIMin/¨ů@ĘzĽa°#ĄQµď¦äź–ńćžXł˛LläVťé…ÇőÇC®ŮZč‹o+*ś€±‚˛éĆ~őľh‘m/Sä9vkŢ©:¤2ŢĘd8öQń›™$/ăŁXÜ:ą‡;z/±q¤Ü犭SxŐF+Ó|”vĺW„ۤŇlźČĚ2ÚbwiˇA[«WéßGM=¬xäđňÖŤţĆőĎę•O9˛VŽ~çř"¸ [O[w#%)€T.XE>T6Beç÷=ö“—Á “=yßY.iYśř[9›‘•k]X;PÖ^Ľ ž ’!őČeîrđoťvëhż>ŇŻă¬l¦8F$„7 Q«Â·ĆoŚ™ ¤k-''ŹfNŻĄHWÔzý?ÔFN|N"ű®ŇńVĎ‚éŕŠZ•ů&–Şo€ &'ł”@rÓÝŞ!ÍdZËď÷­o·<†?~<ŠŃ!#â°ämÇć‚U­yőuĽKŤ|Ţ]?ăˇ!z}4m˘ą)i´ÜtJ ÉŘ#q;JćŽ˙ŕËyßď÷ś+č°źNG‹g–$"ä<}Qm_®ÎT —űlőjŘňx óórýŰż®*(µŚ şĽqÄHâ &ĂŻfuŁ>ÍË1¶RŚVőĽ­qłć:?ho˙áĘąŃ[Dž¨ďŞ˙¦KZÁ*ş`=]Ät{ŇBISHcÜĐovß’,¸Oť§L±+gŃ®ÚĘŁŐĚöťĄM{ŔééN®űSrSçů…`Ę\^.z ŃwŞ 5©Čokgdç­űĐ×1íXŚś$kÄŠ˙mi­”śÔŞßfż`E†´]tŃŻ‹­qLPú˙Á3{ endstream endobj 1335 0 obj << /Type /FontDescriptor /FontName /YODDGY+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 668 /CapHeight 668 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/A/B/C/D/E/F/G/I/L/M/O/P/R/S/T/V/a/b/c/comma/d/e/f/fi/four/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/q/quoteright/r/s/t/u/underscore/v/w/x/y/z) /FontFile 1334 0 R >> endobj 1308 0 obj << /Type /Encoding /Differences [2/fi/fl 34/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 149/bullet 228/adieresis] >> endobj 584 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MCOYWV+CMMI10 /FontDescriptor 1319 0 R /FirstChar 60 /LastChar 90 /Widths 1313 0 R >> endobj 585 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VYDKHY+CMR10 /FontDescriptor 1321 0 R /FirstChar 48 /LastChar 61 /Widths 1312 0 R >> endobj 586 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NBBWCW+CMSY10 /FontDescriptor 1323 0 R /FirstChar 3 /LastChar 106 /Widths 1311 0 R >> endobj 583 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LAJUWJ+CMSY7 /FontDescriptor 1325 0 R /FirstChar 94 /LastChar 94 /Widths 1314 0 R >> endobj 543 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TXCSIR+NimbusMonL-Regu /FontDescriptor 1327 0 R /FirstChar 34 /LastChar 125 /Widths 1315 0 R /Encoding 1308 0 R >> endobj 396 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VRKWGK+NimbusRomNo9L-Medi /FontDescriptor 1329 0 R /FirstChar 2 /LastChar 125 /Widths 1317 0 R /Encoding 1308 0 R >> endobj 965 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XTTWYM+NimbusRomNo9L-MediItal /FontDescriptor 1331 0 R /FirstChar 3 /LastChar 122 /Widths 1309 0 R /Encoding 1308 0 R >> endobj 397 0 obj << /Type /Font /Subtype /Type1 /BaseFont /IIGVCM+NimbusRomNo9L-Regu /FontDescriptor 1333 0 R /FirstChar 2 /LastChar 228 /Widths 1316 0 R /Encoding 1308 0 R >> endobj 793 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YODDGY+NimbusRomNo9L-ReguItal /FontDescriptor 1335 0 R /FirstChar 2 /LastChar 122 /Widths 1310 0 R /Encoding 1308 0 R >> endobj 398 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [390 0 R 401 0 R 429 0 R 469 0 R 508 0 R 511 0 R] >> endobj 520 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [514 0 R 522 0 R 536 0 R 562 0 R 579 0 R 589 0 R] >> endobj 613 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [604 0 R 637 0 R 651 0 R 656 0 R 663 0 R 671 0 R] >> endobj 680 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [677 0 R 682 0 R 691 0 R 695 0 R 719 0 R 740 0 R] >> endobj 748 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [745 0 R 751 0 R 759 0 R 789 0 R 860 0 R 933 0 R] >> endobj 966 0 obj << /Type /Pages /Count 6 /Parent 1336 0 R /Kids [962 0 R 970 0 R 975 0 R 979 0 R 983 0 R 987 0 R] >> endobj 996 0 obj << /Type /Pages /Count 6 /Parent 1337 0 R /Kids [993 0 R 1001 0 R 1024 0 R 1055 0 R 1059 0 R 1063 0 R] >> endobj 1114 0 obj << /Type /Pages /Count 4 /Parent 1337 0 R /Kids [1111 0 R 1188 0 R 1265 0 R 1305 0 R] >> endobj 1336 0 obj << /Type /Pages /Count 36 /Parent 1338 0 R /Kids [398 0 R 520 0 R 613 0 R 680 0 R 748 0 R 966 0 R] >> endobj 1337 0 obj << /Type /Pages /Count 10 /Parent 1338 0 R /Kids [996 0 R 1114 0 R] >> endobj 1338 0 obj << /Type /Pages /Count 46 /Kids [1336 0 R 1337 0 R] >> endobj 1339 0 obj << /Type /Outlines /First 3 0 R /Last 187 0 R /Count 8 >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R /Parent 343 0 R /Prev 383 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R /Parent 343 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R /Parent 343 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R /Parent 343 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R /Parent 343 0 R /Prev 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R /Parent 343 0 R /Prev 363 0 R /Next 371 0 R >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R /Parent 343 0 R /Prev 359 0 R /Next 367 0 R >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R /Parent 343 0 R /Prev 355 0 R /Next 363 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R /Parent 343 0 R /Prev 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R /Parent 343 0 R /Prev 347 0 R /Next 355 0 R >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 343 0 R /Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R /Parent 299 0 R /Prev 335 0 R /First 347 0 R /Last 387 0 R /Count -11 >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R /Parent 335 0 R >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R /Parent 299 0 R /Prev 307 0 R /Next 343 0 R /First 339 0 R /Last 339 0 R /Count -1 >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R /Parent 307 0 R /Prev 327 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R /Parent 307 0 R /Prev 323 0 R /Next 331 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 307 0 R /Prev 319 0 R /Next 327 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R /Parent 307 0 R /Prev 315 0 R /Next 323 0 R >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R /Parent 307 0 R /Prev 311 0 R /Next 319 0 R >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R /Parent 307 0 R /Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R /Parent 299 0 R /Prev 303 0 R /Next 335 0 R /First 311 0 R /Last 331 0 R /Count -6 >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R /Parent 299 0 R /Next 307 0 R >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R /Parent 187 0 R /Prev 191 0 R /First 303 0 R /Last 343 0 R /Count -4 >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R /Parent 251 0 R /Prev 291 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R /Parent 251 0 R /Prev 287 0 R /Next 295 0 R >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R /Parent 251 0 R /Prev 283 0 R /Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R /Parent 251 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R /Parent 251 0 R /Prev 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R /Parent 251 0 R /Prev 271 0 R /Next 279 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R /Parent 251 0 R /Prev 267 0 R /Next 275 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R /Parent 251 0 R /Prev 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R /Parent 251 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R /Parent 251 0 R /Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R /Parent 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R /Parent 191 0 R /Prev 239 0 R /First 255 0 R /Last 295 0 R /Count -11 >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R /Parent 239 0 R /Prev 243 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R /Parent 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 191 0 R /Prev 231 0 R /Next 251 0 R /First 243 0 R /Last 247 0 R /Count -2 >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 231 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 191 0 R /Prev 199 0 R /Next 239 0 R /First 235 0 R /Last 235 0 R /Count -1 >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 199 0 R /Prev 223 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 199 0 R /Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 199 0 R /Prev 215 0 R /Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 199 0 R /Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 199 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 199 0 R /Prev 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 199 0 R /Next 207 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 191 0 R /Prev 195 0 R /Next 231 0 R /First 203 0 R /Last 227 0 R /Count -7 >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 191 0 R /Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 187 0 R /Next 299 0 R /First 195 0 R /Last 251 0 R /Count -5 >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 1339 0 R /Prev 91 0 R /First 191 0 R /Last 299 0 R /Count -2 >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 103 0 R /Prev 179 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 103 0 R /Prev 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 103 0 R /Prev 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 103 0 R /Prev 167 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 103 0 R /Prev 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 103 0 R /Prev 159 0 R /Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 103 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 103 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 103 0 R /Prev 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 103 0 R /Prev 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 103 0 R /Prev 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 103 0 R /Prev 135 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 103 0 R /Prev 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 103 0 R /Prev 127 0 R /Next 135 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 103 0 R /Prev 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 103 0 R /Prev 119 0 R /Next 127 0 R >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 103 0 R /Prev 115 0 R /Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 103 0 R /Prev 111 0 R /Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 103 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 95 0 R /Prev 99 0 R /First 107 0 R /Last 183 0 R /Count -20 >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 91 0 R /First 99 0 R /Last 103 0 R /Count -2 >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 1339 0 R /Prev 83 0 R /Next 187 0 R /First 95 0 R /Last 95 0 R /Count -1 >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 83 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 1339 0 R /Prev 75 0 R /Next 91 0 R /First 87 0 R /Last 87 0 R /Count -1 >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 75 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 1339 0 R /Prev 59 0 R /Next 83 0 R /First 79 0 R /Last 79 0 R /Count -1 >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 63 0 R /Prev 67 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R /First 67 0 R /Last 71 0 R /Count -2 >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 1339 0 R /Prev 31 0 R /Next 75 0 R /First 63 0 R /Last 63 0 R /Count -1 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 43 0 R /Prev 51 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 43 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 31 0 R /Prev 39 0 R /First 47 0 R /Last 55 0 R /Count -3 >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 31 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 1339 0 R /Prev 15 0 R /Next 59 0 R /First 35 0 R /Last 43 0 R /Count -3 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 15 0 R /Prev 23 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 1339 0 R /Prev 3 0 R /Next 31 0 R /First 19 0 R /Last 27 0 R /Count -3 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 3 0 R /Prev 7 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 1339 0 R /Next 15 0 R /First 7 0 R /Last 11 0 R /Count -2 >> endobj 1340 0 obj << /Names [(CommandLineUsage) 548 0 R (CommandLineUsage_ARGS) 666 0 R (CommandLineUsage_MANARGS) 667 0 R (CommandLineUsage_OPTARGS) 668 0 R (Doc-Start) 395 0 R (INTRO) 517 0 R] /Limits [(CommandLineUsage) (INTRO)] >> endobj 1341 0 obj << /Names [(INTRO_DecoderBasics) 519 0 R (INTRO_SCOPE) 518 0 R (Item.1) 542 0 R (Item.2) 544 0 R (Item.3) 545 0 R (Item.4) 565 0 R] /Limits [(INTRO_DecoderBasics) (Item.4)] >> endobj 1342 0 obj << /Names [(Item.5) 567 0 R (Item.6) 568 0 R (Item.7) 569 0 R (Item.8) 570 0 R (LIBUSE) 539 0 R (LIBUSE_BufferSystem) 571 0 R] /Limits [(Item.5) (LIBUSE_BufferSystem)] >> endobj 1343 0 obj << /Names [(LIBUSE_Calling_Sequence) 541 0 R (LIBUSE_InterfaceDescritpion) 540 0 R (OutputFormat) 607 0 R (OutputFormat_ExamplesArib) 643 0 R (OutputFormat_ExamplesStereo) 612 0 R (OutputFormat_ExamplesSurround) 641 0 R] /Limits [(LIBUSE_Calling_Sequence) (OutputFormat_ExamplesSurround)] >> endobj 1344 0 obj << /Names [(OutputFormat_OutputFormatChange) 610 0 R (OutputFormat_OutputFormatExample) 611 0 R (OutputFormat_OutputFormatObtaining) 608 0 R (aacdecoder__lib_8h) 546 0 R (aacdecoder__lib_8h_a15da43e47179e3ca7b58d6b08620533e) 950 0 R (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24) 551 0 R] /Limits [(OutputFormat_OutputFormatChange) (aacdecoder__lib_8h_a245a0e4176fb886d890a86627c55bb24)] >> endobj 1345 0 obj << /Names [(aacdecoder__lib_8h_a388a21070208ec23217c4ff8f8d98754) 805 0 R (aacdecoder__lib_8h_a404dd0b9b627d3e9ab765dba98be3eec) 949 0 R (aacdecoder__lib_8h_a4666e424f482470e872827f66399454a) 811 0 R (aacdecoder__lib_8h_a6016435b8679d2793078b10ecaf3d05d) 550 0 R (aacdecoder__lib_8h_a60aa42cb3ddc804b44ce61d877d0501e) 575 0 R (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16) 967 0 R] /Limits [(aacdecoder__lib_8h_a388a21070208ec23217c4ff8f8d98754) (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16)] >> endobj 1346 0 obj << /Names [(aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) 574 0 R (aacdecoder__lib_8h_a8bc17277db0f7651065f62d66f92ed9f) 809 0 R (aacdecoder__lib_8h_a8f33403449b41e6a9deda6cb1e07d386) 948 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88) 897 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a28dd853ab4339011893a933020ac5ab8) 940 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931) 944 0 R] /Limits [(aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a4392100c924c0f20a706f55bc7ab3931)] >> endobj 1347 0 obj << /Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) 941 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a605a8fed5c5754dffc63775cc702aae7) 945 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a65284784865f22d79700dc268f84e374) 942 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6e3fa0b7d247c98f132edd55187f9c0c) 616 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aa1a5a121f8b03708d9fdcc06f6e882fb) 947 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568) 617 0 R] /Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88a6056e5b76cc6a00078388445b1f1cfa1) (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88ab49a2169c22ea876c67154d6caa04568)] >> endobj 1348 0 obj << /Names [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) 899 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aefc0ded1aea7e08f3c9c55df76c75668) 898 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af24d28dac8b5de47c00c578712d0591e) 943 0 R (aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88af84565b78a6ae180e316dd612a0877a7) 946 0 R (aacdecoder__lib_8h_aa9ba2e98e71adc41124eaf8d6e5d6f2d) 812 0 R (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051) 810 0 R] /Limits [(aacdecoder__lib_8h_aa34599717f4ed74b0c954cd57edc9f88aee866642a3f335e7874a82939ad0c135) (aacdecoder__lib_8h_abc8ebc3d720699fe1d7c27eccd3da051)] >> endobj 1349 0 obj << /Names [(aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) 806 0 R (aacdecoder__lib_8h_ac8580fe563e79afe695d7b0b32ea0fed) 549 0 R (aacdecoder__lib_8h_acca8f4cf9757885d6c654de37a43072f) 576 0 R (aacdecoder__lib_8h_ae09502f250437ee519971ca3a95ac9e0) 808 0 R (aacdecoder__lib_8h_af59d78a4583ca81ccb2675dce592b812) 807 0 R (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f) 618 0 R] /Limits [(aacdecoder__lib_8h_ac2c358d4ac0d7747cae32f9f45c20f71) (aacdecoder__lib_8h_afb42ea8892dd828264bd2f6147e0559f)] >> endobj 1350 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) 813 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0357ce81d9d62cc106c752121fc9dc8a) 881 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a0bd193ee6a8c3151c5c6469f7e455a8e) 872 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a20cdc26726b22cb44143b4e440441e0f) 882 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a242d8bc09683a84b578546663dda36fa) 865 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5) 877 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a42c5cbc358ada7261ba3d609c33ec3a5)] >> endobj 1351 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) 885 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4a877298c7076e5ef4dd848912ab1d48) 817 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dbbe3b38d0dfb444fdc3a7adae2f807) 874 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a4dff2410394a6ffdf0f95ec66cbd0107) 867 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a516287ad9b64c230200191fdd60361e1) 889 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f) 871 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a45662b23139ca5807ed6fe3b8940dc40) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f)] >> endobj 1352 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) 876 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a65820f534b99b1529510720eeaafc861) 893 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a71440b5535812faf92a0fe99275dd5f0) 814 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a72f0dd3698012cdf8b20dd6f0b5de626) 894 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a77f722abc6c05f1abf1f51c0d11bf7ec) 888 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888) 866 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a7ea36c43c374f751f65be033057e3888)] >> endobj 1353 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) 892 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8aa244ce1ae08763dde378161df0652f) 875 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a8bf90eccdaf6063e299f9415c8bd5d1a) 891 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a95dafb71a0623fbeb0715e46b7a189c7) 869 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a97113255d01bdf3cc7104dd411f40949) 870 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921) 884 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a856cdca9aa719c292b7c351cec03ae06) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa14848134610eea96115c59a6b944921)] >> endobj 1354 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) 864 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41abb11196531beac7285326a5394db0329) 890 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac12235e2fee27efdcc78f2946f86e4ab) 880 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac806692e8a98e9baca1bca5f7d9df0cd) 863 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ac8bc8e0a106154098f730ba596c43c50) 879 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c) 883 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aa86450161814b428d08b620188302fbc) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41acb4252bc9a6eeee71738af951850379c)] >> endobj 1355 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) 573 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41adbb894fd8e900c4993f57ae88f8aee1a) 818 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae2ac2caa02bbffb8ace0fa87ad5ffc05) 896 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae36383b7f8b4f36072eb60a303c439c3) 878 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ae6d7add4f73779b26c859900f710c34f) 868 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769) 895 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41ad8e91a23786bc032e507dfbd036f63c4) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41aea6be518456d203d68898efd236a6769)] >> endobj 1356 0 obj << /Names [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) 887 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af1e591927344a1a91c49b87efe3fb0b9) 816 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af61dc054946b313e1780cf604ca833c6) 886 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afbf7d7d96fdf87cb5f7541348a597b48) 873 0 R (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41afdf896f1fefa0b962ef99c6cb2681027) 815 0 R (chapter*.1) 431 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41af16b1992a2a415168ab96228671ef337) (chapter*.1)] >> endobj 1357 0 obj << /Names [(chapter.1) 2 0 R (chapter.2) 14 0 R (chapter.3) 30 0 R (chapter.4) 58 0 R (chapter.5) 74 0 R (chapter.6) 82 0 R] /Limits [(chapter.1) (chapter.6)] >> endobj 1358 0 obj << /Names [(chapter.7) 90 0 R (chapter.8) 186 0 R (figure.2.1) 582 0 R (main_8cpp) 547 0 R (main_8cpp_a08a7e8a6abdc5cf6d2ac4e978e084d1a) 577 0 R (main_8cpp_a0ddf1224851353fc92bfbff6f499fa97) 669 0 R] /Limits [(chapter.7) (main_8cpp_a0ddf1224851353fc92bfbff6f499fa97)] >> endobj 1359 0 obj << /Names [(main_8cpp_a2e18f5738841433eb8c7cd9357ff6ced) 1044 0 R (main_8cpp_a414bbb1046de58d0a2596be7b829448d) 1042 0 R (main_8cpp_a774499c04248e86e7f71ea689c3a7d19) 1050 0 R (main_8cpp_a7f18a204314393991d3da96356b2fd16) 1051 0 R (main_8cpp_a84b7343ea6e13f56b7a06559a7ef8b5a) 1047 0 R (main_8cpp_a8abd3ebb6e18277a43604c06f41e77a8) 1040 0 R] /Limits [(main_8cpp_a2e18f5738841433eb8c7cd9357ff6ced) (main_8cpp_a8abd3ebb6e18277a43604c06f41e77a8)] >> endobj 1360 0 obj << /Names [(main_8cpp_a904ab05aa185e4cbd7dfbfbf043caa6f) 1046 0 R (main_8cpp_a93d34427c5ada45032539b77c78ab2f6) 951 0 R (main_8cpp_aa5539bfe92dba402e77bcbbb497eee32) 1049 0 R (main_8cpp_aad1596787d6c1baa977de86d9a6f503c) 1052 0 R (main_8cpp_ab3bc9e46a841eaef9e74d55e0045eba8) 1041 0 R (main_8cpp_ab4a8982ff08a7f0ed68e15d851833d38) 1039 0 R] /Limits [(main_8cpp_a904ab05aa185e4cbd7dfbfbf043caa6f) (main_8cpp_ab4a8982ff08a7f0ed68e15d851833d38)] >> endobj 1361 0 obj << /Names [(main_8cpp_ab78424394912809ef271c9587d264664) 1048 0 R (main_8cpp_ab7e6541570b5f939d29aa8bbcc1dde61) 1043 0 R (main_8cpp_ac7fa490a7117a01e48e05784a6da30fc) 1045 0 R (main_8cpp_aea681fdc68ba4b307e92a33c8a62ea08) 1038 0 R (page.1) 516 0 R (page.10) 658 0 R] /Limits [(main_8cpp_ab78424394912809ef271c9587d264664) (page.10)] >> endobj 1362 0 obj << /Names [(page.11) 665 0 R (page.12) 673 0 R (page.13) 679 0 R (page.14) 684 0 R (page.15) 693 0 R (page.16) 697 0 R] /Limits [(page.11) (page.16)] >> endobj 1363 0 obj << /Names [(page.17) 721 0 R (page.18) 742 0 R (page.19) 747 0 R (page.2) 524 0 R (page.20) 753 0 R (page.21) 761 0 R] /Limits [(page.17) (page.21)] >> endobj 1364 0 obj << /Names [(page.22) 791 0 R (page.23) 862 0 R (page.24) 935 0 R (page.25) 964 0 R (page.26) 972 0 R (page.27) 977 0 R] /Limits [(page.22) (page.27)] >> endobj 1365 0 obj << /Names [(page.28) 981 0 R (page.29) 985 0 R (page.3) 538 0 R (page.30) 989 0 R (page.31) 995 0 R (page.32) 1003 0 R] /Limits [(page.28) (page.32)] >> endobj 1366 0 obj << /Names [(page.33) 1026 0 R (page.34) 1057 0 R (page.35) 1061 0 R (page.36) 1065 0 R (page.37) 1113 0 R (page.38) 1190 0 R] /Limits [(page.33) (page.38)] >> endobj 1367 0 obj << /Names [(page.39) 1267 0 R (page.4) 564 0 R (page.40) 1307 0 R (page.5) 581 0 R (page.6) 591 0 R (page.7) 606 0 R] /Limits [(page.39) (page.7)] >> endobj 1368 0 obj << /Names [(page.8) 639 0 R (page.9) 653 0 R (section*.10) 1029 0 R (section*.2) 722 0 R (section*.3) 792 0 R (section*.4) 794 0 R] /Limits [(page.8) (section*.4)] >> endobj 1369 0 obj << /Names [(section*.5) 795 0 R (section*.6) 796 0 R (section*.7) 936 0 R (section*.8) 1027 0 R (section*.9) 1028 0 R (section.1.1) 6 0 R] /Limits [(section*.5) (section.1.1)] >> endobj 1370 0 obj << /Names [(section.1.2) 10 0 R (section.2.1) 18 0 R (section.2.2) 22 0 R (section.2.3) 26 0 R (section.3.1) 34 0 R (section.3.2) 38 0 R] /Limits [(section.1.2) (section.3.2)] >> endobj 1371 0 obj << /Names [(section.3.3) 42 0 R (section.4.1) 62 0 R (section.5.1) 78 0 R (section.6.1) 86 0 R (section.7.1) 94 0 R (section.8.1) 190 0 R] /Limits [(section.3.3) (section.8.1)] >> endobj 1372 0 obj << /Names [(section.8.2) 298 0 R (structCStreamInfo) 614 0 R (structCStreamInfo_a1f2571c63e5f1db6e4d1537e37310568) 737 0 R (structCStreamInfo_a239e02305ca579866e527f4a512b1fdc) 733 0 R (structCStreamInfo_a24cea6707207c95269162847beaa0b7d) 726 0 R (structCStreamInfo_a28c5ba6424b0975f7074b8e1e217a7a3) 731 0 R] /Limits [(section.8.2) (structCStreamInfo_a28c5ba6424b0975f7074b8e1e217a7a3)] >> endobj 1373 0 obj << /Names [(structCStreamInfo_a36fa897b242eebb936d99010a8c580be) 646 0 R (structCStreamInfo_a47fa73a2c1269f30d1439e90c7652f49) 724 0 R (structCStreamInfo_a4d64654dd9d366c5ea41a89d1972534d) 728 0 R (structCStreamInfo_a5d5f38d670deaa5abf887c3b580df1cd) 723 0 R (structCStreamInfo_a6e431a6f8aeca62ffb7741b3ec068f7b) 729 0 R (structCStreamInfo_a73484dc9e2406a34c5dddf16b3cf6d0c) 732 0 R] /Limits [(structCStreamInfo_a36fa897b242eebb936d99010a8c580be) (structCStreamInfo_a73484dc9e2406a34c5dddf16b3cf6d0c)] >> endobj 1374 0 obj << /Names [(structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120) 738 0 R (structCStreamInfo_a8a9699c8f4e00893127a7e49161bbd0d) 736 0 R (structCStreamInfo_a8ffd4db9d615e545a5e8cb51990965fc) 730 0 R (structCStreamInfo_aa35e5be20f99be29ce12f9f41bf4d50e) 645 0 R (structCStreamInfo_aae39329c51fe206a8aee33daba2fe1db) 644 0 R (structCStreamInfo_aaf23a4756ee1a1b36f0b7d104d3f9882) 725 0 R] /Limits [(structCStreamInfo_a7362ae2c2b9bd37a103e575c271f3120) (structCStreamInfo_aaf23a4756ee1a1b36f0b7d104d3f9882)] >> endobj 1375 0 obj << /Names [(structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b) 734 0 R (structCStreamInfo_ac1388034d207ca6075fc0883d39eea1a) 615 0 R (structCStreamInfo_ae8a7599cb585fdb0ff5446b0a6abb9c8) 735 0 R (structCStreamInfo_af5c2c8b545a6cc3e5aac82e25a2edea0) 727 0 R (subsection.3.3.1) 46 0 R (subsection.3.3.2) 50 0 R] /Limits [(structCStreamInfo_ab28c53f72c8c1a9c4adf5d7e84bcc78b) (subsection.3.3.2)] >> endobj 1376 0 obj << /Names [(subsection.3.3.3) 54 0 R (subsection.4.1.1) 66 0 R (subsection.4.1.2) 70 0 R (subsection.7.1.1) 98 0 R (subsection.7.1.2) 102 0 R (subsection.8.1.1) 194 0 R] /Limits [(subsection.3.3.3) (subsection.8.1.1)] >> endobj 1377 0 obj << /Names [(subsection.8.1.2) 198 0 R (subsection.8.1.3) 230 0 R (subsection.8.1.4) 238 0 R (subsection.8.1.5) 250 0 R (subsection.8.2.1) 302 0 R (subsection.8.2.2) 306 0 R] /Limits [(subsection.8.1.2) (subsection.8.2.2)] >> endobj 1378 0 obj << /Names [(subsection.8.2.3) 334 0 R (subsection.8.2.4) 342 0 R (subsubsection.7.1.2.1) 106 0 R (subsubsection.7.1.2.10) 142 0 R (subsubsection.7.1.2.11) 146 0 R (subsubsection.7.1.2.12) 150 0 R] /Limits [(subsection.8.2.3) (subsubsection.7.1.2.12)] >> endobj 1379 0 obj << /Names [(subsubsection.7.1.2.13) 154 0 R (subsubsection.7.1.2.14) 158 0 R (subsubsection.7.1.2.15) 162 0 R (subsubsection.7.1.2.16) 166 0 R (subsubsection.7.1.2.17) 170 0 R (subsubsection.7.1.2.18) 174 0 R] /Limits [(subsubsection.7.1.2.13) (subsubsection.7.1.2.18)] >> endobj 1380 0 obj << /Names [(subsubsection.7.1.2.19) 178 0 R (subsubsection.7.1.2.2) 110 0 R (subsubsection.7.1.2.20) 182 0 R (subsubsection.7.1.2.3) 114 0 R (subsubsection.7.1.2.4) 118 0 R (subsubsection.7.1.2.5) 122 0 R] /Limits [(subsubsection.7.1.2.19) (subsubsection.7.1.2.5)] >> endobj 1381 0 obj << /Names [(subsubsection.7.1.2.6) 126 0 R (subsubsection.7.1.2.7) 130 0 R (subsubsection.7.1.2.8) 134 0 R (subsubsection.7.1.2.9) 138 0 R (subsubsection.8.1.2.1) 202 0 R (subsubsection.8.1.2.2) 206 0 R] /Limits [(subsubsection.7.1.2.6) (subsubsection.8.1.2.2)] >> endobj 1382 0 obj << /Names [(subsubsection.8.1.2.3) 210 0 R (subsubsection.8.1.2.4) 214 0 R (subsubsection.8.1.2.5) 218 0 R (subsubsection.8.1.2.6) 222 0 R (subsubsection.8.1.2.7) 226 0 R (subsubsection.8.1.3.1) 234 0 R] /Limits [(subsubsection.8.1.2.3) (subsubsection.8.1.3.1)] >> endobj 1383 0 obj << /Names [(subsubsection.8.1.4.1) 242 0 R (subsubsection.8.1.4.2) 246 0 R (subsubsection.8.1.5.1) 254 0 R (subsubsection.8.1.5.10) 290 0 R (subsubsection.8.1.5.11) 294 0 R (subsubsection.8.1.5.2) 258 0 R] /Limits [(subsubsection.8.1.4.1) (subsubsection.8.1.5.2)] >> endobj 1384 0 obj << /Names [(subsubsection.8.1.5.3) 262 0 R (subsubsection.8.1.5.4) 266 0 R (subsubsection.8.1.5.5) 270 0 R (subsubsection.8.1.5.6) 274 0 R (subsubsection.8.1.5.7) 278 0 R (subsubsection.8.1.5.8) 282 0 R] /Limits [(subsubsection.8.1.5.3) (subsubsection.8.1.5.8)] >> endobj 1385 0 obj << /Names [(subsubsection.8.1.5.9) 286 0 R (subsubsection.8.2.2.1) 310 0 R (subsubsection.8.2.2.2) 314 0 R (subsubsection.8.2.2.3) 318 0 R (subsubsection.8.2.2.4) 322 0 R (subsubsection.8.2.2.5) 326 0 R] /Limits [(subsubsection.8.1.5.9) (subsubsection.8.2.2.5)] >> endobj 1386 0 obj << /Names [(subsubsection.8.2.2.6) 330 0 R (subsubsection.8.2.3.1) 338 0 R (subsubsection.8.2.4.1) 346 0 R (subsubsection.8.2.4.10) 382 0 R (subsubsection.8.2.4.11) 386 0 R (subsubsection.8.2.4.2) 350 0 R] /Limits [(subsubsection.8.2.2.6) (subsubsection.8.2.4.2)] >> endobj 1387 0 obj << /Names [(subsubsection.8.2.4.3) 354 0 R (subsubsection.8.2.4.4) 358 0 R (subsubsection.8.2.4.5) 362 0 R (subsubsection.8.2.4.6) 366 0 R (subsubsection.8.2.4.7) 370 0 R (subsubsection.8.2.4.8) 374 0 R] /Limits [(subsubsection.8.2.4.3) (subsubsection.8.2.4.8)] >> endobj 1388 0 obj << /Names [(subsubsection.8.2.4.9) 378 0 R] /Limits [(subsubsection.8.2.4.9) (subsubsection.8.2.4.9)] >> endobj 1389 0 obj << /Kids [1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R] /Limits [(CommandLineUsage) (aacdecoder__lib_8h_a620b5a8c5d7ddd1b525aae1895963e16)] >> endobj 1390 0 obj << /Kids [1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R] /Limits [(aacdecoder__lib_8h_a6d508fce68c364f5dabc9195e701ecf8) (aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a5bc4e4af77d94fa08beb54def8f01f7f)] >> endobj 1391 0 obj << /Kids [1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R] /Limits [(aacdecoder__lib_8h_afbc7e8b4f1613dfd8cb91b681eeb9d41a60690e0dbc450f62f83548fa484716ab) (chapter.6)] >> endobj 1392 0 obj << /Kids [1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R] /Limits [(chapter.7) (page.21)] >> endobj 1393 0 obj << /Kids [1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R] /Limits [(page.22) (section.1.1)] >> endobj 1394 0 obj << /Kids [1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R] /Limits [(section.1.2) (subsection.3.3.2)] >> endobj 1395 0 obj << /Kids [1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R] /Limits [(subsection.3.3.3) (subsubsection.8.1.2.2)] >> endobj 1396 0 obj << /Kids [1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R] /Limits [(subsubsection.8.1.2.3) (subsubsection.8.2.4.8)] >> endobj 1397 0 obj << /Kids [1388 0 R] /Limits [(subsubsection.8.2.4.9) (subsubsection.8.2.4.9)] >> endobj 1398 0 obj << /Kids [1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R] /Limits [(CommandLineUsage) (subsection.3.3.2)] >> endobj 1399 0 obj << /Kids [1395 0 R 1396 0 R 1397 0 R] /Limits [(subsection.3.3.3) (subsubsection.8.2.4.9)] >> endobj 1400 0 obj << /Kids [1398 0 R 1399 0 R] /Limits [(CommandLineUsage) (subsubsection.8.2.4.9)] >> endobj 1401 0 obj << /Dests 1400 0 R >> endobj 1402 0 obj << /Type /Catalog /Pages 1338 0 R /Outlines 1339 0 R /Names 1401 0 R /PageMode/UseOutlines/PageLabels<>2<>6<>]>> /OpenAction 389 0 R >> endobj 1403 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20120927161848+02'00') /ModDate (D:20120927161848+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 1404 0000000000 65535 f 0000000015 00000 n 0000183153 00000 n 0000506334 00000 n 0000000060 00000 n 0000000146 00000 n 0000183322 00000 n 0000506264 00000 n 0000000193 00000 n 0000000244 00000 n 0000183439 00000 n 0000506193 00000 n 0000000291 00000 n 0000000391 00000 n 0000187370 00000 n 0000506068 00000 n 0000000437 00000 n 0000000532 00000 n 0000187540 00000 n 0000505994 00000 n 0000000580 00000 n 0000000685 00000 n 0000187657 00000 n 0000505907 00000 n 0000000733 00000 n 0000000843 00000 n 0000193762 00000 n 0000505833 00000 n 0000000891 00000 n 0000000986 00000 n 0000222468 00000 n 0000505707 00000 n 0000001032 00000 n 0000001165 00000 n 0000222638 00000 n 0000505633 00000 n 0000001213 00000 n 0000001434 00000 n 0000222756 00000 n 0000505546 00000 n 0000001482 00000 n 0000001681 00000 n 0000222874 00000 n 0000505435 00000 n 0000001729 00000 n 0000001882 00000 n 0000228900 00000 n 0000505361 00000 n 0000001935 00000 n 0000001992 00000 n 0000229018 00000 n 0000505274 00000 n 0000002045 00000 n 0000002135 00000 n 0000231747 00000 n 0000505200 00000 n 0000002188 00000 n 0000002324 00000 n 0000234298 00000 n 0000505074 00000 n 0000002370 00000 n 0000002490 00000 n 0000234473 00000 n 0000504976 00000 n 0000002538 00000 n 0000002610 00000 n 0000234586 00000 n 0000504902 00000 n 0000002663 00000 n 0000002788 00000 n 0000234699 00000 n 0000504828 00000 n 0000002841 00000 n 0000002961 00000 n 0000237270 00000 n 0000504702 00000 n 0000003007 00000 n 0000003092 00000 n 0000237326 00000 n 0000504641 00000 n 0000003140 00000 n 0000003220 00000 n 0000239491 00000 n 0000504515 00000 n 0000003266 00000 n 0000003346 00000 n 0000239547 00000 n 0000504454 00000 n 0000003394 00000 n 0000003469 00000 n 0000245207 00000 n 0000504327 00000 n 0000003515 00000 n 0000003640 00000 n 0000245320 00000 n 0000504228 00000 n 0000003688 00000 n 0000003861 00000 n 0000245433 00000 n 0000504152 00000 n 0000003914 00000 n 0000004045 00000 n 0000246770 00000 n 0000504035 00000 n 0000004099 00000 n 0000004258 00000 n 0000246884 00000 n 0000503956 00000 n 0000004317 00000 n 0000004410 00000 n 0000247003 00000 n 0000503863 00000 n 0000004469 00000 n 0000004587 00000 n 0000247122 00000 n 0000503770 00000 n 0000004646 00000 n 0000004689 00000 n 0000247241 00000 n 0000503677 00000 n 0000004748 00000 n 0000004811 00000 n 0000247360 00000 n 0000503584 00000 n 0000004870 00000 n 0000004963 00000 n 0000247479 00000 n 0000503491 00000 n 0000005022 00000 n 0000005090 00000 n 0000247598 00000 n 0000503398 00000 n 0000005149 00000 n 0000005207 00000 n 0000247717 00000 n 0000503305 00000 n 0000005266 00000 n 0000005369 00000 n 0000247836 00000 n 0000503212 00000 n 0000005428 00000 n 0000005481 00000 n 0000247955 00000 n 0000503119 00000 n 0000005541 00000 n 0000005614 00000 n 0000249696 00000 n 0000503026 00000 n 0000005674 00000 n 0000005787 00000 n 0000249810 00000 n 0000502933 00000 n 0000005847 00000 n 0000005930 00000 n 0000249929 00000 n 0000502840 00000 n 0000005990 00000 n 0000006073 00000 n 0000250043 00000 n 0000502747 00000 n 0000006133 00000 n 0000006251 00000 n 0000250157 00000 n 0000502654 00000 n 0000006311 00000 n 0000006434 00000 n 0000250270 00000 n 0000502561 00000 n 0000006494 00000 n 0000006587 00000 n 0000250389 00000 n 0000502468 00000 n 0000006647 00000 n 0000006750 00000 n 0000250508 00000 n 0000502375 00000 n 0000006810 00000 n 0000006898 00000 n 0000250627 00000 n 0000502282 00000 n 0000006958 00000 n 0000007021 00000 n 0000251708 00000 n 0000502203 00000 n 0000007081 00000 n 0000007159 00000 n 0000256953 00000 n 0000502085 00000 n 0000007206 00000 n 0000007327 00000 n 0000257067 00000 n 0000501967 00000 n 0000007376 00000 n 0000007568 00000 n 0000289847 00000 n 0000501888 00000 n 0000007622 00000 n 0000007753 00000 n 0000289904 00000 n 0000501756 00000 n 0000007807 00000 n 0000007938 00000 n 0000290018 00000 n 0000501677 00000 n 0000007997 00000 n 0000008098 00000 n 0000290135 00000 n 0000501584 00000 n 0000008157 00000 n 0000008258 00000 n 0000290254 00000 n 0000501491 00000 n 0000008317 00000 n 0000008408 00000 n 0000290367 00000 n 0000501398 00000 n 0000008467 00000 n 0000008553 00000 n 0000290485 00000 n 0000501305 00000 n 0000008612 00000 n 0000008721 00000 n 0000293228 00000 n 0000501212 00000 n 0000008780 00000 n 0000008879 00000 n 0000293347 00000 n 0000501133 00000 n 0000008938 00000 n 0000009047 00000 n 0000293404 00000 n 0000501001 00000 n 0000009101 00000 n 0000009237 00000 n 0000293518 00000 n 0000500936 00000 n 0000009296 00000 n 0000009412 00000 n 0000293575 00000 n 0000500804 00000 n 0000009466 00000 n 0000009650 00000 n 0000293689 00000 n 0000500725 00000 n 0000009709 00000 n 0000009828 00000 n 0000298546 00000 n 0000500646 00000 n 0000009887 00000 n 0000009978 00000 n 0000302539 00000 n 0000500527 00000 n 0000010032 00000 n 0000010173 00000 n 0000302653 00000 n 0000500448 00000 n 0000010232 00000 n 0000010368 00000 n 0000304426 00000 n 0000500355 00000 n 0000010427 00000 n 0000010568 00000 n 0000304540 00000 n 0000500262 00000 n 0000010627 00000 n 0000010738 00000 n 0000304653 00000 n 0000500169 00000 n 0000010797 00000 n 0000010928 00000 n 0000307032 00000 n 0000500076 00000 n 0000010987 00000 n 0000011128 00000 n 0000307146 00000 n 0000499983 00000 n 0000011187 00000 n 0000011293 00000 n 0000309116 00000 n 0000499890 00000 n 0000011352 00000 n 0000011498 00000 n 0000309229 00000 n 0000499797 00000 n 0000011557 00000 n 0000011693 00000 n 0000309342 00000 n 0000499704 00000 n 0000011752 00000 n 0000011903 00000 n 0000310996 00000 n 0000499611 00000 n 0000011963 00000 n 0000012069 00000 n 0000311112 00000 n 0000499532 00000 n 0000012129 00000 n 0000012255 00000 n 0000311227 00000 n 0000499414 00000 n 0000012304 00000 n 0000012453 00000 n 0000321808 00000 n 0000499335 00000 n 0000012507 00000 n 0000012638 00000 n 0000323788 00000 n 0000499203 00000 n 0000012692 00000 n 0000012823 00000 n 0000323905 00000 n 0000499124 00000 n 0000012882 00000 n 0000012976 00000 n 0000324021 00000 n 0000499031 00000 n 0000013035 00000 n 0000013134 00000 n 0000324135 00000 n 0000498938 00000 n 0000013193 00000 n 0000013282 00000 n 0000324250 00000 n 0000498845 00000 n 0000013341 00000 n 0000013445 00000 n 0000324367 00000 n 0000498752 00000 n 0000013504 00000 n 0000013590 00000 n 0000324484 00000 n 0000498673 00000 n 0000013649 00000 n 0000013743 00000 n 0000324542 00000 n 0000498541 00000 n 0000013797 00000 n 0000013938 00000 n 0000324658 00000 n 0000498476 00000 n 0000013997 00000 n 0000014045 00000 n 0000325731 00000 n 0000498357 00000 n 0000014099 00000 n 0000014240 00000 n 0000325847 00000 n 0000498278 00000 n 0000014299 00000 n 0000014372 00000 n 0000325963 00000 n 0000498185 00000 n 0000014431 00000 n 0000014514 00000 n 0000326079 00000 n 0000498092 00000 n 0000014573 00000 n 0000014621 00000 n 0000326196 00000 n 0000497999 00000 n 0000014680 00000 n 0000014751 00000 n 0000326313 00000 n 0000497906 00000 n 0000014810 00000 n 0000014878 00000 n 0000326429 00000 n 0000497813 00000 n 0000014937 00000 n 0000015015 00000 n 0000326546 00000 n 0000497720 00000 n 0000015074 00000 n 0000015142 00000 n 0000326663 00000 n 0000497627 00000 n 0000015201 00000 n 0000015292 00000 n 0000326779 00000 n 0000497534 00000 n 0000015351 00000 n 0000015444 00000 n 0000327615 00000 n 0000497441 00000 n 0000015504 00000 n 0000015602 00000 n 0000327732 00000 n 0000497362 00000 n 0000015662 00000 n 0000015730 00000 n 0000016819 00000 n 0000016953 00000 n 0000160276 00000 n 0000160404 00000 n 0000015782 00000 n 0000160347 00000 n 0000495354 00000 n 0000495710 00000 n 0000496066 00000 n 0000128679 00000 n 0000160744 00000 n 0000160625 00000 n 0000160525 00000 n 0000162006 00000 n 0000162157 00000 n 0000162311 00000 n 0000162463 00000 n 0000162613 00000 n 0000162766 00000 n 0000162920 00000 n 0000163074 00000 n 0000163225 00000 n 0000163379 00000 n 0000163533 00000 n 0000163687 00000 n 0000163846 00000 n 0000164005 00000 n 0000164164 00000 n 0000164315 00000 n 0000164469 00000 n 0000164628 00000 n 0000164787 00000 n 0000164938 00000 n 0000165091 00000 n 0000165242 00000 n 0000165396 00000 n 0000165546 00000 n 0000167324 00000 n 0000165756 00000 n 0000161683 00000 n 0000160785 00000 n 0000165699 00000 n 0000167483 00000 n 0000167642 00000 n 0000167802 00000 n 0000167966 00000 n 0000168129 00000 n 0000168293 00000 n 0000168457 00000 n 0000168620 00000 n 0000168783 00000 n 0000168947 00000 n 0000169111 00000 n 0000169275 00000 n 0000169440 00000 n 0000169605 00000 n 0000169770 00000 n 0000169935 00000 n 0000170099 00000 n 0000170264 00000 n 0000170428 00000 n 0000170593 00000 n 0000170757 00000 n 0000170922 00000 n 0000171073 00000 n 0000171227 00000 n 0000171386 00000 n 0000171545 00000 n 0000171709 00000 n 0000171872 00000 n 0000172036 00000 n 0000172200 00000 n 0000172364 00000 n 0000172528 00000 n 0000172692 00000 n 0000172851 00000 n 0000173014 00000 n 0000174772 00000 n 0000173172 00000 n 0000166905 00000 n 0000165841 00000 n 0000174936 00000 n 0000175100 00000 n 0000175259 00000 n 0000175423 00000 n 0000175587 00000 n 0000175751 00000 n 0000175915 00000 n 0000176078 00000 n 0000176242 00000 n 0000176405 00000 n 0000176568 00000 n 0000176732 00000 n 0000176896 00000 n 0000177061 00000 n 0000177215 00000 n 0000177373 00000 n 0000177531 00000 n 0000177695 00000 n 0000177859 00000 n 0000178023 00000 n 0000178187 00000 n 0000178351 00000 n 0000178515 00000 n 0000178674 00000 n 0000178838 00000 n 0000178997 00000 n 0000179161 00000 n 0000179324 00000 n 0000179488 00000 n 0000179651 00000 n 0000179813 00000 n 0000179977 00000 n 0000180140 00000 n 0000180304 00000 n 0000180468 00000 n 0000181156 00000 n 0000180632 00000 n 0000174353 00000 n 0000173257 00000 n 0000181321 00000 n 0000181017 00000 n 0000180717 00000 n 0000183495 00000 n 0000182978 00000 n 0000181406 00000 n 0000183097 00000 n 0000183208 00000 n 0000183265 00000 n 0000183377 00000 n 0000496184 00000 n 0000183982 00000 n 0000183807 00000 n 0000183580 00000 n 0000183926 00000 n 0000186263 00000 n 0000186423 00000 n 0000186575 00000 n 0000186734 00000 n 0000186928 00000 n 0000187121 00000 n 0000190726 00000 n 0000190878 00000 n 0000191073 00000 n 0000191526 00000 n 0000187884 00000 n 0000186084 00000 n 0000184054 00000 n 0000187314 00000 n 0000187426 00000 n 0000187483 00000 n 0000187596 00000 n 0000187713 00000 n 0000495180 00000 n 0000187770 00000 n 0000187827 00000 n 0000257010 00000 n 0000311170 00000 n 0000234354 00000 n 0000309399 00000 n 0000304596 00000 n 0000306976 00000 n 0000191720 00000 n 0000191915 00000 n 0000192110 00000 n 0000192304 00000 n 0000192455 00000 n 0000192650 00000 n 0000192800 00000 n 0000193170 00000 n 0000195152 00000 n 0000193818 00000 n 0000190468 00000 n 0000187982 00000 n 0000193365 00000 n 0000193421 00000 n 0000191300 00000 n 0000193478 00000 n 0000193534 00000 n 0000193591 00000 n 0000193648 00000 n 0000193705 00000 n 0000192986 00000 n 0000294056 00000 n 0000307089 00000 n 0000309286 00000 n 0000304483 00000 n 0000324079 00000 n 0000218033 00000 n 0000195018 00000 n 0000193916 00000 n 0000217915 00000 n 0000217971 00000 n 0000495036 00000 n 0000494602 00000 n 0000494747 00000 n 0000494891 00000 n 0000208041 00000 n 0000218610 00000 n 0000218435 00000 n 0000218205 00000 n 0000218554 00000 n 0000220672 00000 n 0000220831 00000 n 0000221216 00000 n 0000221444 00000 n 0000221671 00000 n 0000221866 00000 n 0000222059 00000 n 0000222218 00000 n 0000224945 00000 n 0000225172 00000 n 0000225626 00000 n 0000222991 00000 n 0000220469 00000 n 0000218682 00000 n 0000222412 00000 n 0000222524 00000 n 0000222581 00000 n 0000221024 00000 n 0000222694 00000 n 0000222812 00000 n 0000222930 00000 n 0000496302 00000 n 0000245263 00000 n 0000249867 00000 n 0000298603 00000 n 0000301985 00000 n 0000311054 00000 n 0000225786 00000 n 0000225979 00000 n 0000226172 00000 n 0000226363 00000 n 0000226589 00000 n 0000226781 00000 n 0000227009 00000 n 0000227463 00000 n 0000227621 00000 n 0000227813 00000 n 0000228006 00000 n 0000228198 00000 n 0000228425 00000 n 0000228653 00000 n 0000230271 00000 n 0000230499 00000 n 0000230954 00000 n 0000229135 00000 n 0000224662 00000 n 0000223076 00000 n 0000228844 00000 n 0000225399 00000 n 0000228956 00000 n 0000227237 00000 n 0000229074 00000 n 0000250446 00000 n 0000250327 00000 n 0000247893 00000 n 0000231114 00000 n 0000231307 00000 n 0000231500 00000 n 0000231803 00000 n 0000230084 00000 n 0000229233 00000 n 0000231691 00000 n 0000230727 00000 n 0000232309 00000 n 0000232134 00000 n 0000231901 00000 n 0000232253 00000 n 0000233753 00000 n 0000233905 00000 n 0000234090 00000 n 0000234755 00000 n 0000233598 00000 n 0000232381 00000 n 0000234242 00000 n 0000234411 00000 n 0000234529 00000 n 0000234642 00000 n 0000324600 00000 n 0000236186 00000 n 0000236011 00000 n 0000234853 00000 n 0000236130 00000 n 0000236900 00000 n 0000237060 00000 n 0000237382 00000 n 0000236753 00000 n 0000236271 00000 n 0000237214 00000 n 0000496420 00000 n 0000237870 00000 n 0000237695 00000 n 0000237467 00000 n 0000237814 00000 n 0000238650 00000 n 0000238811 00000 n 0000238965 00000 n 0000239116 00000 n 0000239281 00000 n 0000239603 00000 n 0000238479 00000 n 0000237942 00000 n 0000239435 00000 n 0000240088 00000 n 0000239913 00000 n 0000239688 00000 n 0000240032 00000 n 0000241279 00000 n 0000241473 00000 n 0000241667 00000 n 0000241861 00000 n 0000242054 00000 n 0000242248 00000 n 0000242441 00000 n 0000242635 00000 n 0000242829 00000 n 0000243023 00000 n 0000243217 00000 n 0000243411 00000 n 0000243605 00000 n 0000243798 00000 n 0000243992 00000 n 0000244186 00000 n 0000244378 00000 n 0000244570 00000 n 0000244764 00000 n 0000244958 00000 n 0000245489 00000 n 0000240988 00000 n 0000240160 00000 n 0000245151 00000 n 0000245376 00000 n 0000250684 00000 n 0000246827 00000 n 0000250565 00000 n 0000247060 00000 n 0000247298 00000 n 0000247179 00000 n 0000246941 00000 n 0000247536 00000 n 0000247655 00000 n 0000247774 00000 n 0000247417 00000 n 0000249986 00000 n 0000250213 00000 n 0000249753 00000 n 0000250100 00000 n 0000249639 00000 n 0000248012 00000 n 0000246595 00000 n 0000245613 00000 n 0000246714 00000 n 0000249389 00000 n 0000250745 00000 n 0000249250 00000 n 0000248097 00000 n 0000249583 00000 n 0000496538 00000 n 0000251494 00000 n 0000251765 00000 n 0000251355 00000 n 0000250856 00000 n 0000251652 00000 n 0000252435 00000 n 0000256830 00000 n 0000258679 00000 n 0000262116 00000 n 0000257124 00000 n 0000252301 00000 n 0000251852 00000 n 0000256897 00000 n 0000253345 00000 n 0000253475 00000 n 0000253615 00000 n 0000253902 00000 n 0000254307 00000 n 0000254511 00000 n 0000254532 00000 n 0000256808 00000 n 0000262183 00000 n 0000262343 00000 n 0000262537 00000 n 0000262731 00000 n 0000262926 00000 n 0000263121 00000 n 0000263315 00000 n 0000263510 00000 n 0000263705 00000 n 0000263900 00000 n 0000264095 00000 n 0000264322 00000 n 0000264549 00000 n 0000264776 00000 n 0000264999 00000 n 0000265224 00000 n 0000267281 00000 n 0000267508 00000 n 0000265734 00000 n 0000258405 00000 n 0000257250 00000 n 0000265450 00000 n 0000265506 00000 n 0000495886 00000 n 0000265563 00000 n 0000265620 00000 n 0000265677 00000 n 0000259342 00000 n 0000259472 00000 n 0000259612 00000 n 0000259863 00000 n 0000260227 00000 n 0000260431 00000 n 0000260452 00000 n 0000262094 00000 n 0000290542 00000 n 0000290424 00000 n 0000293285 00000 n 0000290075 00000 n 0000290192 00000 n 0000290311 00000 n 0000289961 00000 n 0000293461 00000 n 0000293632 00000 n 0000293746 00000 n 0000293808 00000 n 0000293870 00000 n 0000293932 00000 n 0000293994 00000 n 0000267735 00000 n 0000267958 00000 n 0000268185 00000 n 0000268412 00000 n 0000268638 00000 n 0000268865 00000 n 0000269092 00000 n 0000269319 00000 n 0000269546 00000 n 0000269773 00000 n 0000270000 00000 n 0000270227 00000 n 0000270454 00000 n 0000270681 00000 n 0000270908 00000 n 0000271135 00000 n 0000271361 00000 n 0000271586 00000 n 0000271813 00000 n 0000272040 00000 n 0000272267 00000 n 0000272494 00000 n 0000272720 00000 n 0000272947 00000 n 0000273174 00000 n 0000273400 00000 n 0000273627 00000 n 0000273853 00000 n 0000274080 00000 n 0000274307 00000 n 0000274533 00000 n 0000274760 00000 n 0000274985 00000 n 0000275178 00000 n 0000275405 00000 n 0000275632 00000 n 0000275858 00000 n 0000278661 00000 n 0000278888 00000 n 0000279115 00000 n 0000276140 00000 n 0000266838 00000 n 0000265886 00000 n 0000276084 00000 n 0000294118 00000 n 0000294180 00000 n 0000294242 00000 n 0000294304 00000 n 0000294366 00000 n 0000294428 00000 n 0000294490 00000 n 0000294552 00000 n 0000294613 00000 n 0000294675 00000 n 0000294737 00000 n 0000294799 00000 n 0000297127 00000 n 0000297189 00000 n 0000297251 00000 n 0000297313 00000 n 0000297374 00000 n 0000297436 00000 n 0000297498 00000 n 0000297560 00000 n 0000297622 00000 n 0000297684 00000 n 0000297746 00000 n 0000297808 00000 n 0000297870 00000 n 0000297932 00000 n 0000297994 00000 n 0000298056 00000 n 0000298118 00000 n 0000298180 00000 n 0000298242 00000 n 0000298304 00000 n 0000298366 00000 n 0000298428 00000 n 0000298489 00000 n 0000301861 00000 n 0000301923 00000 n 0000279342 00000 n 0000279568 00000 n 0000279795 00000 n 0000280022 00000 n 0000280249 00000 n 0000280476 00000 n 0000280670 00000 n 0000280865 00000 n 0000281058 00000 n 0000281253 00000 n 0000281448 00000 n 0000281641 00000 n 0000281836 00000 n 0000282030 00000 n 0000282417 00000 n 0000282610 00000 n 0000282805 00000 n 0000283000 00000 n 0000283389 00000 n 0000283584 00000 n 0000283779 00000 n 0000283974 00000 n 0000284169 00000 n 0000284362 00000 n 0000284548 00000 n 0000284739 00000 n 0000284930 00000 n 0000285122 00000 n 0000285317 00000 n 0000285512 00000 n 0000287720 00000 n 0000287915 00000 n 0000286013 00000 n 0000278242 00000 n 0000276238 00000 n 0000285900 00000 n 0000285956 00000 n 0000282225 00000 n 0000283195 00000 n 0000285707 00000 n 0000302047 00000 n 0000302105 00000 n 0000302167 00000 n 0000302229 00000 n 0000302291 00000 n 0000302353 00000 n 0000302415 00000 n 0000302477 00000 n 0000304369 00000 n 0000302596 00000 n 0000309059 00000 n 0000326021 00000 n 0000288110 00000 n 0000288270 00000 n 0000288463 00000 n 0000288658 00000 n 0000288817 00000 n 0000289012 00000 n 0000289207 00000 n 0000289402 00000 n 0000289597 00000 n 0000290598 00000 n 0000287501 00000 n 0000286124 00000 n 0000289791 00000 n 0000495530 00000 n 0000496656 00000 n 0000309173 00000 n 0000292783 00000 n 0000294861 00000 n 0000292636 00000 n 0000290735 00000 n 0000293172 00000 n 0000292978 00000 n 0000298665 00000 n 0000296952 00000 n 0000294985 00000 n 0000297071 00000 n 0000302710 00000 n 0000301686 00000 n 0000298763 00000 n 0000301805 00000 n 0000304710 00000 n 0000304194 00000 n 0000302821 00000 n 0000304313 00000 n 0000307203 00000 n 0000306801 00000 n 0000304821 00000 n 0000306920 00000 n 0000308684 00000 n 0000308843 00000 n 0000309455 00000 n 0000308537 00000 n 0000307314 00000 n 0000309003 00000 n 0000496774 00000 n 0000310772 00000 n 0000312780 00000 n 0000317980 00000 n 0000311285 00000 n 0000310630 00000 n 0000309567 00000 n 0000310938 00000 n 0000318047 00000 n 0000318234 00000 n 0000318421 00000 n 0000318608 00000 n 0000318795 00000 n 0000318982 00000 n 0000319169 00000 n 0000319356 00000 n 0000319543 00000 n 0000319730 00000 n 0000319916 00000 n 0000320103 00000 n 0000320289 00000 n 0000320475 00000 n 0000320661 00000 n 0000320848 00000 n 0000321034 00000 n 0000321220 00000 n 0000321407 00000 n 0000321866 00000 n 0000312460 00000 n 0000311397 00000 n 0000321573 00000 n 0000321631 00000 n 0000321690 00000 n 0000321749 00000 n 0000314216 00000 n 0000314347 00000 n 0000314490 00000 n 0000314795 00000 n 0000315218 00000 n 0000315424 00000 n 0000315446 00000 n 0000317957 00000 n 0000323963 00000 n 0000324308 00000 n 0000324425 00000 n 0000323846 00000 n 0000324191 00000 n 0000326721 00000 n 0000327556 00000 n 0000325904 00000 n 0000326487 00000 n 0000326604 00000 n 0000327673 00000 n 0000325789 00000 n 0000326137 00000 n 0000326254 00000 n 0000326370 00000 n 0000323534 00000 n 0000324716 00000 n 0000323391 00000 n 0000321993 00000 n 0000323730 00000 n 0000326837 00000 n 0000325551 00000 n 0000324828 00000 n 0000325673 00000 n 0000327790 00000 n 0000327376 00000 n 0000326936 00000 n 0000327498 00000 n 0000329260 00000 n 0000329411 00000 n 0000329561 00000 n 0000329712 00000 n 0000329863 00000 n 0000330014 00000 n 0000330165 00000 n 0000330316 00000 n 0000330467 00000 n 0000330617 00000 n 0000330768 00000 n 0000330919 00000 n 0000331070 00000 n 0000331221 00000 n 0000331372 00000 n 0000331522 00000 n 0000331673 00000 n 0000331824 00000 n 0000331975 00000 n 0000332126 00000 n 0000332277 00000 n 0000332428 00000 n 0000332578 00000 n 0000332729 00000 n 0000332880 00000 n 0000333031 00000 n 0000333182 00000 n 0000333333 00000 n 0000333484 00000 n 0000333635 00000 n 0000333786 00000 n 0000333937 00000 n 0000334088 00000 n 0000334239 00000 n 0000334390 00000 n 0000334541 00000 n 0000334691 00000 n 0000334842 00000 n 0000334993 00000 n 0000335144 00000 n 0000335294 00000 n 0000335445 00000 n 0000335596 00000 n 0000337902 00000 n 0000335805 00000 n 0000328738 00000 n 0000327876 00000 n 0000335747 00000 n 0000496897 00000 n 0000338053 00000 n 0000338204 00000 n 0000338355 00000 n 0000338505 00000 n 0000338655 00000 n 0000338806 00000 n 0000338957 00000 n 0000339108 00000 n 0000339259 00000 n 0000339410 00000 n 0000339561 00000 n 0000339712 00000 n 0000339863 00000 n 0000340014 00000 n 0000340165 00000 n 0000340316 00000 n 0000340467 00000 n 0000340618 00000 n 0000340768 00000 n 0000340919 00000 n 0000341069 00000 n 0000341219 00000 n 0000341369 00000 n 0000341520 00000 n 0000341671 00000 n 0000341821 00000 n 0000341972 00000 n 0000342123 00000 n 0000342274 00000 n 0000342424 00000 n 0000342575 00000 n 0000342725 00000 n 0000342876 00000 n 0000343026 00000 n 0000343177 00000 n 0000343328 00000 n 0000343478 00000 n 0000343628 00000 n 0000343779 00000 n 0000343930 00000 n 0000344081 00000 n 0000344232 00000 n 0000344382 00000 n 0000344533 00000 n 0000344682 00000 n 0000344833 00000 n 0000344984 00000 n 0000345134 00000 n 0000345285 00000 n 0000345435 00000 n 0000345586 00000 n 0000345737 00000 n 0000345888 00000 n 0000346038 00000 n 0000346189 00000 n 0000346340 00000 n 0000346491 00000 n 0000346642 00000 n 0000346793 00000 n 0000346944 00000 n 0000347095 00000 n 0000347246 00000 n 0000347397 00000 n 0000347547 00000 n 0000347698 00000 n 0000347849 00000 n 0000348000 00000 n 0000348151 00000 n 0000348301 00000 n 0000348451 00000 n 0000348601 00000 n 0000348752 00000 n 0000348960 00000 n 0000337110 00000 n 0000335891 00000 n 0000348902 00000 n 0000350849 00000 n 0000350999 00000 n 0000351150 00000 n 0000351301 00000 n 0000351452 00000 n 0000351603 00000 n 0000351754 00000 n 0000351905 00000 n 0000352056 00000 n 0000352206 00000 n 0000352356 00000 n 0000352507 00000 n 0000352657 00000 n 0000352806 00000 n 0000352954 00000 n 0000353104 00000 n 0000353255 00000 n 0000353406 00000 n 0000353557 00000 n 0000353708 00000 n 0000353858 00000 n 0000354008 00000 n 0000354159 00000 n 0000354308 00000 n 0000354458 00000 n 0000354609 00000 n 0000354760 00000 n 0000354911 00000 n 0000355062 00000 n 0000355213 00000 n 0000355364 00000 n 0000355515 00000 n 0000355665 00000 n 0000355816 00000 n 0000355967 00000 n 0000356118 00000 n 0000356267 00000 n 0000356417 00000 n 0000356568 00000 n 0000356719 00000 n 0000356869 00000 n 0000357019 00000 n 0000357170 00000 n 0000357321 00000 n 0000357471 00000 n 0000357622 00000 n 0000357772 00000 n 0000357922 00000 n 0000358072 00000 n 0000358222 00000 n 0000358372 00000 n 0000358523 00000 n 0000358674 00000 n 0000358825 00000 n 0000358976 00000 n 0000359127 00000 n 0000359278 00000 n 0000359428 00000 n 0000359579 00000 n 0000359730 00000 n 0000359881 00000 n 0000360032 00000 n 0000360183 00000 n 0000360333 00000 n 0000360483 00000 n 0000360634 00000 n 0000360785 00000 n 0000360936 00000 n 0000361087 00000 n 0000361238 00000 n 0000361389 00000 n 0000361540 00000 n 0000362989 00000 n 0000361749 00000 n 0000350066 00000 n 0000349046 00000 n 0000361691 00000 n 0000363140 00000 n 0000363291 00000 n 0000363442 00000 n 0000363593 00000 n 0000363744 00000 n 0000363895 00000 n 0000364046 00000 n 0000364197 00000 n 0000364347 00000 n 0000364497 00000 n 0000364648 00000 n 0000364799 00000 n 0000364950 00000 n 0000365101 00000 n 0000365251 00000 n 0000365402 00000 n 0000365552 00000 n 0000365703 00000 n 0000365852 00000 n 0000366001 00000 n 0000366151 00000 n 0000366302 00000 n 0000366453 00000 n 0000366604 00000 n 0000366755 00000 n 0000366906 00000 n 0000367056 00000 n 0000367207 00000 n 0000367357 00000 n 0000367508 00000 n 0000367659 00000 n 0000367809 00000 n 0000367960 00000 n 0000368110 00000 n 0000368260 00000 n 0000368411 00000 n 0000368620 00000 n 0000362521 00000 n 0000361835 00000 n 0000368562 00000 n 0000494133 00000 n 0000368706 00000 n 0000369178 00000 n 0000369654 00000 n 0000370255 00000 n 0000370339 00000 n 0000370537 00000 n 0000370563 00000 n 0000370951 00000 n 0000371830 00000 n 0000372320 00000 n 0000383005 00000 n 0000383270 00000 n 0000392653 00000 n 0000392923 00000 n 0000400117 00000 n 0000400356 00000 n 0000407385 00000 n 0000407617 00000 n 0000425933 00000 n 0000426479 00000 n 0000444502 00000 n 0000445043 00000 n 0000459125 00000 n 0000459501 00000 n 0000479380 00000 n 0000479971 00000 n 0000493741 00000 n 0000497004 00000 n 0000497124 00000 n 0000497213 00000 n 0000497286 00000 n 0000506443 00000 n 0000506678 00000 n 0000506872 00000 n 0000507061 00000 n 0000507371 00000 n 0000507788 00000 n 0000508319 00000 n 0000508949 00000 n 0000509744 00000 n 0000510440 00000 n 0000510971 00000 n 0000511700 00000 n 0000512495 00000 n 0000513290 00000 n 0000514085 00000 n 0000514880 00000 n 0000515675 00000 n 0000516320 00000 n 0000516500 00000 n 0000516789 00000 n 0000517254 00000 n 0000517718 00000 n 0000518072 00000 n 0000518243 00000 n 0000518413 00000 n 0000518584 00000 n 0000518755 00000 n 0000518932 00000 n 0000519100 00000 n 0000519285 00000 n 0000519482 00000 n 0000519679 00000 n 0000519877 00000 n 0000520286 00000 n 0000520809 00000 n 0000521332 00000 n 0000521748 00000 n 0000521987 00000 n 0000522230 00000 n 0000522502 00000 n 0000522793 00000 n 0000523079 00000 n 0000523362 00000 n 0000523645 00000 n 0000523930 00000 n 0000524213 00000 n 0000524496 00000 n 0000524781 00000 n 0000525064 00000 n 0000525187 00000 n 0000525357 00000 n 0000525596 00000 n 0000525792 00000 n 0000525910 00000 n 0000526030 00000 n 0000526159 00000 n 0000526298 00000 n 0000526442 00000 n 0000526541 00000 n 0000526675 00000 n 0000526787 00000 n 0000526890 00000 n 0000526930 00000 n 0000527111 00000 n trailer << /Size 1404 /Root 1402 0 R /Info 1403 0 R /ID [ ] >> startxref 527438 %%EOF fdk-aac-0.1.3/documentation/aacEncoder.pdf0000644000175000017500000176501112372261464021015 0ustar00tootstoots00000000000000%PDF-1.4 %ĐÔĹŘ 1 0 obj << /S /GoTo /D (chapter.1) >> endobj 4 0 obj (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) endobj 5 0 obj << /S /GoTo /D (section.1.1) >> endobj 8 0 obj (\376\377\000S\000c\000o\000p\000e) endobj 9 0 obj << /S /GoTo /D (section.1.2) >> endobj 12 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000B\000a\000s\000i\000c\000s) endobj 13 0 obj << /S /GoTo /D (chapter.2) >> endobj 16 0 obj (\376\377\000L\000i\000b\000r\000a\000r\000y\000\040\000U\000s\000a\000g\000e) endobj 17 0 obj << /S /GoTo /D (section.2.1) >> endobj 20 0 obj (\376\377\000A\000P\000I\000\040\000F\000i\000l\000e\000s) endobj 21 0 obj << /S /GoTo /D (section.2.2) >> endobj 24 0 obj (\376\377\000C\000a\000l\000l\000i\000n\000g\000\040\000S\000e\000q\000u\000e\000n\000c\000e) endobj 25 0 obj << /S /GoTo /D (section.2.3) >> endobj 28 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000I\000n\000s\000t\000a\000n\000c\000e\000\040\000A\000l\000l\000o\000c\000a\000t\000i\000o\000n) endobj 29 0 obj << /S /GoTo /D (section.2.4) >> endobj 32 0 obj (\376\377\000I\000n\000p\000u\000t\000/\000O\000u\000t\000p\000u\000t\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000s) endobj 33 0 obj << /S /GoTo /D (subsection.2.4.1) >> endobj 36 0 obj (\376\377\000P\000r\000o\000v\000i\000d\000e\000\040\000B\000u\000f\000f\000e\000r\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000o\000r\000s) endobj 37 0 obj << /S /GoTo /D (subsection.2.4.2) >> endobj 40 0 obj (\376\377\000P\000r\000o\000v\000i\000d\000e\000\040\000I\000n\000p\000u\000t\000/\000O\000u\000t\000p\000u\000t\000\040\000A\000r\000g\000u\000m\000e\000n\000t\000\040\000L\000i\000s\000t\000s) endobj 41 0 obj << /S /GoTo /D (section.2.5) >> endobj 44 0 obj (\376\377\000F\000e\000e\000d\000\040\000I\000n\000p\000u\000t\000\040\000B\000u\000f\000f\000e\000r) endobj 45 0 obj << /S /GoTo /D (section.2.6) >> endobj 48 0 obj (\376\377\000O\000u\000t\000p\000u\000t\000\040\000B\000i\000t\000s\000t\000r\000e\000a\000m\000\040\000D\000a\000t\000a) endobj 49 0 obj << /S /GoTo /D (section.2.7) >> endobj 52 0 obj (\376\377\000M\000e\000t\000a\000\040\000D\000a\000t\000a\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n) endobj 53 0 obj << /S /GoTo /D (section.2.8) >> endobj 56 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000R\000e\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n) endobj 57 0 obj << /S /GoTo /D (section.2.9) >> endobj 60 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000P\000a\000r\000a\000m\000e\000t\000r\000i\000z\000a\000t\000i\000o\000n) endobj 61 0 obj << /S /GoTo /D (subsection.2.9.1) >> endobj 64 0 obj (\376\377\000M\000a\000n\000d\000a\000t\000o\000r\000y\000\040\000E\000n\000c\000o\000d\000e\000r\000\040\000P\000a\000r\000a\000m\000e\000t\000e\000r\000s) endobj 65 0 obj << /S /GoTo /D (subsection.2.9.2) >> endobj 68 0 obj (\376\377\000C\000h\000a\000n\000n\000e\000l\000\040\000M\000o\000d\000e\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n) endobj 69 0 obj << /S /GoTo /D (subsection.2.9.3) >> endobj 72 0 obj (\376\377\000A\000u\000d\000i\000o\000\040\000Q\000u\000a\000l\000i\000t\000y\000\040\000C\000o\000n\000s\000i\000d\000e\000r\000a\000t\000i\000o\000n\000s) endobj 73 0 obj << /S /GoTo /D (subsection.2.9.4) >> endobj 76 0 obj (\376\377\000E\000L\000D\000\040\000A\000u\000t\000o\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\000M\000o\000d\000e) endobj 77 0 obj << /S /GoTo /D (section.2.10) >> endobj 80 0 obj (\376\377\000A\000u\000d\000i\000o\000\040\000C\000h\000a\000n\000n\000e\000l\000\040\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n) endobj 81 0 obj << /S /GoTo /D (section.2.11) >> endobj 84 0 obj (\376\377\000S\000u\000p\000p\000o\000r\000t\000e\000d\000\040\000B\000i\000t\000r\000a\000t\000e\000s) endobj 85 0 obj << /S /GoTo /D (section.2.12) >> endobj 88 0 obj (\376\377\000R\000e\000c\000o\000m\000m\000e\000n\000d\000e\000d\000\040\000S\000a\000m\000p\000l\000i\000n\000g\000\040\000R\000a\000t\000e\000\040\000a\000n\000d\000\040\000B\000i\000t\000r\000a\000t\000e\000\040\000C\000o\000m\000b\000i\000n\000a\000t\000i\000o\000n\000s) endobj 89 0 obj << /S /GoTo /D (subsection.2.12.1) >> endobj 92 0 obj (\376\377\000A\000A\000C\000-\000L\000C\000,\000\040\000H\000E\000-\000A\000A\000C\000,\000\040\000H\000E\000-\000A\000A\000C\000v\0002\000\040\000i\000n\000\040\000D\000u\000a\000l\000r\000a\000t\000e\000\040\000S\000B\000R\000\040\000m\000o\000d\000e\000.) endobj 93 0 obj << /S /GoTo /D (subsection.2.12.2) >> endobj 96 0 obj (\376\377\000A\000A\000C\000-\000L\000D\000,\000\040\000A\000A\000C\000-\000E\000L\000D\000,\000\040\000A\000A\000C\000-\000E\000L\000D\000\040\000w\000i\000t\000h\000\040\000S\000B\000R\000\040\000i\000n\000\040\000D\000u\000a\000l\000r\000a\000t\000e\000\040\000S\000B\000R\000\040\000m\000o\000d\000e\000.) endobj 97 0 obj << /S /GoTo /D (subsection.2.12.3) >> endobj 100 0 obj (\376\377\000A\000A\000C\000-\000E\000L\000D\000\040\000w\000i\000t\000h\000\040\000S\000B\000R\000\040\000i\000n\000\040\000D\000o\000w\000n\000s\000a\000m\000p\000l\000e\000d\000\040\000S\000B\000R\000\040\000m\000o\000d\000e\000.) endobj 101 0 obj << /S /GoTo /D (chapter.3) >> endobj 104 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000B\000e\000h\000a\000v\000i\000o\000u\000r) endobj 105 0 obj << /S /GoTo /D (section.3.1) >> endobj 108 0 obj (\376\377\000B\000a\000n\000d\000w\000i\000d\000t\000h) endobj 109 0 obj << /S /GoTo /D (section.3.2) >> endobj 112 0 obj (\376\377\000F\000r\000a\000m\000e\000\040\000S\000i\000z\000e\000s\000\040\000\046\000\040\000B\000i\000t\000\040\000R\000e\000s\000e\000r\000v\000o\000i\000r) endobj 113 0 obj << /S /GoTo /D (subsection.3.2.1) >> endobj 116 0 obj (\376\377\000E\000s\000t\000i\000m\000a\000t\000i\000n\000g\000\040\000A\000v\000e\000r\000a\000g\000e\000\040\000F\000r\000a\000m\000e\000\040\000S\000i\000z\000e\000s) endobj 117 0 obj << /S /GoTo /D (section.3.3) >> endobj 120 0 obj (\376\377\000E\000n\000c\000o\000d\000e\000r\000\040\000T\000o\000o\000l\000s) endobj 121 0 obj << /S /GoTo /D (chapter.4) >> endobj 124 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x) endobj 125 0 obj << /S /GoTo /D (section.4.1) >> endobj 128 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t) endobj 129 0 obj << /S /GoTo /D (chapter.5) >> endobj 132 0 obj (\376\377\000F\000i\000l\000e\000\040\000I\000n\000d\000e\000x) endobj 133 0 obj << /S /GoTo /D (section.5.1) >> endobj 136 0 obj (\376\377\000F\000i\000l\000e\000\040\000L\000i\000s\000t) endobj 137 0 obj << /S /GoTo /D (chapter.6) >> endobj 140 0 obj (\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 141 0 obj << /S /GoTo /D (section.6.1) >> endobj 144 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000B\000u\000f\000D\000e\000s\000c\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 145 0 obj << /S /GoTo /D (subsection.6.1.1) >> endobj 148 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 149 0 obj << /S /GoTo /D (subsection.6.1.2) >> endobj 152 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 153 0 obj << /S /GoTo /D (subsubsection.6.1.2.1) >> endobj 156 0 obj (\376\377\000b\000u\000f\000E\000l\000S\000i\000z\000e\000s) endobj 157 0 obj << /S /GoTo /D (subsubsection.6.1.2.2) >> endobj 160 0 obj (\376\377\000b\000u\000f\000f\000e\000r\000I\000d\000e\000n\000t\000i\000f\000i\000e\000r\000s) endobj 161 0 obj << /S /GoTo /D (subsubsection.6.1.2.3) >> endobj 164 0 obj (\376\377\000b\000u\000f\000s) endobj 165 0 obj << /S /GoTo /D (subsubsection.6.1.2.4) >> endobj 168 0 obj (\376\377\000b\000u\000f\000S\000i\000z\000e\000s) endobj 169 0 obj << /S /GoTo /D (subsubsection.6.1.2.5) >> endobj 172 0 obj (\376\377\000n\000u\000m\000B\000u\000f\000s) endobj 173 0 obj << /S /GoTo /D (section.6.2) >> endobj 176 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000I\000n\000A\000r\000g\000s\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 177 0 obj << /S /GoTo /D (subsection.6.2.1) >> endobj 180 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 181 0 obj << /S /GoTo /D (subsection.6.2.2) >> endobj 184 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 185 0 obj << /S /GoTo /D (subsubsection.6.2.2.1) >> endobj 188 0 obj (\376\377\000n\000u\000m\000A\000n\000c\000B\000y\000t\000e\000s) endobj 189 0 obj << /S /GoTo /D (subsubsection.6.2.2.2) >> endobj 192 0 obj (\376\377\000n\000u\000m\000I\000n\000S\000a\000m\000p\000l\000e\000s) endobj 193 0 obj << /S /GoTo /D (section.6.3) >> endobj 196 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000I\000n\000f\000o\000S\000t\000r\000u\000c\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 197 0 obj << /S /GoTo /D (subsection.6.3.1) >> endobj 200 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 201 0 obj << /S /GoTo /D (subsection.6.3.2) >> endobj 204 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 205 0 obj << /S /GoTo /D (subsubsection.6.3.2.1) >> endobj 208 0 obj (\376\377\000c\000o\000n\000f\000B\000u\000f) endobj 209 0 obj << /S /GoTo /D (subsubsection.6.3.2.2) >> endobj 212 0 obj (\376\377\000c\000o\000n\000f\000S\000i\000z\000e) endobj 213 0 obj << /S /GoTo /D (subsubsection.6.3.2.3) >> endobj 216 0 obj (\376\377\000e\000n\000c\000o\000d\000e\000r\000D\000e\000l\000a\000y) endobj 217 0 obj << /S /GoTo /D (subsubsection.6.3.2.4) >> endobj 220 0 obj (\376\377\000f\000r\000a\000m\000e\000L\000e\000n\000g\000t\000h) endobj 221 0 obj << /S /GoTo /D (subsubsection.6.3.2.5) >> endobj 224 0 obj (\376\377\000i\000n\000B\000u\000f\000F\000i\000l\000l\000L\000e\000v\000e\000l) endobj 225 0 obj << /S /GoTo /D (subsubsection.6.3.2.6) >> endobj 228 0 obj (\376\377\000i\000n\000p\000u\000t\000C\000h\000a\000n\000n\000e\000l\000s) endobj 229 0 obj << /S /GoTo /D (subsubsection.6.3.2.7) >> endobj 232 0 obj (\376\377\000m\000a\000x\000A\000n\000c\000B\000y\000t\000e\000s) endobj 233 0 obj << /S /GoTo /D (subsubsection.6.3.2.8) >> endobj 236 0 obj (\376\377\000m\000a\000x\000O\000u\000t\000B\000u\000f\000B\000y\000t\000e\000s) endobj 237 0 obj << /S /GoTo /D (section.6.4) >> endobj 240 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000M\000e\000t\000a\000D\000a\000t\000a\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 241 0 obj << /S /GoTo /D (subsection.6.4.1) >> endobj 244 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 245 0 obj << /S /GoTo /D (subsection.6.4.2) >> endobj 248 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 249 0 obj << /S /GoTo /D (subsubsection.6.4.2.1) >> endobj 252 0 obj (\376\377\000c\000e\000n\000t\000e\000r\000M\000i\000x\000L\000e\000v\000e\000l) endobj 253 0 obj << /S /GoTo /D (subsubsection.6.4.2.2) >> endobj 256 0 obj (\376\377\000c\000o\000m\000p\000\137\000p\000r\000o\000f\000i\000l\000e) endobj 257 0 obj << /S /GoTo /D (subsubsection.6.4.2.3) >> endobj 260 0 obj (\376\377\000c\000o\000m\000p\000\137\000T\000a\000r\000g\000e\000t\000R\000e\000f\000L\000e\000v\000e\000l) endobj 261 0 obj << /S /GoTo /D (subsubsection.6.4.2.4) >> endobj 264 0 obj (\376\377\000d\000o\000l\000b\000y\000S\000u\000r\000r\000o\000u\000n\000d\000M\000o\000d\000e) endobj 265 0 obj << /S /GoTo /D (subsubsection.6.4.2.5) >> endobj 268 0 obj (\376\377\000d\000r\000c\000\137\000p\000r\000o\000f\000i\000l\000e) endobj 269 0 obj << /S /GoTo /D (subsubsection.6.4.2.6) >> endobj 272 0 obj (\376\377\000d\000r\000c\000\137\000T\000a\000r\000g\000e\000t\000R\000e\000f\000L\000e\000v\000e\000l) endobj 273 0 obj << /S /GoTo /D (subsubsection.6.4.2.7) >> endobj 276 0 obj (\376\377\000E\000T\000S\000I\000\137\000D\000m\000x\000L\000v\000l\000\137\000p\000r\000e\000s\000e\000n\000t) endobj 277 0 obj << /S /GoTo /D (subsubsection.6.4.2.8) >> endobj 280 0 obj (\376\377\000P\000C\000E\000\137\000m\000i\000x\000d\000o\000w\000n\000\137\000i\000d\000x\000\137\000p\000r\000e\000s\000e\000n\000t) endobj 281 0 obj << /S /GoTo /D (subsubsection.6.4.2.9) >> endobj 284 0 obj (\376\377\000p\000r\000o\000g\000\137\000r\000e\000f\000\137\000l\000e\000v\000e\000l) endobj 285 0 obj << /S /GoTo /D (subsubsection.6.4.2.10) >> endobj 288 0 obj (\376\377\000p\000r\000o\000g\000\137\000r\000e\000f\000\137\000l\000e\000v\000e\000l\000\137\000p\000r\000e\000s\000e\000n\000t) endobj 289 0 obj << /S /GoTo /D (subsubsection.6.4.2.11) >> endobj 292 0 obj (\376\377\000s\000u\000r\000r\000o\000u\000n\000d\000M\000i\000x\000L\000e\000v\000e\000l) endobj 293 0 obj << /S /GoTo /D (section.6.5) >> endobj 296 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000O\000u\000t\000A\000r\000g\000s\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 297 0 obj << /S /GoTo /D (subsection.6.5.1) >> endobj 300 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 301 0 obj << /S /GoTo /D (subsection.6.5.2) >> endobj 304 0 obj (\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 305 0 obj << /S /GoTo /D (subsubsection.6.5.2.1) >> endobj 308 0 obj (\376\377\000n\000u\000m\000A\000n\000c\000B\000y\000t\000e\000s) endobj 309 0 obj << /S /GoTo /D (subsubsection.6.5.2.2) >> endobj 312 0 obj (\376\377\000n\000u\000m\000I\000n\000S\000a\000m\000p\000l\000e\000s) endobj 313 0 obj << /S /GoTo /D (subsubsection.6.5.2.3) >> endobj 316 0 obj (\376\377\000n\000u\000m\000O\000u\000t\000B\000y\000t\000e\000s) endobj 317 0 obj << /S /GoTo /D (chapter.7) >> endobj 320 0 obj (\376\377\000F\000i\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 321 0 obj << /S /GoTo /D (section.7.1) >> endobj 324 0 obj (\376\377\000a\000a\000c\000e\000n\000c\000\137\000l\000i\000b\000.\000h\000\040\000F\000i\000l\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e) endobj 325 0 obj << /S /GoTo /D (subsection.7.1.1) >> endobj 328 0 obj (\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n) endobj 329 0 obj << /S /GoTo /D (subsection.7.1.2) >> endobj 332 0 obj (\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 333 0 obj << /S /GoTo /D (subsubsection.7.1.2.1) >> endobj 336 0 obj (\376\377\000H\000A\000N\000D\000L\000E\000\137\000A\000A\000C\000E\000N\000C\000O\000D\000E\000R) endobj 337 0 obj << /S /GoTo /D (subsection.7.1.3) >> endobj 340 0 obj (\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000\040\000T\000y\000p\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 341 0 obj << /S /GoTo /D (subsubsection.7.1.3.1) >> endobj 344 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000B\000u\000f\000f\000e\000r\000I\000d\000e\000n\000t\000i\000f\000i\000e\000r) endobj 345 0 obj << /S /GoTo /D (subsubsection.7.1.3.2) >> endobj 348 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000C\000T\000R\000L\000F\000L\000A\000G\000S) endobj 349 0 obj << /S /GoTo /D (subsubsection.7.1.3.3) >> endobj 352 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000E\000R\000R\000O\000R) endobj 353 0 obj << /S /GoTo /D (subsubsection.7.1.3.4) >> endobj 356 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000M\000E\000T\000A\000D\000A\000T\000A\000\137\000D\000R\000C\000\137\000P\000R\000O\000F\000I\000L\000E) endobj 357 0 obj << /S /GoTo /D (subsubsection.7.1.3.5) >> endobj 360 0 obj (\376\377\000A\000A\000C\000E\000N\000C\000\137\000P\000A\000R\000A\000M) endobj 361 0 obj << /S /GoTo /D (subsection.7.1.4) >> endobj 364 0 obj (\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n) endobj 365 0 obj << /S /GoTo /D (subsubsection.7.1.4.1) >> endobj 368 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000C\000l\000o\000s\000e) endobj 369 0 obj << /S /GoTo /D (subsubsection.7.1.4.2) >> endobj 372 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000E\000n\000c\000o\000d\000e) endobj 373 0 obj << /S /GoTo /D (subsubsection.7.1.4.3) >> endobj 376 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000G\000e\000t\000L\000i\000b\000I\000n\000f\000o) endobj 377 0 obj << /S /GoTo /D (subsubsection.7.1.4.4) >> endobj 380 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000I\000n\000f\000o) endobj 381 0 obj << /S /GoTo /D (subsubsection.7.1.4.5) >> endobj 384 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000o\000d\000e\000r\000\137\000G\000e\000t\000P\000a\000r\000a\000m) endobj 385 0 obj << /S /GoTo /D (subsubsection.7.1.4.6) >> endobj 388 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000o\000d\000e\000r\000\137\000S\000e\000t\000P\000a\000r\000a\000m) endobj 389 0 obj << /S /GoTo /D (subsubsection.7.1.4.7) >> endobj 392 0 obj (\376\377\000a\000a\000c\000E\000n\000c\000O\000p\000e\000n) endobj 393 0 obj << /S /GoTo /D [394 0 R /Fit ] >> endobj 398 0 obj << /Length 931 /Filter /FlateDecode >> stream xÚ}UM“Ł6˝űWp„Ş1–Â&·ÉŚw3©Mj“ń-ÉAa”€D„ďä×§ő¶wť”«L«ŐÝŻűuKBŃ)BŃÇúŹ/†á(C8ĄQ±-ÓÓ¨ęWŻPŠr’ąý+ŃmQ„wĚq9«7/=ŽžŐęřÍa×>îú*đ÷‡Őć!ÉÓín‹ŁC•(˘»2Ą¸uô[üXż%ĹLVĽNÖ„˘ř1ż©Ę/źT-äÉË{Y©šëäŹĂŹ €)Ę|O⨙~·;€A˛i–Ä"‚!ݦ% €?}Ţ\ŹÉ€é”yŔLr€ő‹O*!4>ŻźT?t<Á4ţ"Ě{RĐřa΂dPîUěćqj×űĆş˙Ž©—•őżňFn‚݉¶—íE!+żxćű*č·™ń s®#»´,Š<Đi™’|ë-?h6ÉV5`ěbľČŃ3żj¦‹Ţđ“\îŻUË:3É—Áâĺu! Ł´¤ĺ˙#„8Ž2uÂĚ\ů“Đ ŢĹŐ$̸ ,]ż­ę ˛5fřnł9źĎ¶u©cÚ\˛  Şů†őý}~J”Ň2DzcŐ1Ń/\~ŤŠ•zŰŮ(Ý3#0’młX„ŻiĹčĄZUSĎĄ űA;NÇ?y”Fů/Đ›ŕčőËł0­š‚ŤTFTŰ’¸f†yßiäőmz~ΙťřqiŕU]-×\¸&Óiî7äĐGˇ¦Ńk& ţAVśÎb Ć/Ż!ÝŚńg­ę©2!ś?‘4®””m|p°5x±÷ÓNăcŘ3šŐĽgúŻKűŻvuśÄh ßúŰ;…©Ćűl˝XÍdZrw8>´<śb»ëŞ·Â…ÄFOĎâĐ1ąLD–]¸= Ô5ŃoH5÷Ŕ„qČCçsĐ5î@Rxě:Ż×pĹ1Č|äúÍB:b­ÝĎÁ}`ÚÜT[\UKČ<ŤÇĂtěD5§ [Žk+X®­…ćk—«ô®XĐOFtâźY+‚;“3W`bϵ ;WfÉ™´ÓšÁMĆ;w&4MIQÝúöÎhYgmł0«nrOŝƭ2ŞR}jŢ—çdąţ{Qie¸ëĽf9]v1pÝ‹qt¬Řµßł†qź5Ző^‚á ~–α 7ŚÍky‹ÝĹďdaźĄ&"[xˇ x<É6…wÖ'ý+·7ᛸgižâđv…D_ů`xśďRÔáěpXý ])o endstream endobj 394 0 obj << /Type /Page /Contents 398 0 R /Resources 397 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R /Group 396 0 R >> endobj 395 0 obj << /Type /XObject /Subtype /Image /Width 5000 /Height 1419 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 403 0 R /Length 111531 /Filter /FlateDecode >> stream xÚěÝ{pÖőďńß+MI¦É@BBGÇŮî®ăŘžngÝž¶{ěi»;mÇqę´łNwěgŻ€L€$$䆲őÂ%@®OňvŽšŃXÜżľ0¨ÉżfîCw=˙č„WVą:˝śŐ‰$IŇź—Ű\‘ŃXŇŻ®ŕşE57Ż}ý’xÓ«k]ţ`—*I’ôge6ŤÍh,ţŢÂęoΛ¸îĐwE€?g~"I’zy9ÍىňA‰˛đĎ~xŇ•3Ç<ů["Ŕ_2E‘$I˝|”š—¬Ľrćř+fÜwŐśÎwt¸ü5Ö(’$©w–Ű\1(QÔŚüů˛äésí]ą|›I’Ô«ĘKVŤé__Lş;őcNž8~şÍť Ć)’$©÷Ô§vT0ńŽŻŻß~ěЦ#űʶťtHť}Š$IŠvąÍeAu~0mÄăoo[ńű§Îµ»|¶*’$)’ĺ%+3‹;ç¨SďÉN”?ňćć0w?€ĎĂhE’$Eo‘šÖPLúżU×m}iĘć缱ѭŕó3]‘$IŃ(·ą˘}ażş‚`Ęđ–&ňW?¶rßN—=€ ȆE’$őôrš+ŇŠúŐüę™9w=˙čMËgn9zŔ5ŕ‚łd‘$I=ôí¨eŤ%é±âń˛_<5ý§O6v¸Ű\LV-’$©Ç•ť(˙JcÉ•3Ç_·¨ć;ŹN˝qY˛ű\®vĽŘ *ĂI’ÔSĘI”g'ĘĆË®ś9>·ą˘tí˛nrˇ:}®ýHۇGŰNn9z ¨é† D•…‹$Ię)ĺ%+‡$Çő­ݰmM7ąJťďč8×q~ÖŽ Á´ŮÍfĂż§&U.’$©ű—ŃXTçŻ;´§ĺěégNť9®›\ĄĆ˙ƒ+fÜ—ť(Ďi®Čůčoë† D•ť‹$IęŽ%+łâĄýę úÔŽJŹď<~äíďťë8ß}.Qw=˙č5súűY˙ťŮ4¶ë5©Ę *łI’Ô­ĘKV¦ÇŠIwwá´Ť‡ß Űtd·ş>ýňéY?y˘ńňé÷†ĎA‰˛Üżřn@TżH’¤n2Gí[7:¨Î&Ü~Óň™Oî~µ[ÍQʶťüŮŇć[žť–Ů46­ˇčc©v©@´YÁH’¤/Ľ fd0éîҵËfíŘаmÍŽ÷wźËŇ–Łn{îá›W̦Ť¸¬ľ ,ço}7L Ş a$IŇP˛2+^Ú§vTç"µfä˝ëź®|ůéÖö3ÝęšôÂţ·ÂżŐŤË’Áäˇýë ó’•)~:7L Şěb$IŇ%+/Y™ŃXrY}AP3ňŠ÷­YR¸ćɰîvAZľ÷őäö—˙maM0éî´†˘Ô©v©@´ČH’¤Kó‚ÔŚĆ’>µŁţő‘)·<;ď¦ĺ3Úř\w»=µgűň˝Ż‡]9s|P5,ü ÚEŞ]*mf2’$颖Ů46,­ˇč;ŹN˝vAŐŇÝŻu·ëĐ©ööµ÷,ßűz0őž &?,+^:ř3-RíR€h3–‘$IŁśćŠń˛A‰˛kT}ű‘)WÎżĺčîvj9{úíďÍycC0éÎËę r/ĐgwâĘjF’$]đEjN˘nP˘,;Qžsqľ7L ŞLi$IŇç©oÝč`ŇťłvlŘyüČöc‡Ž¶ťě†žÓçÚŻ]PuݢšśDyVĽ4üó˘~'n@TYÓH’¤OűvÔ¬xiPťßŮ´KwżöÂţ·Nµ·wĂ{ÎşC{®[X󋧦˙ôÉƱ1Ť%9—ä+râʸF’$ĄŇ丱1ť[ÔŞa_›őëÇß޶x×ÖîyĂ ˙n7-źůĂÇęÂżpZCQř7Ď˝„ß•&UV6’$é“ËKVöŻ/ &Ýyý’xÓ«kk¶üféî׺íÝfĆëë ×<ůŻŹL ¦Ţ“+˙ň—ţsâĘÖF’$ýµúŐô­Lţ«gć®yrĂá}ÝöJSłĺ7u[_ »rćř`ę=Ť%_Č"Ő.6‹I’ô§r›+ĆËú׆Ą5ÝőüŁ#V/ţ?ĎĚŮ÷áńîy“im?3kdžÄkë‚i#‚ęü°¬xéŕ/n‘j— D›Ž$Iś¬ĚŠ—¦ÇŠżT_xĹŚű~ůô¬›–ĎüŻłşíf߇ÇWü~Ç űßš˛ůĹ`âAÍČnő}şaQe‰#I’¤¦ÇŠŻ™űĐŹŻ˙ö#SŠÖ,éÎW—˝-ďo9zŕ¶ç&ÜÔŚĽ¬ľ ď‹~;Ş]*Đ{ŘăH’Ô;ËN”‡eĹKŻšó@^˘bŢ»ůĄĺHۇO~đŹ7S†g6Ťí†sT»T ň¬r$Ięť]1ăľ°ţő…/ŘÝm/*ç;:Nťk?ýQWĎ}p@lLv˘Ľű·n@TYĺH’ÔKĘýč©™Mc3KÂ˙yěTk[űٰóÝö˘˛óř‘Ż4–\9s|Xř÷Ďé!_µ&UF:’$E»ĽdeFcÉeőÁ”á˙ţxĂ“'žü ›_QV˝óćW›+Ż™űPVĽ4;QŢ#^“j— DžµŽ$IŃ,YŮŻ® ¨<±ţÝ˝Ek–ÝÔŚě[;z°·Ł~\9ÍáďžŃXüĹu˙˛`ňöc‡\&€^ĹŔD’¤Ô”( ËlűŹłďżvAŐUsČ_ýXĎ˝<ůÁŢ–÷÷}xü—OĎ &Ýť+Î3Gýë‹Ôń˛đĎđwżzî-gO»F˝™‰$I©l;K”_9sü×fý:=V<ăőő=ôŃľŁŁĺěé®®šó@˙úÂŚĆ’ń˛\?ô'€Dy^˛ňŠ÷]» ĘíčÍ,M$Iú› Ś—…ő­˝ĺčöóçĎś?wľŁŁ‡>úwĽx@lĚW§Ź ó˦Rv˘Ľ_]ÁőKâáOćöôfĆ&’$}LÉʬxiZCQźÚQ_›őë#m†˝ŰÚŇs稡•űvćÄË®šóŔŔDYv˘<Ěý  =V€`ňС/, úă§ŰÜ O$IúSyÉĘ®-j0éÎ˙\>cÇű‡·;ôö‰÷zôł~Â+«ľ1Â÷×~cţÄŚĆâń2?ô'”Ű\Ń·nt0ńŽÄkë°í˝GŰNş1t1?‘$),¨TçÝ6ţwĎĽtŕíUYűc=úŰs߸,ůźËgüăěűű×f4g5•ćú­˙úuP˘¬ó L˝gń®­+÷ílm?ă˘đ˙±C‘$őÎ÷˘~Ą±¤s„ř˙šµcĂâ][çľ±ářé¶žţpżuĺüˇ/,Ěl{Y}AZCQVĽtp˛ŇŹţ ‡!ü®‚©÷„†g`á[[ÜţkIRŻZ ¦5uľµjŘ·žÜ°mÍźęéôťÇŹäŻ~¬ňĺ§Ă?ęüľuŁłĺ~ńżyŇcĹáa¸zîu[_šóĆF7C€Of“"IŠ|ąÍW_Đ·vt0eřŤË’÷­_Q´fÉ“»_ŤŔs|ĺľť“6=ß°mÍÍ+f“îjF†ÓŰQS[(Ź ĎĂu‹jÂĂđČ››Ý Ra™"IŠęuP˘ěKő…aýę nyvŢđÝĽbööc‡˘ń_ńű ŢÜt킪`ň]Au~ř1‡$ÇůÝ˙fi Eáw~c?}˛1<+÷ítHť}Š$)J[Ô¬xiFcqXZCŃ丛–Ď űŮŇćh<µĎwt¬zçÍŐűw……6zOfÓŘµŁ˛âĄ^ŤúŮF©C’ăŇcĹw¬ZŕľpˇŘ­H’zĐu`Ľě+Ť%aýë ż>oBkű™®ÎwtDééü˝…Ő_ť~o^˛2'Qîw˙ ç$+^T ˙»gÂłqú\»űŔ…b˝"Ięî%+ÓŠúŐď(\óä;žŰ÷áńC­-Qz"<ůÁßĎúďY09lđG Ü?ý§ě˛ú‚Îs2éÎäö—÷¶Ľßrö´›Ŕ…eĂ"IꞯĽĚN”5#;›t笶=°áđľŁm'#ö ^şűµo=<ůÇOÄ®[T“+Îlf‘úiߢTç÷­˝ćŕî®sŇÚ~Öŕb°g‘$u“†$ÇĄÇŠęüΦޓŃX˛rßΰ§öl?sţ\Äžż^Yuă˛äŻž™óŻŹLé[;z@lLřysOS^˛2üŇ‚)Ăż:ýŢ®Łâ^p±YµH’ľđuażş‚Î-ę¤;ňDăüťŻ„ÍycĂâ][#ůä­|ůé«_9s|P3˛}aFcIř 8źvÂü冢`ň]ßytꬖď}ÝŤŕҰm‘$]âr›+˛ĺAÍČ?6yč]Ď?:eó‹ă÷Ěúw÷FňiŰÚ~¶tí˛7>ÖůNŘšü¬xé`sÔĎ´bî__ž™–&îßđěŞwŢt—¸”,\$I—lQŮ4¶_]AźÚQYńŇҵ˺úÂÂŁm'#ůÝńţáš-żIn9üÁäˇAM~Xv˘<×yř”ĺ4W„'§ó˝şSďąyĹěđĚl:˛ß-ŕŇ3u‘$]Ä’•ŤĹ_n( ëS;ęšąÝöÜĂ·<;Żä·K#ül]{pĎăoo[şűµ_>=+p{Pťß·vtž·Ł~ÖWë¦5…§čÖ•óĂĂóóeÉC­-îo_›IŇĹx»eFcIXZCŃ÷×ް4ö˝…ŐMŻ®Ťđ#uݡ=ëßÝvőÜŞaAuţ€ŘsÔĎĽH”(KŹIŽ»~Iü¦ĺ3ÝŮşËIŇ);Q>0^–/ ˙ű» §…ýÓěűwp,Ѷöł;ŹyűÄ{ëßÝTŹě[;:,ür‰Ďw–2›Ć^9sü7çOĽcŐ·5€îĂřE’ô9_ŤšóŃ«-/ź~ďUsűÚ¬_ű‘)Ń~z¶¶ź9vŞőřé¶ŻŻ&“+v.ÔYşrćřń˛ŠuËÝÓş+IŇçŻOí¨’ß.í=OĎá/.ę[;Úď~1 ŞóŻ­sCčžě_$IźöĄ–bcş ކ-|kËńÓmÇNµ¶µźí ĎÍź/K^>ýŢŻNż7;QŢő~OGₜ¨ :Ăá}]géôąv74€îÉF’ôÉĺ%+3KúÖŽ Şósš+Ţ>ń^W;Źé Â3çĎ}ëáÉß]8-lHr\VĽ4;Qî`|Ţ’•á7TŹĚl»ëÄŃđ,ťďčp1čćěb$ImŽÚŻ® ¨Î&Ü~óŠŮëßݶîĐžMGö÷’GdřyżóčÔ–&~üD,=VśŃXf‘z–ÎĹÁäˇ_ź7!ٸx×Öu‡öDćŘl9zŕçË’7.Kö­ž7L ŞĚd$©—żąr@lLP“ßŮ´YńŇäö—»ŞŮň›–ł§{Ďńţ Ď­YRşvŮ5s żŠ~ué±âđűqH.ČäąOí¨`Ňť#V/î:ZQzGęĘ};‡ż¸čú%ń`ę=i E?:3n@TËHR/ ö«+čS;Şs*X5ěGŹ×?¸ńą°ńż{¦éŐµ˝ę!ŘÚ~&üÔS6żֹϭÎjFf6Ť5G˝Pe'Ę;ŹYu~×ć÷hŰÉ(ťźĹ»¶>´ńąëŐ„˙ŽŇŠţüظaQe2#I˝d‹šť(ď__ÔŚĽuĺüQży<,üŹŐűwő¶gßÎăGŻ­›żó•Ę—ź&ÝÝ9G­Îżç䔬̊—†'­_]AfÓŘđ }aaĎТ][漱ńfý:¨–Ńř1ďŐuâĘ|F’˘<l*–ÖPţ?żzfNŘĎ—%ĎwtôÂGކĂű–ď}}ĺľť7ŻL¸=¨Îď[7Ú«Q/ě‘ËlŰŻ®ŕŞ9„'í—OĎţâ˘(ˇđźM×úrCQ0mDVĽtđ_9?n@TŃHRÄĘj*Íl6 6ćëó&üř‰XŘ÷×ޱjAď|Ňm:˛ËŃaWĎ}0¨ÔŚLŹ›Ł^đňfĹ;GĐß?ńÚUÓ6ŻŽŘ)jm?łáđľÇßŢÖu„ţćŰuÝ0€¨2Ą‘¤ž^NsĹ DYWăeßś?ń_L»|ú˝ówľŇ;źn§ÚŰ÷¶Ľ˙·'6~'¨ŮŻ® ,ürr ]×ÁËŠ—^3÷ˇđČ-޵5bg©ĺěéđ,5˝ş6xÇ—ę S¨ö•ƒ̦±ÉĹD‡vĽôXńĆĂďDň8U¬[Lž/ýTŁf7L ŞĚj$©Ç•űŃK*łâĄa}kG߸,yćüą?ŐŃ‹jĂ_\ô冢˧ß;$9.ÇQąČŁÔŻ4–\1ăľÖöł]ď|GÔŽŢ-ĎÎKʶłä† D•eŤ$ő”`˙ú®‚Iw7˝şöÝÖ–°C­-ÇO·őňgŮ×]=÷ÁoĚźxĹŚűĆ˲ĺ9‰rg梔¬Ěj* ¦ŤřźŹN Źß‘¶#y˘~ňDăUsřęô{ĂăôŮÎn@T™ŘHR÷,/Y™ŃXÔŚü¨üôXń¶÷n?v(lËŃ­ígzůóëPkË7çOüácuaىň̦±YńŇlsÔ‹vżT_Řy'ŢqÓň™áQÜÓr,’çę{ «Ă~äđD}žăä† D•­Ť$u«ő_ßşŃAu~gď¸~I|őţ]a/ěßµćŕnϬЊßďřŃâş›–Ďüń±ţő…ŤĹa9ĎĹ|AjźÚQÁ„ŰÇ˙î™đ(®Ü·s÷\¤ľóá‰=^˙łĄÍbc.ȉňO*‹IúËm®/űă5lŇť÷oxvá[[ÂfíŘ°í˝žS]¦m^}ëĘůĂ_\ôÝ…ÓÂ/ęKő…bc'+ˇ‹w2łĺťg˛jXÝÖ—ÂÓxüt[$ŹÖşC{n^1űĆeÉđæ5]¨/ĐżY ŞLo$éŇżu@lLP3˛łi#Â˙§aŰš®&mzľ­ý¬gS¨ă(ůíŇűÖŻčęŠ÷Őů}kGg4癣^ĚĂ™Ů4¶ódV燧4<“S6żŐ3öÔžíEk–üä‰Ć`Ę𴆢 {®ü˘ĘG’.ÍŰ'/«/č[7:,2ü?o¨|ůé°ŇµË¶­ń0ú“·NĽ7iÓóáw~9áőÇőnÍȬx©·Ł^ěEjFcq0mÄ×çMżüŠuËĂ"ŞÇlá[[j¶üćÚUAŐ°±1céěß2U–8’t‘†¨ăei E]ő«+¸ĺŮyC_Xö˧g­9¸ŰčĎ­;´çáť›ďÚzëĘůÁ„Űęü>µŁĽő•¬Lʇßů÷V˙ę™9sŢŘŐcöČ››Ă36$9.2<ٱäâť1˙¨€¨˛Ç‘¤ 5DÍl›ŃXÜUZCŃ•3Ç˙çň]ݰ4á‰ó—ÖÜóŇ·Ă:ß\9éî :?üކ$Ç9N—¦ŚĆ’đ¬öŻ/üß‹ë~°¨vĺľť‘űöĺË6l "‚Dʦl2˛Ă0ôwĆŻw.*Ea¶×+ďęśóů|ćś3çÓF9ÝřŇ ë¶G4÷®ÉOß7}T ®·ŞsgÂzË\=?ńX|YÚ-7|ëYË-•=‘/´Ů×#š{ë¸Aa:G˛ţĎĚ|?G® ş¦¦.éŻÎ ňúu®ČŞÝçUKŤWşťĘ3~>§´ĹWÝU¶)Đ5’ÝX\ű-•U‘+'ľ,˝.Á¨>˙şčřůł±śŞ>ççČÜ7}ÔmăźüúÄż„ąuÜ]#ŮÝTÔ O÷±9ťĘ3‚Ń}Ó_ť«ŰÓŐç[pŐýřą˘[Ç ęÔK©öR€ĚÂŽČĄéÍíTžŃ®()LŰÂ_.NŢúáÁ='ŽĹ˛óŁŁÇĎźőłă v˙đk˙|ßôQaşŤÍ‰} 5L·F]lµ©í‹“á˝J6Ż K·ęÜ™–]{ßš62¬şîW]Ło@@KemGD¤G4·]QRPĐż6#ůĺܲ ‡öŐĹOŠ«1kÇ˙:}dxčţmf~‡ŇÔNĺa|µQvQ»D˛>)ć‘˝Ăó˛öÝ-{™zo?3ú§łKšTŐ™ @Ke…GDZ]˘ą ™A~â˙˰‡‡®_˛đo[ĂĚŰůÖÖúép•žZ÷Ňľ0î—¦Ü7}TŰÂJSăËŇ»«±ĆűÔo0ćńncsbĹü®-[tů­>°ëWĎWürnYۢKÓšÔé0€–Ę"Ź´†ôŚŠ+Iůd utßŰ' ®|g}]Ęß\ݲ?(YŹŞ/Öô^6#iĺśXľ: ˙MĹI7—Ą÷檴Ƭ푽ż5mäÄ­ëćí|«Ĺ×áě÷6÷Z:ý§łK‚Ľ~JS›`í™@KeŁGDZdşE˛Ű¨K0˛÷ĚŹŽŘđr§Ö˝4mŰó˙ ŮúáÁś5 ÂŁ—´jn0ćńş›P‘é먍řÔ›Š“ÂÚţí‚ńá©yrí»ßnŮuXţćęˇë—„˙Řű¦Ź Főiš©öR€–Í^Ź´Ś˝ř˛ô›Š“biW”ţĎ”UĎ×ĺˇ%Ó69`ćQËöm/sőÄ­ëţkáÄ`xŻ ?±má@ßEmôťëXť‡§ăO‹*ĂÚŢrôý_Šăß^ÖáÍeéA^żđßäżĎkz-•iľéXšÖˇ45L›Âßyfô/M‰ĺO‹*ű.źiÂ_›vmY°űíXîť:<ńXźW’Ň3:HÉ5bşŹÍéÉ ODBEf¬Î3?ZuîLË®ĆSŐçfż·ąňťuÁÇĂ: Ź@sů>ŻI´T6}D¤-ĺu*ϨK|YÚOg—üęůŠ0÷Mő®-Fú5«:wfő]ëîť·ó­`tß  1–đ8ű:jŁW~çŠÚĘďXšvŰř'>§ôŹ‹*[CM>}2¬É‚MŻĂnS8 {s;q¦ ĐRYů‘&›.‘¬Îź¤SyĆíç™ŃuągĘ𳪍ńköÁ©ă;?:şűř‡aFlx9Ţ«]QŇMĹIÝŐ^“I×HvXůßśôTXđwNÚoŬÖP™‡Oź|ŻęHú«óšŚ+Ii¦›Ń& ĐRŮú‘¦“n—¤k$űk˙üĎ˙K§ňŚôWçÚ×ďřůł±üdvqPر4-Lxxoń]Ô&Öa Ü>apxvĆż˝¶•ç©ęsUçÎüaᤠŻ_BEfł®IŁh©¬˙HÓŮĹëÉ®Ë—Š“¶}˙ÂĹšşÔ\Ľhh_§ăçĎöŚęÍ ˙ô]Ô¦ü™Ô0A~ââ=ŰZUĺß?«0ˇ<łeT¦i´TÖD¤qÍíXšW’K0ćń_Ď‹>}˛.‡Nź°Z_VîßŮą"ë®ÉOß9yhÝćŻ"lRé>6§K$«}qrBEćţ“U±¨®©i%%z÷”aaqö憕ŮÍ^*@fHDnĚjBEf›Âu F<öĚ»·;Ë–Łď8ů‘™\ŹrÖ,¸gęđÎ,sďÔáńeéá)Ł›TzDsăËŇj;btß»&?öÂöŞĂ­¤D7ŢGĺ°>0#?VśÝZĐ™5‚€–ĘN4ж]»˘¤ ?ń“Śě}ĎÔá«ě¬Ë˛}ŰĎŐ\0„ëÝNúÍüčľ0îö ăJRâËŇĂt*Ďč®,›XzFµ/N†=ü§E•aG¬Ü˙Ţć#ZI•ÎŰůVlc:<±myç×,Z*›A"R_źCý[¨a†÷ĘYł`ö{›cyćÝŤ«ě2rÂÖţnÁ„G_~6LŻĄÓ;–¦µ/NŽ+Ié\‘eµi&(č_Ű#ĂN^5wę¶×·Wi=ĺÝňÚNúîłc‚‚Äř˛´pt´ÔIh4-•ý ą¶ĎˇÖ~ę± ˙'óř­ăž(su]FmXVuîŚŰpćí|+qĹs9küç ă‚Ń}Ű%ĹŇM}6Ét›Ó%’Ôn,†Ýë‘§O´žŠÍ۸"ýŐywT ňúĹ—Ą÷hY©á?'üG…“đö c3ĐŚZ*»B"r5+u]#Ům Ö%Őç÷/Nü×E±ä¬Y0ţíµ&jC+ŮĽŞ`Ó+Eo¬ sßôQáY úÇ•¤´°ż¶®xsYzmË$†Më—ÖV·yW„[ű!ŃĽ~ťĘ3ZŢFj‡ŇÔ`tßď<3:sőü‰[×™T@ËfiHD>˝fŐ±4­}qr]Ú%uŤd÷[1«.ZTů^Ő#´ˇ˝ęřř·×>óîĆ0·®«ý4m^ż żö››-ď‹“-ŻŹj? ™źř­i#Ă–yôĺgźZ÷R«ŞŢSŐç¢-su¬h»D˛ş·ÄłÜ¦pŔOg—<đŇ”ą;ß4˛€ÖŔętŤdw,M«Ë— ţhVŃď_śX—ßĚŹxe¶yĂlýđŕÂżm]¶o{ŇŞąÁÓĹQ‚DµÚ,_–ëŁďĎČűůśŇiŰ6´ŞęÝ}üĂXőŽÚ°,Ţ+(čßRż"žčđ,ß5ůéµě6µ€ÖĂ‘H«J÷±9ť+˛Ę3ëŇ©<ŁG4÷'ł‹ër÷”a[Žľo<Ţ`›Źů0?›]Śx,(čW’⣨Í%ÝĆćÄę‡3 b}´r˙{­Ş†w˙pÓáýĽ4%öpX˝í‹“[jő†':ľ,ýßfć›–@+d“H¤5|µ. ™wTąwęđş„˙ó· ƆŤâě…ę}'ŞŢ?u|ËŃ÷Ű%}©8©}qrđ4Ýbµů¬Ł†ťŐ%’ţ=l¨oNzęTőąÖVÉOź8pňŁÍ* Ć<[uoÁ§;v˘ż1驪sg 1 ˛R$Ҳ7ćn‰ćŢ6ţÉş|ą8yő]F_#:WsáĚ…ęłç™w7ĆöřjQUlól±·Xřç}ÓGµ¶bľřńnuoNzŞciZ×Hv‹?Ýť+˛ţeÚs hÍl‰´t›“P‘Ů©<Ł.튒îźUxşúüĄ©ąxŃčkD.žžšŰ' óŐqOtké«|-¸Ý:Wdů‰á ŤuÖ™ Ő­­ť>ŃmlNXÉumÁ§»k$»}qň}ÓGµÂ p)»E"Í2ŃÜ„ŠĚ›Š“.M0˛÷Üťoî?YU—}'Şź>iĐ5®3Şďšüô·¦ŤŚĺÖqO„ç®k$;ĹÜěZ/®$Ą¶ÝF<ňÄÚ÷ž¨:vöt+¬ęő÷öŚşgęđÎY-»Ś{DsăËŇQ}ţc~4ś¨‡Nź0Ó€VÎ’‘HsŮŤjW”ô˙$#űŮě’ÍG\šő÷ž«ą`¬5kŢßuď”ááişVáÍeéu±µ‹ÚLÓmlNmëŤě=cű¦X»µÂŤÔČ[kţeÚ°ŞżýĚ襩 ™-{ę¶/Nž~(qĹsíŰ{˘ĘXř»˝T‘&űyľüÄ˙‘Ź”l^µtď»±,ŘýöÖš`MÍĐőK~=/ň‡…“ÂüpfA»˘¤ŽĄińeiŞşů6c§ňŚÚĚë׾8yáß¶†©ąx±ÖöSë^ú÷ycďž2,VŐáaéŢŇO}0â±°Ł_صĺŔÉŹ 7€:ÖŽD=µaü+¨ŹýŰĚüiŰ6\šńoŻő-Ô¦éŃ—źM\ń\,·OžÍöĹÉaâËŇzDs•wsLĎč ¸’”ÚfŮűŢ©ĂĂśşíőŰ7µÎ Ď\=żďň™·Ť2¬íNĺ-ľŞ?ţ0ní©ĎYłŕřůłFŔeě‰ÜČđu,M«ÝB˝4ů‰O­{)o㊺ Y·xŮľ¦S“µţŕŢôWç…§)LŇĘ9A^ż6…bI¨ČĽĹ.j3oŇ›Š“‚ŹývÁř°ź^żdÁî·[m©ç¬YN§Ą©á¤jńµÝ}lN犬đ_Ú®(iĆ—ĂSß:?Ś đŮBiý¦.‘¬vEI—%óřýł 3WĎż4éŻÎ3šľgŢÝXţćęČ[kÂüz^$ńHl­¸Mየ-ᙑěOš4Żß/MéłlĆ–Łď·ÎRßůŃŃĽŤ+Â:ü×EÁčľa‘wŤd·üřř˙4 gtP8“źXű˘‰pÖ‘D®ˇ)ľ,-®$Ą.7'…˙˝×Ňé—ĺ?_·tď»ĆNłpŞúÜ3ďnś»óÍXj?¤8ćń ?1L‡ŇÔžŃA*żĹ¬·/NîTžkŇß-pěěéÖYó[ŽľÖüCK¦Ă뼵ě\GsĂłß¶p`ŘÔCÖ-6úţ!{I"_h…-ľ,ý˛|ą8ů‡3 ~3?Z—_Î-K\ńśńŇí?Yµlߎ5ďď*ŘôJ0ĽWl5Lxę»ë‚ÔË ™aóĆ•¤~uÜżžyŕĄ)­ąě79°ęŔÎ_=_Ö|\IJ+Y»®-ňĚp€ß=eŘŹź+zzýŕjXPůĽt®ČJ¨Č¬ËÍeé_›řçĚČż,ßśôÔÖ&Í×ÎŹŽn;vh{Őá0˝–N†÷jS8 }qrŹÖđ±ČVŮÔńeéwT ›÷Ţ©Ăű­Őš‹{Ő‘°řďž2,óx§ňŚVUóáż7ü‡‡|üŰkŤA€«gMI¤[HöeéÉľŁrČť“‡Ö%ü/9k-@uMÍáÓ'Źž9Ëí·+JúJIJ„ňĚ[¬Ł¶Č6Źdw‰d}cŇSa/˙ŻňŚÖĽŠXW˙N~”P‘Ůľ89nÝ[_1t,M[ş÷]óŕ‹˛¬$R»Í˝,ÝĆć=sĘh1.ţýď5/Ʋx϶ ?±nY ´ŠDsŰ'o>r@,Ýűn]ý·Úbh[4pő]#Ŕ5°¬$­gů4öĽËŚě]ôĆĘŞsg>óˇ%đĘěÎYßśôTŰ' îÉîűT®îhé-W’Ú©<ăýSÇŹť=]sńbk[×Ý\šviý·Ş’˙ŐJSĂzŘůŃѰ.\¬1®Ý%i‘űh튒Ú Ľ4Áčľ?‘żóŁŁ—e{ŐáSŐ猂é{ĎŽůîłcľ÷qn˙d§ňŚÎYaşD˛´IKMŹhnÇŇ´Ú–ŐçGłŠę:˝•÷Âŕż.ú椧î¨vA««˙hnByfźxű„ÁŠŕúYb’f˝€W’$^ž1Źż°kËş{.Íš÷wm;vHË·l+öířÎ3Ł=/ćsĘn.KŻK×Hvw]ÓŇB»˘¤ŕ釼2;lůŐvmŻ:ÜĘ;âO‹*ĂFŰáź'ţ%®$µsEV÷ÖWá…űg®ý`÷ć# I€ëg•IšţVŃÍeéA~âgäé‡z-ťľ`÷Ű—eŢη´vë1dÝâßż8ńÁĹSĂüpfAPĐ?®$5L‡ŇTíÓŇ-’ýÉ@Ţkčú%łvĽqŕäGú"Ö ĺ™q%)­s#µgtĐ—‹“ĂŞřńsE›ďWőĹN“4©ý/˙řéČŢßš6rüŰk?ť˘7Vî>ţˇ.nUŽž9őčËϦż:Ż.·Ž{",›vEIaâËŇzDsőQkXWďTžQ;ňúµ/IŽny-%›WťŞ>×ĘäŔÉŹÂ kŠn‘ěÖűĺÜŹ<đŇ”°*6ÚgrÔ#űMră7†Ú'·)pYb[T˙şhŘëK/Mîk/.Řý¶VmÍ–î}7,ŚQ–…©]¸ŐçŇĘi…‚lĺ¤ciZ0ćń»§ çĂĐuKň6®Đ#ˇM‡÷?±öŇ–L Fögi«mŠđ–Gßĺ33WĎß^uDaÔ;[NŇ@»c7—ĄßTśôéů‰żqbŇĘ9—eŔ+łSV=Ż%‰™şíő‰[×Uľł>Ě÷gä# +'L»˘$_DmŤ‰ćĆ•¤ÖĽ~?śYđčËφ˘MB‹÷l‹ny-l“˙ †÷ QĎč ÖY$Ý"ٵRĐ?üăËą Çş“\ĎgéşD˛:”¦~:m Ţ7}Ô/Můt~ő|ŧŽk=.sřôÉą;ß\ř·­afż·9(čäő‹í˘Ć—ĄŰEmĄ›†csb#Ą]QR8:bdńžmúĺďG8l–;*‡Łú„mW’Ú:7Rc?‰âJR*2Ă ůí‚ńj AŮ{’«I§ňŚO§ciÚmăźüĺܲOç_§Źśµă ýĹ•mŻ:Ľîŕž ‡ö…ÉYł xúˇÚuÔŹŁéZóÂ{×Hv8aâËŇĂżÄFĘwźsđô -Şąx1ěš0JSĽ~ ™·´Ö­íŘFjě'ŃOg—üaá$ĺpŘ’XşD˛>3ť+˛şF˛ď›>ęÓąŁrHźe34Wé\Í…ťÝsâX]ľóĚč`Ěă튒Ât,MóQT §MByćmăź 'ĚżLń‹9e'ćTőąXű,Ýűn0şoŘ2ÝZ}µ$Td~mâźĂźD}—ĎT!7Ś5¨V•nź—Höí}â_>ťđżß9y¨NáÚś˝P}üüŮXďŮŚy<ľ,˝.]#ŮÝ5¦ü÷ ëá«ăžčTž‘´rŽŢଉFo\ŚęvMx|tMl…ů¦â¤§×/Q!7Ý–VµĹÓą"ë3Ó®(iËŃ÷«kj>/:…k“´rÎMĹI·Ž¦gt6”Ďű^s8‚Ľ~yWś«ąPsń˘Ţ©3ŕ•Ůí‹“{Ds} őŇ‚‰U‹R¸ń¬·´śDso.KŹ+IůĚ#­|gýˇÓ'>3ś:n»‡úňígFß9yčÝS†…ąmü“ť+˛şF˛Ăt‹dëSątSţ“é4ćńeűvÄŃéęó:¨ÎďL¸}ÂŕXYJŤĺăg˝gîؤZ‹%—f”ož¶)đ™ †=śĽjîÖ~f69`…‡†0wç›wNz˙¬ÂX~8ł sEVBEf,]í˘Ęg ± Ż_Ďč ŘtÚrôý }”ů5/~ďŮ1±n Q§ň MÔýă-ćX٬ط#üqvöBµRh,ö¤šÔĆV§ňŚ ?ńs3Ľ×/ç–­Ü˙Ţgfńžmś:®¤ą’VÍýŐóż]0>Ě}ÓGÝTś_–ößI×ËňéôŚŞýŇĺ±űv¬;¸G+]j÷ń4«(쬥©±n˛‘űxÇŇÚC+uĐčěĽ4ˇµÓŹ}ç™ŃłvĽńy™ňÎúÍG(Zn°='Žýţʼn˝—ͨK÷±9튒âJR„U}K4WËç-Ö~ć2śoĂ~hÉ4Cě3­:°3l±_Ď‹‰q%©Ę¦î‡f|Yz0ŞĎWÇ=±đo[Ő @aóĄ>wN ú_)ŁűŢQ9¤dóŞĎËčŤË—íŰ®&i fíx#yŐÜÜ×^ ó‡…“Âęm[4°.]"YÝ5ľ|NÂÚ+¤nî=±öĹpľŤŘđň{UGtÖĄ*ßYź˛ęů°Ĺ~6»$ýĄÝ6…ţó…qX8iá}Ş ijÁë- ™ńeiWNűâä;*‡ünÁ„+äçsJ‹ŢX©ThîVîoŮľ+ţ;˙µpb0ěáŘj›Âöăä_–~SqŇ˙ťUŽĘźÎ.™şíuŤöi‡Oź\Ľg[Řtáń‰-€wŤdwW?—¤[m-ĄĹ•¤|ďŮ1OźP3MYłŰ6í\‘•P‘ůÓ±4íÎÉCü\Ń•sĎ”ác6-W´Ó§Ž‡młfAíxA˙vEIÖQ//§HvXH]"Y?šUtßôQ§«Ď+€&®‰l¦tŤd_M*2ď¨rĎÔá˙0Ý"Ůăß^ëüŇz:}âSÇëR» 7â±öĹɱ|ą8Ůś\ç:j8„»D˛zDsccö“ž:~ţ¬Öű´Ă§OĆÚđÁĹS‘˝ăËŇí€fEu®Čęt×ä§˙ĎĚ|eM_pÝC€–ˇ‰ě§Ü:^En*NZu`§łˇš‹ĎŐ\¨Ë×&ţ9ľ,˝î“Á]#ŮľĚ(ő¸BŘ#šáÎY?›]˘ű>O¬ďť:ĽCij¬ Ď*ŞSyĆĚŹ*h ‚&Éyhšpë$’}sYú?Ě?•ĄýSiúŢU§ŞĎ]Mj.^tÖ ´tď»_)Ną}ÂŕXb«^öݤÓ}lNByf8¨Ń}SV=Âg.TëľĎtüüŮŻŽ{"lĆîšńŐUź¸â9ĺ7^в8ˇŤâ*·HzDsăËŇÚ%]e‚Ľ~wM~z«Ś˙Đ‹§ŢQ9ä_§ŹŚĺÎÉCĘ3»D˛b±ě&őř-ËO&ůG¦ż»!Ń»ŹXuîŚü<[?©~ áŘWhH‹÷l»šĚŰůÖÁÓ'.h8Ł6,űÍüčUĆňó9ĄíŠ’:”¦ÖĄk$Ű"ŞÔozFĹ•¤ů‰ÁÇľýĚčŘŔ_¶o»~Ľ˛Ń—˙űĽ±˙2mDۢaoĆ—ĄëÍĎ[G WmŤî[ůÎúđZâřůłę‚…S›Ş@ËvŞúüCK¦ xev]ľ6ńĎAA˙öĹɱt(Mí͵×& ÷ÔvEIÁđ^Ľ4eę¶×Çż˝vŐťóĘRV=ź¸âą°[ż>ń/a·v*ĎФW^J˝ą,=ľ,=,°‰[ש¨wVJ­©-Ř »¶ä¬Y0tý’Xú.źŚîۦp@]*2o±ă& śÚŹWôŻÍ¨>ýVĚzríÂU‡µç•ť«ą6ox¬j7y úëÖ«ŮzîTžäőë66'ňÖ%őËę¨MU …9U}®`Ó+Ń-Ż]šoMŚě$ĆŇ®(É—ĺ%š›Pž–\ŰÂńei™«ç‡é»|ćńóguë•í;QörΚ7o˙njé*6RĂ ňúÝ3uxŇĘ9Eo¬TEPżl‰ZMZ€ő÷ÎÚńĆĽťoĹ2tý’`xŻ ?ńŇÜ\–nUnđ:jXu_)Ii[8đŽĘ!-™öŕ⩉+žÓ°˙ЦĂűcÝoŬ`ŘĂm hŢ«©·ÚŤÔ‚ţ?‘˙Űă+ßYŻ ~Yµš 4SjjVŘąöÝuůŢłc‚ŹŐ­ úŞ4n:•gÄ—Ąą8ůŰĎŚţőĽČýł ó6®ĐąWcó‘«ěúѬ˘`Ä#a/‡ÇP/_MşŹÍéPšúĂ™á0\ş÷]…ŤË»âŢ0ŔE>î€FtŕäGŰŽzŻęH]ćí|+Ő§máŔş$TdŢbyM5ÝĆćt®Č Vă·źýýy˙<áĎËöm×Â˙PÍŋ۫Çşűk˙äőëTžaőęV]xÄn˙dx•4Ţ÷†9.ďq×Ü05/=sęŘŮÓuůŮě’ ?±Cij]âËŇş[F“&łŽ¦k$»G4÷ŽĘ!an˙dŐą3zůjT×Ô„ýľţŕŢ ŕ“ʤ˘úĺ÷ńá «î–hî“©(h"Ľ+î s\Ř㮸aÖÜŰ®(Éş™4ŻÄ—Ąýřą"ýűEŐ~ű8?Qý\sşD˛ľ>ń/Ő55j šďŠ{Ă—ô¸eNżłş}ü˝żXľ>ń/]#ŮÝţű3”ݬžIÓK÷ÚEÔôĄ©Á¨>I+ç;{úč™SÇĎźŐÎW鉵/v®Č űýk˙Ü%’ĄÍżhů%Td‰?‘ű¨´Š€¦Ćëâ^2Ŕ•¬çmÇŮ üB}ůŮ{¦˙ÚÄ?Çş^żŃôćc˙Ż…·W޲JE@Óäuq/™ŕ· Ŕ5HZ5÷głK~=/R—űgĆ•¤Ä—Ą_š®‘ěîÖͤ Żv*ĎňĽ~aő®>°kí»WîďĚ…j=~ő~9·,6n7¨Cij—H–®ż†Rl_ś {řO‹*÷ś8¦¨ )󺸗ĚpőŽ[ŕÚ˛ę?ćGZ2­.=ŁÚ%}Ą$Ą.ńei·Dsí—IÓOX˝q%)µë¨#˝oú¨y;ß łđo[uúňţ©ăáXřĂÂI_.NŽ ©×’hn›ÂÁ°‡3WĎćÝŤ»Ź¨´ ‰óş¸—ĚpéŽ[ŕ2yW$­ś“ąz~]ţkáÄ`Ěă튒ębMšë`Ab0â‘?-ŞŚny­čŤ•ËöíĐň_ČŇ˝ďö^6# X8) í‹“•Ö5$śź]#ٵŐ8şďĐőK 6˝rôĚ)ŐÍ‚×Ĺ˝d€‹vÜ2@kö^Ő‘'×.˝qůĄąelN×/(č_—öĹÉ=| Ušçö_—HV›Âµ©yý’WÍş~Iú«ó¶;¤ýż¨ą;ß ŹŢýł ‘˝Ť…ëŮŹN¨Č ;–¦…Çó‰µ/*-h^Ľ.î%s\±ă–ZŹŰ7Uľł~ę¶×ëňŕâ©Áđ^A~âĄé\á[¨ŇĽÓ#šŰ©<Ł}qr›Âá˙đĘě0˝—Í0®Á´mbsăŽĘ!Á¨>KÓ¬Ł^ĎRj‡ŇÔŰ' î·bVîk6R Yňş¸—Ěp­Ž[h‘v~ttŢηďŮV—…ŰÚľ8ąöC¨—¬ Ć•¤ôڞ,&-féďć˛ôĄ©m‹Ţ3uřUţvÁřôWç×ŕ\Í…vm™»óÍÚŹ&<7:•gŘH˝®Ď¤–g¶+J Gî°×—*°kS]S–eř͡ y]ÜKć¸PÇ-4kŐ55ëîÝtx˙eůÓ˘Ę`Řõ e—¤[$Űv´Čt*ĎÓˇ4ő»ĎŽůůśŇoM9që:óá>}rÝÁ=á `0â‘ŘgĺzŇ}lNBEfXśwOöígFŹŢ¸\™]›ÓŐçÇż˝6ńXřăĚŃ y]ÜKć¸DÇ-4#‡NźŘsâŘŢUuya×–`TźvEI—ĺć˛t_6”–ťncsşD˛ÂtŤdkÚČť>ň«ăžŘ|ä€AqmŽž9µűř‡É«ćĂ{…3$®$ĺ3äşgByć]“ź‹sú»”ٵ9~ţlXśµK©#{ÇĘŇ1 y]ÜKć¸>Ç-4M.ÖśŞ>wY~:»¤MရËŇëŇ©<Ł»ĺ/i…K©‘ěžŃA·O|Űř'ďšü´‰qÍNWźŹŤ—ß-ä'v®Č2Ręqu:,Ѹ’ÔŐv©´kv®ćÂŕż. FőI(Ϭ+N‡€Fäuq/™ŕâ÷ Đ4-Řýö— ~uÜ—Ćľ´ňt˙ř© ™m üvÁřs5b11®Ůť“‡öć†ă%üł›«×t(MÝuühXź5/Ş´k–łfA»˘¤ËŠÓa ycÜ{ć¸,Çý4şď>;ćî)Ăî™:üŇ|cŇS ™]#Ů—Ćž—´ÚuÔŻ”¤´/NF<6tý’N˙ÔńcgO›×ěđé“·O|ĎÔaÝĆćÄĆ‹ĄÔz\ťnW”_–ľóŁŁöQŻÇ‹§†Uú˙ŤŇ[ěĄĐdxcÜ{ć¸&ÇýÜ0Ă^_zďÔá?~®čŇÜ?«°sEVByfBĹ˙Hř}UZo˘ąaý?ɨ>/ěÚ˛ĺčű›ďŻ:wĆ0ąf ˙¶ő®ÉO‡“çű3ňâËŇìŘę+=˘ą7—ĄŁűŢQ9$¬Ő­To×ă—¦tŤd‡‡4üóÓ? ‘7Ć˝g€ rÜ/@˝Ű^uä'łŠ~·`Âeů椧Ú'Ç—Ą]ű\"±ôŚęPšä'#{ß9yčŠ};bYş÷]ßťĽNŃ-ŻýlvÉ·ź}SqŇÇ“'Ýć{=Öm\IJ0Ľ×Ď甆µşáĐ>őv=~»`|đŔ&Td~^•:J4"oŚ{ĎWă¸_€ë‘ĽjîŁ/?ŰwůĚKóëy‘ ?ńËĹÉ—ĄöÓ„Ń\;\"źţĐd۵ë¨ĂţÝ‚ 3¶ošşíő•űß3a®_Κ±u÷”aAA˙ř˛ô¦P˝–n»˘¤°nxiJĺ;ë6ŢŻä®YŐą3\TůĐ’ií‹“Ă|ćgRíĄĐxcÜ{ć¸Çý\Ť…ŰšĽjî“k^š'ÖľXűmÇ‚ţm ^š¸’›_"WN÷±9]#ŮaűÔfTź”UĎ—l^őôú%[ŽľoŕÔ‹ś5 Â1Ő©<#6ŁÂżKőśhn0şoâŠçÂşÝQuXÉ]Ź}'Ş~»`|0ćńvEIWsđ1‘7Ć˝g€ëpÜ/ŔĄŽť==bĂË%›W]–ď=;&Ůű“şKŇ-’m9Kä }_˛SyFۢaűÜ\–žűÚ‹a’VÍ=S]mţ\ż}'ŞblČşĹA^żđ _ůŁ“rm 'ígRóúýiQeŐą3 ďzl>r ,Ú^K§Łú\ýę´ă@#ňƸ÷ĚpŽűZ­vm™±}Ó¬o\šĚŐóὂüÄË_–îS"×óeɰ‰âJR‚‚ţwM~ş÷˛˝–NŰÍ Ş훺íőp‚ő]>3öpíÔ*čoµ!>ňŰ%’Őľ89,ćG_~ö—¦\T|×gó‘żś[ţŘ ŹjĎč «?ŤČăŢ3Ŕ8îhٶ~xpéŢwWîďÓ‰/K«ýžŕ˙Ü?mW”ô…VcDä ‰/K-ĚMĹI?‘˙Űă2»¸üÍŐFS}Ůph߲};~4«(ńH8Áľčrź\ýFj犬¸’”ŻŽ{â7óŁĽ4Eí]§M‡÷/ß·˝v)uĚă×P´ ŤČăŢ3Ŕĺ7îhŞÎťŮ|äŔÖ~:?™]Ś|´Má€O§k$۲•H˝'쬄ŠĚ0ť+˛îźUËť“‡®y—aU/.ţýď[Žľq_›řç`ĚăťĘ3|ĐąAż‘_–ţĎ˙rßôQýVĚR×o{Ő‘p&ŁűŢ|­ß"w hDŢ÷ž9®˝qż@sqábͧŽ:}âÓ˛nq0ⱸ’”O'ˇ"ł»Ő*‘†O·Ź7R;G˛n÷ÄÝS†Ý9yčwžmpŐŻs5Â1¸îŕž ?16âÂcnÄ5h:Wd}}â_Âż<˝~‰ Ľ~?ţ©}ű„Á˙T–v=ĄëHĐĽ1î=s\xăf€¦¦ş¦ć3łţŕŢ  犬OÇ—OE})µG4÷Öq:”¦>đŇs¬~Ő\Ľx®ćB8çî|3Čë×%’ĄänXa·-8uŰëŠđú]üűß÷ž¨ęXšţÔľţSăxĐĽ4îUs\uăf€¦ć_§ŹĽmü“_źř—Ërű„Á]#ŮÝ>^ş,–§D+7—ĄÇ—ĄŁúlzĺřůłaÎ\¨6ÇęWîk/†9álŚŤA…wcj;ÝwĆöMŐ55Šđúíüčh§ňŚúú©íxĐĽ4îUs\răf€ďÁĹSďś<ôľéŁ>3ÝĆćt®Čęą<>Š*ŇŇ}lN؏튒Âc_±oÇžÇv~tôTő9Ă­~ýf~ôž©ĂĂ©xű„ÁťĘ3ŚÁ“đ ×Öv^żUv†…}Öžőu §ÄWÇ=sBEf}ť&G€FäĄqŻšŕz7 4ĘwÖÝ7}Ô/ç–}:·Ž_–Ö©<ă3ăS€"M-=˘ąJS‚ţµÝ÷¶ńOn8´/Ěş{j.^4îęÝĎf—übNYxäăËŇc©ÝŐaC'š›Pžäő x¬¶Őa˝X°űípbÄ•¤†‡·ËŘ yiÜ«ć¸ŘĆÍ×fńžmżzľâ—¦|^îť:ĽmáŔĄ©źN×H¶+‘f±ŽÚ¦p@ź<ýPŘÔ ˙¶5Ě‚ÝoŻ>°Ë ¬w[?<Şż[0!®ä“Q©o@zFu,M Föľ{ʰ°Â—íۡëEtËkżžůîłcÚ'ßÍ­ßłćđĐĽ4îUs\iăf€ĎłóŁŁ.žš´rÎgć‡3 ‚Ľ~7'}^:•gô¨ď=ičt›Ó5’]»‹fdďÁ]TůÎúň7Wď¨:l*6Ą{ß}hÉ´_ϋĆjíźRĽQ©áŃF<ň‹9eŃ-Ż-Ű·]5Ö‹Ń—÷]>óî)ĂÂ1_–Ţ2ŤČKă^5Ŕe6nZ­ŁgNe®ž?ěőĄź—?.Ş FönS8ŕ3Ó±4ÍÚ©HKú4j§ňŚŘ×Qo.KµaYÁ]t®ć‚iŮ@*ßYápŘŢ?«0Ő'®$ĹP˝Á5Śyü '=±öŵěVőĄčŤ•±Ýöýż§pśhD^÷Ş9®±qłĐRťąP]˛yŐř·×~^’VÎ F<$~^Ú'[’iŮ{yq%©íŠ’Âyýî™:<ýŐyI«ć]żÄm8‘·ÖĆđ˙7(óx8l­ůßřÔ~&5Żß/ć”ůp=*suXŘa=w*ĎčŢŔgĐŃ yiÜ«ć¸ĆĆÍ@stşúü¬o,Řýö2bĂ˵k§ů‰ź—vEI=Łl'‰´¶t›Óˇ45®$µMá€_=_ńŕâ©aţc~´ňťő¦kĂ9~ţl8·Çż˝6Ý76„*2»+Č\ü‘ě°ňż\śü_ 'ţűĽ±OźP™őâ\Í…’Í«‚Q}ÂÂîÉľ…íĐĽ4îUs\`ăf ©9U}~ŐťëîąBj·?†÷şÂ§NĂ´+Jň>‰ĄűŘś®‘ě›ËŇăËŇ*2ő|ĹŻçEľ?#oď‰*S·Aí;QéŁ7.†=ܦp€]ÔĆŞ˙ř˛´n‘ě°ň>§TeÖ—cgO‡ÝňZ0ňŃ[nŕU‡#@#ňҸWÍpuŤ›€éĚ…ęíU‡w~tô ©ýšŢGÚ ĽBâJR윊Č?L×Hv犬0ťĘ3n˙ä÷žóígF˙tv‰iÜĐöť¨zŻęH8Ň\<56ŇÍíFě‚XýkÚČßĚŹ*ÎzTuîĚŕż. †÷j_ś|ËŰÁ yiܫ渴Ɲ@Ş:wćŇLÝöz0˛wÇŇ´+äć˛t_Ó‘ëI·ŹÓ5’}ű„ÁßśôTđď}—Ď4“oŘŘżgę°¶…Ă‘žP‘i¤7îRęmăźěÉ~ôĺgg=:U}ţŘŮÓąŻ˝Śî{Kc,\;4"ďŤ{Ű—Ö¸ShPµË—Äv’Ü˝ÔHv ?ń…][j.^Śĺ˘‰ÜđŞÎťąĹGQ›R‚‚ţO­{Iý×»Om_’ÜW5NŤČ{ăŢ6Ŕu5îTl;ě˙Ĺ–ÔwşŹÍI¨ČüJIJ¸’”Ą©»Ž=zćÔáÓ'ĎŐ\0‡o€•űßű_ĺwNzGĺŘ´W–Ťśhn|YZ0â±aŻ/=]}^‰ÖŻ?.ŞěTžŃ%’ŐÍ^*xhř] ´Jž…z‚ €‹jÜ)4(ËA"Ň@éÍŤ+ImS8 ŮűWĎWlŻ:\ł÷Ć˝qů•C~0#˙ž©ĂăËŇ*2;Wd©ĚFO»˘¤`Ä#S·˝ľőĂÇĎźU¨őčsĘľűě[Ç ęiäRw.Ŕs{đ» yę *.Şq§Đ ě‰H˝µv5?1xúˇĚŐó׼żkĹľďU1oo¤ôWçý|Né•CâJRj7RË3»+ÎĆî‹ÎYµ}‘ź¸`÷ŰaSś˝P­PëËąš ?ť]ňďóĆ&TdĆ—ĄuŤd7zÁ;)ŕą=ř] Đ< őWÔ¸ShPv…Däúż‹Ú©<#¶pW›1ŹG·Ľ6wç›ÓßÝpčô cöFzpńÔ^K§‡ůßăµ+JJ¨ČĽ%š«D˝An.Kű"ü{Řajý:|úäĎ甆W’Ň­Éśwç<şż+‘gˇž ŕrw ĘĆ\ó¶ÝWJR‚‚ţÁ¨>wM~:ňÖšXĘß\m´ŢH;?:ÚgŮŚĚŐóW<צp@»˘¤0ť+˛| µ)ôH‡ŇÔ`dďoMY˛yŐĚ›”kýÚrôý°řxiJźŘÔ ŢŮOďÁďJ€FäY¨'¨¸śĆť@˛7$"_(튒ÚŚęó«ç+†¬[śązţ¬o§7ز}ŰĂź·qEíRŢÇ‚‚ţm ŞĎ&µ”äőűŮě’°Aćí|KĹÖ» ‡ö…‡7,ţöĹÉ=šŢwť đôü®hDž…z‚ €kiÜ)4(«C"rĺt›Óą"«}qr/'=úňł‰+ž óŔKS6ÚgŠŢx ˙¶µňťu?‘_»Žšźž—žŃA µ %ö™ÔĽ~÷MµęŔN[ďÂŁ:ţíµżž Ć<Ţd‹ßiđÁďJ€FäY¨'¨¸Ćť@˛@$"źąXש<ŁciZö%É_÷ÄNúŻ…˙âDcł±,ŢłméŢwĂÜ6ţÉ`tßř˛ô&řŤH [ćKĹIżś[öó9Ą›ďW·őnÝÁ=÷NŚx¬CijSŢČv¦Ŕ3|đ» yę *.¤q§Đ ě‰ČĄI¨ČěTžŃˇ4őŢ©Ă6»$Ě÷gä%­ścZ6ŠŞsgÖÜ»ůČ…ŰŚîôÓą"«»Zmbé66'lś°}~ü\Ń}ÓG>}RőÖ»°6ŢGĺöĹÉM)ŰůĎđÁďJ€FäY¨'¨¸ŠĆm@˛L$bź®k$;–ÎYwOö­i#o›»`÷Ű&dc9vöôŢUűOVŤÚ°,ńČMĹI_.N¶‹Úd;(lśŃÜ{§˙ö3ŁUo˝«ąx1l‡íUG:–¦µ+Jęi{ŮNxŚ~]4"ĎB=AŔ%4n”•"‘VľR×#š{ű„Á±tŤdpę¸ÁŘÎ^¨>]}ţ 'ů‰ťĘ3|µéwPĎč đĎ_Ě)S˝ ˇćâŵě jۡyŐ†sžä_—ŤČłPOPp ŤŰ€e«H¤¦űŘś.‘¬Nĺm ţęůŠłŞërŃXlT÷Ď*Ś- wS¨Íˇ‰‚üć–L ç\ÍŐŰVîßySqRslç<Éż.‘gˇž ŕú· Ęn‘HëI\IJűâä0ÁGr_{ńýSÇ÷ź¬:zć”IظÂSđő‰ąwęđ0·Ds»D˛,Ą6ĺôćv(M ›č‰µ/î;QUuîŚnÓ¶mčÉąŁrHBEć-öRÁĂ|ŔŻK€/ÂłPOPpýŚŰ€eĂH¤eŇ1ˇ"3(č_›Ľ~Ëömßrôý0í;vö´ظďŮv÷”a?™]üůńeé ĺ™al¤6ýĄÔ`Äc‘·Öh˘ÝňZ·HvÇŇ´ÎYÝ›g©8‰ŕa>řu Đ< őϸMhP–ŚDZXzFĹ•¤ů‰µŐ瓞Z¶o{Ą{ß5ńš‚Ń—˙ęůŠßż8ń»ĎŽůRáŔŽĄińeéÝ•n“O·±9µ=5Ɫ7Vž®>Ż’ČĐőKÂą{ʰ¸’Ô[˘ąÍ·`śJđ<üşhDž…z‚ €‹gÜ&4(«F"-#µ_DŤí˘{řÁĹSźywcĘwÖ[Gm"’VÍí»|fżłţyâ_“վ89ľ,˝Gs^»k-‰ćÖ~t8Ż_»˘¤©Ű^ź¸uÝEŐÜ`†®_6E›ÂťĘ3š{w8›ŕy>řu Đ< őϸMhPvŽDš÷ş\A˙  1üsŘëK‹ŢXfČşĹďU1Üšs5Ň_ť—űÚ‹_.NnS8 máŔđ¬Ýbµ9¤G47ľ,=óřmăźĚ۸˘üÍŐęąá ţë˘0áaŹ/Kk âś‚çůŕ×%@#ň,ÔT\9ă6 AŮ<i^‹rJSŰ%… ňoź08gÍ‚XLł&e۱CŁ6,+sućęůÁ¨>AA˙n ¸Y5ZÇŇ´`Ěă˙:}dĘŞçÇnY٤Čąš Ł7.łiyě‹Ďť+˛ş·”*rrÁ#}đë yę *®śq›Đ ě‰4‹t(MŤ+I ň2»řŃ—ź ó§E•yWbMĘ껞ywăě÷6˙qQe0ěáđ|µ)ĐĂ×Q›Őgk7RóďźUřű'ÎŘľIU7ścgOç¬YŚx$(čßňjÉůŹôÁŻK€FäY¨'¨¸lĆm@˛…$ŇÓ}lN×Hv|Yz,JS9·ě?_÷Ăëî1¸ššŐv­:°3Ě=S‡#{ů‰q%©=ŁTróJŘkí‹“ü\QŘháŮTŘ˙?{÷de}ç‰˙) bzĄşÜ8VnVʤśTś$ăoÍÎ%•™JYcmjR™ĘnY•RTDŞiúJwJąCß/‡ä"QQDA@Q@D.á* ĐrǦ;żN†IíîtTxNźÓĽ^ő.‹ÚýCç|żźďůžĎ“Otť9ąl߇#×/ Ć>ÔQ·­2čęÇ%@;Ň ŐAŔµż"eI$yŇ+V’Q_¦GÝ[§>qĎüňx~8gBsK‹ó*©śmţl˱CŰOYxoçĘÁAů N9áÚÝěí¨)¬ÉCõ»{^Ůwžyzď©¶w¤Žś=őđs1ýŇŞó;đŰ„-4čę'&@;Ň ŐAŔťż"eI¤}“+Ť§g}É7źĽă™QaţŰ”áż1וśÎ6väě©lĆ=śVťźV]`§z fMÖ]Kk«í©¦ 玞=ýŔëłI;ü·ĺŤ}đÄhGzˇ:¨¸3ă7@¤L$‰´oú6 ʧsĹŕ…;7;”’VKkëĹÖ–0#×/ ʲ3cĄvoHďË/K˝ă™QvxĘçgĎפUçg][ˢĆ>xb´#˝PTÜ™ń R†’D?×+VŇ˝¦0­:?üó±sgN~v>LÓ…sÍ--Ą¤őËĹÓÂőúfă“_›ňxü ›6sJ—aĎú’ <űVĹ ĐŹÔ_Ď{Ű´}†]?Ý4öÁ é…ę ŕÂŚß‘2ť$’€ôi–V]ĐĄ27L0ţŃź=_łçäń='Źí=uÂ)”ĚZ˙řÇďĎ÷7ĎNřáłn™2<Łľ¸g}‰7Ą¦z1v«)Ć>ô›Ąłv}zěă3'íóQX5aí\WÓÜ–ôöÁ é…ę ŕÂŚß‘2Ł$ŃŰ3cĄAyöź2úÁ±ßŘpx_uďŮőé1‡O2Űxd˙]sĆ˙üĹúź.¬NŻ-ęQ7$ŚqÔ0‘zi0|ÔC×.^{h÷ÓM¶z¤öźjúŃ܉ń"şß/l€Ţ>xb´#˝PTÜ–ń R&•D®Uú6 ď^S”e_ĘÄÇÂ?/Ţł5ž…;77]8çŔIrŤŰÖ˙ˢÉ÷ż6óďź«ěT‘Ó­¦ \D»$kňĐKU9ö‘ňMo†Ĺxôěi»=jŰŽţáś ť+_·Ed€ö>xb´#˝PTÜ–ń Rć•D®ÍK/M˝=ôłçk·­3uëşg?|Ç “F®_šóćÂüŐ/~oÖ`ŇŔŞr»×†Ëjo§|†ő¬/ kłSENÝ{kÂ\hąhĂGmĹţý–ÍąwQ,üäŻç:˛@{<1Ú‘^¨*nËřŤ)K"_4˝'ÍŚ•vŞČ‰'˙hżesĆn|cčÚĹkîvޤ„ -_÷J¸jazÔ Ę/Ť.†0ŽÚ‘Ć»Őôm>ú÷Ë&ĽłÂžOŚĄ{·ß5g|x*¦Uç_çŐd3€ö>xb´#˝PT\•ń Rf—D>çŚŰMµE7Tĺ†é\18Ł®8ő‹ńô[6çđŮS“”°ŁéhőćŐŤŰÖ?ľî•`\˙Koą-ËÎŚ•ö¶É;\µ†+{Ë”ÇË7˝iŰ'ĆË»·4lyűÇs'ĺŮć»ÍĄ‚?xb´/˝PT\•ń R&GDÚx/j÷šÂn5a:Uä|ö¸ű_›ć×K¦ç®zŢé‘BÖŢ»h×ű‹÷l —/ő@Pvéí¨Fç:`.O¤Ć«ő/O©|w•ÍźKţ°-,®ŻMy<0 ˝¶He™K~đĐhwzˇ:¨¸*ă@¤LŽüy2cĄ=ę†ÄÓ˝¦đďTţüĹú0óě„g?|lj‘Z6ŢĎťłĆ\z;jyv·šCs5aͦUç˙đŮ Ş5‘–ď˙¨SENP–ÝłľÄ{‡ÍĄ‚?xh$ ˝PT\•ń R&GD2cĄ=ëKÂdÔß2eřźťĎwžyúÄůłN‰”ÓÜҲłé“MGt©Ěí\98üg¸˛7Gí¸‰ď_Ď{ŰÔkîV pţbsXe«î & ´ÍĄ‚?xh$˝PTÜ“;Ě%Ü€ädrD®Ďdý{2cĄ·N}⛍O† ˙ßőJŁc!EťżŘÜtáÜÉĎÎ/Ű÷a0ń±ôÚBűüz(äđźań†ŘŞI$Ć…–‹óvl & HŻ-˛ ÍĄ‚&?ř_UIH/T÷äĺö }™‘ëö©ń“NÝşîbkK<-­­Ž…5ú÷Ë:W îŰ0ĽŹWŁ^7C©=ę†|˝ń·Z.†Ĺ«fööŤť*rě@s© ÉńIK/T÷äëíší@‚™‘ë" Ă2ę‹ÓŞóĂt­Ęë^S¸ëÓcGĎžsäě©ó›©ëß–4Ţ:ő‰;žuŰ´=ëK2cĄY±R{ľĂ—sP–}÷Ľ˛°„Źť;Ł fÔ†×Ăűzăo{ĹJlEs© É÷IK/T—äëů‚í@‘Žš> ĂşVĺuŞČ Ś}äŢE±í'Ž\‰ÚOu?ž;ńžůĺan™2ĽGÝŚúâLă¨×AQw«)Ć>ôoK·?Ľ÷Ô …0Ů+źűţěqßl|2˝¶ČPŞąTĐç}€$§Ş €K˛{őU®»Şh›Éé0é=yhŻXIP–ý§Ś~pÂ;+VÜfůţ;š>Qď©nÓŃ÷Ě+˙ĹËS~ţb}÷šÂôÚ˘0ĆQŻ“‰ÔΕQäŻ~1,ç='Ź+‡D¸rAÖäˇiŐ=ëKzŰćRˇ˝ű˝€˙Uđé…ę ŕ’ěR}•«ŻjÚfrDR:}†_zb|uâcuĹ wnŽgÖößźüěĽďÂĄüŐ+Ťż1÷§ «Ă…N«ÎO«.°ůŻŁ4 Ćőµáőp':sRE$RżesÂŇËš<´GÝ©ćRˇÝ;˝€˙Uđ9é…ę ŕ†ě:}•;Aá´Íä¤âZçŠÁAů KűČ?żP[÷Ţš0Ő›WĎŢľQQwc7ľQĽćĄˇkß9kL0i`—ĘÜn5}†)ëç Č™±ŇKe>ń±p'śżŘ¬(ěŃĺóÂösĺŕp! ĄšK…vlđţWUŔĄŞ €ë±»ôUn µĐ6“#’¨őĹ—ĆŁ.'40{ĺs#~÷jĽŐ/¬űxŹBî0Î_lýűe•ď® “^[té5¸ĺnŞ-2Žz–|¸ôáË|čÚĹJ#‘>>sräúĄáÇL|Ěn4— íŰÚ< ľ˝PT\Ź]¤ŻfW(€żČä$gú4 KŻ-ęZ•¦SEέSź¸rA<Ľ>»Uév,;›>™şuÝłľ3rýŇ`ě#—ĆQ˲˝˘ńú,üuCÂ’żmÚţËçŻyIu$ŇŽ¦Ła%fŻ|.ý`¸ 7›7— í××< ®†^¨*®ÇnŃWł7Ŕ_drD’*éµ…Ýk.ĺ+˙vޤ_˝ŇćŢE±ż{Uµv<›ŽXşwűňý;~łtV0ę ,»sĹ`ŻF˝nߑڣnH—ĘÜďÎýóëźŢđşI°MGńň”`ô]«ňú6 ·'ÍĄB{utĎ€«§Ş €ë±űóŐl…đ™‘vLďÉC3cĄuĹazÔ É¨/ţ»•˙°°*ĚwgŽ^u`§ í6r0Ě–c‡ţzöŘ`üŁAů î5…ĆQŻç„µîp?„…?uë:5’`;›>ŮtôŔ}/5S‰ćRˇ}Űą€§BŔ5ˇŞ €»±ËóŐěµđ™‘Ä'3VOF}ń­Sź¸sÖ0ß›9ć®9ă•dGuţbóţSM‡ÎśÜrěP—ĘÜŻTĺv­ĘëY_Ň[E\÷§A¸ îxfTźŘĐĄ{·«”űřĚɧ?ýţěqÁ¤=ę†J5— íŘČ<®!˝PTÜŤÝśŻf·¨€żČä$8Y“‡Ţ2ĺń[§>¦[MAΛ •aÖÜŇrîbóů‹ÍĎ~řN0ń±ř[qU\Ix¤×m?qD±$Xë˙Řtá\߆ááçź+µÍĄB;¶pφ€kN/Twc×ć«Ů0jŕ/29" xbŹş!WL¸tďöłÍźĹsˇĺ˘2ěŔŠŢZÔ­¦ŕ¶i#ľ6ĺqłoňóé±ŇôÚ˘> ĂNś?ž-­­Š%ÁÂOŢŰQÍĄB2ôoʇ€(č…ę ŕněÚ @¤LŽČ5Oź†aéµ…7Tĺ† & ü›g'8Ýt%{Oť0‹Ú±Ý=Żě{łĆ|ö¸05uDF}qf¬4ÓPŞ\>âĂéáŢO§?U/‰·ĺءľ ĂĂ"í+±'Żyz_ţŰÂŻ?; Ú¦?‘Ň ŐAŔÝŘť€H!‘k•N9Aů Kő@ńš—6r0ĚĆ#űw6}˘Đ:ĽŹšŽŢ9kĚOV˙ăÂęžő%W^Ź›+í­:äňDjZuA0¦ß}/5„ÇB¸aTM»X÷ńžŰ¦ŽčVSQ_l[F2v=ń±ľ ĂĂŻ?› Ú¦Ež‘Ň ŐAŔĹŘ…€H$‘«x)jQP–})“ĺŮ/ězoپüĽ{Ë‘ł§×ő`ÁGďţěůš_/™ţÓ…Ő]*s»×†QňśáŢF=đčňy‹÷lÝ~âÂiÇj˝g~yת<ÓâQěóđ{đGs'.Ý»}íˇÝöüEşôŕ!)˝PT\Ś]”YůüC7ť+˙i5ĚŘG~4wâěíă™óáFŐtýýűeż17{ĺswÍn†®UyÝj ¢Lä˙Lð`\˙aożŇ°ĺí˝§N¨ťv{mżesâŐš^[¨TŻmú6 O«ÎĆ>ô·ó&™H…ĎO—<$"ĄŞ €‹±Ű2‘2Q"˙YzOÚłľ$(ô§LżúĹI﬌çé Ż/Ű÷ˇ ş® {ű•‘ë—† ÷FP–Ý©"'˝¶ČŚ›ü?“+˝tnL|,{ĺsgš/(źöҰĺí[§>L¨ZŁzMęÄÇ~ąxZx0®9¸Ű~ĎOŁ<'"ĄŞ €‹±«2‘2T"˙ÇM÷šÂ.•ąa‚˛ěľ Ë׼OöĘç.´\T2×›˝§NLzgeěýµOox=0 >¤Üłľ¤·z‘˙|ž˝SENx’„çFΛ Q{iŘňvXąá©Ţ­¦ŕf© Ą–e˙taő¶ă‡í7ř˘ôęÁŁ" Rzˇ:¨¸»*)s%×ű; 'M«Îż’ |Đ=óËű-›ćż:cäúĄjäú´ńČţy;6˝°ë˝ţËçŁ ʲýa´MÚJðŚúâ.•ą·N}â×g›Hm_3>ŘpiŠ|Ň@Sä%­ş SEÎOTě=uÂ~/AŻ<*"ĄŞ €‹±{2‘2Zr}ľÍ0˝¶čr 3ę‹˙eŃäű^jçîyeË÷¤.®[ëď]sp÷ÚC»ď™_Ś}((ËN«ÎďŰ0\áHۧJx’„[ĺ;Ď<ýÓ…ŐC×.VJíĺLó…űw,řčÝ`Â;3ŞżĎ!V~ţüĹúź,¨8vîŚ]_Žv=xZDJ/T÷[÷d"eŔäzHĎú’ŚúâxnŞ-úFă“wĎ+ óŁą˙éůZUpť»ĐrqŰńĂ;šŽ†˙LŻ- ʲ;Uäô¨ŇÇŰQĺó/á¶ąă™Q·ĎY˝yµ‚j/MÎ…%\÷Ţš`Lż.•ąŢ‘ŃĆĂŻŃĚXé=óËm9¸JÚőŕi)˝PTÜo]’”1“üB·x2cĄ·ĎůťgžŽ§g¬ä©őŻŮů׹3ÍŽž=}ěÜ™0/ďŢŚô«ŐůiŐYjGľČ!Ó+Vň­éOý׺!‹v˝Ż¬Ú·˘‹×ĽŚ}$˝¶čfĺŃ$ü2íŰ0ü›—˙b[®žŽ=x`DJ/T÷[7d"eҤæaX<éµE{Oť°Ő µ´¶Ć3`ĹüN9^V,ňe™ŻTĺn:z@eµŁÖËuť»ęů |=iŇŞóď{©Á–kEÓ<3"ĄŞ €ű­2‘2iŇŇ{ňĐ›j‹ş×Ć”e˙ěůš¦ çâ9qţl«ŤÎe÷Ě/żmÚoOę–)Źg^žHŤGÉzkdZuAŹş!O/-­öôoKű4 ‹W´ÍŃüuF]q0iŕŻ^i<Ó|Á–kEÓ<3"ĄŞ €ű­ë1‘2r’˘¨™±ŇΕă Ć>4ăő»>=ĎGMGť9ion†ŰgŚüń܉aÂÍ“Q_Üłľ$Ë›|ÁôiÖŁnH0iŕwžy:~Ô(®öőÓ…ŐwÍË”áaQJŤnŰăúçŻ~qGÓŃŁgOŰup éŰÇF@¤ôBuPpżu= R¦NRe4&­:?(ĎţS&>–+]xo<«î:Űü™ÍĚź{y÷–>;áŢE±˙± 2­şŕ¦Ú˘0^Ť*_öü)Ć>ôOĎ×®űxĎ–c‡ÔW»űçj3ę‹Ók‹L¤F;”:ö‘˘·9{Ę–kNß<6"ĄŞ €ű­ë1‘2x’Ě ĘeŮ—2ę~Ëć,Ţł5žE»Ţ_ľ‡ÝË˙měĆ7~ąxÚo–ÎúŃ܉áţI«.HŻ-ě­šäËÎĺu©Ě ĎźpG-ÜąŮDj»;zöô}/5üzÉô´ę|c摾”üŇ÷ďč‹ŢZtěܢ o‘Ň ŐAp%Ćő€H?IžůŻôÚÂ˙x#jůĄqÔňMoNÝş.L廫öśüQď‘Ndw©ĚíÓ0ěńu^“ ‰Łuž‘Ň ŐAp%ĆĹ€H™Ią†ÉŠ•ö¨r%iŐ;oŇ?żPĎÝóʆ˝mć…Ďĺägç×}Ľgă‘ýaÂ?ÜX•”eĺÂ}ŐÇŰQĺZżÇą[MAÖäˇO­Mé%‰MG„µ˙­éOu­ĘSň‘î˙ôÚ˘ď<ótř=âwŻÚxHş÷ŕá)˝PTWb\Ś”±”«If¬´W¬$žŚúâľ Ăďš3ţJnťúĶă‡í1>żcçÎěúôŘŢS'Ę7˝Śéץ27ž,ĺ&Ńś`=ę†Ü>cämÓFŚÝř†lw-­­»OŰ~âH·š‚Î{Ö—ô¶Q#Ţ˙abﯵ÷ ńtďÁĂ# Rzˇ:¨®Ä¸)“)_řĄ¨˙žĚXé­SźřFă“ń„˙_˙óĄ;Š/áLó…“źťs˙k3IÓk‹2ęŠÍŁI¤çXx‚Ý6mD÷šÂŮŰ7ŞÁdp±µeÍÁÝAYvxآ Jý«ËűĆ®í:¶´¶ĆĎs[Ú¦{‘Ň ŐAp%Ć­€HNů˘éY_O0iŕÂť››[Z®äbk‹Ĺ—đ׳ÇfMzË”á77 Sb’s,(´úŕ® -[Z[Ő`2Xą˙ŁÎmÎÄ$(Ď?đ(ö˙ćO¦Uç‡çą- mÓŔĎŹ€Hé…ę ¸ăV @¤ §´•†a=ꆤUçÇÓĄ2·÷äˇGΞŠçă3'/´\´…řrv}z¬oĂđďÎ&ţňľ0YŠN"KďË۬ku^xšm?q$<ÁŚŇ'‰¬ĎŞ/ůÖô§z֗ب‰Jť4pŐ]Í-×~˙Ż?Ľ7Ľ6„ëÖšŤ mÓŔĎŹ€Hé…ę ¸ăV @¤Ě§üy˛&íT‘s%ÁčsŢ\¸ířá+Ů~â=Ă—V˝yőĎŚúÉ‚Š0óě„ôÚ˘Śúâ0JO"MźË#öÁÄÇn›6"~”)Ć$1jĂëß›5ć;Ď<ť^[Řłľ¤·íĺ\vŻXIP>(ĚŞ;ŁxMđňýý·)ĂĂ=ţo´˝ˇmřŕů)˝PTWbÜŠÔő<ĄŇ·ax·š‚ ,űO™4°sĹŕĄ{·Ż:°3žđχΜ´I¸JŮ+ź»wQě_O˝ă™Q]«ňŇk Ăô¨bMpĘĄUcúÉ‚Šĺű?ÚpxźzL#~÷jź†aá™Q_ě4úíçÝk Ă9ţĺ~Í—rööŤ· ňGs'¦Uç_YJ;Ú¦ž‘Ň ŐApĆ­€H]oĂ)—Ţ•veuLżű^jXđŃ»W˛pçf[‚k˘Ąµőţ×fö_>/LV¬´KenZu~F]ńÍ ĂĚIb&RĂ]Ś~đß–4ÎÚţ{©I%ő‹ý–Íů«i#ş×:˘~Ypzma0ţŃۦŤXşw{«Ů¸mý7ź o—Ţ”úg«iźCŰ4đÁó# Rzˇ:¨îø©Ž>ŤRtiőJʲÇn|ŁzóęxÂ?o:zŔŕZY{hwΛ ‡˝ýJ+ć_zoĺŕ0˝b%^†( K¸Ů:Uäc 7axĘm;~Xm&Ź˘·…çĂĄIÉňAőŐ#ż„ßű÷Ě/źôÎĘE»ŢŹbA·­˙zăo»Tćöůż–Ňn‡¶éáGH@¤ôBuP܇q% Rl놪ÜÎă &>öĂg'<±nI<ŹŻ{%Śçš[đŃ»ŢYQ˝yő?=_Śë‚î\9ŘÄ™$řĚŚ•^:úʲsW=ćčŮÓĘ3yśmţ,ő‹áSx>„+eV=ę‰Ô´ęü`€»ćŚ_¶ďĂ(´aËŰ•ď®úzăo»Vĺőůťöö<´MŚ+1‘JáÁ“†aőĹ7Vĺ]IçŠÁ÷ż6sŔŠůńüŻWgĽ°ë=KLDžýđťy;6…ąuęÁřG˛ěn5}†›“ÄO¤ö¬/ůJUnx$†G_żes”gR9xúÓĆmëźZ˙Z0®żqőÄ\‚ňA÷.ŠýzÉôŐwEtţ‡·Ž`ŇŔ6^zkçCŰôđÁ#$ Rzˇ:¨îø©š4IŻ-JŻ-Ľ’®UyßžţÔ/O»’{ĹZ­(‘ůřĚÉĄ{·ŻÜ˙Q˝{齇eŮaÚK‰z"5>žŰ´÷˝ÔĐůŠ„\ÂëÁ÷gŹŰŃôIkÚzůŮÁ¤™±Ň¶˙Kěh›>x„DJ/TŔ}Wb"•´ĂV™±ŇŚúâ+éQ7äżĎ/űűç*ŻäÎYcF˙~™$j{NßüÉÁ-Çĺ®~!ý`P>(LçŠÁ˝Ť€I{ż#5˝¶đö#0g\ńš—”j˛ŮŞé/O ĆôK«.0‘š€d]ÓţÉ‚Šđzpřě©kľ gš?ŰtôŔË»·|ž˙%mÓĂŹ€Hé…ę ¸ăJ @¤’g˘$3Vz%=ëKnťúÄ÷fŤą’ŰgŚ<±Ůz‘­üăˇ3'?ţ÷üŹ•ÁÄÇşVĺÝT[d¸L’ä´Ě¨/ţÖô§Â?Wľ»JÍ&›ŁgO‡GÇĎ_¬Ęy™r†RĂşřţěq­éąććş÷ÖcůjuţçüK ´MŚ+1‘Jžˇ’[¦<ţµĎŤUyy«_°:$RKkë…–‹av4íZ•wĺ]˝Y±R3_’Tówáiů•ŠÁ‹v˝Żl“Px†Ü9kL·š‚LGGÓłľäŻgŹŤhM/¶¶Tľ»*4đ ˝&[-@ŰôđÁ#$ Rzˇ:¨îø©v™é}ů˝f7Ő]I§ŠśÍź<Ó|áJ.´\´:$ŇĽ›ľZ•Ű´a˛ĚyIR&<-ňAŹěÉ‹­-Ę6 }wćčđ Î’°ëDŻXÉ UąwͶůłÖtÂ;+ÂĹý; Ô´MŚ+1‘JĚŘHתĽ.•ąWŚôŢE±}§š®dď©-­­–Ä+zkŃ×ű9ănź12Ł®¸W¬Ä[%Ů&ďzÖ—tŞČéQ7dϧÇ÷ś<î´LBGĎžţÖô§Â“$ËPj˘Ň§aXP–ý‹—§„WŹĎśŚbYsW=˙ŤĆ'ĂdÔŃ˙ @¤˘‰żŃď?2aŔâ=[7=p%ďŰsň¸źöňŹ «ö|M<·MŃ˝¦°GÝžő%˝ŤzI’ŤÝĄ‡ÇéřGďxfÔĆ#ű7rPń&ˇpiľ?{Ü=óËÓk/ť$ömbJ#­:?ýŕŻ^iÜwŞ)˘•Í^ů\V¬4ü‚čű2ßJÚ¦Ťž"‘Ň ŐApĆ}€H]ý‹ü.Mž–e˙GĆ>ôw *—îÝ~%Kţ°ÍçL»Űvüđ?=_űż^ťńŻ‹§v«)¸㨒„éŰ0üŇŘÝ~˙üBíâ=[7ާ„“Óę»îxfTçŠÁéµEN’„UG0ö‘üŐ/.Úőţ®OŹE´˛9o.ĚŠ•ö¨ňĄ—Uu@Ű´ńÁS$ Rzˇ:¨îø©/óňľ?źBť4°ňÝUł¶˙ţJ¶Ľ˝ţđ^,É`ęÖuý–ÍÉysa{ĹÂíÚµ*ďĆŞ<]’Ě/‚ěR™Śé÷›Ął&oY»éč…śś|ôîŻĎţűç*;Uä„«fë& ú«0Ć>4p傏ϜŚhe¬~eô¬/ąšˇTs©điă{@¤tŃőŢ܇q RmOUtŞČą4r%ăýń܉ŢYq%ă7.÷’lĆn|cäúĄOoxýö#‰Ź…Ű8LZuľŮ1Iň\:r' Č^ůÜë–ělúD-'§ĆmëĂúÁśqábu«)p°$&Y“‡eŮŹŻ{eÄď^mşp.Š•mim «/ü·„•+˝ĘŕŞh›6ľDJ#]űŔ}÷a"őç/éëQ7¤Keîź'çÍ…Ĺk^ş’+ć/ŢłŐ‡F˛9xúÓňMo6ly;LőćŐť+_z™oyv¸ĄŤŚIňż˛W¬$/˘•ÝŞéŮßybÝ’`ě#×pÖXÉ@Ű´ń= RéÚďîø©{Ĺâą{^ŮŚÖű@Hrë>ŢłöĐîđźaţqau0öˇ ,űĆŞTŕÉŻxÍKábٱíS&eٱ÷×Fşľ÷Ě/OŻ-Šô˙ EmÓĆ÷ €Hi¤kż¸ă> \?~0gÜ7źĽ}ĆČ[¦ ĎŚ•f]~Ĺd–A-IéפĆJ»Őt©ĚÝrěбsgš[ZTz2»˙µ™}†mĘă˝b%źD¦÷äˇÝk qý·­żĐr1ş%ľ{^Y¸¸áWŚąThGÚř)Ťtíw÷a܇€lÍÁÝßśöŰżť7)žĚXiF}qĎú’¬'†D"Oðp3“Ţ2ĺńťMźěh:ŞŢ“߯—LĎźuC2A‰Mę„K÷nß~âČą‹ÍQ,îů‹ÍwÎ~ŃdMš€őUMĐ6m|”Fşö;€ű0îĂ@3âwŻţÝ‚Ę{ĹÂühîÄ«ňŇk‹ÂÜT[d2K:@ú4 ëVSŚ}äÇs'®=´{ÓŃŞ>ůĹO¤Ţ“‡ö¬/±‡ůŽÔđʲüĽ{Kkdë{ěÜ™»ćŚď^S~×$ć5¸j Ú¦ŤďA‘ŇH×~pĆ}č~cîo–ÎzŕőŮ·MŃĄ2÷«ŐůaŇk‹nnf8K:Fú6 żˇ*7ýŕż.žşŕŁw7ާđ“\Ó…sżxyĘýŻÍ ŹŁ´ęüĚXio;9ďîVSţaŃ®÷ĂD·Ę{Nżg~yř˝“ČĹU\Đ6m|”Fşö;€ű0îĂ@ŠÚ~âH˙ĺóŠ×Ľ&wő ]«ňşTć†É¨/6ů%o®SEN0öˇ‡ß[ľéÍ-Ç9’ßľSM˙˛hr0iŕ Uąöp‚ß)ś^[LpëÔ'|ôntKĽţđŢđkč—‹§eŮ ţ;Ô´Mß"Ą‘®ýŕ>Śű0B|ôî¨ ŻOxgE_˝ŇŚë” Ó©"Ç(–tČdĹJ/M¤N»ęů˘·<ý©s ům<˛Äď^ýÍŇYÁ„}Ľ˛9áC©á—ÂßΛ4ěíWć|¸1şU^sp÷˙7ż,üş±*/ń«¬Ę mÚř)Ťtíw÷a܇€ä7ó afm˙ý7ź Ć?”e‡ą±*ŻoĂpCXŇ!Ó{ňĐžő%]*sÓk sŢ\řđs[©`ÍÁÝS·®»ďĄ†`LżŞrťQ žHíVSLřÝ™ŁďŮőBß=Ż,üwµ×«5h›6ľDJ#]űŔ}÷a }|ćä˘]ď/Ý»=Ě‚ŹŢ & ŚĎ˘fÔßěĺŇŃ'RĂ}޵*ďkS˙Ő+Ťż1×*ÖŢűýŮケŹt«)0‘šřÂąˇ*÷V˙ÓóµËö}Ý*Ż9¸{ɶýxîÄ <»_†«Ü mÚř)Ťtíw÷a܇€$±ýÄ‘ ‡÷m:z LţęQĺÂtŞČ1r%×Ď;R»ŐÜ>cäÝóĘÂ*p,¤ŠÍźÜxd˙wžyú+Uą}ĚÎ'<=ę†tŻ)üöô§¶?őB÷mL|,ü7¶ďB+:h›6ľDJ#]űŔ}÷a }í?ŐtŕôĄ\zĎŕ¤7Tĺ†IŻ-4Ű%×U2cĄőĹßžţÔ-SźđÎ 'CJhimÝwŞi÷Éă7Őu®Ü3VŇŰfnŹÚąsÖżš:"\‹H—{ď©a‘fÔ'Ă*«>h›6ľDJ#]űŔ}÷a Áš[ZÎ6Ď®OŹ}µ:żGÝ0Y±RVr}&kňĐ[§>qcUŢĽ›)ábëĄslĂá}Aů đř˛‡Ű«p2cĄßl|2üZ‰n­[Z[õŢęDzmQVŇüß®ˇmÚř)Ťtíw÷a܇€‹˝ż¶kUŢ­SźÇh•\çɨ+Ę­=´űÜĹć–ÖVGDJX¸ssxŽ}mĘăYöpű˝&µ{Má·§?uţbs¤k˝áđľ´ęüdű¶RĐ6m|”Fşö;€ű0îĂ@üëâ©·Ďyç¬1aľŃřdF}qf¬4ÓUr¦÷䡽b%]*s»ŐěhúäŔ馋­-ŠT1{űĆ˙RS?ÇlćvHðΕ˙nAĺÁÓź>{*ҵ^u`ç­’„k­ ˇmÚř)Ťtíw÷a܇€\hąřăą˙aaU> ĂzÔ É¨+Ó+VŇŰ\•\Ż ká¦Ú˘`âcßšţÔćOn9vČY‘BĆn|ăűłÇ}wćčôÚ"çX{UP0iŕ?żP»çäńH×zööŤáB‡Ëý_j “p­#´Mß"Ą‘®ýŕ>Śű0p -ůöź.¬ţŐ+Ťaî]K«Îď^SĆ[Eú6 +"űĐ?,¬Zşwű†Ăűś)¤č­E÷˝ÔđíéOÝP•›Q_|sĂ0[:ńÔµ*/ýŕż,šĽýÄ‘H—»qŰú[§>ŃĄ2·GÝä\k% mÓĆ÷ €Hi¤kż¸ă> \Ą§Öżöđs®\ćîyeÁ¤]«ň¤Uç{ź Hü Ź]*sŃţŻWg4n[o"5ĺŻy©W¬¤sĺ`©íůšÔqýĂo™©[×m;~8ŇĺnŘňömÓF„ßb}’x­U%´Mß"Ą‘®ýŕ>Śű0đE5]8—żúĹż{5ž^±’ <»sĹŕ0éµ…} m‰üY:UäăúX1äúĄQżä‘knčÚĹá)—^[”QWlĐľ}‹č7Kg<ýi¤Ë]ľéÍaożňíéO%ůPŞąTř‹´ń= RéÚďîøźÇš»'Ľł˘î˝5arW=Śë”ЧW¬Ä¸–Čź'¬ĚXi—ĘÜN99o.¸rÁ±sg#)äÄůłă7.ą~i0ń±đ” WÓ)×.Éş<”~édŻ|®éÂąH˝aËŰéµEÁ¤=ę†$˙_° HˇmÚř)Ťtíw÷a܇€6,ůö˝»pçćź,¨Ć>”e‡éR™ëĄ¨"˙ŮDjĎú’Şr{ĹJ~cîŻĎvڤśCgNfŻ|.ý`P>čfg];ŐQXA]«ňŇk SDł¶˙ľsĹŕ°xSeYťBŰ´ń= RéÚďîøîLógËö}¸úŕ®xzÖ—\z]`Yvzm‘YT‘¶'é2ę‹ÓŞóo›6âç/Ö÷_>Ďy’röś<ľ|˙ŽüŐ/céŰ0Ü®nŻRęQ7ä–)Źß÷RĂ˙~uF¤+~öňWŢÂť›Ăoş¬”ú”T+´Mß"Ą‘®ýŕ>Śű0pčĚÉ-Çm?q$Ěä-k1ý:UäÄ“+ímNJä/ĄW¬$˝¶čö#ż7kĚе‹ť*)gß©¦mÇ˙Ű’Ć`ěCÝj Śá·WÂ/ť›j‹Â‚°b~Ô‹~¦ůBőćŐáW^—ĘÜú¦Ëş<ŻfˇmÚř)Ťtíw÷a܇ŕútôěé+ůĺâiÁ„iŐůaŇk o6%ňůgÄbĄ=ëKľŃřdřĎş÷Ö8[RщógďžW”egÔ;Űwľű¶i#ú6 Ď^ů\Ô‹~®ąąňÝUÁřGSkĹł.żOöŽgF)[h›6ľDJ#]űŔ}÷a¸N´ţńŹ[[â9vîLÖäˇ=ëK2cĄa˛ĚC‰|ŮôiÖąbđâ=[2©(~$Ţ5g|zm‘ÍÜîéT‘3~ăň¨˝Ąµ5\ô ď¬& LąŹ¨GÝÍť¨rá/ŇĆ÷ €Hi¤kż¸ă> ׉y;6uŻ)üfă“aľŃřdÖĺ×®ĹcJäKĽµ0,¨ |ЦŁš.śkniqȤśs›żŢřŰđ<ěí$lׄź˙MµEÁřGË7˝yˇĺbÔëžóćÂŚúâ[§>‘+M­OéĆŞĽ{ć—źiľ xá/ŇĆ÷ €Hi¤kż¸ă> XżesîxfÔźťćö#{Ô éY_¦W¬Ä$”Č—IðŚúâ |PXG{Nßőé±–ÖVGMĘŮŃtô덿˝kÎřř‘hc·ď¸e0ţŃ…;7ďlú$—VĚK8Ł®8…†Rű4 Kż<·űӅՇΜTżđyhă{@¤4ҵß܇q€ŽäLó…{ć—˙üĹúxţŰ”áÝk {Ô “Q_ÜŰ ”ČUŤ†ăúß9kĚúĂ{7=ŕŔIEË÷ď¸kÎř»ç•ĄU„ŁŤÝŽă¨™±Ň <;˙輛đšÔ_/™ţłçknťúDF]*}†'Ořő[6gÝÇ{v}zL Ă礍ďA‘ŇH×~pĆ}RÝË»·Ü»(v˙k3ĂÜ÷RC—ĘÜn5ńdĆJ͢Š\eú6 ďZ•Ś~0,´E»Ţ_xŻc'uOËŰgŚěT‘“^[ällߡԛj‹ş×.Ţł5¬©,ýo–ÎęQ7$­:żW¬¤wJ>Á¸ţáüž“ÇŐ/|!Úř)Ťtíw÷a܇ Ť\ż4çÍ…ů«_ óăąIo¨Ę “VťoŘJäľ©°sĺŕ`Lż^ź]˝yµw¤¦®Ćmëű/ź÷·ó&uŞČ —ŐŢnÇšş©¶(řXf¬ôŮßIĚę÷[6§kU^řoLĄĎŞaX¸Wă‡ĎţSMJľ(m|”Fşö;€ű0îĂŽť;3tíâ±ß§GÝ <»SEÎĺ˙łą¶Éš<ôŇPŘ„Ů+ź Ko·—¦¬ş÷Ö<˝áőŰgŚ &>ć´l˙AďŠÁ={ěČőK·­Źz鏞=oŃ[‹‚ISîł ˙›Ă˙ňđż?üżBĂ— ŤďA‘ŇH×~pĆ}’Öš»ëŢ[Ó¸m}ÜUĎc ʲăÉŚ•z/ŞČ5OXV˝b%]*/˝z8çÍ…ż1÷\słł(uÍü`CzmQ0i`Źş!&RŰw"µ{Ma¸ßyćéy;6%`é÷ž:ńŔëł1ý:UäÜśRK~żw­Ęë·lŽú…«ˇŤďA‘ŇH×~pĆ}’Ęâ=[ŻäîyeÁŘGâ¨]*sű6 7Ü$ÝDjF}qתĽ°ĐîmćŻĎvĄ®ć––v˝·pçćÎ{Ö—âoç4 »ˇ*÷' *î] ×%ęŐß~âH¸ôVĚĆőOˇďÍřP|Zu~Źş!żY:KĂUŇĆ÷ €Hi¤kż¸ă> íëŘą3kîŢpx_eű> ĘłŻÄ ţD3Öłľ$­şŕ›ŤOţýs•Ů+źs.Ą®¦ çÂuĆ. ő—ʲĂŰ;áYZu~X\ë>Ţ“€ °ëÓc÷.Šcú…˙Ňú˝4_W|ëÔ'~ö|ÍŻ—LWČpő´ń= RéÚďîø@â:sr×§Çöś<fÄď^ ĆôëR™Ź!&‘D&3VÚŁnČí3F~ŁńÉ‘ë—:ťRÚÉĎÎŹţý˛đDíZ•włˇţ$HĎú’ĚwŰ´ŰŽNĚwëOVĺŮ)÷W:„TF}ń€óU1\+Úř)Ťtíw÷a܇ ZZ[›.ś;ůŮůxîžW”ę^S&Ł®Řü”H‚“u9™±ŇۦŤËpĆS)í\ssxĆ>µţµ`Â'j’”XřĎŻMy<\—l€řwë=óËo¬Ęëť‚ÓńiŐ9o.TČp iă{@¤4ҵß܇q€ŘvüpZuA߆áńô6µ$ŇŢ`a‚ňA+öď¸ŘÚŇŇÚęJiż1×;R“í ·Lyüägç°úaý~{úSáż4Eż[˛ě˘·9…ŕÚŇĆ÷ €Hi¤kż¸ă> ™đΊžő%w<3*Ěí3FöŠ•ÄGáÂYI|zO–á Uąá??>sňčŮÓGΞjniqXĄ´Y4ů덿˝eĘăá˛fŮçIPe7Vĺý`θ°ľŽť;“€ pˇĺâ·§?ýqŠ}\ ĂŇk ±Ź {ű•3ÍÔ2\[Úř)Ťtíw÷a܇ŕşďĄ†ĎťxĎüň0ßšţTzmQF}qžő%ć•DÚ+}.ÍÜ9k̶ă‡w4uXu?YPńßç—…‹ŰŁny˙䨲Â`\˙»ç•í9y<1{ŕÄůłßť9:ü’MĹŹ+űČä-k·;Ôtáśr†kNß"Ą‘®ýŕ>Śű0\Ťí'ŽÜ3żü/O‰§g}I÷šÂôÚ˘0áź{Vi×ômžVťŚéwď˘ŘĘýmţä S«himýÇ…Ő—OÚÂ,©ÉQhÁřG˝dúňým;~8{`˱C÷Ě+˙Ůó5Ýj Rń­˛Á¸ţuď­9Óü™r†hă{@¤4ҵß܇q€/dÂ;+îmćĂoĚŤçź_¨ ĘłÓŞóăÉ2 $’4Ż#ě\18ý`X§ł·oÜrěă«Řsňř/Oűő’é]*smň$J×˙ß–4&ěMÄë>ŢsלńAYv·š‚Ţ)5ŽÚ+Vţg«|wUKk«Š†čhă{Đż›|třű•O·ecüTÔ~§]öˇĎHő/P/¸»®ďŕő‘¦şÖ?ţ1wő C×.ŽçÖ©OeŮ]*săI«.čÓ0Ě\’HR%(ŚëźżúĹń—ď9yÜ9Ö¬?ĽwŕĘżzĄ1řXת®Ëî“ǰ ^Ţ˝%{ĺs˙ô|mřEśb_ľ ĂnŞ- S÷ŢšęÍ«U4hţ{ŕ;ČéŤkĎŕÎě2ŚŃ~'µvšĺ:Ć7ŁĹ÷aG8‹”?@8‡}ţÉlă‘ý#×/­|wUâ5/\s»śŚúbóP"Iű.ÂN9ť+‡e›żúĹ3ÍśfĂš»ď™_Ś{¸kUžż ‰Ŕ˲łW>—·ú…§?MŔ6XĽgëwgŽĆ?Ú­¦ ĺ†R»×†(ßô¦r 7ť@_@pěX{wf—aÔö;)şÍ, Đ1ľ-¸;ŔAäčç°UH*/ďŢ2{űĆg?|'Ěż,šŚé”e‡éT‘c J$Égľ2ę‹;W˙<`Ĺü+8Đ:ŚĺűwĚř`Ă?,¬ & ěŰ0ÜnO†đĚXiתĽ0ż^2˝Ąµ51;aéŢíßžţTXć©őŤţ×ö¨” wďřŤËU4čąiřĆqžc‹Ú˙¸?»Łjü\Ąm*k+ßSŕ4Ŕ9'ŕ@vś^oÎ4_Xň‡mË÷ď'Ł®8řX|µ[M(‘T™HíZ•÷­éOÝ÷RCţęťlĆŞ;—íűđŰÓź Ć?š^[čďH’ˇÔ°â˛&ýŐ+Ťż\<-1;aůţŹÂťpëÔ'nLą·ĺ6 űjuţťłĆüüĹú ď¬PÔŕ§źv€/G:¶Ą˘ŔýŮĄäg)~ Y\pR9ÓŔS/Ž Ŕ±ěíxöś<ľéč-ÇĹS˝yu0úÁ |P<™±ŇŢĆŽDRg>®g}I÷šÂ;žőýŮăF˙~™#®chim ę0Ýj ‚˛ěŚúb'sňĽ&5˝¶(üçýŻÍLŘ~X{hw—ĘÜp'„őŢ;Ő>±đă ˙9ó ęü ôłŔ÷‹#[Q™ŕ"íꋲâ:ŻD+8¦nŕĐŔ·‰Óp>;3SHKkëÁÓź:s2ž{ć—ëZ•O·š/ŕIĹdĆJ3ę‹oź1˛OĚĚW‡rˇĺâ˛}Ćę,[=™ŇłľäݦŤřF㓿Y:+1;a˙©¦ő‡÷eŮ©ű‰ÝT[´pçfu ~úY ŕ;Ĺ‘Ž‹ŤÂŔuÚŤ%Ću[€Ýń Î(‡8@ph€Äy8źť©âbkËą‹Íç/gŰńĂ]*s{Ô ‰'3Vj¶H¤äkSďZ•·ęŔ.'^;ş—îÝžşs8Y“‡†_¦C×.NĚfhim}a×{Á¤őĹ©ű‰}Ąbđâ=[•6řmčg)€ŻG:®1Š—j7^”×UŃYe;śQ7pžŕ ‡†łpJ;SÔ¤wV¦Uçß6mD[§>áŤ{"i8®GݰŔw6}r¶ůł–ÖV'^‡1uëş«ňľ6ĺq‡vRĄ÷äˇőĹÁ„#~÷ę…–‹‰Ů >z÷+łRöŻ’Ź©`ŇŔĄ{·_lmQÚ࢟ĄľD鸺((\ŞÝxQz\…fqm p@áĂŮ‚“śŔAí0L9˙}~Ů÷fŤůţěqń|˝ń·őĹ™±ŇxL‰¤|†]šŚ+ôµ)Ź8Ý´˙T“yÔŽdÄď^˝uęßl|2~tŰđIUzÁ¸ţS·®Ű{ęę㠉Ů3>XSmQŠľ)5sriçĘÁ›?9~bÍ-†RÁďD?KÁŮ⬰Ė ç‰3Ž‚R¨[Îłî¶ Î^śĆ8~Áé„SNÎF J …¬¬,±•Jď»sćź.¬óŹ «{Ö—ô¨r%˝b%˝ ‰tôiÖ˝¦0×˙îye›ŽŘvü°°şvqV¬4\ĺđ$wt'U:UäcšşuÝ™ćĎłFmxý®9ăďxfTzmQĘm†Ţ—_“Ú­¶`ă‘ýęü`ôłś-Î ‹k™p€8Qď("llµ`ËŮc–ŰžÁŮ‹Óg/8špĐ©GŔ‘ččCąˇ˘•’ŵRínčÚĹ˙óĄ†_/™ĎOTt©Ěí^SO–"‘7ŽÖxP–Ś~đWŻ4.ůö͟tv0VĚ˙×ĹSo›6"‡;pµčY_”Z´ëýĹ{¶&쥟O­­oĂđŞr/˝)µaXjťW=ę†ËŠ•®Ü˙‘Ň?ý,g‹łÂ˛Z&FÔ>jĺ l9{Ě*Ű98{ŃRĂVçÎ:… 8ťx¨;”¶ ˛¬VŞ]śmţě7KgeŻ|.žľ Ă;Uät­Ę‹'˝¶°OJ ­ČçOP>(űĐе‹goßذĺmďHíxú/źěőĹ]*s˝&5éć+' ěVSđě‡ď$l?ŻyiŔŠů·N}˘{MáÍ©öĺ~há‘ő9ăf|°ańž­Şüxôłś-Î j™ ôś(”Z°ĺě1ëk˙ŕěĹiŚ=Î%śu*pú9čP€¨q…cM­T"­:°łč­E#×/ 3`Ĺ˙ĎŢ˝YUŢůţ_DŇ}¤şmđı&1–sŚ•{N%'ɤ2S–ëXI%•IĄ*ĺ•[5ĐĐô "(tÓ@ß»7 4wąĘEQ1 Š(  wh ť_~ůMnFéŢkŻýz×S–óWŕyŢźĎÚë©ůşúu¨řŃ2¸dY±˙DcŹÄĺO4†ëŁ8qáśß31ăčŮÓaÉYűD0)/,öěD©bŹÔ|eçšÁ7L]±yUÓ¶ß·›Ł7<ýOµCÂŕ§ÜgR˙k(uRŢ­sĘWěÝ!ŕ€÷GŻĄ€nŃŽŇ1é@ˇ„â ”ă“et/â—#GĆ@/AÝATĄ'†tţ_ĹśTôHĽ˛ţO×­Ęî˙h0­Suľ/˘ZVZ¬¦áY Ĺaę{$JŠ×- —ź1±d˙ÉăżY1;,ůUŤŁFm¸2ł~h0±˙šlŢľˇ=­xxă3Á¤ĽěDi*nZ—ş‚ ˘ŻˇTŔ[¤×R@·č çč  Đ ’qĘq̱ şq ‘ó" — î ­€Ć~“D;R7/N*f8őţÜ×7=ľëĺpÍzmc0)ďOW׺ˇfQ-+­&R»5u¨xĂôŃż~zÖ°őËü€‰%Űß;ôČë›/»ĽwݦĚŹZ ;Uçgţ¤ź-›6㵍íŁÄńógõ[×ăű¤č÷ť;V úŹÇëď\:eőţ7dđ"éµĐ-şÂ!:&…#ô€@drs t‚îEĚâă¤(č%¨;Č, ë ÖDRŹÔŤ‰“Š ëîţăĘ_óXđđ]˙5Z9Ŕ@eĄçĘť<,«ˇřł5o™=îŹVWl^ĺ§K,Ůvôŕš·ßü鲩ÁŘ»Ăă6”µvk( Ďĺ Ó~Űž_üśy$|”“ŐXüÎéí&ĆĄ>řů“Íťk§î¦…;vó¬±I W¸‡ÍŰ7“ňţřGR8€WKŻĄ€nŃÎKĄÓ˘ M"YĺRÚ1'B3č^1qŽPż€:‚Ţj@›AwA`ˇÁy©¬ż ËJç•;yXŹDIçšÁ×MyüüŮcçÎ\ň3%¦l;z0«ˇř†éŁ ĄF6ŚW׆&1\í™Ä;—NéÖP”“(MŃ}ëRWpëśňÎ%1_‰WÖ¶fpöźěˇÎĽcz-t‹®pR*ť3X¨ňCd”KQǜ٠{Ä!B÷şÚO´č ­±…Z‡Ą¬ţ.F,+=WĎżŽTôýÎüI»Ţ?şçÄ{~źÄ•e{^ý×ćßŢ2{\·†˘îŤ%äŹ`ĂŁ &ô»yÖŘvţ`ń÷Vý‘Š^M#z$JR·Äľ5oÂţ“Ç“±ę—Öd5‡‡ř§<ÍxÍôZ č]áT:[ łĐ-̇8Č(—rŽ9ĘA÷ÂńA÷şÚOŔ¨/}á…r żcRSA–•npťŞóĘĽ`ěÝ?˛yýÁÝ;ŽöË$®L޶ţŰó'Ţ:§<ŁvHVCq®D2’Á„~·/N„aÜţޡöÔăG‹jł‹3ë łSđK©—÷­˘oJlü¦çÂd…ŰřßňĄ/›^Kݢ+ś‘Jç $J†óYĺRË1GŔ:č^hcč^@AŠ9ĹĄ© żPĚwF:ęăc&ȲŇdĺNTĆŢ=ęO-ŰóęÂ7^Úyüß$1¦vëÚ릎ěP5đňg›†‹@ÔVݦWŐ䇑Ľ}qbŰŃí&ơ3'˛xň/–7¶fpNĘn]PŢűçO6'·ÄŠ×-ůĺňé_ś>şK]ÁźGLŢ7˝–şEW8•NČ/´ Ű!˛ĘĄŠc6źxĐ˝H(ě?ÓŹ(@; ˛Ŕ=H1EŞ;ď,ŇŞťLYVěÇQ{$J. ub˙ŠÍ«Ş_ZsâÂ9?EâÍŘWćŻyěĆc2j‡ô4‘ŮĎ}–÷îýÜü0’íů™Ô]ďý÷ÇęĂ6č\38…·n|źź?Ůţ]’˛‘/,Ďj,îP50üç_śűVD€WNŻĄ€nŃŽFĄ3R ťĂs,€r)ᝇŠÓ˝Hzl;Ůč@< ¬   ËĐń°ÝA¤[/˛¬ľuk( &ĺe5Ź}qĺ +ü‰=áAŹßô\xâṇ§o(5š«cő  ˘ď/—O?pęýöÔcŰŃ·/NúĄ¨ą“‡uŞÎĆ÷ůٲiűNObĐĘ6=›Q;$«ˇ8÷Ż˙iŐŕ­Ók) [t…sQé Cíâ  \ôłíĐrşÚşPDĐR@Si'3ÔŐŤRúd˛¬XN¤^]_LĘűâôŃýW/|hă3~{Ä›Ó-ç^^Wąĺů`b˙đÜ{$Jr!’+{réU5ů}ž›ĎĘąíůĺâŢŮ“xeýĎźl*úöj‘Š[—óáPę}Ďλë™9GĎžNbÜ&n^¦,;Qú·˙Ŕz đâéµĐ-şÂˇ¨tn@–ˇqP.ĘŽŮp(:Ý‹ÁžS𼀄ě: |DCiÄŔsGžŤdJȲbµ>śHíX5č«sËďXŇTýŇż:bĎŃł§‡˙ţÉ`ěÝAĺ㨑ýĐgŹDIFmAĎ_=5Łť Ůtx˙·çO Ęîͨ’˘C©Ů‰ŇĚúÂź-›–ܬť˝Ř–j0ľĎÇů3«&Ŕ»§×R@·č űŻŇ‰‰†â6ÄA@ąČ:f·ˇët/´1Ô/ zP€vRJkč †;]ô)1.dY±YY ŵ_¤â«sËľń’ß±çŕé/ĽłgÔž ĘîďŮ4\";”šŐXüą)ühQm;OVn}÷ŔĆCűľ6w|‡Ş©hHî˙;‘Ú=QrÇ’¦$fíŘą3aÖ&o[f횏·“ đęµĐ-.ˇŇYˇ†."6ÄA@ą:fźˇît/"[ ő Ď@ę@/fnhʏmçÓĽ…L YV VŹDIVcńWć”}nĘ/ĽłÇ/ŤŘsřĚÉ='ŽŢ÷켠ěŢ.u†RŁüˇĎ¬†ân(«ť%Ů{ňXÎäaA倰RôCşÝKÂN»eö¸ź,žśÄ¸?öň'‰ÇÝ“Q;äăgMM^B˝–şĹe#T: ÚĐK”†8Č(5Çl2”žîEŇĺ·ĂĐ˝đ€4ˇ*”:$6bŰvdhȲRwĺ|¸Âů|óá?ž>á7Fě9ÝrţÄ…s·=ŃTčŢX’+ŃJýÜ”˛Šű®ZĐž’\úŕ§ŢďÖPţR¸ßĄ]ę îY97ą‰;w±ĄxÝ’`b˙4kĘ đęµĐ-.‘ć•îdżŮ´™!˛ĘEÍ1; ˝§{‘tóm/t/<e¨u-1‡‰ŤŇö\ů|`.Ő˛Ryh«{cÉŐő…źo~°Ąµ5\—üÂHľ2§,gň0ă¨)±‚‰ýÇľ¸2ĚćĹK­í)Éţ“Ç»5ĄüîUč»jA;oÝź“żć±NŐůźŕĎŻ¬Ż˘^KÝâ˛i^éNđłM;1â  \tł·P}şÚ$„' ˇE¤‚I×$|v šçŠcnȲRl5 ďÖPTô˝sé”ĂgN†ëČ™S~Z¤ _™S–ť(MéŹ`¦IH»Ôe÷Wl^u¦ĺB{ňÂ;{rĄ7Í|¨G˘$uw/ł~hPŢ{ŕó‹N\8—ÜÄő_˝0łľđ“m¦ľĽŤz-t‹ËF¤yĄ;YŔ/7íDc,€rqĚĆBűé^$Ýy» Ý Ź@*@ Qv¨”8Él·ŐÎ1@dY©˛z6 ď\38{÷Ŕçm;zđŔ©÷ý˘HŢ9}âËłÇ}wAeVcqŽ,D{ĺN”÷žżsËÖw´óXĺĘ}Ż˙Ď)#2뇆ž¤nËe÷Oز*Ü˝ŁgO'7w÷=;/;Qú‰7Sq^H˝–şĹe#ŇĽŇť,ŕ÷›v"0ÄA@ą¤;fKˇu/´1¨@+BEĘGíRŻU8l˙µMŰa†Č˛RcŇ­r@0öî±/®\±wÇÁÓ'ü–H6ÚűýU?ZTŰąfpf}ˇ,D9¤Ů‰Ň`R^PŃwĆkĎ·^lOOf˝¶ńű «ż9oBFíÜTţÎlPv٦gŹź?›ÜÜýçS3î\:ĺÚ)#˛Š?ń~Ş/Ŕ;©×R@·¸lDšWş“ü„ÓNě…8Č(—\Çě't x«ŤÁFx ZZĐ<:|ĹB`›ŻjÚĂD–•“n /Ż›ńÚĆvţü"’Čâ]Żübyóż-Ş čRWpMÓp‰rTŻ®/̬/\řĆKŹĽľąťU™úę ˙ÚüŰ rŔĺÉĺÔô俊n|ź±/®ÔKśěµÉzćĎ1OdY\=›†wk( &ĺeÖÖn][ąĺy?ŇŠEonýŇ̇ ýşÔô4‘í¨^]_žTřďÍŰ7´ł'a3Ż[rÓ̇®ŞÉOQOr'Ëj(ΨÝÄÍ«“›»ÖK—î{v^P9 çJüŐôŕÍÔk) [\6BĄ;\Ŕ9ŐÄ[,€ríďm„&„BçvşĘPŚęP8ŞĐĐ0qňÖkż©"ËŠÚ[f}a0±˙ ÓG[ż,éZhgćěŘú-łÇu¨h"5âQíZ74Đď+sĘŠ×-IĽ˛ľťUiÚöűn(»˘[CQŞŞňaÝe5Ź}qeŇŁwâÂąţ«†š{…ţvÚ đręµĐ-.ˇŇ.ŕ·śj"-ÄA@ąöwĚ6BB!hcĐšPŚĐ€¶Ń3€P2¤µçęĄ}0[dYQšHLĘűú#ż~zVĂËëü`H+ćďÜ®śÉĂ‚ ý®®/4”ń´v¬ôÝ•żzjĆÜ×7µż-á˙hçÚÁY Ĺą)ş‡~şCŐŔđĎ?zĂÓIOßá3'>ż((ď}s§Óď§^KÝâ˛*Ýá~Ω&ĆBd”kgÇě!ô!t‚63ˇóÝ˝č%č=ĂX®[Ú ăE–•ô•Y_Y?ôŞšü˙˝`ŇŐ,|ă%?҇s[Věݱx×+ÁÄţÁ¤ĽîŤ%ąBážÎŐő…aZż8}ôsűßHŠ-Źďz9´%;Qšş{ŘĄ®ŕK3ľí‰ĆQx*ąÜ{ňX¸Ą…ż[”Ýß«iÄük*7Ŕ+Ş×R@·¸l„Jw¸€_tމ®YĺÚÓ1•µt˝ít/> U dŔ訚řkouËßŔ‘e%kĺL–ŐXÜ­ˇč» *đhő—f>üÂ;{üHH+N·śoÚöű`Ü=ŞJDJ¬«ë ż5oBÖ ‡ö¶ż-‰WÖ§ş- öf'JŁđIč§Ţ˙ĺňéá–fÔąâ_(Öo€WTŻĄ€n‰qWŘX•N@¨&®Bd”‹šcvZš!énŰ:č^h{@=j@˝č@@áÄĎU«Uţ6†Ś,+)©=—?‹ůĺŮăľ4óáó­ý6H7N·ś?pęýËC©ĺ˝ŻąŇqV[¬ěDi¸®ťň@xpI±ĺňPjyďž©lK¸YŤĹ]ë†6oßô ;wć§Ë¦“ňÚhKµŕ-Ők) [âÚvUĄłPމ¨Yĺ˘ć­b„rHşŘö şzPŹ:Đ-ŠPĐ9ńŐ®Ş”ż‹Q#Ëj˙ˇÔžMĂsĄß™?ÉO‚4¤Ąµő|ëĹ^x2Ř˙ŁńdˇH‰Ż|~nĘá?Źž=ÝÎÂ\ĽÔ:lý˛ŘVßµSF|¦jĐ#ŻoNz Ă Ţľ8ŃąfpŰý}uŕEŐk) [bٶTĄĐމĄYĺ"ĺMb„ŠĐĆ`)”<ő¨FŢUť vřÓ'I´‘eµçh[÷Ć’`RŢO—M=ÝrţLË? Ň»ž™“ŐP|픲ĄB‘+łľđ¦™…™ ץvfČÚ'>[38¶„Ő·öŔ®p[Z[“ìľ[CQN[ţ}uŕ]Ők) [\6BĄ;\@¨&ŠBd”kSÇět#´„6QˇáhHM¨•¨ͶPÔ~*“ʉ#Ëj‡Őłix—ş‚ ěŢü5Źí9ń^űrQŕöʼn›gŤýÜ”˛‹s Ą¦Bl»5úÝ:§üŕéí/ĚŻžšqăŚ1˙2mT÷Ć’ Ą®;°; ©!?ZTŰ#QŇÖŁľđşęµĐ-.ˇŇ.  T?!˛Ęµťc¶ ęŠB¨P2ô‰>4ňA[ři35ÉÇÇä‘eµíjޱjP0öîŠÍ«6Ú{äĚ)?Ň“ź,žÜ=Qru}ˇĎ¤¦ĘPj0ˇßKš6Ú·óř‘öćWOÍUÉüPÜ˙BtÇęAkŢŢ•ô ¶^şôÝ•?~¬.ÜŇvˇŇĽ±z-t‹ËF¨t‡ (ŐDN,€rm佂†„®ĐĆ€–S씤J”‰2”ţA[Či'ŐČ?„á#Ëj»i¬Ëk|źćíďzĺřůł~¤!§[Îßľ8ń‹ĺÍ™&RSdőjqUM~0öî;—NŮqěpR´ůÍŠŮYŤĹaŤä¦ň`ďgk_7u䊽;Vî{=éIWŐä‡nHJ¬UĂ#ű͊هΜlmŽž=ýë§gúu¬”“úMřĄ™/ŢőJň¸ëýŁw,i 7¶ť“¨ ď­^KÝâ˛*ÝášA5qâ  Ü•uĚAOB÷FÄd»ő }čIÝ(@(˘ř9iµÇ'Ŕ ’e}ú9¬ŚÚ‚`Bż.Şé»jÁÂ7^ň O[VěÝQ»uíż-Ş Ęîͨb"5UVv˘´SuţŔç…>Ýrľťµyăř‘Ę-χ˙ëÁř>)íĚĺŻÍNĘűńcuá6Fd(uű{‡î\:%)«Ż®^KÝ›®°Ť*ť<€fPM`Ž8@(ÇlT%tŻ6tŻ2 *Ő  = (Ŕ˝6ŇŞŽO€q$Ëú4ëň—+ÜöDă˙]Ň´ćí7=âÓ™ŐűßřâôŃAyď®uC{5ŤŽčŻÜÉĂz$J>[3řęú»ž™“mv;üÓeS±wwŞÎOmmš†‡…[甯?¸; yÜräí…oĽô‹ĺÍÁř>IŮX•xuőZ č—ŤPéĐ Ş‰“Y宬c¶Şş7éۨ_hr@Uj@uhŠBĹUH{¨:>ć’,묜ÉĂ2ë 3ë‡ţř±şoĎź¸ëýŁîéĚ ďěYp÷uSGfÔąĆ7RSg(µ[CŃç¦F“,ëăŻěDi÷Ć’¬Ćâđßż=â×ćŽoimőXO[ÂÓßqěđ¦Ăű;VęP5°G˘$WLR'ËÝŠÂ8÷]µ )ňě;yüŹT}3ë S}(5ÜĆp3Ż›:ňÍăďF!{O»uNy§ęüän¬†Ľ˝z-t‹ËF¨t‡ čŐÄF,€rWĘ1›… Ý›tí t/8 -U  4ôŤˇ”âęˇÝÓźÓI–ő1?šť(˝vĘ7Îsý´Q˙gaµ§y:sľőâŃł§WěÝLčץ®@@Rn(őş©#ĂćŻy,)ţ?öÍšŹAć°Żi~ŕÔűQČf¸·7Í|(łľ0é{«'/°^KÝâ˛*Ýá*B5Qâ  ÜqĚÎ@gB÷&Ý^ŰÝ í hKmh Ą@i襸JhëÔŧÁ€’e}ĚŐ±jP˙Ő =Ä2őŐ‚IyB‘˘+<»ŠÍ«’čĎM3účłË©ľz$J>ßü`t>}ńRëšěŢX…ÍŃ“€wXŻĄ€nqŮ•îpˇš¨qPîÓ;f[ 3ˇ{“nŻ=ú…ę´ĄÂÔ…Ć 7TSŚ ´uşâÓ`@ɲţĆĘť<,łľ0(ď]¶éŮŁgOźnąŕ!ŽÚ­k3j‡ôH”äČHęĹyhçđĎ]lisÂůč›Ë}‚9Ýţ]Žť;‘`†gzĂôŃŃŮXU x‡őZ č—ŤPéĐމ‡Yĺ>Ťc6jş7"ęÚč^čm@aę@W¨ ŞC;ĹU?ű¦(>%&•,믭NŐůAŮ˝łwĽ¸ăŘáÎy|ŁxÝ’›f>ôĹ飻5 HĘÍQăű,zskçÓ-çŰ_ž˝'ŹýkóołŠ#ň5ĎOĽz6 żşľ0Đď–Ůăöśx/ ÁÜőţѦŹţĆ#‘ú ­ÂĽĆz-t‹ËF¨t‡ č ŐÄ@,€rźĆ1Í Ý«ŤÝ«´(Lµ( ]¨(¨¶ÓϦ)ŠOŹa%ËúoĂk=%Á¤Ľp-kűš·ßLĘw5î{vŢż?Vý´Q˙T;¤{cI®°¤N˘łĄ—]ŃwţÎ--­­í/Ďş»ż5oÂ˙YXÝĄ® Ő÷łgÓđ`Bżź,žţĄ¶żw( ŮÜvôŕM3ʨµiqµ x“őZ č–Tě ;¦ŇĄĐ~0€âY \tł!МнI÷Ön@ýBc SóZBQĐ:*®îŮ1-qE0µdYś·ęÖPLč—“(]Ľë•py^#ä7+fßőĚśěDiçšÁ&RSl5 Ϭ/ sĆyŃ›[“âĎĘ}Żßó«Nďł^KÝ’Z]aŻTşTĂpO ”‹cöúşWęWKP›ZĐ úP#PVm§ś˝RWsLVZ­ěDi—ş‚®uCţdómO4;wĆC±ĺČŰËöĽúÓeS±ww®Ü«i„Ľ¤Ö7=3ë ;V şyÖŘuv'ˢ{w„+ě™°d®IńˇÔ?¶ĺí‹ŃÉéš·wĄĘĚŻRĽŇz-t‹ËF¨t‡ ( ŐD<,€r˙¨c6*şWşWEĐśŠP ĘP#ĐWm§śŤRWÓLVšĚ¬e'J3ë {6 ˙ѢÚ˙xĽŢłdŰŃ›ď˙ćĽ Ń˙Łő×Vîď.¨ĽuNů–#o'ŢÖK—VěÝLěTč‘(ÉMńýěŢXr͇můďŹE¨-·ľ{ŕŁ&O‰™_Ő x«őZ č—ŤPéPމxYĺ¨PÝ @÷B?ĘS:A3š*+:ľŮ(Ípe1ÍdĹţ©=%YŤĹ×MůĄ™˙üÉfOa|ÄĄ>Ř{ňŘľ“ÇŻť2"¨JrŤ‰Ô\aŔĂőů揞=ť‘Î^lŮs⽕ű^&ô‹Í–vo,ůٲi‘ ěŽc‡»Ö ˝<0›"ۨcoµ^KÝâ˛*ÝázC5±â  -Ş{č^(g@yŞ#@!¨@™@kED6»¤®8fš¬xĄ~nĘ×O•Y_8đůEžżř#­—.mďPçšÁW×ćK* 9 řuSGžn9ź‘ZZ[›·oĆ÷éÖP”‹-ÍI”v­úËĺÓŁŐđpw?ňŮšÁ©µ“jđbëµĐ-.ˇŇ. :Tĺ ˛ĘТş€î…rô§:´Zô ´VDLłK:áŠc¬ÉŠëęŢXLč7㵍ç[/†«ĄµŐódŰѵb’Ň+łľđÖ9ĺÔ˝±D^RqőlŢ­ˇ(Ř˙[ó&9s*Y"=𓽚F|ľůÁxîj0ľĎđß?Öćńóg#’Ö{w\]_ŐXśť(5— ¸€«*@·¸lTé‚ ŔB˝Ä7,P€"…î {Ő2Ş”= •â ź@3[¤Ú#NÖ5qůŇßĺ¤VȨ˛éđţ­ď¸xÉRń˙#ńĘú›gŤýňěq]ë†f5KMŞŽONč÷ó'›ĂŚď9ń^˛\*^·$§±$łľ°G˘$7»Zv˙/óµ Ł7<”ÝTť”ţšçU5ůW×ö]µ ‰F:srŕó‹‚ňŢ=ăń˝Ý¦á]ę >ßüŕ=+çŻ[©đ.zskřgëÖP”Ť2ŕNŔk) [\6BĄ“ P#z‰fYĺhTÝ @ýęaZTG‚Żx;SbITËÎ(6Ĺ”ýń´ŚÚ!ź›ňŔKš~łb¶g(ţ"»Ţ?şrßë—Gľ«Su~L¦Ó8ň×MFţ®gć$˨='Ţ[±wǵOe÷÷jŹ˝íZ74ŚĆŘWF-ż‹w˝TŹ>7F2«eŔť€×R@·¸l„J' IôÇ ˛ĘPŞş€îU©š¤^ đ‚¦Ç’蕝ŃmŠ1(+˛łiYŤĹ™ő…_h~đksÇç­~ÔÓ‘='ŢŰvôŕO—M ĘîíRW`"5Ąß­ˇč†éŁoťS>díI”ęŔ©÷±Ľ9wĎ?Ő‰Q5jfýĐ🶬ŠNxĎ´\Řúîĺom&ô‹źĎĘp'ŕµĐ-‘í ۢŇĐ$~0€cY ĄŞ{¨_h`éܢNHçßNNĐ0Ş,­Ľ˛- ­1 eEme'J»7–Ü0}ôͳƆ˙g?í‡čpôěéŻ?RLĘËj,ľĆDj*Żśߥ® bóŞäučĚÉ;—N & ŤQáĆ~ˇůÁp‡k·®ŤNxĎ]liŢľ!(ż/ٶ 7ŽJëgŔť€×R@·Dł+ě‰JL@™řÁ‚AdrôŞî {ˇ~¤y‘:J ť;9Y@ɨ˛´’ʶ[cĘŠÚşvĘNŐů+÷˝îq‰żAKkk¸n™=®[C‘ÔÄ`őjѱjPr'CŁľţHEFmAN˘4N{něâ]ŻD*ż­—.%^YLěcĄµ4ŕNŔk) [˘ŮöDĄ &IśOü`Á ˛@9zU÷ннҼKť#¶żťkh'őŚ6KsŁl‹ě·5†ˇ¬¨|-qň°ĚúÂNŐůŰß;tâÂą‹—Z=.ń× ąnęČĎ7?+;©żÂC &ô[ş{[x¬ç[/&Ń«ŻÎ-ĎN”ćÄlo'ö_ţÖö–Öh5jőKk:× ÎŽ×üŻąTŔť€×R@·¸l„Jç[,5p:,ŇK 8@(@µę^şş@ĚşÔ!éůĂÉ™2Ť N_ˇĄ›QöDöŰ#QVŇǦ˛‹Ę×4 ß{ňŘžď]ňÄ_gű{‡®›:ňÖ9ĺÝKz$J$(Ő§Ń;Uçăű,Ý˝-‰©'.ś»ićC_›;>çĂ?R¬ö¶˘ďŠ˝;’;íűç”mz¶[CQŘüńÖ[]ş%‚]aCTş`:qÇĘ.đ„]Y ŐŞ{č^(^şÔ!éůĂÉ™R‹|Ph馓=üvŔ`”•”ŐłixFmAP9 (ďýőG*6Ú·őÝžŹř,kűWç–{ţÄĐśn EB”ęéÝK:× ^p÷ ďěi˝”´yô§O|yÖ¸ĚúˇˇT9qŮŰđďŇĄ®`á˝áŠÔ¤˙൏wA姏ά/ŚýÇŽ•6ŕNŔk) ["Ř6DĄ ¦#vĘdOŘqĘP­ş4¤Ö Kť †żš(ŁxB ť–n:ŮÁoŚGYí?‘zů+~ßuĎĘąËßÚľt÷¶M‡÷{2âoĐĽ}Ăí‹ßś7ˇcŐ ĚúÂkš†ËQJ7@·†˘`Bż¬Ćâ•ű^O˘Wí»í‰Ćp…Ťźɦá]ë†f'J“»·‘!kź˙„ťk‡Gź›Ş«nŔť€×R@·¸l„JOgëô0¸GTjAd”C»ĄĚľiWH’’A[§{!"C h-@ĚńÉŮ‘„ź)í’ÝúvÔ՞ëňRËî-üÝ↗×í>qÔ—¦mż˙×ćß“ň2ë {šHMýˇÔUož5¶yű†EonM˘WkŢ~óksÇűgÔÄĂ«đo‘Y?4¨čű/ÓF-ŢőJÔ‚\ĽnIVcq·†˘Ü´±]{şĹe#Tzş‰§‡uÉI-,€rNšl2 h˙¸Ůa2¨\g8ُ1—zÄň'·% -SŃ%»!őí†9)«­Wîäa=%—'R'ĺ=đ“á:~ţ¬G!ţ.µ[׎ٰâ†éŁ;× 6‘©É.uÁř>7Ď»t÷¶$zµx×+Ă˙äż-Ş )6^…‘°cż3R™ů;·D-ËŁ7<ťQ;¤{cIn:9ŻĂw^KÝâ˛*=öâ)^Đ’“Ô‚8Č(‡”HÍç†î…|1ę—íxś‹XȸČs†Hä!ݬHvCäŰ ÓRV®¦áYŤĹŞvo,˛ö‰Ák÷ÄÇ!ńĘú©ŻľY_Lěß­ˇČPj<¦&üXÝ}ĎÎKîPę˛=ŻŢ8cL0ľO—ş‚ ĄŢ2{Üň·¶G-Ë­—.Ť}qeäěDişiŻÉw^KÝâ˛*=Ţâi]0“Ô‚8Č(‡ŠŹ# ‡î…p‘ę—çx ś—(¸Ľ†NüŻ”H¶BäŰSV[ŚŁvk(ʨ-čTť˙…ć˙ó©…ż[ěهżË‰ çľńŇÔW_*ú“ň˛ĄąŇ”úźKîZ74¨pëśňŢŮ“\ÁVíßyý´QWŐäÇf"5ÜŢĚúËŰűĄ™?·g¤â|ěÜ™0ε[×ăű¤§ü*p'ŕÍĐ-.ˇĎc鞲%K©Č+,€rHőČ8¶č^ˇ{éÍ|^AŁ2 HźßKŽ’-¤"ÓĐ"[!ď퉱)ëĘI}8‘:ä«sËo_śřî‚ʱ/®ôÔĂßĺĐ™“kěżéą`ěÝŞGŤÁĘ™<ěęúÂ.u?\TóŤG*¶=DÁ^xgφC{ŻůpHöš}~7ÜŢď-¬ ·wýÁÝ‘JôŃł§‡­_<|WÇŞAiű˝cŸ\\č—ŤŘ8ąç÷+čĘ@^A ”CĚbâ°Ł{!G´ä (MxŽcZ| »čÄŔXZd+ä˝=1ääĚpľoŠ| ÇHĹ˝ŘXd佝1?e]‘#†ë†éŁł‹·żwČc“Ó-çşlj0±hÎ5&R㲲?JýÚÜńɵë|ëĹcçά?¸;”ËĘíŐ4âčŮÓQ ő™– ź_†Z˘5<ŕNpqˇ["e‚­XÁt(ôP, © ˛@9E‰¤{!2…îĺ0·ąâ)jY )LcńâíŹ}ôvĆ•u†¤KÂ;w¦őŇ%Ď8||n_śČ¨- ­˙Q?ôŹT$˝ ćďÜTČŤăwo,éŮ4<ą˘ýkô]µ SuľKÜ ..t‹ËFlĘéçI ĺ@*q€,Pi J'Ý a!*ť@]J“ 0G #|#ĺR]!ű ěíŚÉ듬¦áYŤĹ˙T;$¨pó¬±GĎžŽŕgűeľ9o ÓG÷j‘ť(¨ŘÔBXw.ť¶AŇG&gĽ¶1,¨‰’śípîäa]ę n™=.š•{Ç’¦™6ęÚ)µąTŔťŕâB·¸l„Ŕ¦P0ý0ă‰báH%ĘA¸J*>CL¸Ę+–ÉlLHëČĆ·xČcÄĽť19býC«gÓđŚÚ‚`Ü=ż~zÖÎăGv;ĽçÄ{žkřś¸pî–Ůăľ3Rv˘4«±8G¦âR ]ę ‚˛{ą|ú;§O$×±‡6>sÓ̇nś1¦[CQśv8łľ0ßç›ó&DłrďX҆:ÜsC©ćRw€‹ Ýⲛ*Áô“Ś-ş…i`”8@(A +»Č é -»ŔUs´ p˙ úńŤi±‘Ç&yűcrÄúřQ«ßUĽnÉsűßŘwň¸Ç>>ŰŽüÎüI?~¬.ٶ łľĐDjśš!(»żđw‹ĂZŘ{ňXr5ő‡§®ą<;?$«±87.;Ü«iDPŃ÷g˦­yűÍíďŠ`şď\:%Üđ‰q0— ¸\\č–hš`V0•$at hĆ(,P"@ZŽé^oA0–˛—ś §P€Ăü‡P0x4‹·96AĆŰ“#Öß]9“‡“ň‚ňű*6Żšűú¦ĂgNzáăłrßëw.ťňăÇę‚Ę]ę re*.+<ĘđLq÷ |~ѡd×Â൏˙fĹě맍ʬ'Ç.ĄŽďółeÓv;Í€˙byskźI5— ¸\\č—ŤŘčÓo0ÎčpŚQY řĎ[šqBÁ^ĐŚśÔe)ř)ŕ0ů!<äÇâjŽMńöÇäő׾حˇčňĐ٤ĽNŐůµ[×VnyľĄµŐ# ˙ËöĽúĺŮă‚ ýşÔ„RIVśV0±˙Ăꙏyőńóg“«Ů°őËşÖ íP50NźI˝ü‰ęęAAŮ˝?[6mçńwŁí#gNő]µ \ácBĚĄîşĹe#6âÁôë‹9ęě˘ÄA(ćS—l†Ddc&c‰ ˘ĘL~éG°x›cdĽý19býů0Tf}a0ˇß§ŹłaĹč OŹ}qĄ'ţQy}s٦gż9oBP™g"5NßHíŢXҡj`§ęüÂß-N®cç[/†TÇŞA=%qűíÄţýW/ 7yďÉcQKwřGúů“ÍAyďpç}Ů\*ŕNpqˇ[\6B`#L?˝ČŁ^@-:Adr ={)Ç^ȇÁ7ZŇ•« « €˝Ě‡,’„슽66AŔŰ“#ÖźN¤v­LĘűćĽ w=3§iŰď=°đ żsËě/^7udPŃ7łľĐPjLVÓđ¬ĆâUĂíżzaţšÇ’«Ů±sg ·8(»?~ßëĚ™<ě3U~ţdóůÖ‹ ř®÷Źţrůô Ľwݦra.p'¸¸Đ-.!°Q¦]üQ/ŕť ˛@9pžŔ¬Ł.¤€Ă`'ąJZ0VŔ^ćChÉC^ŢF±Â•Y?´kÝĐNŐůß[XőăÇęďzĹŁ ˙([[—żµ}ŮžWC‘‚‰ýł‹Ż1‘ŁĎw†qăŚ1˙wISńş%É5ííSÇ—îŢ6ęOe÷Ćię9ÜäěDi—ş‚«ë ď\:%š1ßőţŃŹľ”j(Ő\*ŕNpqˇ[RĹ› °é™M?·řA ť ˛@9žĂÄŁD€Ćŕ!) ęR—ü .ó!Ě$$©énSLޤóĘ™<¬[CQ¸ľż°úG‹jo™5nÓáýRřG9qáÜĆCűćďÜ”÷*äWĽ&R»7–t©+ʵbóޤËvđô‰{VÎ ľ«sÍŕ}Š7Üç^M#~đhőí‹ŃLúŢ“Çî\:%ĐĎGÍĄîş%…L° ›nńôC‹?FŃ â ”ŐiL?–˙L©HN˝ !uiţó““Ś¤»09’¶©Ý%ą“‡Ý:§üËłÇ]ňdÂ'âÄ…s{O«Üň|PvoFíHŤßĘj,ľqĆ^M#j·®M®lGÎśÚwňřoVĚ&öŹß\dŹDI¸ŐżzjF4“~čĚÉý'Źßľ8LĘ3”j.p'¸¸Đ-€ŔF0ž~_Q˘A'.Adrŕ9“Ć’źĚ !9 3´ç-íA~ŠŇ’N€t·'&GŇs(őň`QÓđď-¬ňHÂ'ć|ëĹÁk&ôËj,Ε¬XvE˘ôŞšüĹ»^Işlç.¶üpQMÇęA=>¨Ź_'gÔÜőĚśh&ýěĹ–ŻĚ)űlÍŕěD©¤›KÜ ..t Ň0ń=ôËJÉC@¸Ä%,P$'3AWÎóTd !Af2đĽ™ĎRrr ’’vĹ,Ź&GŇjĺ~řUľ rŔ/–7ź»Řrľő˘G>1y«í\38G˛âűĄÔ`b˙ĺomo˝”ü/*wAeřçɉc'wo, ÷ůľgçE¶ož56üCJşąTŔťŕNR·€ómdťxÚ:(y? ¸Ä%,P ç3¨ČUÂĎl¤ŘČjJę¤çiOTđ“Kr.Dű/br$-VÓđŚÚ‚Î5˛{ ·říSÇŹť;ăa„OĚO—M˝qĆ릎ě‘(‘ŻX~RąCŐŔ-GŢŢňxKkkM»ôáPä—gŹËýđă­1ŰçžMĂń}ĆlXîóńógŁö/Ď—=ąÔPŞąTŔťŕîE·€äm§˘xj9čy? Ä%,Pô¦4ŘHT¶ŇśäxHlVç¤ç9ĎU°”HH­ČőćRÓ`u¨”Ý;뵍ێÜtx˙Ńł§=†đ‰ůѢÚ1ÇÎťů÷Çęď\:%łľ°kÝP©ń›‘̬ŚďsĂôŃ+÷˝ľćí7“®Ü;§O|{ţÄŚÚ!±Üđ°™q÷<Ľń™ÎE0ď;ŽţѢÚŰžhŚëţ›KÜ îdt ()?ĹSąAŰ«P  â ”±Y Z˛”äŕ63ůF?0śá`8cAx“DĄŇAŃĺŃäHśVݦ]놓ň‚Šľáż?ňúćů;·xčŕÓ°őÝżzjĆĎźl*ó ©Ĺµ7‚‰ýżż°zĆkWî{=éĘm:Ľ?Tî§Ë¦•rc·ŰىҰ˘›¶ýľyű†s["ů-GŢţöü‰ˇµąb.p'¸śŃ-`rŰ‹*žj _—ň‡HY XMl0“˘ ·ÉI6îç<˝é ¶łťş +¨ž˘ĆěŻir$6ź;̨”÷ţţÂęę—ÖTl^5÷őM7ř4¬Ü÷úµOܱ¤)ß§sÍŕĐ1A‹_o|¶fpP~ß˙^0ií]Q°nýÁÝß]P*Z¬”kžŐXLş<Ü]ąĺůȦ~á˝—÷by7— ¸\Ńčp¸ÝtO……ŻQůC$,P”ć6ČÉOzŰü$ń@u¶Ű\Ő©N`0–<$Occö·39q§Î5Šľw,iężzásűßđ”Á§déîm•[žż<žVŢ;năÖź Ąű˙lŮ´°7^xgOŇ­[±wÇÄÍ«˙ý±úE^ţď\7udńş%c6¬lđ˙k(ŘPŞąTŔťŕ˘F·€Ŕík¬x’:_Ż’‡EY řLođ“śô˝ůI3Öí„·ą ŞóśŔŕ-yčťŇĆěŻfr$uWÎäaµC:T üٲiáÚţŢ!Ď|zVěÝqý´QÁř>™őCŤ§ĹuýSí rŔ÷Tíz˙h¬[˝˙Ť/Í|8(ďÝĄ® WÓř Ą~nĘ›WE6őkŢ~sţÎ-ß_XLě·ý7— ¸ÜŐčP7ňŢŠ' öµ+sXqĘĚôEÉÉm0śĄă8Ďy›«ŕ9Éi ę2‡Řé nĚţR&GRkĺNÖ#Q’Y_Y?´[CŃKšţmQí‰ çrćTŇ­[pwhÝç›ě\38fsĐa”˛‹ĂżWݦ•[žŹlđ7Úî˙‡Łč…FŃÍĄî76ş¤EâiÇ öu,sXqĘÉ '*Éj0ś¨#hĎ|°š¨ŕ9Ă™ ö҆Ň8&GRhe'J»5]7uäwT~gţ¤?VG`|zη^Üvôŕú»ĘŞöH”äŠ[L'Rł‹Ăó $"îm:Ľ?ăĂ/·voڎuW×Ţ$§7źÁaÎĐ©‚É‘”X=›†w¬ôđĆg‹+BëĄK/µÖn]Lěźť(±xŻÜÉĂşÖ ˝cISÜ»ôÁ+öî&ĺĹ[ĽUĂżf4ăA˙ý§ŽeÖJ‡ąTŔťŕG·€ĄHz<픿Ęĺ ‹ ˛@9pä +-É ž3–T4HČLQśŰ”Ť Ă^¤&G˘Ľ2ë »Ö Ć÷™őÚĆăçĎž»ŘÂX\Š×-éÖPtÝԑىŇY‹ńjLěßő°@N·śŹ‚{‹w˝ňŮšÁ1/ł~h¸çĎíăâĄÖhĆá˝áňóÍćI7— ¸ÜäčđÉŽ§Íň×˝śˇÄA(óŚĺ$™ÁsŇ’Š`AŤ) ’s›Ň 1a¨‹TÄäHżlŘ#QұzPÇŞA›ďßsâ˝7Źż{ÖD*®ż~zÖÍłĆ^?mT·†"_JŤ÷G–3j‡ăîÉ_óرsg˘ŕ^íÖµˇx7Í|(t/–{Ţ˝±¤síŕmG†Ą١Ô5oż™“( Ź |ЉąTŔťŕ2G·€śHn<í ôż&  ˛@9ç`,'™ Şó–Qě‚88ĚO0śŘ 6™ŮBZ¤(&G"5GÖ­ˇ(ĐďN±ńĐľpńWź,žüŹ×÷jѵnhŹDI®ĐĹşL‚˛ű'n^˝îŔî#gNEAżŠÍ«Bĺ2j‡d5çĆńż'Y_ŐPńŢ^±wÇőSG… ţćRw€űÝf"ąń´'Đ˙J0ü8ČĺŔ^Ş·„ä0¨N]:Q B! 0?ÁpVŘ|f c‘ŇIúęŐ4˘sÍŕ`R^Pv˙·ćMXş{Űš·ßd&®,?[6­kÝĐŚÚ‚ěD©‘´ŻśÉĂ>*“±/®:|ÜÄďĚĄî¸ŇŃ-´DjĹÓ†@˙ëaÂđâ ”u©ö’Ŕ`;uąÄ+…\€Ŕä˝Y zó™*\EŞcr$ąM«ăîůÍŠŮÍŰ74ĽĽní]śÄäťÓ'îY9÷ľgçu¨(qń^ą“‡uo, :l’p]ĽÔGýᩏţTYŤĹ±J *óľ5oBÓ¶ß/Ý˝-˛=0őŐú®ZđŤG*:V ęi(Ő\*ŕNp±Ł[ŔI$/ž¶Ş-ü8ČĺŔ[¶Ŕld/ŘÎ^"ń rvś 7ĄAoVS…Ą&G’µ:T *úć­~tŘúe»Ţ?JE\Y¶ľ{ Të®gćăűtŞÎ÷ŤÔ8ݦáYŤĹAe^f}aĹćU1pô†§Ë6=۵nh·†˘Ü8ţW2j‡„áúÚÜń+öîr4oßpÝÔ‘Á„~ˇ†RÍĄîw;ş„Dăiŕ ŠŮB!,PĽe;ĚFę‚í&Ż  ö’ôć3Îmžđ±ÁäH;аG˘¤Su~çÚÁy«˝ďŮy§[.W–uv7ĽĽîÎĄS‚q÷\U“o-Ţß\îÖPLĘű|óź_4fĂŠ(xöbËČ–}Ă?Xv˘4–C©á_íöʼn{VÎ]µg”Ű`ţÎ-á¸K]Á5zŔ\*ŕNp˝Ł[ŔF$5ž6 ™-ü8Čĺ@Z¶Ăl¤.O`‘ Ňé .3Ao>áÄć ?'LŽ´Ű× »Ôt®ÜłiřŻźžu×3s¸‡+ÎÚ»–îŢöťů“‚˛ű3j z5ŤľxËgkß:§üÎĄS&n^ź9ąčÍ­›Wĺ˝ă:™;yŘgŞ}cnŶŁ#^ËßÚ޵nčŐő…>—l.p'¸áŃ- "O¨eŞâ ”c,ŘNc6‚·„‡)Ä(Č€đĚä6™ArzóĚÄÄäH[O0e5gÔąićC·=ŃřG«űŻ^Č:\q6Ú®ĎMy ¨čŰ­ˇČ7RÓ¤X®ť2bÎŽM‘đĐ™“ź_<|W§ęŘ~Ą7 W—ş‚/Í|xßÉă‘m–ÖÖőwŻŢ˙F‡ŞÝK ĄšKÜ .yt xŔSš™*ä8Čĺ ÂÓŠ -çÁdţĐ 2" Ľ3ąÍdđśä$'qe19Ňv«G˘¤[CŃM3ş~Ú¨†—ב Wś–ÖÖ7Źż»ĺČŰťŞó;V •3–+«ˇřćYcŻź:ęń]/GÁĂ#gN…^J­č׉ԜÉòĄ_¤âĆcŽž=ŮN8w±eţÎ-Ayď°$Ĺ\*ŕNpĎŁ[@BžPÎT!ÄA(GWžÉTii&“‡K1!-hÉm&ç$' ‰¶ŔäH[Ś/}4ÁôŻÍżíZ7tŮžWi†¶ ĄµuĹŢÁ„~™őCĺ.}ę%ě–°X6ŢO·ś˙żKš‚‰ýł‹ă:ť“( ·ýËłÇEĽη^|äőÍa'O7— ¸ [Ŕ@ĐĎş…uŕY ®IÂ,P4Ł=±AB–‚ů¬& y >˛–’Ňů9O pí‰É‘ż;#–Y_رjP0)/{ré¨?<.Ú MŮqěđ +ú®Z”÷îP5P Ójţ=Ř˙ľgç ^űřÎăG""äš·ßüÖĽ ˇŤµCâ:”š“(ý¨çďzfNô˙›e›žť¸yuxY ņRÍĄî¸ůŃ-¬ĎuMć@dr (í‰ ˛äg5[Čń°”Ť”&0ČĎyb€{hgLŽüí‰Ô`RŢWç–÷_˝đľgçŤŮ°‚0hS6Ţ߼}Ă>5#{w§ęü8ŇúłąČÎ5;V şcIÓ‰ ç""䊽;f˝¶ń» *‰ý{5Ťń·°Ă¶{ţž•s#^g/¶ŚŢđt0ľOřl ťs©€;n~t ĺŔă@c3„9Y (Ę|bůąMÚ@$e#ĄŮ ţÓž Ú“#ľ2ë »Ö ýLŐ ďĚźôŁEµŹĽľ™'h¶ľ{ŕň`Ů˝µCâ:hýůPdv˘´K]AVcńĎźlţÉâÉŃrÝÝ×MTô +1–#Ň—'R%aÜz$J˘?‘rüüŮ1Ve÷›X7— ¸ŕňG·đ <”6=qʢĚ'6HQźŰTˇ „H‚@Q6Rěĺ?íYâ!‰ů˙ľW8yXVCq·†˘ď.¨üᢚ›gŤ]{`CĐlďĐÖw|sŢ„UMśĄŐĘj,ţÜ”ľ·°ęÎĄS˘#dhă¶ŁłĄ™ő…ąńťŰţúiŁľ3Ň]Ď̉xE9sjÓáýe›ž5”j.p'ŔĺŹnáx"(mz0â ”?™Ďm0ź ?˝©ÂČ‘źl¤4¨Ë°”CŇ19ňŃDjŹDIř/·ĚwăŚ1§[.íŔĄ>8pęý§O\;eD‡ŞÝKrĺ1}j'Qžx·†˘űžť'/^jÝpho0)ŻsÍŕěDiŚ÷?ÜüĚúÂÂß-Ž~Q?¶˙ę…AŮý]ë†J5— ¸ŕţG· <ô6=qʟ̧7HNđźŢ¬Ţ˙FFí릎4‘šžĺLč7öĹ•aíśo˝'˝ąőł5cďd¸ůYŤĹAEß1VDgó˙żY1;ٶ@QKÜ p¤[žŞ›Ě8Čĺ@Nţ3Üc&řĎp’Ň$J 'ů ŢJřďčɆ膣"=›†gÔe÷ŽúĂSoź:ľďäńŁgO3íĂŚ×6\;yřŤ3Ćd5g'JŤnĄ×ş\>CÂň©ŘĽętËů(iąńęúÂř;Ů4<(ďţe÷ž<©ý˙küçS3ţąˇ¸G˘DvĚĄî¸Ň-4ŹíÍć@dr`&˙Iî1üg8IŘ(0“‡do"ŕÜ™†čns"ŞăîiÚöűŤ‡ö;w†h7ĆlXńµąăż4óá.uYŤĹąć¶ŇiĺLTĘď{äőÍaůś¸p."ZŽ}qĺGZfÖćĆ~˙ËîoŢľáLË…č×ĹmO4ţpQMݦÝ ĄšKÜ p ¤[h ś´8Čĺ@KţóÜŁ%řOr†°2%P`&™ ŢŠD€4C´H‡f5“ň.݉ýľńҲ=Żžmiqôh7Ż}üÎĄSľĐüŕU5ůˇŤˇ“&¶ŇgĺNÖ˝±¤Su~Ř<ËßÚŢŇÚ3ÇlXŃ«iDĽµüh˙;T \ş{[x/µFż1îXŇ”Y_ŘĄ® ;Qj€Ý\*ŕN€‹ ÝÂ1đPĐáÜ  ÄA(fňźäŕ-!$çU Y2ZňÉ ­8@ ř@3DŤŹ„ôlžY?4¨čűůćçěŘ®Ů;^tâhOúŻ^®śDiÇęA&RÓm…Ô­ˇ(Đ/üçüť["efńş%}W-¸nęČ®uCă¬ĺĺ§@a¸y}ó˙ĂŢťy]ßůľ˙’}č>Đmc&ŽĄÉXVĚÍXăÄ{ÍÍV“”•ĘÔ±’Ę©d*U)W¶j ŢĹŤĄ÷ő×ýëZVADDDDAQ ([Xeii–n–¦ŰűÎMÍ™3“¨ü-Źg˝‹ňĎîţ<_Ż_ć]őž_\4ĆŮ®óży©ĄgM¶ř¸KěXé‚€5Î Ú@dr %ůÁsúŃ"@rnP’%V % É ŇB¤€CĚ’¨ç`˝ëFĄďś[9áíeó¶żëˇq5iď<›űĆÂüŐ/ô¨΀h/=LÂŁÔž5Ů·L˛tĂň)[ÖĆ”źO¬[Ú§~LP5497hqĘ“"ŞŹ“ž'.É-IHc!|`b›Ä¸ţČh*ę]7şgMö˙\Ür˙˛Ů÷Ľ8yă‘ýW™mGg°aôŞçI9.KĆąt‘Z5ü®gŞ~µhĘÜ7ĆŽśÇÎtżůR0éđÇKě'H‰ä†żă7Z‹©ŁŕżŔ¶c‡ĂϬ`Â}áGŘuÍcĺČ]*`'Ŕ:H·° |(hrnĐâ ”!El''!<'O _’N’Ć -„BČ@-Ä8qýí¨˘)‘Ü”HN˙Ć‚}ˇů_ž«ďęîö¦¸úl;vxĺţżyF0áľ^µŁ—%ád^ĽŽ˙Ἒ;çV®Ř·=vä<Ř~âµ}>±ni0éÄ>—źŕ«uŁż?·"|‚ů;6ĹEuěh;~xeC”†»TŔN€ŤnˇřPPćÜ  ÄA(BŠŘNi=ÝÎM-Ź]S=˛cA¦;¬¤śŚ‹˙Ţ2ýÉż›<öHÇ©ŘQ´íěéđçą÷•YAŰkýě1#Z-LmČŰÜz0. äŘ™Ž°=~ôlMĎšlŐá.° `)¤[x>ô97hqĘŤ"ÂŹŞS‚$2!é3B! dŕ⋸;ôČl* Ş†×Ľ»ŇŰዢ«»űŔ©ăý"ąŃB·WI>ý nžöD *úÓůu_­ť‘$Ń\ܧ~̇mGâĄ@BgRňÄÇ]*`AŔRH·đ |.čsbĐâ ”E„'!!T§C e2BҦ+DC"@*Ä#ńrßŃ·>'ś tđ‚ťď;Óq¶ëĽ·ĂÂşC{úErżŃňXF´0ĂíU˛NćŋԞ5Ů·ÎĐvöt¬YúŁgkŇóÓ“ŕnúż7ä‡oŃzş=ü\čęîŽýąt”zˇ=\µ»Kl‡X é^€Ď}N Ú@dr`Ł€đÄc#¤€đ”  RĆFúĂt…hH…ř$ö/ż‚Şá}ës¶~|hçńÖŰŽ¸HĹĹĽíďŢŘňč·gNLmČë-pu•ś3°ą8%’” úů‚ČŽ¶ŁűN¶ĹŽ˘]ÝÝ·Ď.ýŢśň°<ü(µą8­!?¨ĚşaʸÝ'>Ž—iď<ű­éăĂĎ59r— Ŕ˙ÍŘ éR€Ď•N Ú@dr ˘€ó¬Ł"¤€ó”  ‚ĆFîĂt…hH…ř%6ĎľúÔŹ Ş˛‚ŇÁ˙đÔăk?Ú˝ţĐ^/…/ŞŤŻß9·ň;3'ö®ťvńűť\%íQjP2čÁWç¬>°kçńÖŘQtď©cß›Sţ/ĎŐ§DrűEr3ţŞ˛~0Ż:ütŘtô@\tȶc‡ż;§ü'óëúÖçČ‘»Tv€˝n!ř\PéÄ  ÄA(*J8Ď:6B Ďn@Ö klä8LW†D0Nkbęăşć±_®Í&Ü÷ëESí޲`ç{«ěňFř)~óĄß.~ęćiO\S=2µ!ďÚćbÇVI{‘:Śż÷ţełcí :7·Ľăé˛Ő#úÔŹIř‡?&‚ňˇ?z¶fă‘ýńR#ďű§Ů%—ľűŰU»»Tv€Őnař\ĐęÄ  ÄA(*J8Ď:*B 8Ďn@ýBÖ¨Č=®‰`ťďÄĘGsqŹęÁ¤-ź[óîĘÍ­= ľXňWż0zŐó™MEAŐđ´†|©É<ˇAÉ â7_ ŰéŔ©ă±céŠ}Ű|uÎ/6•Y]ŃđĽđ˙¸`Ň?ť_·áđľxi’µíţŢśňdx ă.°¬†t ŁŔç‚V'm ˛ĘQRŔyÖńR@{>pę˛FEîŔ\…tȸ„$á <ŮČl*-čQ=âÂEjůĐQ«äŻ~!¦nľ´żůŇ…/ǬŢż±Ŕ÷&ó„Őł&{Ü[KB%NźďŚ)K—íýŕöŮĄAéŕŢuŁ“á(5üřýË3ÂŹ‰8ú¦Ô•űwÜ9·2¨ć(Ő]*;ŔjH·0 |.hubĐâ ”Ąśg!´ç1 ~!nTäLThĐ€KHľ¨oGMkĚďQ="=Z˝ňąp-źŰí1đEsěLGĂ{«ËŢy-(ę¨*™'ł©¨ă…‹Ô”HîčUĎÇš¨‹vo™˛eí÷çVUIń-ś˝jG•Yw?߸˙T[Ľ”ÉŇ=Űš7żůĂy5AŰëšÇĘ”»Tv€Őnař\ĐęÄ  ÄA(JhĎ:B hĎV@CčxH<«ą ‘0\ĺsÔÔ†Ľ>őczÖdó©Ç˝hjî =b='Ź-Řů^ń›/î Ş†_ëË “ű(5%’{ĂÔqż]üTÖŠgcÍŐű¶˙Ýä±AŮđ‡LřŁÔôhaßúś˙ą¸ĺ Ł'Îť‰—>Yu`çŤ-ŹĄS"9ľ)Ő]*;ŔvH·Đ |.(vbĐâ ŕÁ^ÚłŽ„ć3Pż:ć*D.h@$$WíÎ+­1żwÝŰf•ü|Aä{sĘ'Ľ˝Ě±Ŕî­k?Úýŕ«s‚ń÷öŞĺĚפö©“ŃTTüćK±ćęúC{7ŢviJ$73Ńß"=ZţšásÜý|c|UĘĆ#űĂ×é[źăĽÝ]*;ŔvH·Đ |.(vbĐâ  !´g !Ěg+ ~!t<$ĚU\Đ€HHH®ÂiĆ€hAZCţ·gNüú䇗îŮćoŽáŔ©ă»O||÷óŤżÖ0×Ej’Oz´0µ!ď›O=~cËŁŹŻ{9¦\íěęZągP1¬gMvřs&ü[„ź_›üđ?Κôłç"ńŐ*;ÚŽ†Ą5ćgĘ”»Tv€ínˇř\PěÄ  ÄA@9B hĎ:BĎJ@ýBîxH<¨Ń ‹ \ą‹ŚŚ‹ţÇŤ-ʦ6ämýřż6b„ç΄sëŚ ˝jG ¸ 3éŃÂżź:®o}Δ-kcĘŐή®ĐŐKG©Iňľ)5çß–L‹ŁJéęîźiçńÖŢuc2ʸKě "ÝÂ%đą Ű‰A,€r$„0źu$„ 0ź ”€ú…čńu`/K!#ŇA!ˇąrG©ý/|MjřßÇÎtśí:ßíoŤŘ íěék›‹ŻkëlĘüy‚ʬe{?›Ş«;¶şjÖ¶ ×TŹL*]{Tʏ÷•Yç»»â¨UÖÜőĄÚěŻMÖ*Ć]*`'Xé.€ĎőN Î@d”#!¤€ů¬c üL  z˘Ç@Ö˝,…Ś („Äç2b4§6äĂ~2żîpÇÉK㏌asëÁĐŇoMź- ÇŮ”Éh*ę]7:(ş|ßöή;„ś˛emßúśţŤÉ ksqJ$7(4hůÜçÎÄQ±„ňô‹ä†Ď¤UŚ»TŔN° Ň-\ź ęťś8Č(GBHóYÇ@ůi@ @úDʬ{Y đÉŔe9ľŘ\Ü«vTŹęÁÄű˙°tććÖ{O¶ůŰ"vXü§­·LňöŮĄ)‘Ü´Ć|S&ł©(4ˇwÝMG„•k_“úřş—ż=sb(mżHnféc ëŔ^–BL„ü>ů›ďR3›Š‚ŞáÁ„űĘŢymĺţK÷lŰsňż*b‡¦Ík~<żööŮĄ_®ÍNmČs;f^úZçňˇéŃÂŐvĹ ´Ż})ő+µŁŇó3“ŕ@ř҇Čë–;ÓGÝŇĽůÍKÝňպъŸKě;"ÝB$Ę ^¦8qPŽňSŽňÓ€€čI Yö˛b" ŕ’‡Ď}I4 ZTfĂš6Ż™öÇőíťgý1SLx{Ů–ÎĽuĆ„ jxżHîµÍĹ|®kۧ~LP2č¶Y%s?ܸřO[cMÚQ«ÜżlöőSI‰ä$±MEAůĐčűń÷!ŇđŢꦌÓ-Ć]*`'Řé"Đ]ĐđBÇ,€r „ źr „ ź|¤OH9°—Ąáy„|ÖďL‰ä^řn»ŠaiŤůu›VŐĽ»Ň߱Ƹ·–­Yt]óŘ 2+µ!o «1s±ľÂâúů‚HŮ;Ż-Ýł-˝ ĄíS?¦GőţŤ ęŮTţš_ŞÍź#î&úţšë§<ň•ÚQşĹ¸Kěk"ÝB$j ^9qPŽňSŽňÓ€€ ý(겒"  ’OŇŐ·>'(zűěŇGÖ..Zł¨jăëţz)şş»'mxµěť×zÖd•YÉpÜg>e}}ĄvTP6ä®gŞÖ~´;ÖĽ=ÝŮ9áíeáUYéŃÂÄ‘ćâ´Ćü jxjCŢ“ë_‰»žiŮş.ł©¨OýG©Ć]*`'XéĐQPňÂČ,€r „ źrô đź|PéG9P—ĄáyśüŐŻ´ë]7ćÂIWeÖŹž­ůÝ’ió¶żëʆäÄą3Ż})(y0¨ĘĘpeţ˙é]7:¨ţ«ES~»ř©MGÄš·­§ŰsßXLz ü!“âEš‹űÔŹůFËc÷/›]üćKńU2ł?Ř0÷ĂŤý"ą)‘ÜLá2îR;ŔšH·°€.‚’RÎ@d”c ü”Ł˙  2H?Ęş,…¤Čdĺżş§Čh*J‰äô®}÷óŤż^4őÇójVŘĺĎ…ä`ű‰Ą{¶]řşÉIůCóJě__hţÉüş#§bÍŰ˝'ŰBo/SOz ĽÍl*JkĚ˙rmöuÍcK7,ŹŻ’9ßÝ5íŹë˛!Aĺ…ď´u”jÜĄv€5‘naĺ%/łś8Č(G?˙)G?˙9@@e~”u) I‘ĐÉĚ8ŁHʦ5ć§6ä…˙ńŁgkîxş¬Łóśżb“§Žo:z`Äëó ÷őŞĺ(ŐüŻ‹ÔhaXb˘a‰Ĺ ·{O¶…Ţ>řęś`âý˝ëF'ÉQjżHî­3&„Sµńőřę™Óç;gn{;(äŐ¸Kěk"ÝÂ"ĘJ^Š9qPŽ~ţSŽ~ţs€ € Ę ý(ęR’"&  đÉż»KÍh*ęßXđőÉ{ćÄoM×3Uţ8YŽtś:Ř~âž'ĄűEr]¤š\˙µÉcc¶ÄZO·˙ËsőAŮÔ†Ľ$ńöŇ˙»~ő9ó¶ż_=ÓŢyîŔ©ăŽRK_«dŚ»TŔN°)Ň-üt  ę…š3YĺčAŕ?ĺčAŕ?ȡ rŹr .M®-i\äĎG©×5ŹíS?ćÁWçř› –9Űu>ś;ž.ë]7:=ZčôÉüoß”ÚTÔ·>çž'Ǭş?W6mR=Ę×&?üĄę‘‹vo‰ŻŞ9ßÝ5áíeAůĐţŤľ)Ő¸Kě›"ÝB!@źz^Ŕ9qm(G?˙)Ç=‚p€ €Š!÷řęĐäÚ’6ŔźéÉ '(üÄşĄíťgĎśďô7AĚr¶ëüM-ŹÝ0e\ćĹ DwOćĎ“yńźŠaż]üÔéě±oMý”G6'•ş=ŞGl:z üp9ßÝ_m3î­%_®ÍvünÜĄvö€nQ2€ôĽĽĂ'…8@(G?˙)Ç=‚p€ €Š!÷řęĐäÚ’6Ŕ`ďɶpvźřřÄą3ţYvoýű©ăn›U2 ZŽ‹'óçŘ\ܧ~L0ńţÜ7†UÖzş=Öě=sľó[ÓǧG Cu“ç(5˝©ŕšę‘ŹěďęÂ)Zł(µ!ŻŁŞ1îR;{@·(@oz^đádrô đźrÜ ˇ$rŹoŕ-M®09qĆň}Űo›UrçÜĘľő9© ynťĚ8J &=Tµńőu‡öé8köî<ŢÚűĂy5ý"ąÉň(ÍĹiŤůAŰ0°ď‹ÇÎÉ}caF´0l›L3îR;«@·(@Wz^ Ŕ˙6Čĺ¸AĘq‚ ` ‰’Č=ľ·4ąÂä Äł¶mřĹÂčťs+Ż©™Éu#fţýd4•YÁ¤&mx56żîyÓŃ˙4»$´·o}Nňś ÷¬ÉľyÚ‹˙´uůľă®s/źűŰĹO]?ĺ…cÜĄvV€nŃ0€ŠT˝6gIJ@9îAD€rÜ,€×g ‰’Č=ľ·”ąÂ$ Äu›V ^>÷¶Y%AeVJ$g`s±'si2›Šú7„bô¨Ń´yMôý5ç»»bMŕĄ{¶Ýűʬ»źo ކ'‰˝×5ŹíS?&(tëŚ áŻʵ“˝ňą°mzÖd‡‚9J5îR;«@·¨@-Ú^3€3âY ÷ "@9âA¤Ŕë3DIäßŔ[ú\a˛â‚ňŤŻ=ąţ•ë§<T ëÉu‘jţ·i.îS?ćşć±Ą–WĽł"6^ü§­NŞK÷®“$‡żfŘź/Ś{kIřëÇcóäľ±°Gőôhˇ”w©€ť€U [Ô   mŻ"Ŕq€,PŽ{ ń Rŕőˇ!Ś’H<ľ·ôąÂ¤ Ä>]ÝÝ ď­nŢüfŻÚQAeVZcţµ.RÍ˙~ůŘ/’şńőÉ׼»265^°ó˝čűkţůé˛äůšÔ0§˝ëFĺCďś[ąćஸkžÖÓíˇNă׿ţ RfÜĄv¶€nz*´˝–gIJ@9îAD€r ž, p— }a”Dâń Ľ Ď&O ći=Ý>oű»u›V%‚ʬ ßWhţŹËÇ~‘ÜŐ#n›UňëEScö(uéžm™MEAŮ”¤ůžßđ÷íY“ýË…Mál:z îĘçPÇÉŻĎĆßÚĺ޸Kě,Ýő%h{]ÎdrÜ ĺ@çöŮĄ­§Űă±>j?‘µâŮ`ŇCšÇ¸Kě,ÝőŮ´˝ŇgIJ@9îAD€r ž, ńRŕia”GâlĽ Ď&|îH0>j?±˝íČýËf“čS?Ć]ůO§cAjCŢŔhŃę»bÓäή®e{?ʇ^S32=iľę7#ZŃTô˝9ĺßž9ńl×ůx¬ ÖÓí—Ď Ę)ă.°°t t ¤PřŞśČĺAĘx˛€„Lw¤„Q‰˛ń€>Wđą a8qîLŰŮÓ?{.TfĄ5ćgş]2˙őńă7ZKmČŰxd š|¶ëü±3ŽR+†%•ĆME˘wέŚÓ jď<>Ü…ŁřĘ,ýcÜĄv€nnĽ _€3âY ń R@9O¨)đŽ4€0Ę#ń@6ŢĐç >÷$ ßž9±´Ŕ˝’ů«ÇŹ˙˝!˙Łö]ÝݱirËÖuAŐđ$őxZC~ZcľK%óźÎŔćâ~‘Ü lČ?Κ´íŘámGcSć˘5‹ú7„?ę€dúÚßđu§ą÷•Y[?>Ć9N‹č§óëŇŁ…î⍻TŔNŔNĐ-Đ-kŠś8ČĺAĘu˛€„‚G¤äQ‰˛‘€J×™đˇ ~YűŃî;çVţx~mďş1n”Ě5×5Ź Ę‡ţraÓĘ;6·ŚM™-źűó‘[íÉÍL¦‹Ôž5ŮÁř{ď_6{ßɶxlˇŽÎs?z¶&´+­!ßQŞq— Ř Ř şŠ p— Î@drÄ HĺŔ:Y@Á#Ň")ʬŮH @ĄëLřĐŹĚß±éW‹¦üp^MP5Ľo}N¦%ó_\¤^8{śpß/6ĹěEjȰóŇó{ŐŽęßXTG©Á¤‡Y»xöâô(őpÇɟ̯»¦zdďşŃgÜĄvv€nb,HúÎ÷úś8ČĺAĘu˛€$ ‚G¤DRY˛‘€Jי𡠾hŢüföĘçţů鲠|hßúśÍĹ®“Ě2ÍĹ=ŞG“´|nĹ;+¶~|(eîţ䓯ĎĎ_ýBźú1ýŁIt‘šŃTT JŹZµŕÄą3qÚE;ÚŽŢý|cP1ěZ-dÜĄvv€nb Đůz†3Y ń R@9°NLAđ4€HĘ#ë@6ŇPé:>ôÄ ď­.{çµ¦Ž ʇ¦Dr]¤šż0AeVöĘçrßXřQű‰ŘôůÄą3C^{&”9¨ž<_µ™ŮTÔż±ŕ+µŁĆ˝µ$ő ÝńŮEëí}|ÝËż[2-(˘Ś»TŔNŔNĐ-P,b:_Őpâ ”#A (ÖÉ’-‘IydČFZ*]g‡>€Ř§eëşYŰ6ô®T KkĚ÷í„ćżşyLŹ~ą6»Wݨ߿<#f}ŢsňXóć7‹Ö, J%ĎUcř:ax{Öd§5ćŤ^ő|üÖŃúC{8Ż&xŻÚQ×5Ź•;ă.°°t  ä€ÎW8ś8ČĺXAĘu˛€d ‚G¤DRY˛‘€J×™đˇ fi;{úĹ]›§lY” *łŇŁ…‘Ě_řÎŢuŁĂ˙řÍK-ż[2-f­Ţ}âă?,ťŚż·gMvRĄ¦DrolyôW‹¦Śx}~ü–ŇĆ#űďś[Ö‘‹Tă.°°t  $€ÎW;ś8Čĺ(AĘu tŇÁ#Ň")’¬ÓH @ĄëLřÄî8ąţĐŢI^ Ćß{MÍH_jţňÍcjCŢŤ-ŹŢőLŐýËfǬջO´n8ĽďÂQjéŕɤôĄJŹŽ{kI\÷Ҷc‡˙ivIŹę5’q— Ř X şŠb @çkÎ@dr” ČĺŔ:ČBÁ#Ň")’¬ÓH @ĄëLřÄS´žnß{˛mÄëóIő­Ďq˙eţň¤G ÓóS"ąEkŬŐµźŘw˛íGĎÖeCRň’Ęę??ĐřőŻÄo/8u|˙©¶[¦?Ů»nL¦Üw©€ť€µ [ X °tľţá ÄA(G9‚,P¬,$w<" ’"É:0Ť´TşÎ„O|1ÂéóťťçîyqrP5Ľcă/óW'#ZřµÉ÷®ýřş—cWěÎΛ§=ѧ~Lz´0 čë¨âťqÚKÝź|r¨ădŘH)‘ÜŚä{Aă.°° [´ ¤€ÚWAś8Čĺ(APŽuAđô€HJ%XÇ4Ň@ňTş÷Ą€¸ă{sĘ3›Š6g882źbŇóňˇ-[ם>ßŮŮŐ›Vwvw}Łĺ±ô¤Ľg ă>ĐĽíďĆňýU¶źčßX nĆ]*`'`-@·hČ)µŻ8qĘQ‚  ë ‚ŕé9‘”J°Ži¤€Ŕ]*|â ÎśďĽeú“ß™91ł©h@´ŔQŞů”ŹK÷lŰw˛íôůÎŘ;üŮ®źňČ·gNLÎŁÔ^µŁ‚’Aówl:Űu>~ŰiçńÖÍĹîRŤ»TŔNŔZ€nŃ*Rj_qâ ”ŁA@9ĘAdÁÓs")•`ÓH ÉPéŢ—bźímGnť1á®gŞRňŇň]¤šżzŽš- ކĂ˙iëůîŘý έş©ĺ±”HNZc~˛=ÓĄ7Z}`׆Ăűâ÷(uĺţťa;}wNyJ$WôŚ»TŔNŔZ€nŃ*Oj_#qâ ”ŁA@9ĘAdÁ»sR)•`ÓH ÉPéŢ—b™ĺű>üéüşĎŻíY“íěËüŐŘ\śÚ”MkČĺY¶÷u;üŮB·ôlMŻÚQ™IőLÍĹáëĂúÔŹ ß(® jéžmßhyěKŐ#űEr3иKě¬č­Ů ö•g ˛@9ĘAd”ŁdAĽ; •R Ö1Ť´­îqą 6™ýÁ†ßż<ă®gŞ‚Ša}ës6»-2ő(µGő[gLµmĂ‹»6DzދvoůÖôńIčvřË~©zä?<őxđ;ß‹ëŽ ţ𯩩ťŚ»TŔNŔZ€nŃ*Lj_/qâ ”ŁA@9ĘAdÁ»sR)•`ÓH IŐę—bŤčűkŠÖ,úÎ̉AůP©ćS^;ö®” úö̉‹vo‰e˝güq}ţęľ?·"¨žl©}ęÇĄo™ţdĽ_¤N»řw<]ÖŁz„‚2îR;°Đ-Z" @ík'Î@dr” Č(G9Č‚,xw@*Ą¬ci ŮZÝă@ě}MĂ{«3›Š‚ňˇý"ąľĚ§»H” ůů‚HÖŠg˙ikĚęݲu]ݦU7µ<ţ´)‘¤űšÔ 2ëÇókGĽ>?ŢŹRźţ໯O~8ě¨eÜĄv°t‹V<Pű Š3Y ĺ ˛ĘQ˛ ŢťJ©ëFZHĘV÷¸Äđ…s¶ëüě6Ěřăú jxP1¬cA¦K"ó)&ô¤Gő}ˇů׋¦®;´'–%źżcÓ…űŮŠai ů×&Ó1cřF}ës‚ʬŰf•¬Üż#ŢËęĹ]›Ă‚ Łk]¤w©€ťlݢU ŚÔľŽâ ÄA(G9‚,€r”,Č‚wç¤R*Á:¦‘’µŐ=.1|´žn_¶÷†÷V“ކ»2źr2šŠR"ą˝ëFß>»ôŔ©ă1křŮ®óË÷}¸h÷– 2k@´ _*|ŁźÎŻ»knŐ†Ăű⽯VěŰţ:© y獻TŔN6€nŃ*Dj_Mqâ ”ŁA@9ĘAdÁ»sR)•`ÓH ÉÜę—ľwśÜÜzpÜ[K‚ ÷őŞ5Đ—šO”-LŹŢőLŐ?ΚtâÜ™•ĽŁóÜ´?® &=tMőČä|©Ô†Ľ›§=q¨ăd\—ŐŮ®óaY­9¸+¨Š'€Ć]*`'›@·¨!ÍŻ©8qĘQ‚  ĺ ˛ŕÝ9©”J°Ži¤€$ouŹK W™¶ł§ŹtśşŮě tpżHîµ.RÍg™ô‹G©ßťSË’wtž;Üq˛eëşPňä4<|ŁŚ¦˘[ŤĺĂáOĂŮ®ó vľľcďş1ŇgÜĄv°t‹J ĐüĘŠ3Y ĺ ˛ĘQ˛ ŢťJ©ëFZĐę:“®&]ÝÝç»»~ö\¤Wݨ ·BćłOfSQ˙Ć‚ďĎ­qĎ_÷rP™•Ěß­ľÔ SĆť9ßď•őĚöŤAĹ0Ń3îR;Ř şEĄ@h~}Ĺ,PŽrYĺ(YďÎH%XÄ:¦‘´şÎ$€«ĎmłJn:n`sq2ßë™Ď3ÍĹiŤůAŰ_-šŇvöt{çŮXöĽh͢ŻÔŽşô…ˇIxŽúŐşŃw<]vâÜ™x˙¦Ô™ŰŢľô”2hÜĄv°t‹JôĐü*‹3Y ĺ ˛ĘQ˛ ŢťJ°uL#-huťI WŤcg:n™ţäO—ĄG ű7ř¦Tó™f`sqP:8{ĺs;ÚŽé8ËŞßűʬoMĂÔqiŤůIřL)‘ÜđĄîz¦ęŔ©ăńŢZŢ^vSËc7O{"­!_Ť»TŔ6€nQ)=š_kqâ ”Ł̡ĺ ˛ŕÝim ‘dÓ Z]mŔŐaă‘ý·Ď.ýἚľő9© yŽĚg=uěY“Śż7{Ő‚Ă'cYő{^śüłç"_›<6T}@´ 3)o‡˙ňڵíţ°íhĽ×ăë^©Ţucú7&ÝSw©€U*lݢR w4żââ ÄA(Ę dr”,Č‚w§´1D’uLc,huµI _/îÚü‹…ŃĎŻíQ=˘o}ŽŰ.óY'¨Ę &=PöÎkówlŠńŻIýíâ§R"ą˝ëF§G 3“ővřß–LŰyĽ5şë‘µ‹Ă_Jkw©€U*lݢR t4żîâ ÄA(Ę dr”,Č‚w§´1D’uLc,huµÉ W‡–­ë-źűýąAŰľő9›‹Ý™O?™MEý ‚Şá ď­çĚůÎUýŘ™Žű—ÍĽ|nĎšěŚdýBŰ tpî ë6­Ú}âăxď®üŐ/dŻZp]óŘ”HεŠË¸K¬Ra9蕉 ůŐg ˛@9PN ”ŁdAĽ;  Ť!’¬cc@««MV¸Â4Ľ·úÉőŻÜ<퉠|hJÄEŞůŚÓ\śÖTeő­Ď)ݰ<Ćmß{˛í.n J_S32 +Ł©¨Gő0éľ:§íě騯qo-ůRmvP5ĽcoJ5îR«TXşEĄ@Üh~ Ć,P”Čĺ(YďNhc$ëĆXĐęj“®(S¶¬mŮş®_$7¨–Úç"Ő|ÖŻÝ µ Ş˛nlytÄëóÇ˝µ$–mßÜz°nÓŞ_ť” JBŐ/|ˇm´ OýěU †ĽöLwü×WgWדë_ »+CŤ»TŔ*–€nQ)5š_‰qâ ”ĺ˛@9ĘAdÁ»ÓÚ"É:¦‘´şÎd€+I{çŮů;6Műăş |hP™5 ę{ÍgţŽÔÔ†ĽŐ#ľ3sâŻM){çµw~sëÁź/îëU;ęşć±Iw‘ÚXĐ»ntřďŻÎI€k=Ý6XÍ»+’AşË¸KěQa9č•A ůőg ˛@9PN ”ŁdAĽ;  Ť!’¬ci@«ëLV¸ré8µúŔ®ŞŤŻîëQ=ÂI—ů|wŽ}ësnź]úĎO—Műăúw~ëLJÖ~´űgĎE‚ŠaÉů5©© y7L÷“ůu÷ľ2+1J,ő Ář{Ż©é+žŤ»TŔ–€nQ)2š_•qâ ”ĺ˛@9ĘAdÁ»ÓÚ"É:¦~´şÎd€+Ä‘ŽS;ÚŽćľ±0xďşŃîąĚç›тԆĽŚháŠ}ŰcÜůÝ'>Ţ}˘ő–éOĂÂź9 ťOʆżxZc^üÄč±cg:F­Z” Ň`Ć]*˙§˝ĺ [T D €ć×fś,Čë@9A€,PŽrYđî4€6†H˛Ži -­®3Yŕ ŃŢy¶íěéß.~*¨–Ö­{.óą&ăâÜÔňŘ‹ä¬;´'–ťďţ䓧ާ6äő©“-LÎ÷ ńë§<Ň/’űđÚ—˘ÇÎ…=–µâٰǔq— ŔNŔrĐ-úň@ů+4Î@dx ś @(G9Č‚,xw@C$‰Ç4€V×™¬pĺřÁĽę´†üL7>ćr|ůćţSmç»»şcŰůđ‡ Ô$Ż bXÓć5ácuuw'@ŹÝóâäľő9.RŤ»Tv–€nŃ'/Ę_ˇq‚ Äĺ˛@9ĘAdÁ»ÓŞ"I<¦´»Î¤€+Ç­3&Ü2ýÉÍĹéŃ 7>ćsMfSQJ$ç-Źé8NŚ;żîĐžţŤ7O{"iż&5|Ż>őc‚’[¶®;sľ31Şě— ›ŇóD ôq— ŔNŔrĐ-úÂ@ůë4Î@dx ś @(G9Č‚,xw@C$‰Ç4€b×™”pŮŮ{Şí[ÓÇß9·2­1?—\ćóÍŔćâ~‘Ü lČ­3&ě<Ţűć/ß·ýkMĹ)‘ÜţŤÉű5©ĺC—îٶąőŕé:J-G$Ť»Tv–€nŃ',Ę_­q‚ Äĺ˛@9ĘAdÁ»ÓŞ"I<¦´»Î¤€ËËę»îš[őăůµ_©•ÉuÔc>ß\×<¶wÝč`âýw?߸bßöMGĸů3·˝ýyŐw<]öպљIů©ý ‚ŠaAŐđwmNŚ6ëţ䓟=ąçĹÉáŻć(Ő¸K`'`9č}± ü5g ˛@'ÓEŹůŽR’A÷/›=kۆͭc_ţ)[ÖŢŘňhP5üÂ-vsq~­mďş1áżówl '1 íÄą3w?ßŘł&»wÝhßřlÜĄ°°t‹>XPţšŤ3Y(AĘQ˛ ŢťPĹIâ1 ¤ Řu&%\Fš7ż9zŐó·Ď. ʇö­Ď|wyć˛Msń5Ő#IünÉ´ťÇ[c_ţŞŤŻçľ±đ[ÓÇą6{`R^¤¦Dr‚˛!7L7÷ĂŤ Ói‡:NŢóâä 2Ë}˝q— ŔNŔrĐ-ú2@ů+7Î@dÄŁA(G9Č‚,xw@C$‰Ç4€b×™”pixouĹ;+ţ~긠|hJ$×EŞůÜ“-Ľp‘Z™5âőůŁV-8Ôq2ĆĺŻÚřz8éŃ bXjC^rĄUĂďś[™żú…YŰ6$L­í<Ţú›—Z‚˛! Í˙;°°t‹>@PţúŤ3Yń(AĘQ˛ Ţť€4‰$ńŇPě:“. ]ÝÝÓţ¸~Ö¶ ˝jGĂŇóŻuŔe>ďd6őo,H‰ä[1ďţełă"u›V…ć•YáOž„_©9°ą¸o}Nř¸uĆ„E»·$Lłm:z eëş{_™” ş®y¬lăđv–€nŃ'&č&{hbp‚ ĺ ˛@9ĘAdÁ»3%y$Ó@ZŠ]gRŔßȱ3‹˙´uĘ–µAÉ  2+#ZčlÇüM©Ń‚ŢuŁD ââ"őÄą3ˇ˙-[ץ“ůŐzŐŽúńüڟί[ľďĂ„)·­ Ł`âýˇŽRŤq— Ř XşEź@š ňLf18AŹrY ĺ ˛ŕé™ČŁ<Źi -Ĺ®3)ŕoäpÇÉ ‡÷Mx{Y0ţŢž5Ůľ ŐüŤ·Ť˘)‘ś¦Ž»sn彯̊ý;Ó1~ý+üO‰ä~Łĺ±mÇ'Rżí<Ţz×3UAUÖ@ÍfŚ»TŔNŔrĐ-ú˘Ń&3CÁ‚,€x” Čĺ(YOĎ@ĺ‘xLi(vťI ­§Ű÷źj¶b^0顾ő9î¶Ěß>ý nlyôú)Źäľ±0ö#Đvöôľ“mO¬[”Nf˙ÓŁ…˘7yěSǦß>j?ţ:w<]öĺZçöƸKě,ݢO Gd>s†ś ČG9‚,PŽrYđôLäQ‰Ç4€b×™”đ7qć|g8ż\ŘÔŁzÄ€hA¦#s9&Ł©čšę‘u›VĹ~Îvť#đŕ«s‚Šaý“:áď~ý”GÂ˙8Ňq*a*®˝óě×'?üß"9ŃBÁ4Ć]*`'`9č}9‚Řň™EÄŕ A@<ĘAdr”,Č‚§g ŹňH<¦´»Î¤€ż‘ďÎ)ż®yěŔćâ ç9ć2Ý6¦5äeCš7żŮŮŐűřĹÂhz´0LA’G _$÷–éOvtž §;QúíÄą3_›ü°r3Ć]*`'`9č}!‚¨RšQÄŕ ¤@Ŕ=ĘAdr”,Č‚§g ŚňČ=¦´»Î䀿‘öÎs·Lň¶Y%×6 ¸Ű2—ezŐŽ J/ţÓÖ='Źť>ßűA¸űůĆţŤá$m6§6äĂţqÖ¤ŹÚO$RËé8uĂÔqaż ¦1îR;ű@·č$”ŇÔ"g ˛îQ‚ ”ŁdA<=aFî‘ ¤ Řu&|n¶;üť™0Żş_$7µ!ĎEŞą,ߑڿ± gMöÚŹvo8Ľ/.ľ&5ŚŔOç×e\ĽËľ6‰ŹRňˇ˙úBsřjŰŰŽ$LË…żÎwfLĽsneJ$W<Ťq— Ř ŘşEź@‚ •¬¦18)pŹrY ĺ ˛ŕ陣0rŹl -Ĺ®3ůŕó±t϶y®ţÇók{Öd§DrăËöm›ĺCĂ—ďű0.‚ĐŢyî'óëľZ7şo}NF´09îşć±_®Í&ÜwĎ‹“·;śHE·úŔ®oM±ĺr3…Ôw©€ť€ý [ô ÄÂHlľ3Y÷(AĘQ˛ žž €0 #÷ČŇPě:“>;3·˝ý‡Ą3ďz¦*¨Ö·>g`s±Kó·6†.%ľ5}|(ŘÂťďÇ~¶;üű—günÉ´Ő#’üš8|¸¬Ď6o~3ÁŽR—îŮöť™Ă÷ŐrƸKěěݢO >AbŹśČ¸G9‚,PŽrYđôd„QąG6€b×™|đ9hxouń›/Ý:cBP>ÔEŞą\WŤ˝ëF%~<żvüúW^ܵ9ö°úŔ®Ü7ţzŃÔ tpŻÚQÉ„Ő#Â?–Îü¨ýD"uÝĽíď­YôyŐAe–˘3Ć]*`'`?č}Ůôq›~Äŕ ¤@Ŕ=ĘAdr”,Č‚§' Ś’Č=˛´»Îä€ĎJôý5ád4ĺCSňj™ËöU›ĂţÇ ÍC^{fĺţq‘…UvŢ9·2ôĐW’ű"5˝©°gMö×ç[1Ż˝ól"ŐÝ‚ťď}Łĺ± t°ë{cÜĄvö€nŃ'·H Î@ dÜŁA(G9Č‚,xz2Â(‰Ü#H @±ëL>řLś9ßůôďĚřăú 2+śţŤ™înĚeš>őc‚ŞáwέÜvěp\ÄaĹľíó¶żűĎ­ łp]óŘä|µ°D zŐŽJ‰äŢűʬÄ+˝Ą{¶ýÝä±I~tlŚ»TŔNŔ~Đ-ú‚‰Ł7‰•"îQ‚ ”ŁdA<=I”Dú‘ ¤ Řu&|VZO·ż¶ďÆ÷V“ކ»µ1—k2šŠR"ą)‘ś»źoĽë™Ş§ŽÇE"ÖÚ{ý”G‚˛!áź´‹™ME© y_źüđ/F˙mÉ´+˝Uv®9¸+­1?|břƸKěěݢO 85z’ś@¸G9‚,PŽrYđôd$QéG6đ€bW|đ)9ŇqjëLJŠß|)p_/_h.ë¤G Ăďś[ůÝ9ĺq‡îO>Ůvěđ‡mGD ú%÷ąbřv© yý †­—`Ąwľ»kŮŢ‚Ša=ŞG„ż¦ŁTcÜĄvö€nŃ'H˝iI ¨€,ĐŹrY ĺ ˛ŕőɡ$ŇŹlŕ-Ĺ®0ůŕÓĐvöô‘ŽS÷ľ2+(śÚw­‹TsYż&5=ZŘż±ŕ§óëâ"ť]]a6ŢT˙jÝčŚä~ľŃ‚żź:.üŹŻĎO°Ţ úŇQŞă.°°t‹>ŕ@ľčMNb€3"Y ĺ ˛@9ĘAdÁëCŤ@ %‘~do(v…Éź’®îîp~:żÎýťąB“ŮTÔ·>çîçă"Ýź|˛h÷– 2K.Mř§({çµë˝î‹Ő·t϶ *Ëă.°°t‹>Ô@¸čÍOn€3"Y ĺ ˛@9ĘAdÁëC1B %‘~do) @ajQźžďĚśxSËc›‹ÓŁ…ÎjĚĺśćâÔ†Ľ lČŻÎ9v¦Ł˝ól\$bŢöwżZ;:ŚCFŇ_§Dr’A5ď®Ô@¦čMTn€3"Y ĺ ˛@9ĘAdÁëC7B e~|o) @ajQź†#§n™ţäwç”§G ű7řjHsyg`sqP2čńu/Řv¤őt{\„˘jăë7µ<ć"µ!ĎWÜĄçďŘ>_Ľzę6­ ź8śŃQ5Ć]*`'`?č}‘@1ś«ÜgD˛@?ĘAdr”,Ȃׇn„Ę ýřŢR€ÂÔ˘ţ2ëí˝ăé˛=[Ó§~Śű;s%ľ&µGő`Â}ăŢZ/©!“6Ľ:°ą¸wÝč´ĆüĚ$>GMŹUYAŮyŰßíěęJĽ,{çµđˇS"9™˘jŚ»TŔNŔ~Đ-úňQ"9cąÎd~” Čĺ(Y€»TčFČ  2oŕ-K(L ŕ/˛pçűż\ŘôŁgk‚Şá}ëťe™+pŇX™”ŽľżfŢöwOś;ąČ_ýÂď–LűćSŹ÷©smsq2ż`żHnJ$wŃî-aW$^­YôŰĹOýCŇ?´1îR;ű@·čČ ää¤ĺ8ĂČ)AĘr˛€ÄË‚wädPľń–Ą&T(pŮ™˛eí°óľ;§<¨Ö·>g ›,sYż 5­!?T«OýĐ´†÷VÇK.FŻz>śŃ‚Ő#Ňó“öVńâ÷‡ćĺC3›Šžţŕť„ěŔqo-éßXT Oć‡6Ć]*`'`?ččańś·ÜgřY` ĺ ˛@9PN¨YđŽ|€ Ę Á7޲€Â„ .# ď­žđö˛o>őxP>4%’ë"Ő\ö“ĆŻÔŽş©ĺ±'Ö-­yweĽä˘űâפUĂĂ-ČLîěQ=â¶Y%ăŢZҲu]BÖ`é†ĺ_­ťÖďK˘Ťq— Ř ŘşĚHĎ©Ë p†˙R‚ ”ĺd ™ďH Č 2|ă-K(L¨Pŕ˛0eËÚi\ß·>'¨–Úç"Ő\‘/٬̺aę¸čűkâ%­§Ű/keCĽŕĄ~¸eú“ó¶ż›xxć|ghfřܡĄéŃB™5Ć]*`'`?ččaěđśŔÜgřY` ĺ ˛@9PNŔY𔔀 Á7검¶„ >7'ÎťY°ó˝–­ë‚ŇÁ—®±|E ąĚsń"őšę‘w<]öË…M͛ߌ—tl?‘µâŮ`ü˝=ŞG$űĄvsń—kł˙ßy5w?߸pçű‰×„mgO?ľîĺ`ŇAŐp™5Ć]*`'`?ččIŕPťĂÜgřY` ĺ ˛@9PNđY𔔀ô Á7검¶„ >‡;N®ýhwŮ;ŻîëQ=âZ_j®Ŕd6ő­ĎůŢśňš]ňâ®Íń’Ž˝'ŰÂtdŻZLzČw§6äő®óŤ–ÇÖÚ›exěLÇë–“đÖƸKěěÝ}")Ş  ˙! ¤A(ĘÉ’$ ž’=éă!(G]–Đ–PˇŔgâHÇ©]'Z/ÜÜMĽżOý§Xć Í€hAZc~fSѦŁâ%µźŘ}âă_/šLz¨o}N’§#|ÁţŤ·Í*ą~Ę#[?>”xexěLÇÎă­ľ)µd&4Ć]*`'`?ččp^d¨ŽŔ]*hC~ )AĘr˛€¤É‚§¤DOúxĘQ—Ą´%T(đ)iď<{âÜ™ 7w•Y—ťĆ+1˙˝±ĺŃPłmGă( ßťS~MőČţŤŇţnjyěú)Ź„Ą‘}xú|çýËfĺC•ˇ1îR;ű@·@ź@Lä…ę 3=hC~ )AĘr˛€dË‚§¤DOúxĘQ—«´%”'đ)ąsne˙hÁµľĐ\áŁÔ´†üëšÇž8w¦ł««;~ňOłKŇó˝`8© yß™91|ľpµ˙ňŚŢuŁ˝µ1îR;ű@·@ź@L„…ęŕ3=hŁ!$¤A(ĘÉ’0 ž’=Ńă!(G]®Đ–PžŔ_ć|w×-ÓźĽuƄ̦˘ôha†‹s%¦ą8­1?¨Ěú§Ů%‡;Né8/9qîĚ7Z ňçoző˙ütYëéönĹß.~*µ!/ěCÉ5Ć]*`'`?č艤P”¦mt#„” Čĺ@9Y@rfÁk˛r'z<ĺ¨ËUÚĘř?YwhĎ-ÓźüÁĽę;çV¦5ć‡ă"Ő\ˇŘ\T űך7·Ü}˘5^2˛íŘá0#ßź[‘Ú' ±|čŻMąř'j1ţ|Aä˙y¦ňk“Çöo,\cÜĄvö€n>ŚH ŰAizĐR‚ ”ĺdI›ŻÉ ťčQ”Ł.WhK(Oŕß3ǦΫąsnĺ—kłS"9)‘\'0ć ÍuÍc{ŐŽ &Ü÷«ESv´ŤŁ¬?´÷[ÓLJ?Ľ€„ŹvEřży©eçńÖîĆ_,ڦ6äő­ĎIŹfĘŻ1îR;ű@·@ź@FÄ„í`5=hŁ!<¤A(ĘÉ’8 ^“:ąŁ"XÇ^®P•PžŔ%Ţ[ýoK¦ýóÓeAUÖ…k»ćbÇ/ćĘ}˝fŹęÁ„űFĽ>Ú×oo;/1Y´{Ëo^jůÉüşkŞGĘČ…ŻIťôШU ¦˙q]|]&ÎvťżçĹÉ˝jGůÚhcÜĄvö€n>ŚČŰAlzĐĚR‚ ”ĺ ˛Ŕb@脎Š`{‰ @UB!e6żú…o>őxP1,%’;ĐEŞąÂ”-~óĄI^ý¨ýD%eÁÎ÷nť1!(ҧ~Ś\¸,.ôŕ«sŽtśJÔnÜsňXÖŠg-źTf‰­1îR;ű@·@ź@@„íŕ6Chć )A‡rYŕ7 tGE°Ž˝\ *ˇ<ŞŤŻ×mZ•ÚT ˙ujg®Üd6ĄG Ż©ŮŁzİóşă*)ł?ŘPńΊŰf•„?Ľ\zÇÜ7fŻZĐŃy6Qëńö#÷Ľ89ôPĎšlŹnŚ»TŔNŔ~Đ-Đ'ˇ:¸MÚ€ů‚ŔCĘAd”ŁdA8Ŕ ťÄQ¬c/]¨JhN$3'ÎťiŮş®á˝ŐAůĐ 2k@´ Ó©‹ą’©iŤů=k˛ÓŁ…C^{fĐňąq–ąn çÂwĽ– é—Üß&ľc˙Ć‚^µŁR"ąá;&vInýřĐ…ŁÔŇÁ×5ŹacÜĄvö€n>€ŐÁm’ĐĚR‚  ĺ ˛@n@Ü$üa{é @UBs"i9Ř~béžmŢ^L¸/¨îŐ\…‹Ô^µŁnjyě— ›˛V<_y™żcSP™N˙ĆdżÝýÔ†Ľë§š«vÉŘ/’{Ëô'o›U2î­%q–öÎsŹě_´{KP>Ô;†ď8 ZÉMŹfŻ|.±{rçńÖ;ž. J§Dr”¤1îR;űşEź@@¤T§7IhÚ )APŽrY = n˛6Ź˝t *ˇ9‘śé8u°ýÄ=/NJ÷‹ä:¶2WaŇŁ…iŤů}ës¦lYGaiď<{ŕÔńđg&=Ô»n´/§cÁŤ-Ź~mňĂąo,Lŕž<ÔqňŁö˙×Ě ŢÝw©€ť€ýݢO ˘¶3ś$´íŠ” Č(G9Č‚,Đ€5Y!‰G`ĆĐ“P›HZÎvť玧Ëz׍NŹ:f1Wg2šŠľ6yě—ŞGÎÚ¶!Žňrľ»ë‘µ‹Ša˘.˙ü”×Tʬywe÷d÷'ź´žnÓÔ†Ľ ŹnŚ»TŔNŔ~€nŃ'ŃŰNć€óRŔFĘAd”ŁdAh@Čš¬Ä#0cčI¨M$+g»ÎßÔňŘ SĆe^<.sÉb®Î¤6äĂVîßŮŢy¶ł«+Ž"“żú…^µŁ\p_šĚKOY:8úţš°L¸*Źtśúó®w7Ć]*`'şEź@:äT'9OÎK)APŽrY`C h‚BŹŔŚ 'ˇ6‘„ě<Ţú÷SÇÝ6«d@´ 7,ćęL˙Ć‚ŻÔŽÚúńˇÝ'>ŽŻ‹Ô?,ťyó´'n:.üĽăĄŁÔ lȢÝ[§ěč<—Ŕmąçä±ë§<âÝŤq— Ř Ŕ~Đ-úŇ! :ÉyÂp^ ŘH9‚,€r”,ČA“2’{U= µ‰ädůľí·Í*ąsneßúśÔ†<×+ćjLsqZC~P1,Tnă‘ýq—šßż<#=ZÉ ˙ÍLúsÔđŹT ʆ,Üů~|VVŘu©-S"9RlŚ»TŔNö€nŃ'ˇŐyÎć€óRŔFĘAd”ŁdAŔH™”“Ü#0H čIčL$3·˝}÷óŤwέĽ¦zdJ$7Ó銹ňs]óŘľő9AÉ oϸřO[Wîß_©ůÍK-ż[2-=ZÖ/2á_ ¬ŽÔ†ĽĄ{¶…Ż™Ř…ąlď7O{B[ă.°€ý [ô DC(Ŕvžó„9 Ľ’rYĺ(Y&R&bŕ$÷8 ŇĐ~:IHÍ»+|uÎmłJ‚ʬ”HîŔćbG+ć*\¤öŞLzŕgĎE¦lY»|ßö8ŠLëéö?,ť¦¦gMvř[řšÔ°4Âęʆ„˙1Ǧ„ďĚE»·Ü:cBŹęÚŇw©€ťěݢO ¶Sť'Ě᥀” Č(G9Č‚,$1'ąÇa€öÓ™H*ĘŢyíńu/_?ĺ‘ bX?©ć*ž1eC~·dÚ¸·–¬ýhw|ĄfĎÉcż^45(Üł&ŰSţŻ×¬~űěŇ o/›ýÁ†ÄîĚđ,~óĄďĎ­e…iŚ»TŔNö€nŃ' qŐŮNć€đR@HĘAd”ŁdAČ@Č—|–ôă0H @IęL$ ]ÝÝu›VEß_sá ++łŇóŻu`e®Ö\°®|čĎDv´ŤŻŕl<˛żjăë÷/›”v“xé"µOýđ5oť1aáÎ÷ľ9çm÷ÂŮ”HŚq— Ř Ŕ~Đ-ú˘! :۩°] 8I9‚,€r”,ČHů’/Đ’~o(I…‰„g˙©¶§?xgáÎ÷kŢ]” *ł2˘…îSĚŐ™ôháWëF÷ŞőŰĹOýŹšuśŚŁě¬;´gŢöw˙ő…ć`Â}áŻp]óXzmsqĎšěźĚŻ _sńź¶&|†żcX}ęǸâ7Ć]*`'ű@·č†8€ęl§ yŔvŕ$ĺ `ĺ(Y2đň%\ %ýh ŢĐ  Ď®­+÷ďČZńl0ţŢ 2ëšę‘ľěĎ\ťÉĽx‘šÉ ˙ýĹÂčĎDâ.>›ŽřÇY“‚’A}ë}Kć˙šÔ†ĽŢuŁo™ţäĆ#űľ?WŘąćŕ®>őcÂß:Óëă.°€ý [ô DCŔsÂł…<`»p’rČĺ(Y2đÂ%\`&ýh ŢĐ  Íľ“m¶ąçĹÉÁ¤‡\Ő™«?ý ®źňČíłKC ă.>;ÚŽ~ŘvôćiO|Ąv”oÉ 'ăâ¦5ćßńtŮ7źz<üű$vží:żřO[˛!×TŹôíŇƸKě`?č}Ńđśđl!Ř.śĺ˛@9ĘAd—4ü;Ü<퉛Z;ÝŮ™đz¶ëü˘Ý[‚ňˇ^ßw©€ťěݢO ˛Şž-äĎE€™ ś @(G9Č‚,đ*,™3IS€†Ô–HxÚ;Ď~}ňĂéľŕĎ|ˇÓŁzDÖŠgă1A{NK‰äzÁ?© y·Ď.Mž]°ó˝ 2Ë»ă.°€ý [ô äB@uÎł…< şĐ”Čĺ(Y>Pb%S ' AcöĐŞ‰Í޶ŁéŃ›§=‘ŃT”á.Ő\őÉl*J‰ä%J7,o=ÝŢŢy.ľ´ćŕ®Ô†Ľo>ő¸łî??hZc~P•uçÜʶł§“ˇEë6­ ¸aę˙ÇŢ˝ÇX]ßůă˙h‘ÂÄ™…Üş¦ÝÖ4ę×6íîwk¶ý¶Ý¦mšf›4m¶iMă 0ĚťKaî—sć#WEŠ rĘĄ ( "W‘ËŔ0Ěř;h~®‹8 Ýćśóx䕦˙Îçó|ľy›w>cú„óŔ÷RÁ™ÎŔn±OĐ E@Îe^f„ WáDä]9‘CtA$¤ťŇ)„S‘dé¬G«’xµ|ߎžöçďĚž\›Ó;ä:•ąÓ­"3(şÎ[·?|âÜŮŘjĐăomŠ6čöY®ŻÉ֠ʧo¤0<đ÷Kęw4ŮŞ!餍ËSBąŃ ¸”jŚ{©ŕLç`·Ř'č…" ç2/3„«€p"rŠ€.śČˇ ş Ň‚Biň)‡łôvŁUIĽšţćú;ç–ţËăĹ×Uf%×椻ub®ú¤†óŇŚ%ďn[ąçŮóÍ1W˘úmëoś2*Ú ”Ú\ úřFj÷ʬ`ü˝w-ťľçäńŮĄŹnxţŁţŽcÜKg8»Ĺ>A/9—y™‘$\ţ…‘StAäD]Đ‘ ‰’O9D’°íIâҤŤËż¤ţŽY‚˛Á××dß)tßÄ\Ő‰¦„r’A=ކ=˝ëőX,QŃĆŁ%ş}Ö„čź A˙ý™Ô‰ä®^řř[›vź8–»4űŻ ţôÜĚŻ×?Ü«z„ă^*8ŔůŘ-ö zˇąĚ‹Ťü áň/śś"  "'rč‚.„Ŕ P¨’|Ę!’,Ŕ€őhOY˙ܰUĎÜA/!—y±‘Ä[ţĺ‘StAäD]Đ©T UQ9De°-Iâ̸ Ďoz©gőđ 4Ă-*sMn¤^_ń€ďĎ-)\»xööŤ±ŘŁI—÷¨¦DźžÔp~׊ˇŃwš»zá™óÍqżK[Z[Ç®_6ţ•şWfőĺĄË€1îĄÎś€Ýbź Š€„ËĽäČâ-˙ň‰Č)ş r"‡.č‚`Č z„‰¨"Ď2 XŚ–$qäč™Óá7ÖLÚ¸<(”f¤†ó]-1×äRjP6řçOŐÜ˝lÖ˘Ý[c®GŤÍç궬©}}µ}2éu˝CyÝ*2“j˛‡Ľ±ţĐž1[ęRŞ1îĄÎś€Ýbź Z€„‹˝äH‚-ůȏȡş r"‡.č‚l ę Ş("Ďb XŚ6$q¦[Eft’ks\ž2×đFjďP^ô˙|wÎÄoÍxôtóąëŃ‘ĆS»OËXń— x€*}2©áü”ÚÜ®řćic ×.NĄzôĚé{žźÝß«z„0ă^*ŕLŔůŘ-ö JˇH¸Ř Ź!Ř’ŹüŠ  "'rč‚.Ȇؠ;¨Ź¬J#"-É€­h=gÜ1×üRjßHáŤSFýëăűؠĆćs§››.|q¸4Łw(/Ý;ýä͆óoš:ú+•Ăj__ť8őěůć?.ť” –cÜKś 8»Ĺ>A)´ {á‘"¤ZňT‘CtAäD]ĐŮtĹ‘UiD¤%°­Gâ’›#ćÚN÷ʬ˙\P×Ôr>:±Ř ˙űÄä´pţ ‘Â4oóNP2hÉ»Ű˘ŻµĄµ5q6ęďMëY=\Ś1ţ… Îś€Ýbź Z€x‹˝üR-öŞČˇş r"‡.č‚xHZî«4"Ňň ŘŠ#ńĘÍsM¦o¤0©&;ôĐďM;~¶1FëóźśÎďÎsńÓs]eVP<`Ůží1z×řďóĂyĺßšńčŤSFF#!Ć˙ÂgÎŔn±OP -@ĽĹ^~ ‘{dUäP]9‘CtA<ä­AeÄU ‘jy¬D‹‘xĺćąú7R»Wfăď¶ę™WŹě?xúD̵ćč™Óß™=ń‡óĘ{‡ÜHýďIŻ+>čËÝphďć÷śomIśEú“ů•Ńż=ą6'ÍĄTcŚ{©ŕLŔůŘ-ö JˇȶŘK‘ !ĎbʬŠŠ  "'rč‚.Hü /¨ŚÄ $R-Ď€•h1×Ü1Ws‚˛ÁÁ„űŠ7˝´lĎöCŤ'c®/›ß?đ“yżxş¦{eVRÍ/ô“»Ćɵ9Áä)µą+÷ďL¨ÚŇÚúó§j’j˛ÝH5Ƹ— Îś€Ýbź Z€l‹˝ Â,ö«Čˇş r"‡.č‚„ČĘ‚ľ­L"ŐR X‰V"‰ŔÍsu&5ś” ŞŰ˛¦~ŰúÓÍM±X–5ßůŢśIAiFĎęáéŢé§.Ąv)rűĚ ŹżµiŃî­‰ł<÷ťlřý’ú?=7ł[E¦cÜKgÎŔn±OP -@°Ĺ^ a{ÄUäP]9‘CtAB°N•eZ™D°Ą°­D„›#拝HaJ(7(Íč^™U˛iEŚÖdŃî­ĂV=óó§j˘HßHˇ×úÉŤÔUÉýoź5aÉ»Űjsn;vč—Ď„‚â_®ĚtIŮă^*8p>v‹}‚RhR-ö˛$KH˛Ě#±"‡"č‚ȉş  ‚ŤŞ)hŠÜĘ$‚-Ő€}h%’8Ü1_ÜĄĹäÚś 4ă¦©Ł Ö,ztĂó1Ú‘E»·Ţ6s|0類ŐĂ]JýôűŤľÜ_<]3äĺů u)uÝ{»‹6ľřű%őAńy0Ƹ— Îś€Ýbź Z€T‹˝,É’,óH¬Čˇş r"‡.č‚`ŁŞ š"·2‰` 6`Ú‡$7GĚńŤÔ¤šě lđíł&Ü˝lVń¦—b´‹voť»ăŐoÍx´[E¦źLz]AĎęáAiĆżÎ)^hOB-ĚčßűďO–E÷÷¨Ö/2RŚ13ç`·Ř'(… Ňb/N˛„ËA)´y{‰BśdXŕ‘[‘CtAäD]Đ!At]±D¶e° -C–›#¦çúšěyĽř[3]¶g{Ś6˘ąĄeŃî­Ań€.ĺCRĂůŢé_J ç÷ çýp^ůwfOv‹}‚R(2,ö†PI,r.Ć"‡"č‚ȉş  Ň‚héŠ Éň‰„‹:|AýőX¬AŰŹŘĺćiϤ×t)ÝźµęéÚ×WďúŕhŚľĄµőîełşUd~©235śďFę'ď7ú4‚ŇŚ x@ń¦—˘Ż¸ˇéL˘-Ă©[×}˝ţáčCHŞÉîëRŞ1Ć˝Tp&ŕ|ěűĄPXěe ˇ’Xä\ŚEEĐ‘9tAŃŇ´@E!—vř"këáŘV±ËÍsŮëŠn¤–f¬Y4jÝâŁgNÇhÔ÷źjČ]˝0sŐÓAÉ oö˘·ś\›Ó«zĤŤË]˙|bnÂéo®żyÚî•Yn¤cÜKgÎŔn±OP ]@ze^Ň+qEČĹXäP]9‘CtA`.@äYDr‡«PXŹČ´÷]nŽ6®+¦ÔćF'űŻ 2W>»!ßrô`Ĺk+xń‰ čţ.ĺCnpńđ“‰FßoP6¸O8ď‘őĎ%ć¬ß¶~ęÖu˙8eäWކą”jŚq/ś 8»Ĺ>A)tŃ•yyC®!—d‘CtAäD]Đ™AŔ„ůiEČe®N[=%;ĐŇ#vą9b.}]1”űĺĘĚÔp~ÖŞ§c:á[Žüĺ3ˇ`ü˝Ý+łúEFząź~Ë=«‡ß2}ě–A)tŃ•yyC´D —g‘CtAä9]@ÄFĚd™lAEÎ%®z==1 Đş#vą9b>™>áĽäÚś[¦ŹýĆcŹŚĺ…ŘMő;'Žîúŕčm3Ç“F˙"—R/šč3ąuƸŻŐ˙ąöőŐ ¸ôN7źŰŃpdÁ®7‚IůFŞ1Ć˝Tp&ŕ|ěű˝@$VŕĄé’OÄ[¤EEĐ‘Cät]I“y^°‘9~¸&ĹôÜ,@»ŽŘĺć‰NZ]Aj8˙kőľľzĬíŻÄnž[?üđŕéň5úąuxÉý•Şa‹voMĚŤwö|sŐćUÁÄţI5ŮâaŚq/ś 8»ÉŃ ÔA\^đ.áDĽĄZäP]9DNб6GÔeYuů‡kUFĐöłč]nŽ ×ĂůAŮŕ•űw¶´¶¶Ćržśú %”ë…¶ő˘K3^ŘűVk˘nĽ’M+˘O@Ś13ç`·`źčJ!«˘Žř d"ŰR-r(‚."§ č‚đČ›ś#ç⍬Š:*Ŕµ­ˇÇhűŮrÄ.7G|@ł{eÖŽ†#GOťom‰Ý$o8´7%”{Ëô±©á|Żő˘ůř©Ý*2·;}ŃÍ-- ¸ë˛V=}7OÓ'ś'Ć÷RÁ™€ó°[°OôĄTQGĹL,‘jÁ9AD‘ÓtAxDN‘p!G\Ą-ŕÚ¶ĎĂ´ú¬8b—›#‰9éu)ˇÜ 4#©&{۱C1ťáů;7łţáoĎ.Šţ-˝C®^ü˘{UŹřÇ)#w4Ů~üpÂ.şŚ‰f#ą6ǵecŚ{©ŕLŔůŘ-Ř'z^H)˛'„b&“Hµl‹Š  "‡Čéş ?R'Ű·ś#®Ź"ĐJç‘Ú{ö±ËÍ‘D›ľ‘¤šÁ¤‡ľ5ăŃŐŢYhOLxÖöWnś2ęşĘ¬äÚśtď÷âť}Ńßx쑍‡÷%ň–´b^j8_BŚ13ç`·`źčz!˘ČąŠ™@"Őâ-r(‚."§ č‚üž`#آŽÄ <ę@ç©›kďŮlÄ.7GgúEF^W™L¸ďgOUĎ{űµŐމéč–lZń‡%Ź}göÄî•Y7D ˝ß‹ŢuP2č?ćWE_ôŞ»vżÝ÷Âśč¤Ő¸”jŚq/ś 8»űD/Đ ůDÎEQŇD‘r‘CtAä9]@äGö¤‘–v„VćŃ:UË<^KĎZ#vą9’ źÎěV‘Ý×Ňé%›VÄú7RÝđ|ö_Üv ö‰^ ‰ ¤° !ň,ç"‡"č‚Č!rş€.Ę3Â,đ­ĚŁtŞ~yČ–žťFěrs$î'˝® (ÔůÜěż.ŘŃp$Ö[öęË=«‡Ą)ˇ\źIýěĄÔ`ňŔ?.ť}×íMصvşąiČËóٱ cŚ{©ŕLŔůŘ-Ř'zjH&B.“ň&ł¨‹Š  "‡Čéş BB(ĚH˛Ě#´bŹ^Đ9›ĺ9Űx’Fěrs$Ž'-śß˝2«Kůß<;ĺÄął1Ô3ç›§n]ٲ6(Ü;äó——UÂҌź=U˝űı„]hűO5DC2jÝâ`b×–Ť13ç`·`ź äÚ!“H¸XŠśř!ÉŇ.r(‚."§ č‚ɡ#ĂbŹÜŠ=ŞA§-”năI±ËÍ‘¸ü@jźp^Ďęá)ˇÜ?,yě× #1ŃĂŤ'ź}gKŮ«/E÷e˝ß‹&5ś}×˝ŞGüvŃÔ_<]sülcÂnł='Źß÷Âś`Ü=]+†öu)Őă^*8p>v ö Şˇ ‰xK¦ÔÉb,đ"‡"č‚Č!rş€.’(J/,üČ­äŁ tâyěÖť¤»Ü‰ż©I5Ů7MýŁyż[4-¦Ăyđô‰ ‡öć®^Ś»§[E¦›†źťŢˇĽ"…˙1żę§ó«yŹí>qlăá}.ĄNzHNŚ13ç`·`ź :"ŤČ¶| žÔ!Ă2/r(‚."‡.č‚ ¤č"·ňŹčJ>:Bço‡oÝI±ËÍ‘xúnfJ(÷ćicľ^˙p˙ĺsc=™GĎśľkéô`b˙¤šn~vŇ>ş”}ăżyvJ‚/±#Ť§~öTuP<ŕúšlQ1Ƹ— Îś€Ý‚}‚j¨‰"ŘR*{ň†KľČˇş€đş  ˛$“‹Đj˘+üh 1Q/®“4b—›#qrK1śă”Q=ކŤ]ż,Ö3yö|scóąß-šÖµbhş—ű9—RűEFöĺĹú'q;$-?śWMľ¨cÜKgÎŔnÁ>A54E‘jA?aCz…_äP]@äD]ĐY’LqEV‘Cé~”…*‹×a×I±ËÍ‘8ôş‚`ňŔúmëĎśonni‰őLŢ9·4úGőŤ¦yąź÷şK32W>uö|sSËůß`Ń´¤„rĄÂă^*8p>Ř ö Úˇ,â‡H˪ʢ«"‡"č"'rč‚.“pJ)‚Š:HŻüŁ2ÄVAĽ‹NŇ]nŽÄúô¨=8kű+gĎ7ÇtĎ·¶Ü:cÜíł&¤×ô çą”úŮé)ěY=<(ş?űŻ Nś;›Č‹«ąĺBZîř(-iá|Ů0Ƹ— Îś6}‚vč‹ŕ!ĎB+ŠŇ…Ä*‚ȡş€Č‰ş  â$˘Â‰|˘,˙č±U oǢ“4b—›#1úĹĚÔp~P68(ôÂŢ·6Ţë—RšÎ|{vQrmNJm®©—|ă]ˇăď­ÚĽ*úşŹž9ťČ[+š–;fMcŚ{©ŕLŔů`·Ř'h‡ĘHÂ,·Ň(W«:Š  śČˇ ş Q˛*“Č$Ú!è€ú»uđšl9I#vą9s_ĚL®Í &ěĘ[ľoÇ {ߊőn9zđ§ó«~ůL¨GŐ0ď÷’“VWxü­MKŢÝvşą)‘÷ŐÇiůĹÓ5ŇbŚq/ś 8ěűíĐyC’ĄW&% AU ‘Ct‘9tA„ QDŃF”®€WfËI±ËÍ‘X™~‘‘=«‡űß1kÂěíź}gK¬goŮžíw-ťţ‹§k‚’A=ކ§{ËźůFjJ(7úpş”™şuťeµáĐŢ}Ľ8ú@˘EcŚ{©ŕLŔů`·Ř'(îH2,Ăb)HH©jŠ  śČˇ ş T$Zn˝k!DSÄ-P%â,öŢť'iÄ.7Gbĺ3©AÉ ź=U=ţ•–Ľ»-‚·h÷ÖoĎ. Šô¨ýëĽâ‹'RŘłzřŤSF–˝úrŐćU6ŐŞ»îś[m´cÜKg8»Ĺ>AAÔGĆ`INB>DäP]@äD]Đą"ˇěÍ *#ÉhBŻi÷­8I#vą9Ňůo¤ö¨řţÜ’ŐމČÍ{űµŠ×V^řđeŮ`w /ůĆ“j˛’A7M]űúj;jÉ»ŰĘ^}ů§ó«\J5Ƹ— Îp>v‹}‚‚h€!˝Â,źňpęȡş€Č‰ş  ˘E˘eŘ;9´FQť"Žsî=Úo’Fěrs¤3OŹŞáAŮŕ_/ŚünŃ´Ť‡÷ĹzŘžŢőúüť›oś2*(T“íŽágż‘záFjŮŕďÍ™ôÇĄÓ}&5ęĄ};n™>6ŘżWő~‘‘BbŚq/ś ŕ|ěűŃ#ŃBnEZPĹ™´cEEĐDNäĐ].$Ě^˘¤ˇ;ÂŚ.(qźm/Ôr“4b—›#ťpŇÂůI5#˘ó«áÎ+ďô‰8HÚ’w·u)” ęĘK÷–?3é®!űţÜ’rtŽž9mµ~t)uýˇ=]ˇ †1Ć˝Tp&€ó°[ětDĹ$á{®r°=C,OŰUäP]9$GĐŁĂ[ŕaĘ öłTŁ( zű#iÄ+7G:ĂŤÔ`ňŔŃë–44ťil>ąó·ĄÝ«˛RĂůiŢďĄ&ýŁĎ¤ö¨–îRę˙oţÎÍ˝ŞGÜqëŚq_«˙sJ(×+ľäKO®Í &ü»OÝsň¸-5kű+˙P›}2}ÂyBbŚq/ś ŕ|ěű5Ń; ÁO€.6§í*r(ş r"‡.肤V%6ł`ŁŠ)~Ţ2%itZnŽ\« ĘEÖo[żúŔ; Mgâ K˙µ¸ţçOŐ|uʨ^Ő#ú„óŇ˝ĺK]J &üőÂČş÷vo?~Řţ‰š´qůťsKo›9>™1Ƹ— Îp>v‹}‚š¨ˇTŕ'ŔÂlN«‘StAäD]ĐIěIlfŮF5ŃŞzGÖŻŚI‰ĂÍ‘«9éu˝CyAÉ  lđĽ·_›żssSËůXŹPë‡ţvŃÔ?=73ą6§GŐ07R/9ý"#»UdăďýÍłSÜHýÄřW^řřÉDĂsC¤PNŚ13ś€Ýbź )~lKŔć´Z9E@DNäĐ]6Ŕ’ÄZoTÎÜ_ĎÜúµÍ$ >t/ő*~(3©&;<°_ddý¶őÓß\ůih:ó»EÓ‚˛Ś/Wf¦yŃm|&ub˙A+ćUm^ĺRę'Š6ľ}2˝ŞG¸‘jŚq/ś ŕ|ěűMüX€ÍiŻ"rŠ€.śČˇ ş o€ ‰ť,á¨XżŘf’F¬psä*ÜIěY=<(đÝ9Y˙\ÜÜHÝ~üpÁšE-źLč^aÓµ|hôí˙éą™‡OZ8˙Ę ŃI ç'Ő¸”jŚq/ś ŕ|ěűeüŘ–€ÍiŻ"rŠ€.śČˇ ş r€ ‰…,áhXżXe’F,qsä ˙PfŮŕźĚŻ|ŕĹ'ćďÜ™ŮphoŐćU\:=p_·ŠĚľî~fŇë ú„ó˘§{eÖ ó˘o˙tó9ŰćcĹ›^ J3˘Ó;ś—.-Ć÷RÁ™ÎŔn±OPŔO€m Řśö*"§č‚ȉş  "XŹXČBŽ‚€ő‹=&iÄ7Gľ¸›‰I5#ş”ů?3ÇŻ:°+nłńđľÎ+&ÜףjXżČH/ú’Ż>ą6'úżznćÝËfY2kh:3çćđk‚I ‰1Ć˝Tp&€ó°[ě”đ`a6§ĄŠČ)ş r"‡.č‚Čv#˛śŁ `ýbŹI1ĘÍ‘/b’kszV˙ó*ľ7gŇĆĂűâ#*›ß?°ţĐžďĎ- ĘűFjźIíU="5ś˙ĐňąÖË'Žźm˝nI0îž®ĺCocŚ{©ŕLç`·Ř'( ŕ'ŔÂlNK‘StAäD]Đ©,FlcQGGŔúĹ“4b–›#8iu˝Cy©áüyĽř–écŹ4žŠŹěúŕčîÇnś2*(ÍH ĺşWřy}8_«˙ó·f<:ŕĄ'í–O44ť)\»8ŘßufcŚ{©€3ç`·Ř'č ŕ'ŔÂlN‘StAäD]ĐÁlE¬biGMëד4bť›#5©áüľ‘›§Ťą}Ö„¸‰GKkëöㇻWfőŞ‘Î÷–۸’ @ôA=şáy[ĺŤÍçšÎä®^” rťŮă^*ŕLŔůŘ-ö úř °3›Ó:Eä]9‘CtAö[{XÚŃŔúµľ$Ť8ŕćHG]KěQ5ě?ćWťomiimŤ›xl;v(úwyżíą•” *ŢôR<˝ý˙˝»–NďQ5ÜŤTcŚ{©€3ç`·Ř'h ŕ'Ŕ¶lNë‘StAäD]Đ ¬Dl`GSë×ú’4↛#˙«‰^_“LzčîełŽ4žjh:7ÁXňî¶ŢˇĽ[¦ŹíÎó˘ŰžŐÉýçîxőpăÉ3ç›­”OünŃ´”ÚÜh~ŇäÄă^*ŕLŔůŘ-ö Zř °0›Ó.Eä]9‘CtAüűKXćQŔúµ»$ŤxáćČß=}#…ÁÄţ…ko9zđpăɸ‰DřŤ5·L{ŰĚńI5Ů˝C.Ą¶ő‘Ü dĐŠ}oGpÖŤÔOůŮSŐwÎ-í)?Ć÷RgÎŔn±OP¸ć‹ÎCđ`[6§]*r(‚."§ č‚–ˇ ŚŘŁ/`ýZ\’ËÍ‘żď3©]ʇăî)XłčH㩸 Ă#ëźűŮSŐ·Î×˝2+Ą67Ý‹ţś·źĘ Ju«Č\¶g»r‘_>J®ÍIŞ‘ΗcŚ{©€3ç`·Ř'(\óEç!ř °0›Ó"9AD‘ÓtA›ĐîEňQ°~m-IŽĺćČMj8?(Í&=TµyŐ¬íŻ44ť‰›$<˛ţąľ‘Â®ĺC“ksnz×—üBnRMvôíß4uôüť›ězĂů´3ÍÍż^é^™•&-Ć÷RgÎŔn±OPč4[Îsđ`a6§E*r(‚."§ č‚(Ö Ĺ‹đŁ5`ýZY’ËÍ‘+řDfiFŹŞáµŻŻ.{őĺxĘ@áÚĹą«¦×$ŐdűFj—RŇÁ˙öÄäŠ×VÎßąŮęř´Ý'Ž Z1ďźvDTŚ1Ć˝Tp&ŕ|ěűÝNµĺ<?¶%`sZ¤"‡"č‚Č!rş€."`ZĽČ?ŠÖŻ}%iбÜi×'2KÝ~lKh»ţ‹ÍisŠŠ  "‡Čéş Ą`×a»"9(Xżö’¤ÁIŔ{]ʇăîÉ]˝pŃî­qv#5jŐ]·Î×­"3©&;ÝÍ 6&R” ĆßM‚o¤^Ňś·6ţü©š;ç–^W™%KĆă^*8p>v‹}‚6Aě.4ĎÇŻ€m m·Ţñ6­M‘CtAä9]@d,:ěU$ťë×R’4¸"‰vO$(0iăňČ–µńwqŢŰŻÝ˝lÖŹ˙RŃĄ|HßHˇ;A—MBɦŃ$44ť±>kć›ţąţá 4#©&[śŚ1Ć˝Tp&ŕ|ěű…‚^hžŹ_«DÚÚ´6EEĐ‘Cät]WŔ–łTŃÔ ¬_IŇ %ÂÝôş‚>ἠÇ,\°fQkÜ˝Äúmë ×.ţAń€žŐĂÝ"l# ˝C’е|čż-U˙Ď3óÍ _ݏ[E¦,cŚ{©ŕLŔůŘ-ö :q°Í<"żV%ČłµigŠŠ  "‡Čéş ®€g©˘ hXżÖ‘¤AŠó‹!‘”ÚÜ lpźp^îę…щł×7uëşđknś2*(ŕ»–mLôÉ$×ćD“^WŤAÁšEşIÓß\_űúę›§Ťé^™%NĆă^*8p>v‹}‚NA|¬2OÉŻ€m ÂlmZ"‡"č‚Č!rş€.H,`Ĺ٨(ĘÖŻ]$iĐâřFjrmN—ň!ßxě‘?=73.ď!Îykc×ňˇAÉ ”Pî ®¶†UĂľ5ăŃh|&µ ównî^•%QĆă^*8p>v‹}jEśí1ĘŻ€m‰ľK˛µi[ŠŠ  "‡Čéş ´`łať˘)čXż‘¤AŠż› éu)µą×UfÝ1kÂŹ˙RQĽéĄ8{e§›Ď-ß÷öüť›ÉÓÜýąlBÂĐ/2˛âµ•ú~IgĎ7Gµh÷Ö 4#5ś/6Ćă^*8p>v‹}šEś-1ĎĘŻ€U‰˛K˛µi[ŠŠ  "‡Čéş ·`­a—˘,¨Xż¶¤AŠłk ˝CyI5ŮwĚšđÍú‡çĽµ1Î^VCÓ™mÇE¶¬ &Ü×­"3ÝĹźv„á¶™ăżůŘ#á7Ö(ű%56ź›şu]Pt4Q2cŚ13ç`·Ř' \Äĺó¬ü X•hş[›VĄČˇş rś.  ˘ v)ú‚–őkIt ¸ą’ÎO çß2}ě?„rVx'Î^Óéć¦#Ť§FŻ[=T“}C¤Đ•ź¶'†o<öČ?Ôć,yw›šžłç›/\sžôDcŚ{©ŕLŔůŘ-ö čqĽÁ<.żV%j.ĂÖ¦=)r(‚."§ č‚ô‚…†-ŠĘ h`ýÚ?’(~î€D “j˛÷ś<ď¨őĂďy~v×ňˇinú´{şWem9zPÁŰUKkkíë«Ň i1Ć÷RÁ™€ó°[ěP1â{}yb~¬Jt\€­MKRäP]9DNĐŰ +­A×Ŕúµ|$ :PL_úHŻ+čÎë^™uÓÔŃ MgŽźmlŤÇwô§çf&Őd§†óÝKmĎgs{UŹřreć¶c‡ZZ[üóä®^řµąŃâDs%6Ćă^*8p>v‹}ZF|ď.ÍŻ€=‰‚ °µiIŠŠ  "‡Čéş É`•as˘8¨Xż6ʤAŠÝ}#…]ˇŢ9·t×Gwź8—oç—Ď„ľ7gŇŤSFőçąăÓö×rSBąAiFôYEó°łá}ŐnCÖŞ§ŁŹ+ą6ÇĄTcŚq/ś 8»Ĺ>-#—çćWŔŞDµĄ×Ú´!EEĐ‘Cät]f°Ç°6Ń4¬_kGŇ ĹčŤÔUâűü—ŠíÇÇßKiimŤţiżZîÎűřK©.ř´ť‡ lđ÷ç–¬{o÷«Gö+uî^6ëçOŐÜv ö şFâ¬,OĎŻ€U‰FË­µi7ŠŠ  "‡Čéş Ň`}aa˘D¨Xż¶Ť¤AŠ•űéu]ʇE÷g®|Şâµ•;ŢŹżw±ĺčÁ^|âOĎÍ Ę2\Ľě7R/ÜP.ş˙K«ÚĽjὺüyšZÎ?´|n´8×Ufůö®1Ƹ— Îś€Ý‚}‚ş‘€űĘô+`U˘ŃBkmZŚ"‡"č‚Č!rş€.6Ř]X•čÚÖŻU#iĐ:˙uÔÔpţ…©Ąą«FçřŮĆř{ +÷ď˝nÉoM &ö˙refßHˇ=mM¤0<đźćaűńĂZ܆h_îy~vP< Z"źß5Ć÷RÁ™€ó°[°OĐ8sYy†~ěIÔYh­M‹QäP]9DNĐŮ‹ {UBÁúµg$ :Pgľ{ĘíZ>4úż™+ź´b^\>˙e{¶G¶¬ýŃĽŠ čţUĂúEFşËÓƤŐtŻĚ Ę˙ćŮ) Mgô·mN}đŔ‹Oű»élŚ13ç`·`ź t$ň¦ňý X’č˛ĐZ›ŁČˇş rś.  â V–$ …‚őkÉHt N{#µ[Eć×ę˙ü_‹ë3W>Żĺţ]Ńż1ôPRÍ7/;}Âyɵ9w-ťţ›g§´Şn›v6Ľ˙ô®×‡Ľv ö އ%®~ěI´XV­MűPäP]9DNĐ9Ë »µBÁúµ[$ :PçąÁ‘ÎO©Í˝eúŘŻNٲ6.źvSËůÝ'Žm<Ľ/(Ü­"3ú'§»ĽÓć¤ESĘ˝ięč[gŚs)ő˛Ţ;}bĎÉă˙ą .(Íp#ŐcÜKgÎŔnÁ>Aű° dŐŻ€=‰ţ ޵iŠŠ  "‡Čéş ę`Ma1˘\¨$Xż¶Š¤A‡ë,×ë ţiÚŻT[¶g{\>çć––ÓÍMKŢÝL\›ăÂN;/ĄŢ8eÔő5Ů-ź«Ş—ŐŘ|îŰł‹ľ\™Ů'śçľł1Ƹ— Îś€Ý‚}‚b;I©KÍ•R;Ó&9AD‘ÓtAÚÁŽÂVDżĐJ°~­$‡/B'ąľńĄňˇ[Žlj9ßŇÚ—Ď9˛emôoĽqĘČ4·uÚ7éuAÉ qžŹ¦˘ąĄEU/ë¶™ă{‡ň$ÇcÜKgÎŔnÁ>A ±šDÔ%‰ÎЍťi ŠŠ  "‡Čˇ ş ó`;a˘e(&Xżö ’ĆçÚ^‘Ct‘9tAĐě"°ýô…‹×Ţ@޸:®Î§0»– &öďż|î¸ Ďo9z0^ćŮóÍĽřDPšý{SĂůn¤^öFjRÍ xŔ-ÓÇ–˝úrý¶őúŘËöl˙Ńçö•Şa}]J5Ć÷RÁ™€óŔn±OPLl!ôC`C˘ž2igÚ{"‡"č"'rč‚.  ŘB`ďi: V®ĄÔq}ˇ—2RĂů]+†e+ţ2äĺů‡OĆëcÜ{˛ˇhă‹Ů]pµť—R˛ÁwÎ-¶ę™YŰ_ŃÄöxz×ë%›VDZPšáFŞ1Ƹ— Îśv‹}‚nbIŁÝH;ÓŇ9A9‘CtuŔ KOQ[°om Ź«ď ú@jďPŢ—+3Sjsű/ź{÷˛Yqü·;4ýÍ Ń?3o×ňˇn ^~"…˝ŞGĄ·Íżh÷Vl§%ďn»ięč`ŇCI5#ÄĚcÜKgλĹ>A=±DŃ%‰bŠ˘ťi݉Š  śČˇ ş€F`˙€Ť§(/Ř´vâÇ5ńEÜHíQ5쟦ŤůőÂČ}/̉ăG·ĺčÁĺűvüćŮ)Ář{Ż«ĚęéÎe'©&»{eÖŹ˙RńŁ'ËWîß©€í±bßŰŃg•ÎďU=â7RŤ1Ć˝Tp&€ó°[ě”ËGýب¤Ú™vťČˇş€Č‰ş  č6Řuš kK „\;x#µO8/©fÄ7{ä;ł'[őL|?·]Ťţ™}Ľ2ŰÇ+Ű9)µąwÎ-˝uƸť ď«^{´´¶.ß·#(ÍčR>$5śź.EĆă^*8ŔůŘ-ö zе#~lHôQíL‹NäP]@äD]Đ´;l9}D‘ÁvµE®©ą|‘ÎďĘűçú‡ÓÂů%›VÄ÷;Üx2:ßšńhĎęáî ¶?!iu·LŰÔr^éÚ©ąĄeůľ·’AňcŚ13ś€Ýbź ­Ř9˛ç‡ŔzD%Đ›˛ĺDEĐDNäĐ]@G°mŔ~ÓJtěUˤ“čËý"#»–ťżss?¨Ö?lj9¤ńTďP^J(7ÍĄ›+ů–núG—RŐ­ťZZ[Ła{aď[Ai†ücŚ{©ŕLç`·Ř'(,VŤěů!°!ŃAŮóľě7‘Ct‘9tAĐ,°ŮÔŤK:Ź˙ýÍ‹ 4cýˇ='Îťmni‰ăµůýI5Ů_«˙sZ]K©íĽŽÚ;”ץ|Čç•GăqşąIÝÚ©~Űú^Ő#ţiÚÔpľ cŚ{©ŕLç`·Ř'¨-öŚÔů!°Q@ÁóĘ,7‘Ct‘9tAP¬°Đ”˝»1N:ŹżűĘaj8ż[EfP6xÝ{»[Z[ăř-Ú˝ő«SFÝ6s|Jmnźpž»6홾‘Â`ňŔ»–Nß}âŘ{§O(ZűŐľľ:ą6':.ĄcŚ{©ŕLç`·Ř'(/6ŚĽů!°Q=‘óâ¬5‘Ct‘9tAP,°ĘT´[«@DélţŽű†Éµ9ÁäéuďŰpho|?źyożöŹSFö¨žĘMwѦ} é^™Śż÷îełöťlP±ö+\»řÎąĄßšńhRM¶°cŚ{©ŕLç`·Ř'č/v‹°ů!°Q:yóúě4‘Ct‘9tAP¬°Ä4›őW:ˇöß°čŮłzxPôŕ÷ćLZ´{ëĘý;ăűÉTĽ¶ň× #ßť3ńşĘ¬"…®Ř\~"…]ʇăď-\»řé]Żďu)őJ¬Y”^WđĺĘĚ”P®ĽcŚ{©ŕLç`·Ř'(2‹ŚyeČ­şIš7h›‰Š€äśČˇ ş€a™€őĄ¶ ďŘ™(ľĐŇ9µóFę…/`N¸ď?Ô…ßX÷7RÝđü óľůŘ#AiĆő5Ů}]lß“NÚ¸ĽöőŐGĎśÖ¬ö¶ę™!/ĎŹĆĚgRŤ1Ć˝Tp&€ó°[ěPL+EşĽ8DWŃÄĚ{´Ę9E@DNäĐ]@•°FŔâR^Đz¬JT^zéäÚľU‘^WĐ­"3Ř˙OĎ͵nńĆĂűâűiŚ]żlü+/¤„rŇŚäÚ7R/;Ń„ô çe»”)\»Xˇ®TÁšE*V6¸w(ĎĄTcŚq/ś ŕ|ěű”Ú2‘+ŻV1ó6-1DNĐ‘9tAĐ),°ŻTtKe—a:ąĎ»O‘Î˙řşÜ}/ĚyŕĹ'öžlďçĐŇÚ:nĂóAÉ  ,ŁOŘ ÁvL¤0Ą67šč˙¶ę™ěż.Цökh:SńÚʢŤ/“Ę’1Ƹ— Îp>v‹}zm“•7 ë—tyˇ6"§č‚ȉş  ¨¶XVZ ęŹ ‰¦‹1±â’źżěQ5,ą6çîełţkq}Kkk|?#Ť§ć˝ýZĹk+IąŽÚţK©=«‡ß2}ě–v‹}šnoH‘wŠ<ë‘8yŃV"§č‚ȉş  čVŘK ÖÖ -áĢ´Ź.ĄŢôŐ#ű$'îW Â=ކ ’1Ƹ— 8p>v‹}ŠoKŤ·Ś„ëŽđxé"§č‚ȉş  ( XA*v6Ę+öÄ´ŁgNi<ŐÔr>ţŘŰfŽO çGÇ}™öOôqÝ4uôţS Ńś´¸“zĺţí‰Éßxě‘~‘‘‚gŚ1îĄÎś€Ýbź€úŰă]#ç*#6ŢľŐ„Č)ş r"‡.čš=6ŹîĄ-‡ÎŞt~[ŽĽuƸďĎ-éĘKsYćďş—š 7—;VCÓ™;ç–ö 祄rĎcÜKś 8»Ĺ>«ŔZ/×i‘ëyÓtAäD]ĐTő Ç Ë =ŐčTü×˙ő°íFpjđo˙€+⿸ůďq€•h7€S €€±ř· \)˙1ΕěC»ś]8úü‹Ĺ?o ťü·9˙y°íFpváčđ/˙Ľ€+â?Ě$ňJ´ŔŮ…ŁŔ?Zü«ţ7üç9€x݇v#8ľp_đŹ˙°€/”˙<»űĐb€Dă˛ŕ-ţUťŤ˙BĐiW˘Ĺ|×4˙hńOčlüw:€«°mEŕ‹ŕŽŕź.ţ%üěŰÁĂ DA÷ßtұAŽV3%,zÜ>Ľĺ:ĚÂí\É»ĽëjËŰśv%ň¬{]ą<.ŔLň7S‹ G˝˛ăŕ6±›©Ą…×!đśŔÍÔrÂěguTě"j3µ„0ň5Ű ŮL-LzD*çč×L­Ěx>i*§‰×L-ěţpşTj×L-ěűdşT*‰×L-ěřX˘Tęé×L­ěőLşTޢ_3µZ°ŃéRx‘~ÍÔjÁŹ"ŐĄ°@żfjµ PÔĄ°Bżfęɵ DÔĄ°Nżfę±µ >ÔĄđýš©gÖ‚âP—ŔŻôk¦žV ĘB]÷č×L=ŞÔ„ş4nÓŻ™zN-(ui<ˇ_3őZP ęĚxHÂfę Á Ô™đś„ÍÔńÁ Ô™°…„ÍÔŮÁ Ô™°‹„ÍÔÁÁ Ô™°‘„ÍÔ©Á Ô™°—„ÍÔşTś+$l¦¶6Î €6Sç­­ýtfś a3uŘÚÂOgŔ!6SëRqc¬P±™:imá§ŕ›©u©¸1V¨ŘLł¶ęÓŤp”ŠÍÔkK>u©ś¦b3uŔÚzO]*Tl¦ÖĄâĆXˇb3u÷µĹžşTj¨ŘL­KĹŤ°BĹfęÖk+=u©”Q±™Z—:°čt]Ü ”4µ.Ő‹Śéł Ë3ußµµ¨ŤćőŮĐč™Z—jü‚©}¶Äz¦nş¶(µ×ř>[€z=SëRm^đ >[€Ş=SëR ^đ>[€Â=SëRM]đ">[€ň=Sw\[”Úńiü·ßöíä°a‚ óOÚNˇ%ńZ *„ႿNÁgj]Ş‘ořF~¶ ń™Z—j᫿”?-Ŕt|¦ÖĄš )ź©Ç­-J€G¨ůL­K5,‚>SëR … ĎÔşT«@ˇé3ő¬µE©đYź©u© Yź©u©® eź©u©® eź©u©N qź©u©N qź©u©N qź©­}ĚáßŔzÄ}¦ÖĄş[(ô}¦ÖĄ:Z($~¦ÖĄ:Z($~¦ÖĄş[(ô}¦ÖĄ:Z($~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ÖĄşX(T~¦ž˛ö1_ Sů™Z—ęb Pů™Z—ęb Pů™Z—ęh ř™Z—ęn Đ÷™zĐÚ˘TxÄĎÔşTw …ľĎÔşT§ …¸ĎÔşT§ …¸ĎÔşT× …˛ĎÔşT× …˛ĎÔşT …¬ĎÔşT7 …¦ĎÔşTĂ@!č3µ.Ő¶P¨ůL­K5/R>SëR- …ŽĎÔłÖ–¦ŔSD|¦ÖĄÚ ź©u©¦€Bľgj]ŞÁ î™zÜÚŇTx„jĎÔşTË@ˇ×3µ.ŐţP(őL­Kő  é™zâÚÇęüšx!už©u©ľş%p3ő¶9ˇ€Ô9đi›©w ŐŁ. €N×fjˇ€ÔQPÚL-!ü“¦ş+E›©őľ‘4€ÉŮL-śő™¤©;ď.`‘š©u©¸@ ťš©u©8? ©š©u©8? ©š©u©¸= µš©u©¸= µš©u©8< Áš©u©¸: Íš©ç®-ęÔĄp'Íš©u©89 Ůš©u©¸7 ĺš©u©¸7 ĺš©u©86 ńš©u©¸4 ýš©u©83 ›©u©¸1 ›©u©¸1 ›©u©80 !›©u©¸. -›©‡®­ôĄp39›©u©8* Q›©u©¸( ]›©u©8' i›©u©xąę6SëRńf(4n¦ÖĄâÁPČÜL­KĹk Pş™Z—Šw @ˇw3µ.Ź€Bňfj]*ž'…đÍÔ×Ö„:î'3µ.E*…ÎÔşT©R8SëRQ¤PâL=zmѨ{ŕ6Ę8S/ł¶’Ô%p)}ś©®¦rTN$”3őÚY˘ÚT” ŔY´r¦Ţ§LźĘQř…bÎÚŰ&ŠrT>ĄEŕ;BTľŁBŕGúS ]*pť­6@ endstream endobj 403 0 obj << /Type /XObject /Subtype /Image /Width 5000 /Height 1419 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 31416 /Filter /FlateDecode >> stream xÚěÝKb$É‘DAÜ˙ŇĹ-7lV'Ň"ĚTENPé˙xiţüçđ?9!€oQZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- Ăó”Đá€yJ čpŔ<Ąt8`žŇ:0Oi§´€ĚSZ@‡ć)- ĂüżR`\`jwî@đ˝ďî4ĐáTźNđĘŽ >Tx|ŰP 0Ľ˛ő@‡¨ †t8pk"€Ď*Đá@‡+t8pU€Ż+Đá@‡Čřü7 Ă‹đŕ1¶˝t8pQčp@—żi\€ŹŹ)°ĺť Ă‹@‡ľúÍčpŕ¦|xLÝî@Ü:đÁo:@‡7ŕ#Ŕc ětčpŕ¦ĐငŻ}3:¸)S`›;@‡7€$|ę›ĐáŔMřđ{Ü:¸)t8 á;߼€n ŔG€ÇŘŕĐáŔM Ă ů¦t8pS><¦Ŕöv€® řÂ79 Ă«đŕ1ö¶ólSpUčp@Â÷˝é\€ŹŹ)°łť`Ł‚«@‡ľîMčpŕŞ|xL}í<[\:đmoŠ@‡Wŕ#Ŕc ějçجŕŞĐင/{“:¸*S`O;ŔvW€Čp`ż‚ŕ#Ŕc |Ö;@‡w€6´o+°cÁ] Ă%ő& t8pW><¦Ŕvv€= î Hř¤7U Ă»đŕ16łăěZpWčp@½ÉÜ€ŹŹ)°—`Ű‚»@‡ľçÍčpŕ®|xLťě8Ü: Ăť :€ŹŹ)đ5ď4\:ŘÇ>­ŔÖ—…łÂ˛(yź›0đm . g…e€‹Ý­¶±Óě]pY8+,ĐငçąßÖŕ˛pVX6¸ŘÝŠ`; Ŕî—…łÂ˛ĐáŔîAĹYe€‹Ý­çNđm . g…e:ŘÂŢČ`˙‚ËÂYaŮ€čp`˙. g…e€‹Ý­žć°Ámᬰl@‡Řě`Tś– ¸ŘÝŠŕeî0ßÖŕ¶pVX6¸ŘÝŠ`˙z"- n g…e: Ă- ‚ŠłË»[ĽËŕŰÜÎ Ët8°}=‘Á·…łÂ˛ĐáŔÜÎ Ë»[ě^‡ŘÄŕ¶pVX6 ĂÝë‰ 61*Î ,\ěnEđ*w€okp[8+,ĐáŔćőB»\Î Ët8 óQnćŔ·5¸.ś– .v·"ػΰŤÁuᬰl@‡t8°ŤAPqV`Ůŕbw+‚7ął|[ëÂYaŮ€¶®2ŘÇŕşpVX6 Ă-Orsľ­Áuᬰlp±»ÁÎu€Ť ® g…e: ĂŤ ‚ŠłË»[ĽČťŕŰ\Î Ët8°q=ÁN÷…łÂ˛ĐáŔNÜÎ Ë»[ĽČ`'űÂYaŮ€öíëŹ]Gř¶OGg…e:Ř·ĎmhGř¶OGg…e:Ř·mfGř¶OGg…e:ضĎleGř¶OGg…e:ضŹěcGř¶OGg…e:ضOlcGř¶OGg…e:صŹlbGř¶OGg…e:Ř´OěaGř¶OGg…e:Ř´la'ř¶OGg…e:Ř´Oě`'ř¶OGg…e:Ř´ě_'ř¶OGg…enE°gźŘľNđm žŽÎ Ë»[ěŮ'vŻ“|[§ŁłÂ˛ŔĹîV{öÍë$ßÖŕé謰lp±»ÁžµyÁ·5*Î Ët8ŕµÇ¸ßÖ ¨8+,ĐáŔ–µuÁ~AĹYe€‹Ý­:ŕŰÜ?Î Ët8°eí\đm ‚ŠłÂ˛Xđ7ŢŕŰg…e:ز6.ŘĎ ¨8+°lp±»!ŕ-n¸Á·5*Î Ët8°cí[°ˇAPqV`Ůŕbw+BŔSÜpokTś– čp`ÇÚµ`C â¬Ŕ˛ŔĹîVđm .!g…e:ر6-ř¶AĹYaŮ€čp`C ‚łÂ˛ŔĹîVđm n!g…e:ذ6-ŘŃ ¨8+,Đá€#/q ľ­APqVX6 Ă kĎ‚ ‚ŠłË»[t8Ŕ·5¸†ś– čp`ĂÚ˛ŕŰg…e: Ă ‚ Î Ë»[t8Ŕ·5¸‡ś– čp`ĂÚ±`G â¬°l@‡t8Ŕ·5¸ś– .v·"ذv,ř¶AĹYaŮ€čp`G â¬Ŕ˛ŔĹîV„¤‡¸±ßÖ ¨8+,ĐáŔ~µaÁ–AĹYe€‹Ý­:ŕŰÜDÎ Ët8°_mXđm ‚ŠłÂ˛ĐáŔ–ÜDÎ Ë»[t8Ŕ·5¸‰ś– čp`żÚ°`K â¬°l@‡t8Ŕ·5¸‰ś– .v·"ŘŻ6,ř¶AĹYaŮ€čp`K â¬Ŕ˛ŔĹîVűđm ®"g…eľëÁ~µ_Á·5*Î Ë|×ö+ŘŇ€«čýłÂp€ďzŔ~[t8g…q»KěW@‡W‘ř®űŐ~t8g…qßő€ý ¶4ŕ*ŇáŔĹîRűĐá@‡Óáßő`żÚŻ`Kç¬0îŕbw©ý čpŕ*Ňáßő`żÚŻ Ăç¬0îŕ»°_Á–ÎYaÜŔĹîRűĐáŔU¤ĂľëÁ~µ_Á–ÎYaÜŔw=`ż‚- ¸Št8p±»ÔÁ~t8Đát8Ŕw=ŘŻö+ŘŇ Ă9+Ś;¸Ř]ę`ż:¸Št8Ŕw=ŘŻö+čp Ă9+Ś;ř®ěW°ĄA‡C‡»KěW@‡W‘ř®űŐ~[t8g…qßő€ý čpŕ*ŇáŔĹîRűŐ~t8đ]ŘŻ`Kç¬0îŕbw©ý čpŕ*Ňáßő`żÚŻ Ăç¬0îŕ»°_Á–\E:¸Ř]ę`ż:čA:ŕ»ěWűliĐáśĆ\ě.u°_\E:ŕRűŐ~t8g…qßő€ý ¶4čpÎ ă.v—:ŘŻ€®"đ]ö«ý ľ­A‡sVwđ]ŘŻ`K®"\ě.u°_t8đ]ö«ý ¶4čpÎ ă.v—:ŘŻ€®"đ]ö«ý :čpÎ ăľëűliĐáĐáŔĹîRűĐáŔU¤ĂľëÁ~µ_Á–ÎYaÜŔw=`ż:¸Št8p±»ÔÁ~5ҠçþëÁ~µ_Á–ÎYaÜŔĹîRűĐáŔU¤ĂľëÁ~µ_A‡ÎYaÜŔw=`ż‚- ¸Št8fÖLéţ°"ŕÔÎu±_˝ÔĂ×–šŇá,j6O©:śGĐZiŢÖ śŮ»†âÂqgRCV—ˇÓá¬j>\”pjępĽ´Tš7„•gö®±ŘÚ™ÔĹeđt8«š‚Ąš:o®’öm`ÝŔ‘ýkDVŽ›I ]UĆR‡Ëz0µ:¸Št8"–őoÝĂťýk`ÖŚ9-XNV‡ t#{|ru8pépÜ_ľŐÚ€ďúw˙í6Ëę…d”u¸¸á6ČwçW‡¤ÇýµaÉŰpn ÷†Ę¤zjĂň4ÜçW‡GŁ—÷†gŔÉml&“Z~WoClYóú ëpŕXÔḿ,48{ÎncőÜ™SweńÝčuíP95Ĺ:8u8c~˙ńüJۆćąAHúAg7˛K&pf=A¶_–ËgUÜT9†'ô3 \ž]Ć˝ŞĂ%M¸łH‡Óá":ś-šşSÍ©VqrŠ|J™0TĐáÖM“#<Ât8îţm Zş:ś·y/»dŽ\8^#Yץ!óY7KNý/Ç8u8cţƧL¸I‡ÓáR:ś šşSÍŞVqwŽ|J­ź)CŐŃá6N#<żt8îŐ·WÚŢ0:ÜӿŠݩfU«8=I>Ą–O“Áęčp;§Ç‘_:św˙6+ąţ,]N‡[Ľť]2_ł*VÜž$źR»gÉhut¸ĄłăHo/N‡»›ő\}Ž N‡Ű»ˇ]2_łŞU\ź$źR‹çČ€•t¸µSăH//N‡»›U]{Ž N‡[»ˇ]2_łŞUÜź%źRk'ȵt¸˝ăHď.N‡»›•ÝyŽ N‡űń_ŘŢ©&U«H&źR;§Ç Őt¸ÍÓâHĎ.N‡{őäŮ•¶O ÷Ěo±=SwŞ9•*2ćɧÔĆą1p=nő”8ŔŁK‡Óá^ý÷xuĄíG…÷Äo±;SwŞI•*RćɧԾ™1t5nű„8Ŕ“K‡Óáîßfť7ťŻ{®¶ĂŮť±;ŐśJ13ĺSjŰ´Ľž·~: ŕĹĄĂép÷ołŇkÎ×˝×ŮálĎŘťjNĄŠ ™ň)µkR _O‡;0ŽĐt8îŘ߸Üq»·‹ŁB‡ţ-vgęN5§REÔTů”Ú4%ĆŻ¨Ă] GčA:św˙6+ľŕ|ÝëpeÎćŚÝ©&U8Ęš*źR{&Ä6u¸3áH=H‡ÓáîßfŐ×›Ż{®©ĂŮśˇ;ŐśĘFqsĺSjÍtæwc  ép:Üý۬űvóuŻĂőt8›S‡3§RĹ‘ąň)µe6 bS‡;2 ŽĐt8îţmV~µůş×áJ:śÍ»SÍ©f”7Y>ĄvĚ…Q¬ępWfÁ‘z§ĂÝżÍę/6_÷:\C‡ł7SwŞIUá'˧Ԋ™0ŽMîÎ8@Ňát¸W'Ţs+mß8*t¸™ßboĆîT“ŞÂEΖO©ó`$«:ܡp$€¤Ăép÷˙ŞäJ[´s:ÜČo±7CwŞ9•áRg˧ÔëÓ`(»:ÜĄ p$€¤Ăép÷˙ŞäB[´w:śZS˙Ńô÷żŢśŞp±ÓĺYňö$Ě®wjř  ép:\DIpdmŮ<Ž îűżĹÖLÝ©ćT„Ëť/Ż’—§Ŕhvu¸[ŁďH=H‡Óá"jŠ#kËîqTčp_˙-¶fčN5§2\ň|y”Ľ9†ł­Ă|GčA:św˙ŻJ.´EűÇQˇĂ}ů·Ř™©;ŐśŞpŃ3ćIňâđѶwmä  ép:Üýż*ąĐm G…÷Ýßbg¦îTs*ĂeĎÉ{ŁoHŰ:Üąw$€¤Ăép÷˙ŞäF[´:Ü7‹ť»SÍ© §{#źr˝űK#ô N‡ËpgÖ’-ä¨Đáľř[ěĚŘťjNe¸ô)óyičŤj]‡;8ęŽĐt8îţ_•Üh‹öŁB‡Óá.,Ů—¶9•áâ§Ěs$őľr-ëpÝ‘z§ĂÝ˙«’mŃ&rTčpßű-vfęN5§*śdÜ {ĐôâŻ<9ćŽĐt8îţ_•Üh‹v‘ŁB‡űÚo±3CwŞ9•á!ĂnÔu8Đt8îđmćF[´Ť:śZsaŐľř›Í© W1iúůA7˛…îć;@Ňát¸ű·™mŃ>rTčpjÍ…eűŢO6§*ś&dĚ yŘôÚO<:ŕŽĐt8îţmćF[´‘:ÜW~‹Ť™şSMŞ ' r#žv˝ő ŻŽ·#ô N‡Óáś`:ś·¬ĂŮ©;Ő¤Ęp-łf xŃôŇ<;ÜŽĐt8îţ_•Üh‹¶’ŁB‡űÂo±1SwŞ9•áj¦Íď˘Cčťßww´  ép:Üýż*ąŃí%G…÷űßbc¦îTsŞÂőL›!6ÜE‡Đ+?ďđ`;@Ňát¸űUrŁ-ÚLŽ î׿ĹĆLÝ©ćT†+š6#l´‹!΂=H‡3ćŤńńŤćĚZ˛›:Üo‹}™şSMŞ ×4mŘ`Boü¸ËCmĹ‚¤Ăép:ścL‡Óáöt8űR‡3©2EŔĽŢç¶ń}ýzá·ťi ô N‡Óác:ś§Ă•Ýs/üXs*ĂUMśŃ•<‹N!Κ=H‡3懮3Ż0N‡Óát¸†ťjRe¸®‰3¸Š§§ĂY´ épĆüźĆřüFsf-ŮOŽ N­ą°z˙­&U…+›8c+xťBĎ˙°ŰĂlµ‚¤Ăép:śL‡Óá¶t83t§šS®mć ­ŢYt =ţ»ŽŹ˛Ĺ z§ĂÝ˙«’mŃŽrTčpjÍ…őűđ/5§2\ÝĚYąłčzúg]dkô N‡»˙W%7š§Ăet83t§šT®oć ¬ÚYt ép.čA:ś1×áxmK9*t¸Ź‹Ť©Ă™S•"fꌫŘYt=üŁÎ±• z§ĂÝ˙«’mѦrTčp:Ü…üčď4§2\áÔV­S‡úQ÷‡ŘJ=H‡Óá26š3K‡Óát8űrĺN5©2\ăÔU©łčzô7ڰ… z§Ăép3N‡[ĐálĚĐťjNe¸Ęą3¨JgŃ9¤ĂYĽ épĆ\‡ăµ]ĺ¨ĐáÔ®ufe8sgüu¸ĘsčÉ_”0ľ–)čA:\}‡ Ůhά%ŰĘQˇĂ}ö[lKΤŠI“gH‡÷†AŐát8piBĆýj‡KŮhÎ,N‡ÓáěË…;Ő¤Ępť“gDg·†1]u=ř"†×*=H‡Óát8ç™§Ă˝ÝáěËÔgNe¸ŇŮ3 Ł[öv¸ŚáµJAŇáĘ;\ĚFsfép:śOzűŇśz;šß%Óg<'·†]vép0čA:ś1×á/6ÎLÎľ4§ćÔôîť>Ă9¸3 č¶č±ź2¸Ö(čA:\w‡ËŮhά%;ËQˇĂˇĂ™SÎüM®č$Ňá¬`Đt8c®ĂˇĂép>yěKsZú|4 ¦Ď`Îí ăYŰáRĆÖ=H‡«îpI͡µck9*t8t8s*Ă™@c9¶1 çľ“H‡ł†AŇጹ‡§Ăůč±/ÍiĺűŃx•do Łąđ zč·Äڬ z×ÜáĽxťi:śgwép$Nf`ÉüJ®č$Ňá,bĐt8c®ĂˇĂépľzěKsZř~4[&ĐHm ŮŰárÖú=H‡+îpY͡µcs9*t8t8“jbM ôÚ+:‰t8Ëô Îëpčp:śO{ŰŇśÖ= Ťţž4Ž^{EGŃ#?$hX­NĐt¸ŢçećTÓát8»«ô±aä3Ź'ďC[‡C‡s<€łK2î:ś—YÓ±ć¨ĐḰ” |äńděMˇQنrçQ¤ĂYÇ épĆüŻĆ8mŁ9´t8ÎÇ˝miN›źF^‡KßF˛¸Ă%ŤŞĹ z×Úáâ6šCkÇţrTčp\XËĆ]\ev ˘Wtép2čA:ś1×á^˙gëp:ś6:ś95§˝sh öÄ‘_UxépŽĐt8c~č:;µLďß´:śçÁč˝aNÍ)̡!üţ–8ökt¸ŻţЍµěH=H‡+ípyÍs|ÇsTčph6ćÔ”šCCŮá®ý›u8Ľˇ4!ă®ĂÝëpaI:śçÁč˝aN'Őo›C#×.ţ»s:śµ . Mȸëp.ńCI‡ÓኌW~‰÷«±2§fôâ"ôˇ­]|ď'¤źEăżÁZ†&dÜ:\ŕF;łu8N‡{{d<8î}Ó›šţo÷ˇýŕŽ^t8\šq×áR;\ô“§Ă…?/ţ(î[ăÓ;©÷Ňyź>ĄľĽ!ĽT7źE:śăô ÎëpŰ× §ĂépŻŠřkťÔ„wtÜ·€O©ďn˝¬Ă}úŇ#ô ug…á~˘Ă%n´cë/öhsRčp—wď‹#÷1¦ĂţőYßľĄľşBvręa¤Ă9@ŞţłyĚjŃáŢ˛ŠŤĄĂép‘—ŔíßćbĎ«9Ĺłé·¸Y=™6ýN‡N‡łZt¸­®ekůZĐá/ë?ĎĹţíAézFúBŐát¸KáĂýë_đÇ)ĘŠ‡—×áĽ+}-čpw/€čb7§ “ř›t8.ŕ×čp:čp:śŐ˛ ĂEÝŃ˝®Ăép:ś'±715súň5ŕf ~,Ĺ­bη5čp:ś§ĂÚč:śç;Ă čpćôč¤ćľš}¸YSźJO˙"N‡N‡łZt¸5®sůZĐáb.śébź îöoőAŕf Íp˙¨ë.ď’ňí :śłB‡«íp­;Ěׂr $ýL{ޤö̤ź§Ăy&µ‡8η5čp:śwč:{mČŠ·Ż.ăúť.ö±aźÓüł7kęŚëp: Ă9+t¸¦×˝É|-čp—@Řu±ĎŤBö¤<—}čp©ó­Ăép€ç¬Đáz:\ů.óµ ĂÝżâ~©‹=ď?2V1‘ZŁ'Ă q:śokĐát8N‡óÎÔát¸đK ď§şŘó~« —ň3u¸˘ĎSë[Q‡N‡Óát¸ŻŹ™}¦Ăépç/ŔßZ±˙Ô{óXł`u8§4·ľu8đ‘§Ăép:܇fŁép:ÜůK ňǶ_왿Vť ů©:ś çĹŕ[Q‡y:śgč>4;ípDëp×·gRu¸…gpőG—üóu8Đáś:Üw`Q‡łŐt8.á@JýąÍűŹI•áü\7kňß(ăC\Η›:ś§Ă%ýö·;ś­¦ĂépRěď-ľŘsŻ.ó‹˝d8®ë»ĺG‡N‡Óár~öKÎ^ÓáĚcĆ”ű{/öä¬JĄüdÎoâ|·čp Ăép:Üáźüx‡łŮG´—đ›u¸Ŕ÷ă*źČĄźĹ7« v˝ţóu8Đát8.ä?Úáě6N‡ 9$sŞ®ľ>‡ťOR1ĘOżţ3›żżů}[§Ăép—íSÎvÓát¸”I˛1§&µřŁŰuĂ·˘w>(+:śŐ0ć·ŞM§Ăépq—@Ńő×s±›SýÉ8¸Yß˙Ń}‹:˙[Ń3”Îj ó[ Ő¦{b­LN‡ÓáĚ©şŠu¸¨íůç»Ĺ·5čpÎ «eáßZ¨6]ŃźDť™5®éúÓáň~şü$ÄąYu¸=ż:ý[Ń3”Îj s‹_óµ Ă˝{ U]-{Ó¤ŠOaëX‡“án˙ěěoEŻ|PV«%`Ě­}ÎׂWÝá~blóŐâ Ăép:ÜÖe}ôgűnńm „łB‡ł ě:N‡Ë8$îřŹ×ž„87«§Ăůnńm „łÂ3۰ít8N‡Ű÷ÓÍ©§<-N†»ýËu8ßÖ Ă9+¬–Ĺcnáëpľt¸·¤¶ Đśęp:śápłęp:\ř‡‹og!ś:ś ĂůZĐávHu —÷ëu§´Ą¬Ăy qż=ňAY¬N‡Ólt8sşsëępAŻ.r˛«¶—˙ÝâŰTg…gqľt¸•Rß ¨Ăép˛“qłvw¸“żÜw‹ok!ś:śőoßép:ś§Ă™ÓĽç9đţčpž@BśçŰlgg…gýŰw:ś—w Ţ€:ś§9­.á7ŻčÄoEo|PVô«Ĺ}†ç ­ŮH6ćtďÎŐát¸S˘ĂyDčp:(+zé΢oŘxľt8nŰŻ7§&U†Ű?,:śżDžţýߊžř ¬ČVKŔ[óţ ękA‡Ólt8N‡s[ęp:ś§Ăů¶ÚYˇĂYývž§Ă4ÉĆśšÔşŕtb\t¸ó?ŘűĎw‹okĐáśV˲1·ä˝Ă|-čpšÍ+żŢśćý~˝)o=ëpׯ÷źçŰt8g…Ő˛kĚ­xď0_ :ÜűRç¨ĂépÍąI tłępŚ@Ú·˘>(+j€Ő˘ĂˇĂép:\ÖëpćT‡óRŐár~oű‚űVôÂeE °ZĆÜ‚÷őµ Ă˝ •^‚:ś9-®M†ĆÍúĚĎő‡Xη5čpÎ «E‡#ä¦Ăép‘¬Ăi«;~¶ç€×0ĺ–öĎ˝˙8ß-ľ­AŚpVčpVľ­§ĂépšŤgN7 € ¸¤u¸ÓżÖzÖá|[笰ZVŤąĺ®ĂůZĐáH­w §ĂépFG‡»üs­ç¤oE|PVÄ«E‡C‡łRu¸¸ůŐáLja‡sa.ž®I·¶>}·ř¶9ÂYˇĂY÷¶ž§ĂépÝÍF‡‹›SďŢJY5éÖ¶§Ă˛‚łB‡Ă3Ěׂ×}ép:ś籪Ăép1Ăŕ»Ĺ·5čpÎ «eĎ[ě:śŻN‡Óát8ÎŤąi|t¸ľµ­Ăép ¬čpčpľt8N‡‹™T.ď=<@:ś§ĂE}·řvAÂYˇĂYő:śŻnŐT| ępy#ptĘ\™:ś§Ăépľ­ÁĆvVčpV˝˝§Ăép:ś§ĂépŢ:\ę´[Ű'_€>×}["á¬Đá¬z{O‡Óát8nÓ%cRU¦¬U­Ăép^€ľ[|[ťí¬Đá,z{O‡Óá.ćkP[Őát8C¤ĂYŰ:śĘ V‡WŻN‡Óá‚főÚO÷Đát8N‡ ůnńí ’„łB‡łć˝Â|-čp:śW6©:\ŕ@‡»?﷧ò‚łB‡Ă+Ěׂ§ĂépćT‡ó^Őá~ŞŐ<2>Ö}[­í¬Đá¬y{O‡Óá4Îśęp]ďN‡ ZŰ:śĘŠ€‡GŻ®unu8®©Ăą4· “׸şu¸ŕďßΠI8+t8KŢ#Ěׂ§ĂépműőÖŻ7_:ś§Ăép:(+Z:a:ś§Ăép:ś§Ăép:śçbńm ˘„łB‡łäí=N‡Ólt8sŞĂŐ<t8.guëpÁß-ľťA”pVčpVĽGŻ®ňŰV‡3©:śç Ţ4ő·§Ă˛‚łB‡#yďůZĐát8®v»ęp>oťÁ:ś' çŰt8g…բáĂép:śdcNMŞůŇát8N‡Ëünńí Ş„łB‡łŕkwŻNh]ŘćT‡óyë ÖኳçËt8g…Ő˘ĂŮ:ś§ĂíťYN‡Óá\Ď:ś§Ăép>$ŔîvVčpĽ} Ăép:śĎ`ąB‡ó^Ů:ś§ĂE}·řvYÂYˇĂYđµŔׂ§čp:śçűÖ~]2÷V·çśegEO‡łĘ+׿ŻNĐáĚ©çűÖ~Őát8ηčpÎ Îz·îu8N‡ÓáĚ©gşŚ•§Ă- ęľ1ŔövVčpÖ»%ŻĂép7wDűˇ Včp¦ËXépV÷µŃđˇîClog…g˝[ě:ś§ĂYŘÂŽ§ĂŮŻ:ś7?ľ[|n€ýí¬Đá¬vë\‡Óát8 [ŘŃá _:ś‡ç‡“>aµěskÜÂőµ Ăép:ś9Őát¸ŤĄĂˇĂépŕpŇ(Ś{Úůl¨sľt8ÍF‡3§:ś§Ăy’yępV:čpž4Ćܰ»u8N‡ÓáĚ©ç= Ă%ĎľĎOÎź Ŕá„§ĂcÇśŻîÉÍR^čp:śgŃŇáĐát8p8aÜÓĎgěóµ Ăép:śIŐát8ÎŰĚ#P‡łÔA‡ó¤1ćÝĺ§Ăép:śdcNu8/N‡că|űL·ÔÁ÷¤1ćÝͧĂépšŤ…mNu¸Ć§Ă‘ÝáśRŕhR.Ś»g`s:ś§Ăép:ś§Ă9€ĽŃt8§”ĄŇ„gĚ şkO‡Óá4 Űśępľpu8Î čpÎ ăî>sçép:ś§Ăép&µ+,yµşY=Ôt8Đt8cnDsľt¸w·ŹD‡3©:ś”‡§ĂŁ ănĚŤ§cÎׂ'Ůčp&U‡săëpk^:śĄ¶¸Ť17ć.;N‡Óá|ëp™“ęE Ăépčp:8š4!ănĚ ĄcN‡Óá$Τęp^PÖŞ›甲ÖÁ÷˘1ćĆÜ=§Ăép:ś…mNu8_¸:śÇô„;Ą¬u°Ç˝hŚą!wËép:śfca›S®ňI Ăépčp)đę¬0î‘î8N‡Óát8Τz…yB9€ĽŰt8Đś­‘†Đ1çkA‡Ólt8N‡s˙ëpnžN)kt8Îr7ś§Ăép’Ť9Őá< t8Î!N&Mȸ{Dşßs:ś'Ůčp&U‡ó„ry»épN)kÄ g«1/rç—§ĂůA¶§Ăép!¦ĂˇĂ9¤Ŕɤ wÎŕ9ćt8N‡Óát8ÎłŐZő|ÓáRÖ:Řä4ĆĽyČ^:śçYŘ:śçW‡ÓáĐá|¬€Tg…q_8ćFÎ1çkA¶Ňát8N‡‹yčp::śC | :+Ś»ç^Óát8N‡ÓáLŞ/\ĎV7ś§Ăz§Ă6ÇśŻŮJ‡ÓáLŞç- ĂyÄy:Ą¬uĐážż:ś‡§ĂsI2îž\.®'R‡Óát8g˛¤Ăy†ép::śÎ%Mȸ{rą·ć‡P‡Óát8g˛¤Ăy†ép::śÎ%Mȸ{rŐß[÷ŻĄ«Ăép:śIŐát8N‡ó˝ëĺc­§Ăsă˝űÚĘřÁ–îíUŞĂ9“ý Î3ěÝ—‚µŞMřŢuĄXë`źëpĆ\‡“?t8N‡ł°íTN‡óG9Î čpÎ ăî>;~kEýbKW‡Óát8“ŞĂép:śç{×µÖA‡ÓጹńŢxiĄýdKW‡Óát8“ŞĂép:śç{×µÖA‡Óጹń^wiţdKW‡Óát8“ŞĂe˝Ăt8Î1:śłÂ¸»Ďî¬Čßléęp:śgRu8N‡Óá|ďZ˘Ö:čp:ś17Ţ»î¬Ěßléęp:śgRu8N‡Óá|ďZ˘Ö:čp:ś17Ţ‹®¬Řméęp:śgRu¸¨wXähépčp:8—4!ăîÉUte˙hKW‡Óát8“ŞĂép:ÜŽÉ÷ů©Ăépŕ\B‡óyŕĘúýŁ-ÝŰ U‡s&űAcŕý«Ăépčp:8—4!ăîÉUqe…˙hKW‡Óát8“ŞĂép:śç{×µÔA‡Óጹń–áć´Ą«Ăép:śIŐát8®¤Ăůľ°Du8ĐáśĆÝ}¶ůĆ*řŃ–®§Ăép&U‡‹zEŽ•gqŰw:čpÎVăî>“át8KW‡“lt8“ŞĂépÖŞç»Ĺń¤Ă}®Ăó¸ń.=t8N‡s&űAĆŔ¸}¬t8«ŰĆÓá@‡s¶w÷Yř}Uňł-]ÇĄ§Ă™TN‡Óát8,Qt8–ĆÜxËp:ś§Ă9“ý c Ă+Îę¶ńt8Đáś­ĆÝ}}]ŐünK×q©Ăép&U‡Kz‰ép:śĎ Ç©ńÎYaÜÝgÇ®«˘ßmé:.u8Τ/`®cę-nO‡Î}&Ăép–®ăR‡ÓáLŞç˝ Ăép¸Rt8°Ď}Xs.|Dt¸{kW‡“lt8“ŞĂÉpö«ç»Ĺępŕ öaiĚu¸{˘Ăť[»ˇ×”óH‡3©:śç‚ýŞĂáJŃáŔ>×áŚyÇxËp:ś§Ă9“ý Τép:ś Ç©ńÎŮjÜÝgI °í‡ëp:ś§Ă™T.ç)¦Ăép>4§Ć t8g…qwź);:ś§ĂI6ľëMꝏ6Ź'űU‡ĂŐá@‡ÓáŚyńx÷®>N‡ÓáśÉ~1Đá¶~ŰZ«:®ěsÎëpIˇĂť[»©×”óH‡3©:ś÷Büü§a }bX˘:čpÎ ăî>3:śçP˛ŃáLje`Ňáě×ű\):Řç:ś1oN‡Óát8‘¤ĂyŚép:ś Ç©ńÎŮjÜÝg†âň×át8N‡3©:śç îépľ4,Qt8g…qwź N‡ó (Ůčp&µł0]ţ´µV=}pĄčp`źëpĆ\‡  îŢÚő (Ůčp&U‡ÓáěWÎw‹ŮÓáŔ)­ĂsN‡Óát8»Đ™ě’Ńá‚_cąc¤ĂůҰůt8Đáś­ĆÝ}&xŚęp:śdŁĂ™T®öËÖZőöÁ•˘Ă}®ĂsN‡ëépşŹJΙěép^c:śçSĂqjĽ@‡s¶w÷ŮÉ‘(ýá:śŹ@N‡3©7ĆŔ3X‡Óá|j8NŤčpÎVăî>Óát8N‡“lt8“ŞĂőÁÖŞ‡+E‡ű\‡3ć:\Ň0čp:śçLöŚg„t8ß¶ź:śłŐ¸»ĎŇB‡Óá.ľŞt8g˛¤ĂyŹépY“nműnŃá@‡C‡sź Dí/×át8N‡3©GĆŔ;X‡Óá|k8NŤčpÎVăî>SŁHN‡“lt8“ŞĂÉpÖŞç»ĹÜép`źëpĆ\‡Óát¸ŕG•çLöt8ď1N‡ó±á85^ Ă9[Ť»űĚ{L‡ë›8N˛ŃáLjP‡»ö ÓáRćÜÚöݢÇç>ó‹]:ś§Ăép&U‡KxeŹçcĂÔá@‡s¶w÷™ç§Ăép’ŤgRźáŢŃŃá|mŘ€:čpÎVăî>óÓát¸·źT:ś3ŮŇáĽČ^kŐËWŠöągĚu¸¨!ĐáÎMť'Ůčp&U‡k9­Őă?Ö‡†%ŞĂç¬0îî3.&{tžá×”óH‡3© ĆŔS¸vlşfÜÚöݢÇç>Óát8N‡“lt8“ŞĂy¨ľ32e3nműnŃá@‡C‡sźy‹ép+Ď ΂t&űA:ś'™—5ă·ďt8t8÷™gúu8N˛ŃáLj[‡»ó&Óát8ߎSă:śłŐ¸»Ďt8®gîŇŻ)ç‘gR7Ś·pëŔ”M¸Ĺí»E‡Î}¦Ă…î8N‡Óát8“zh <†u¸Šů¶¶}·čp ĂˇĂąĎ‚ǡzÇ9/nż§t8g˛Ô5Ă­yŇĄę‹Ă&Ôá@‡s¶w÷™§Ămx[čp:ś3Ů*ŻáŇQŃá|qŘ…:čpÎVăî>Óát8îíç”çLöÚĆŔkX‡Óá|q8NŤčpÎVăî>;= ŐN‡Óát8Τęp·_e źuÓmqűnŃá@‡Ă¸»Ďt8N‡[÷šŇáśÉ~ç]¦Ăép>9§Ć t8g«qwźép7ö[ŔŰB‡ÓáśÉ~PÓxW¦IÎG‡}¨Ăçl5îî3N‡ÓáŢ~Lů$r&űA:ś‡BĂ€ô͵µí»E‡ÎŮjÜÝg:śí¶ňqˇĂépÎd?¨j <äçŁĂ]‡ÎŮjÜÝg:śí¦Ă˝ý–ŇáśÉ~WţP(ů@Đá|vx°ëp Ă9[Ť»űL‡K¸™ýN‡ÓáLŞgu¸uSmqűnŃá@‡s¶w÷™x1ű ·źR>śÉ~×=‹-َĂůěđ`×á@‡s¶w÷™§aép:śdŁĂ™ÔÇÇŔ“X‡Óá|w8NŤčpÎVăî>ÓáNŢË:Üí—”çLöt¸îil Îw‡»:śłŐ¸»Ďt¸„kYLĽýŇáśÉ~W=Ť5cŃ8ŃÎ(ß-:čpÎVăî>Óát8N‡“lt8“úöx÷Ť„çËĂ]‡ÎŮjÜÝg:\Ä­¬&ęp:śgRu¸Ł©Ăyůôpś/Đáś­ĆÝ}¦Ăép=˙q=×”óH‡3©‹ĆŔł¸n*g٧‡ďt8g«qwź…CőĄ¬Ăép:śgRu¸“3Ů4 :śoŹŹGŃŐá@‡sVw÷™·éNÎř%µŻ(ΙěuŽwńk'°µ9ĂŃ_–¨:śłÂ¸»Ďt8Îw‘'Ůčp&U‚#íW!n~-Qt8g…qwźépůźÇuŐ5ĺ<ŇáLŞ×ýż/®ĂépG?%,Qt8g…qwźépůź:ś'Ůčp&ur ĽŚËF tżúüřĆŕY˘:čpÎ ăî>Ű7 ÍrĘŻŃát8g˛KF‡+šÍ¶Đá||ű~˝çEüń¸Y˘:čpÎ ăî>Óát¸€Il»¦śG:śI]6ÍŻăÂßŢş_}ú}aĐ,Qt8g…qwź q›năś_Tů~ŇáśÉ~Wř<Öát8ß ?d–¨:śłÂ¸»Ďt¸M—±wúů¤Ă9“ý ®ď}ÜřĂk÷«Źżß—%ŞĂç¬0îî3ź˙›îâ ĄĂŮÎd—LŐ´>+·çŔúx°,Qt8g…qwźůüßtGýŞľ×“ŤčLöt8AĘě’÷«Ďż_Ź”%ŞĂç¬0îî3ă°é&ÖáN?žt8g‘Ô<ŤOäÖď‚âýęűď·Ăd‰ęp Ă9+Ś»űĚ8lşu¸Óo'ÎYäépUoäÚĎΗČÇd‰ęp Ă9+Ś»űĚ8lş‡ł~XÝËI‡sůA:\Ó#ą÷« yżúüĺY˘–5čpÎ ăî>[şöJŻá°źÖöpŇáśÉ~Pő´=“‹ż t8߀ŹŹ%jYç¬0îî3nÓ-śöŰĘŢM:ś3ŮŇázŢÉÍ_ŐűŐGŕďFǵŞA‡sVw÷™·éŽűq]Ď&ΙěuŹAŐCąúŁ@‡óřńĐX˘V5čpÎ ăî>[»ř*ďŕĽ_WőjŇáśÉ~PůôĽ”Ë? ş÷«ďŔ_Ť‹%jQç¬0îîł˝‹Żń ü}MŹ&Ιěép‡Pű7çCđăQ±D-jĐáśĆÝ}fńmş€aŃ“I‡s&űAícĐq ů&(߯>3 –¨5 :śłÂ¸»Ď6_T}÷oäOěy1épÎd?H‡+8‡|čpľ?KÔšÎYaÜÝgBܦë7ó7Ö<—t8g˛T?ů‘Oűő§xę?–¨% :śłÂ¸»ĎvßTm—oěĎěx-épÎd?H‡óť†E¬Ăů üx ,QKt8g…qwź-ż©ĘîŢÜßYńVŇáśÉ~1H>Ť|ŘŻBÜŻÁµ˘A‡sVw÷Ůö›ŞëćMţĄ/%ΙěÜ˙ŮökÜ_öŢKÔŠÎYaÜÝgűŻŞ¦‹7ú·ćż“t8g˛d R˙Łľě×EëáňŹ·D-hĐáśĆÝ}vŕŞ*şvĂéŻ$ΙěČ˙ć¨ĎűuŰ’¸űË-Q t8g…qwź]¸ŞznÝôGFř#I‡s&űAĆ ±Zů°_…¸ŻýnKÔzÎYaÜÝg7®Ş–;·ŕ‘‘üBŇáśÉ~1Xw`ů5ÖŞżímúÍ–¨ĺ :śłÂ¸»ĎŽ\U%7nĹ+#÷y¤Ă9“ý c°ńĚňK¬ŐĐU~ń[˘–3čpÎ ăî>;sWUÜ·-ŻŚĐ·‘çLöŚÁÖs«ôGX«ń‹üÜŹµD-gĐáśĆÝ}vꮊżl›^Ď"ΙěŐ§—żUY«‰«üÖŻ´D-fđă¬0îîłcwUřM[řĚHzépÎd?Čśľjś±öëŐe~çZ˘Ö2řŔqVw÷Ů˝Ë*ůšőĚpMép:śIMbôâµ_W®ňżÍµ–Áíë¬0îîł›—Uěë™ášŇát8“š0ND.˙QąJ@: épž\.«/ –Î;C‡“lt8“ŞĂ9a­ŐŠeľů×X˘V2¸~ťĆÝ}vţ¶ĘşX˝3\S:śgR#ĆŔ‘Ľtí׫|台D­dp˙:+Ś»űĚmUuĐaN˛ŃáLŞ«Ňůj­ZäŃKٵ’Á>×áŚyÜx;t8t8g˛d ¸:\÷ŁĐĘÔá|çSK2îî3וÎĚép’ŤdcRu8Ç«µj•ëp–¨u öągĚu8^^†X‡“lt8“ęŞtşZ«Vąç;Ń:=H‡3ć::śŮÓá$“j§˛|ŮÚŻVą§ĂSK2îî3÷•ÎÔép’ŤgRWŤc1tŐÚŻVą§ĂSK2îî3÷•ÎÜép’ŤgRwŤsQ‡ËZˇ:śďsi=6?žgčpÎd?Č8tu8ŹB‹\‡óťN-Mȸ»ĎÜZĚOŔ¨ĽCt8ÉF‡3©oŤgĽ˙(´^u8ßyŕÔŇ„Ś»űĚ­ĄĂ™ą˙YN˛ŃáLękcŕµZŤ€E®ĂépŕÔŇ„Ś»ű̵őÜô$,€ĆD‡“lt8“úŢxČ'-VC`‘ëp:8µ4!ăî>sm=7;:ÜÍ©Óá$Τľ8^ňÖjü#ÜŞŐá|çSK2îî3÷–gćţ<đ˙O¬Ă9“ý cŕŘíy‹\‡ÓáŔ©Ą w÷™‹ëąÉQrnÎś'Ůčp&őŐ1đ–Źy ‹\‡ÓáŔ©Ą w÷™‹ëą©QrnNť'Ůčp&őÝ1đOy ‹\‡ÓáŔ©Ą w÷™›+ŁĂ qs#ŞĂI6:śI}{ <ç3ŢBÂ×át8pjiBĆÝ}ćęŇáLÜ‹ó¦Ă9“ý cŕä­y  k\‡ÓáŔ©Ą w÷™»ëą™IY:ś'Ůčp&ŐŤéĹo­Zä:śčA:ś'—±Ů|ŬN‡“lt8“ęĘôâ·V-rN‡ô ΓËŕ,>rV@×Ěép’ŤgRŚ}Ŕ3ČhXä:śN-Mȸ»ĎÜ^ĎM‹wsćt8ÉF‡3©ĆŔ“ţţ+ČpXä:śN-Mȸ»Ď\_:ś‰űçŃÔá$Τ®oúóŹ ăa‘ëp:8µ4!ăî>s=7+I+@?Őá$Τş2˝ő­U‹\‡Óá=H‡óä2@[ꍠźęp’ŤgRťĽžúÖŞE®Ăép€¤ĂyrˇĄgʧźępÎd?Č8|{_@†Ä×át8pjiBĆÝ}ć{nJ˛V€yÓá$Τş5=ô­UK\‡Óá=H‡óä2D;Ož°`Ţt8ÉF‡3©nMĎ|kŐ×át8@Ňá<ąŚŃĘ'm´Ü:śdŁĂ™ÔUcŕmöőcX¬qN‡§–&dÜÝg.±žcât8N‡3©-cŕuôńc\,qN‡§–&dÜÝgn±ç¦C‡3o:ś3Ů2ŽßŢ·Ź±Äu8śZšqwźąĆž› ÎĽépÎd?Č8{_>†Ć×át8pjiBĆÝ}ć{n2W€yÓá$Τ:~=đ­Uk\‡Óá=H‡óä2PűÎśŔĐ0o:śdŁĂ™ÔŤcŕ}ď­ţ÷«ĂYŁŕÔrVw÷™›ěwS‘¸L›'Ůčp&Őůëuo­Ză:śčA:ś'—±ÚvâD.Ó¦ĂI6:śIuţzÜ[«Ö¸§ĂzçÉe°–8™K ţšĐá$î?ěÝr۸EQďÓřU©™?“‰mÉhö;g1Ů€HčVśXÔ®3p´wÎ~÷MV‡ł?ÁSËłÂܽϼÍ^_†ˇ[Ŕ˛ép’ŤgQ=€ť0íU›\‡Óá=H‡sä2®VO›©[`ř;B‡“lt8‹ÚxÎőN9ÓáľÍępö&xjyV»÷™÷YĂ cŮŞć¦ĂI6:śEí<Çz‡śń‡pßgu8;<µ<+ĚÝűĚ­]бjUcÓá$΢öžC˝#ÎřC¸ďł¶¨} ž[žćî}ć•öóĽ&żt8ÉF‡ł¨fŕHoŻÚă[ßµ-Áç\‡3óĚy :wÜ_Řr…gQŰżhťčp¦Â}™µEíJđčň¬0wď3/µVADzUŤL‡“lt8‹Ú˙Eë@ď|3ţ-jO‚‡—g…ą{źy­5 :V­j`:śdŁĂYÔ;ĽhçťnĆÂ}‘µEíHđřň¬0wď3ďµ6AÇŞUÍK‡“lt8‹zŹ­ĂĽ÷5ÖµÁĚłÂܽϼٚܓE«š–'Ůčpő./ZGyë3ýîK¬-j;‚Gg…ą{źeżÚúÜ“U»ăŞépžÉnČ |-Ě9ßš=Ţ|mQ›|Îu83ź÷ĽçKŔXVM‡“lt8‹ę9ětcŻÚâ7\C[ÔVźsÎĚăç=íé±–UÓáSX¦ďq»pĆr^š(6d€ö™Âô™żËíyŔˉiú‘Řxšg 3gţ.·éÇ+‡¦„ă°á4O&Îü]nÓXŽLăOĆ ĐĽR4ŰÜŽś°š¦źÍ u¦0]¶ą-8`94M? @ëLa˘ls;pŔrjš~"63€ľĄÂüŘć6<ŔOXt·±´{4{B“´Ńív`Śő€ ŔÖŹ™Ž”8; ‹÷úĹq> endobj 399 0 obj << /D [394 0 R /XYZ 90 739.935 null] >> endobj 397 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /XObject << /Im1 395 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 406 0 obj << /Length 19 /Filter /FlateDecode >> stream xÚ3PHW0Ppç2ŔAc(á endstream endobj 405 0 obj << /Type /Page /Contents 406 0 R /Resources 404 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R >> endobj 404 0 obj << /ProcSet [ /PDF ] >> endobj 437 0 obj << /Length 991 /Filter /FlateDecode >> stream xÚí™Ár›:†÷y –öLˇ’-cÇiÓI¦iě»ę˝ Ő(ŽflpA$Ó>}Řâ;s3µ˝4#ß˙źŁX3 XźÎ€9&g/˛vH@ 5ą·(°|Ś kZß{Ă8’<’i˙żÉ5XĐJňÉůÉÝ'=ť:ÔG~>X¶OB¨ž ű6ô®"™ôaĐ‹Ăl*E™›é‡°0 ©ş0“ž]Ę][ĘĆŔuń,ǧćqˇS¬éŢx/y}ˇď6ńüžÓ·=őLG~Ŕ”vš°*ĄJSm*–ۡÇ-ĹAFśQ4ŤCžôm¤.,Ó´)9Éń6:l© ±C1¶lDŠÖ™P˝?–üŇĘü“˛ß¬îNÁjü€Ş`=ż˝Ň+^Š9oX! ř§{Ä©űÚ8EĄ.eśŮ|.˘™ÖfĚf<š6’ŞOÜ“o%An[ŞĽŠRÉr Š«óů<ž˛ć†Ş"â#ŕÝwö:6 Ż˘e&?~ͤ:ľEŃ2ËkĐ ńáěO{9Ű{ 8B…xÓ޸ČýHÝö6‰űĐë=ŠĐŘzÝ÷‘×»/MÁÓi"–2N"`ŹľĄ˝î–.x+Üí.×#×"•-ő÷·ô_h·{Ô3™á’ópŤ^ĂĄkzţ©2Ů[’†§}#ĆşuB¦2ála“¬Y;zÇŠ/îUĂý†+¸+ĚĹŮ0ŽţͲ¤µ !ž +褳ٶâďŽO·óö >%—.Ľ+“Ó6Ţ·ůÎɶŕ2żŰëě“Ă_GĽ¶ÁV6§Uxâ© ĎüxxNž´Ôáč PÝÍ[U{ĂE|®±ÝÄeÍ÷BšF$8`kť“/-ľ˝sžçY(bÍđ[ĆćBţŞ€¦Ş˘Ö8[*ĺăąfLl@Ž®/ĚÇF&ăvS®<»±8…ä v§ Ű×HeKÔ]˝š)kńţB”»éćD;BŤzś-—q"ËŻ?őąˇŘ6˙OÓż$ţďvGystNŔiüyÁ»Xđ(,łĹrő?úNiˇĎTńPS¨ Ĺ=—Łý÷CŘŠ îö M’oVç}¬^Úľ~Đď˙yd›±ĆŔ#Ň#ÂäÝ µ»­ŔŤwúdˇŇqăq˝7I$[<µžĺuQŤĚ…QŚÚFôŔ“4v‚ĺű»ŘÁş9Ü:‚W˝_ś˙ŘzŠŇ<ÚŞĐŰţš˝CjĄ„:6C]â^`šˇAŮŐÔÍĐz›š?°ĚŁł¤ą»új€Żl‡– ŘuĂşU3t ŇŮ“•>¸…żW´đĆf®~MÎţzv  endstream endobj 436 0 obj << /Type /Page /Contents 437 0 R /Resources 435 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R /Annots [ 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R ] >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 575.708 160.007 584.684] /A << /S /GoTo /D (chapter.1) >> >> endobj 408 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 555.978 153.203 566.882] /A << /S /GoTo /D (section.1.1) >> >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 540.343 190.552 549.189] /A << /S /GoTo /D (section.1.2) >> >> endobj 410 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 510.492 167.648 521.371] /A << /S /GoTo /D (chapter.2) >> >> endobj 411 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 494.722 166.772 503.569] /A << /S /GoTo /D (section.2.1) >> >> endobj 412 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 474.973 198.861 485.877] /A << /S /GoTo /D (section.2.2) >> >> endobj 413 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 459.337 242.288 468.184] /A << /S /GoTo /D (section.2.3) >> >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 439.588 226.916 450.492] /A << /S /GoTo /D (section.2.4) >> >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 421.895 268.24 432.799] /A << /S /GoTo /D (subsection.2.4.1) >> >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 404.203 310.123 415.107] /A << /S /GoTo /D (subsection.2.4.2) >> >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 386.51 199.987 397.414] /A << /S /GoTo /D (section.2.5) >> >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 368.818 219.065 379.722] /A << /S /GoTo /D (section.2.6) >> >> endobj 419 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 351.125 228.47 362.029] /A << /S /GoTo /D (section.2.7) >> >> endobj 420 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 333.433 228.739 344.337] /A << /S /GoTo /D (section.2.8) >> >> endobj 421 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 317.678 227.473 326.644] /A << /S /GoTo /D (section.2.9) >> >> endobj 422 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 298.048 286.741 308.952] /A << /S /GoTo /D (subsection.2.9.1) >> >> endobj 423 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 280.355 277.516 291.259] /A << /S /GoTo /D (subsection.2.9.2) >> >> endobj 424 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 262.663 280.285 273.567] /A << /S /GoTo /D (subsection.2.9.3) >> >> endobj 425 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 244.97 286.094 255.874] /A << /S /GoTo /D (subsection.2.9.4) >> >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 227.278 247.299 238.182] /A << /S /GoTo /D (section.2.10) >> >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 209.585 203.294 220.489] /A << /S /GoTo /D (section.2.11) >> >> endobj 428 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 191.893 354.944 202.797] /A << /S /GoTo /D (section.2.12) >> >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 174.917 387.274 185.104] /A << /S /GoTo /D (subsection.2.12.1) >> >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 157.225 431.557 167.412] /A << /S /GoTo /D (subsection.2.12.2) >> >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 138.815 364.051 149.719] /A << /S /GoTo /D (subsection.2.12.3) >> >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 112.925 188.44 121.901] /A << /S /GoTo /D (chapter.3) >> >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 95.252 172.58 104.099] /A << /S /GoTo /D (section.3.1) >> >> endobj 438 0 obj << /D [436 0 R /XYZ 90 604.454 null] >> endobj 435 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 476 0 obj << /Length 996 /Filter /FlateDecode >> stream xÚíšM“š0Çď~Šś:p€&O’uu;ŰŮn§»Ţ¶ťŐh™Ü"öíÓ7 şh¨şÖvábÂďů?o!MFo:˝açő%Rľ @Ă R‰€řŽŃ˝Eî§á[Dé‡VW/Ţß 7Ă»ĺ˝Î`ŘůÖ!ćFdő<ľ Ť’Îý'ŚĆćú[„}Ş$ú±úU‚PsŚŃ]çC—s)žĎ¦ĺÝ®gG+ł#ůŠ1$Ŕ\PL†úŕzsě\fa˘]Ěé]ô[Ď‹ÓWšĺĹÉ­žëě» Ř™EŮę ÖS@÷^pÇw=Žńó=0ĄüdçĄ ěşuŮ6đaČ#Ćľđß'?˙Ěó( ó(ť »®`Îw—pGgá´4ŚeŁťą0Ď–n-Vv«·Ĺ•®ąŇRÔt4ë¬@6tĄ‘í,¶±~öş=§ÂĎ`ťČč‘"öx },Da&¶4’â"çe¸ąJÇúçöŚPS±Žž„—·kF¬F;Ď„L+şíqlĺoKeT˝Žćůî[  ’Ä?@x)Ë(ÖGëCü‹>řFŹcÖÉKŮXyśS%â * ě0ŇźŤ‰Ns“OgéîČK8D§“őŐülTŇíşĚŚ<¸ąřÜ[Lúz>*łsž-F›’i˘3ťŽôîD•ĎÝҵFU§ÔB†é¦ęë<4î7.Ťi¨fŃCť)4µŕ<Ű|ˇäűN'_ÖEQ?ĚĂ#śFbŮLŚ”řRZî_îÔ`ű˛l†“A\[‘s)÷ϧЕF+X]஠źWc#Ěč#Ć łąD‹ó/8é6N‹ťb˛©UĘżQŢŠl›rm$4q[Ŕ')—lÓEŇ«0“´Ĺz`Ť„3_(«Ţ»†˝J»™K¤3ť?ĄŚů‚ ­ĂxëV ‚ĘĘ^[ÍţŹĐm5{ĆÚj*Ő¬‰˛ÝtÔű•Ű ,˛ Ş{ą)^ Ĺ«ô.Lâš5ú67ÎM´.7MfŐ|tTn˘^b™zjR˘ KJGŻQÖB&OŽ´MJ'`¬&Ą*ĘMRÍ҉©ý-`‚6»[=^ˇ´Š*X—­Şĺňś4ĽĄ:Éó7k-şřčÜ×qřËŇ,-Ćý׋)“ĺf‡kťNóŻvÓĎ[MĺëëŐ“(5ô2Šăk˝\R-6–ÄWĹ[ űŐl€>,ň‹Żašj{CIĐrÜĎQ”“đçßNAYKqż{ËGŠďąqńZęeŁ›Lf7™ďL[ôX®Őb2Ĺ^dm §}Ĺgm‹yNȖ׳¶Ĺ<ڱ8îî­–Ô§žşµú]Ą T endstream endobj 475 0 obj << /Type /Page /Contents 476 0 R /Resources 474 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R /Annots [ 434 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R ] >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 728.876 243.772 737.723] /A << /S /GoTo /D (section.3.2) >> >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 709.097 290.726 720] /A << /S /GoTo /D (subsection.3.2.1) >> >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 693.431 186.438 702.278] /A << /S /GoTo /D (section.3.3) >> >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 665.335 155.484 674.311] /A << /S /GoTo /D (chapter.4) >> >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 647.632 168.435 656.479] /A << /S /GoTo /D (section.4.1) >> >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 619.535 148.839 628.511] /A << /S /GoTo /D (chapter.5) >> >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 601.833 162.348 610.679] /A << /S /GoTo /D (section.5.1) >> >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 573.736 196.43 582.712] /A << /S /GoTo /D (chapter.6) >> >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 554.952 278.412 564.88] /A << /S /GoTo /D (section.6.1) >> >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 536.254 243.463 547.158] /A << /S /GoTo /D (subsection.6.1.1) >> >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 520.469 279.707 529.435] /A << /S /GoTo /D (subsection.6.1.2) >> >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 502.747 244.55 511.713] /A << /S /GoTo /D (subsubsection.6.1.2.1) >> >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 485.024 265.87 493.991] /A << /S /GoTo /D (subsubsection.6.1.2.2) >> >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 467.302 218.538 476.268] /A << /S /GoTo /D (subsubsection.6.1.2.3) >> >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 449.699 235.693 458.546] /A << /S /GoTo /D (subsubsection.6.1.2.4) >> >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 431.977 238.114 440.824] /A << /S /GoTo /D (subsubsection.6.1.2.5) >> >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 412.197 271.04 423.101] /A << /S /GoTo /D (section.6.2) >> >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 394.475 243.463 405.379] /A << /S /GoTo /D (subsection.6.2.1) >> >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 378.81 279.707 387.657] /A << /S /GoTo /D (subsection.6.2.2) >> >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 359.03 258.587 369.934] /A << /S /GoTo /D (subsubsection.6.2.2.1) >> >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 341.308 261.357 352.212] /A << /S /GoTo /D (subsubsection.6.2.2.2) >> >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 324.562 283.951 334.49] /A << /S /GoTo /D (section.6.3) >> >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 305.863 243.463 316.767] /A << /S /GoTo /D (subsection.6.3.1) >> >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 290.198 279.707 299.045] /A << /S /GoTo /D (subsection.6.3.2) >> >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 272.476 234.229 281.322] /A << /S /GoTo /D (subsubsection.6.3.2.1) >> >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 254.753 236.44 263.6] /A << /S /GoTo /D (subsubsection.6.3.2.2) >> >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 234.974 256.904 245.878] /A << /S /GoTo /D (subsubsection.6.3.2.3) >> >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 217.251 253.038 228.155] /A << /S /GoTo /D (subsubsection.6.3.2.4) >> >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 201.586 260.41 210.433] /A << /S /GoTo /D (subsubsection.6.3.2.5) >> >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 181.807 259.145 192.711] /A << /S /GoTo /D (subsubsection.6.3.2.6) >> >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 164.084 258.029 174.988] /A << /S /GoTo /D (subsubsection.6.3.2.7) >> >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 146.362 271.319 157.266] /A << /S /GoTo /D (subsubsection.6.3.2.8) >> >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 129.616 282.835 139.544] /A << /S /GoTo /D (section.6.4) >> >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 110.917 243.463 121.821] /A << /S /GoTo /D (subsection.6.4.1) >> >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 95.252 279.707 104.099] /A << /S /GoTo /D (subsection.6.4.2) >> >> endobj 474 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 514 0 obj << /Length 1121 /Filter /FlateDecode >> stream xÚíš]s˘H†ďý\Â…lBsiłNiĚ*wŮ)Š@›ĄŠu&ů÷Ó|hPÔ(“©ÔŞTˇm¤;OŢÓď9‡Ň‹¤űÖťŐú«Źd¨††4ÉšIt ŞAÉň¤'ą;~°ĚkŞ|µľHU3 řjö™ďűépË´Z˙·ŇQ ÁěTWuL%7l=}’'ĆżH@Ĺ“ľgżJaq ¤iëź(“?y)n4Y/—–©!nÍ$‰1ĺëĐT˘"*m)]-y2ň_‡\ATţ¦@*ó [čz&é©Í–UĄMhŕ…Fepçá*`qmC]Ő)“Dk’q8·çIü/(ŕ»3`¨7—ŕŻćIË;*SÂhcA~˘"IAĐ‹ç·é*IâUäŤbŻé˘›.“•»Ě_ ďĺ ŹÜJ~4Řt°?ʼnťVńfő2÷íńĄăÜË1öřÂMüůŇŹŁJöbh—µUž™ś˝ЬŠNůŽxřĚ“‚®łtŠW±» Ĺîéě#Ík:Íz1T«Jő˝ą­ÂNäŢ˝-ů˘"Oť]ʎ×䦱#(˘©Î*FrM 9;/˘Ą~ŽŔ(,iŻ!7ŠkŠ;-fa$Y·Ťt•2='›@LŃVt‰!%XF´ß3ăVרٱ@=ŰSŇ Ăq\‘7Ř˙śfęůôď 9Y`J/ąeržž•|Đ ů[ňqdvć&•ň]'YęmÎ=>;%ďŔč†őX2’ˇÝ$#wzCÓ~ŻPĆ=sR)‡˙Ľ>ĚÇ•ď‡lÚe8Ą¸Ć…îLáŤ<ÉE–én-ÄTHľí±®ÄđFbĄę÷n5K»‹ž@ç§Ý|QWě†0bŤí·°3“ÚŞ˘ęZ“a˝żźVś„hMO¸ę8ޤ­%Pćd’ľWv-˝ÁĎ?ź©’™–b`ąÓKG: „PÎěޤk?ćXűˇY!‹Éo4ŁV Ń*…GĹ@rgŇU‚ ^¦~ŚłŚ±$"Rcąď®xÔ)bW“ŤaTÓ*ÉĆ*EgFn7Ľá§(>C©Őq˛1Ó¦řŮsĆ‚Âëém`\Ă0ČĆjsŚ÷|9ôźŃ,ľ ”'Ă#µ4H¶ŕíÆ‰~Ť—źCşĄGş…TÄtb Q>¦$ťÄ +ŹĚ(ş¨Sg5©iUjÓ#Ôd—EŤÖ _}‹ÚxΫ‰Ťqu'G+,óëîÉi&Ş4€Î=8ýą « endstream endobj 513 0 obj << /Type /Page /Contents 514 0 R /Resources 512 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R /Annots [ 473 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R ] >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 728.876 264.814 737.723] /A << /S /GoTo /D (subsubsection.6.4.2.1) >> >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 709.195 254.712 720.098] /A << /S /GoTo /D (subsubsection.6.4.2.2) >> >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 691.57 290.398 702.474] /A << /S /GoTo /D (subsubsection.6.4.2.3) >> >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 673.946 284.6 684.85] /A << /S /GoTo /D (subsubsection.6.4.2.4) >> >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 656.321 245.297 667.225] /A << /S /GoTo /D (subsubsection.6.4.2.5) >> >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 638.697 280.983 649.601] /A << /S /GoTo /D (subsubsection.6.4.2.6) >> >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 621.073 295.11 631.977] /A << /S /GoTo /D (subsubsection.6.4.2.7) >> >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 603.448 313.69 614.352] /A << /S /GoTo /D (subsubsection.6.4.2.8) >> >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 585.824 259.833 596.728] /A << /S /GoTo /D (subsubsection.6.4.2.9) >> >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 568.2 293.586 579.103] /A << /S /GoTo /D (subsubsection.6.4.2.10) >> >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 552.632 275.892 561.479] /A << /S /GoTo /D (subsubsection.6.4.2.11) >> >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 532.951 277.685 543.855] /A << /S /GoTo /D (section.6.5) >> >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 515.326 243.463 526.23] /A << /S /GoTo /D (subsection.6.5.1) >> >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 499.759 279.707 508.606] /A << /S /GoTo /D (subsection.6.5.2) >> >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 480.078 258.587 490.982] /A << /S /GoTo /D (subsubsection.6.5.2.1) >> >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 462.453 261.357 473.357] /A << /S /GoTo /D (subsubsection.6.5.2.2) >> >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 444.829 256.933 455.733] /A << /S /GoTo /D (subsubsection.6.5.2.3) >> >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 419.279 189.785 428.256] /A << /S /GoTo /D (chapter.7) >> >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.948 400.594 239.389 410.522] /A << /S /GoTo /D (section.7.1) >> >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 381.993 243.463 392.897] /A << /S /GoTo /D (subsection.7.1.1) >> >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 364.369 257.053 375.273] /A << /S /GoTo /D (subsection.7.1.2) >> >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 347.721 315.185 357.648] /A << /S /GoTo /D (subsubsection.7.1.2.1) >> >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 329.12 298.288 340.024] /A << /S /GoTo /D (subsection.7.1.3) >> >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 312.472 309.396 322.4] /A << /S /GoTo /D (subsubsection.7.1.3.1) >> >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 294.848 303.738 304.775] /A << /S /GoTo /D (subsubsection.7.1.3.2) >> >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 277.223 279.937 287.151] /A << /S /GoTo /D (subsubsection.7.1.3.3) >> >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 259.599 370.109 269.527] /A << /S /GoTo /D (subsubsection.7.1.3.4) >> >> endobj 503 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 241.975 281.631 251.902] /A << /S /GoTo /D (subsubsection.7.1.3.5) >> >> endobj 504 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.862 225.431 260.081 234.278] /A << /S /GoTo /D (subsection.7.1.4) >> >> endobj 505 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 207.807 253.038 216.653] /A << /S /GoTo /D (subsubsection.7.1.4.1) >> >> endobj 506 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 190.182 260.221 199.029] /A << /S /GoTo /D (subsubsection.7.1.4.2) >> >> endobj 507 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 172.558 275.165 181.405] /A << /S /GoTo /D (subsubsection.7.1.4.3) >> >> endobj 508 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 154.934 246.941 163.78] /A << /S /GoTo /D (subsubsection.7.1.4.4) >> >> endobj 509 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 136.228 292.719 146.156] /A << /S /GoTo /D (subsubsection.7.1.4.5) >> >> endobj 510 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 118.604 291.065 128.532] /A << /S /GoTo /D (subsubsection.7.1.4.6) >> >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.742 100.003 251.922 110.907] /A << /S /GoTo /D (subsubsection.7.1.4.7) >> >> endobj 512 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 517 0 obj << /Length 19 /Filter /FlateDecode >> stream xÚ3PHW0Ppç2ŔAc(á endstream endobj 516 0 obj << /Type /Page /Contents 517 0 R /Resources 515 0 R /MediaBox [0 0 595.276 841.89] /Parent 402 0 R >> endobj 515 0 obj << /ProcSet [ /PDF ] >> endobj 520 0 obj << /Length 1520 /Filter /FlateDecode >> stream xÚŤWK“›8ľçW¸rY\ ŕ8ău’ŮťÔ¦bWí!łd[,3ăüút«¶gŮ­śD?$őK_7ál7 gŢ„n˝[żąyĎŘŚ…ç,ť­·ł"śń¤Ň<ž­«ŮWo±G#ŰąĎŇĐ‹ć˙¬˙ IĺY„;™ź¦A’3ÚpŻM;ŹrŻ©úҨFŹ[˘$ÎÜIęî‚hîGaz«˛9J·#žAÁwX1§ ë˝ęć~Ě"ŻjĘţ µA*ô*Ů•­ÚH'4{Iü˝ÚíýZÎYę=ÍŁÔ“5)( ®mçQč‰RKčŠöôťŘ9^ł%–;/ňîWÝ|úĽüŕł›„8··ó$ô¤·ÔeSaĚPR«M+Ú:…nDQP¤)ąQ]ZŽWĺ͉V{~ĽoEŻ÷ÍvHĂ˝îŚ2˝qâm3ň‡íZa†ĂŞ-{e:˘Ă4Ľż_ÁŁEYŔY2Ď,âŃj §ÇZb”;JôOéQb»šyä Ű7˘SNgĹ$cŽ6Úřa™ )ڱDÁC1zö Ţ˝(s"Yg„ö'+Úęĺ‚ň¦ěŁÔdurk5®”S;Ź›§©×‘¬lôc˛]ń„Jv'~?ťµ¨ôkkąE+QąT4óDâsaŔOŚ`Ô &íBÁ_>ü~ĺŠ+uôÝ™L×m]c^sŻ•Pp±´y.<Óu÷…>0ń«Ł,M+jRąŁŘě‹<ÖŞ´.baS´’ô]źëhő6µ$š.)ĽŹK˙ś2ŕS9ćWžYEŞô¶‹ş©´ŮRɆRÉŘX…<őVV8ŹAtĺ1îihýĽ˘ţŚ÷‰V¤iUIűVđâeăü=ň3‹?AĺĘĎ‹ŁŻüł‰úWnŃYŽLřyĺÖ4<ĆE>Ŕ#sđ8 ľĺ;xce÷Ë`™ńK°Şš>ČsüÚ©3 GĐŇ6ýnď´Qę\~RÁžQ’ybÓôîlzUđqFJwž}Ž—‚„čó;A­ľRÍTäθĂ/^†ź$…·žçˇ×¨×%+'ZŘŞ)˛„Ŕ@Ů:úTÚ±öYŮ'|đaćťšžřT+ Š °“î|ăîmĄ¨^]´męš źÂ*wYgKalÍłIśŰT¦yFşŹŚĄ×Z_ýęyż\¸&çQîggŔhf¬˙wÄyŢ«rOź•DÓ˛{Őş“6â…ľmiĂ:q(”;jdĐw ÄäđÚ7 Ô+ăżč< /‚$s?F";»•í,xGŞ]ż9Š»Ę"bRĺť8çă,˛ÎcŰ"É…˙HRăyÎdÚYx·ŰěćA‹ë ˙JDüa†%ý˙°<ôćÇ7j1€ Ć'§}_×€ `‰c}§3 Řůgű'ÉáJço|5bŁŐ7Çx{‹Ę‰·ëU%kĄ%‘„Éč €BQI\Ч·î„(âfOüŰĺŠ>ĐnáR‚ ׳'"庬­/ᦠÜ1X&vźłgf×/ÓÉŕŚę ꛀր çЇČfü\8ü@E‹ŠŔY…43 €%h1ę }ÓřŰV~ď/Ú:h I¸“rŞ > 0:µÓ˘`â<¦™ ĹÄ% 5ٱjÁ Kp@Ĺhłř vëárT96­qť‡ °ˇŃë&ĂĂżŹzĺ «ć ”ĆFnnwćűpËh )˘áÄŔAĐ”±ď˝ĐFý&Q7o„¶pţcžÁř3>‚ ~Ű9‰]<8H.<¸¸ i;JuĆçE$ý$p˛ś’ŚniÝâ`ďĐOă ÔĐŔ‹"Ó\ÜÝ8Kě{‚ Ph"yI‡c<  /ŮRęťŮÓ7H ů¨¨ŰŞŞ·U<2ÉÉ;Ýb´˛Ă1ĆNöH[#a´ t˝ŘúprÝ6ö'äâŇÍÉČÎY·AWzw8 pťßđČnޡ©X¦†ç›…7ižĺţčUÚ3ž˙7FľÂża]®ßüĘ®ŃŃ endstream endobj 519 0 obj << /Type /Page /Contents 520 0 R /Resources 518 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R >> endobj 521 0 obj << /D [519 0 R /XYZ 89 770.89 null] >> endobj 2 0 obj << /D [519 0 R /XYZ 90 739.935 null] >> endobj 522 0 obj << /D [519 0 R /XYZ 90 553.953 null] >> endobj 523 0 obj << /D [519 0 R /XYZ 90 553.953 null] >> endobj 6 0 obj << /D [519 0 R /XYZ 90 553.953 null] >> endobj 524 0 obj << /D [519 0 R /XYZ 118.403 407.688 null] >> endobj 10 0 obj << /D [519 0 R /XYZ 90 389.84 null] >> endobj 518 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 528 0 obj << /Length 146 /Filter /FlateDecode >> stream xÚ•Ž± Â@DűýŠ)“ćÜŰ5—»VP1ťx]H• &A‰řű&‡–VĂ›Ç0.`ěiiµA0Á‰C<#0JgM!±CťIŢÄ ęĽ Şó&•‡azäÖgc÷l§ë8, m#ÝÉÎĂ&MQšR ´=Ő Ł›ű l4xĽŐc-‹ň†‰?—ľůăňj”ĺ_Őŕ1f endstream endobj 527 0 obj << /Type /Page /Contents 528 0 R /Resources 526 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R >> endobj 529 0 obj << /D [527 0 R /XYZ 89 770.89 null] >> endobj 526 0 obj << /Font << /F22 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 540 0 obj << /Length 1625 /Filter /FlateDecode >> stream xÚťWKsŰ6ľűW°—”j,ß“éAQäÔŤb{,ĄÓ™´ă(Čâ"Y>âşýóÝĹ‚%ËŽëĹîbźß‚–qkXĆÇKß/NFgśÜbľĎ=c±6"ËđÝyˇc,VĆWs˛E-ËÁ{–É.~% —a`Ł„e =Źą!'Y˛,Eů@_*q+;!ŰeŽës-ä;Ěőô-śŮˇmY–9ľ:'Ńł$••uŚE>÷µ$Xäř$9NSŕ÷ąôms#ĹJ Ä?,‹Łu JIÔ4ŹE-WDM2"ÖI„užvňŁ$‹ÓfĄOňők)S)*­µńxËCÇőZ»^bNQćŰ3ż%+° Fm›EžG.®sţFES-•ŐđťŚ&oßŇÔÜ–b[ˇ¶e.6šu<¸ŔH™ĹůŞMgÚOUřu“Ĺu’gmÉLäÔ-…B˛ Ű(±špqýńÄřJç"†«n༜m47•řÄ:Gćs—=§\Ď3—I¦Ěµq…;ź"ŹäÎÜÄy)[î ˘XŃ&ÉH¨ŞEťÄ"MµĘ4ÉîÄ2•í´BȇNâZ5HĚĎßb[ô„Ćăá±dMŔ2&FŔpöá '‚Ľ{ÖěüâËď°°±>,Uăpݬ/fЏ ~;ŃĎsZ˙6đ!óU#RŇ©× áP‹Ôz€EGë"<×e0śMhOAC¦6–}otw‰ óčđüýµňŤ.!I•)|ŃĄjYNłxÖ÷¦•BopÝ÷÷ť7¸ˇšBÝk@ëw:慌법|ß™y-‹R}43XÓú,ĐLWňŐśľ¨ö ó, ‰d]&1Ńç€~2ß nóU=Ěž@5'dač·¨Ć5ŞM Ş’ěVk”5Iů ¸i“ĎĐ•WŔ •&ĄÄŔ!!ő|~9ú|5ý8ä#—(]ż#Ű2©«ş” t¨Â‰€ri>ŕžyŻUÚfŐÚĄvIEŚ[”¨sčGß¶ú.‡F-ššŘ@÷ŠVŃ#%”7µbćQ`Ţ—I-iŮG™(„ę×Rá&¬Z , `ˇ˝‹<Ł )/d¦ĺU:‘+Í«cWČ`‘ʵ¶l;ă­Č¬ĺ8ŞÂ !ěIJÇŠi©°;4Ä„­Ěô8 ÍU˛Ć¨®ˇh˛‰"ăµŮ°­sýÝh- ˇüqĐR©‚ Op^Ä´/!9I©®Rď»áálžö¬迦eÇüŘ>°¸(Ú#«¶pR —˝«vâ@G”M¶ç6W“ŘĂuÚ힯CO÷ÁwÇ%$RµÝäRDґá–d¨”TŘÝ'ő†V:«çÍ+,~Ű”Âcă«#´ßљоĄFŽ Ď(a×UQX~_|MoĆăÉôbrůa ćC\6cĺ6YŹ„źésńe6{‡Âf¤Čý€‘idN¤çOę^mľkôȲŻq-’*Ě1›Ž}D>ęx_]9t<‡…d8b®ŻŹ Î•^LÓn5-ËĽśCÝ5Őž#űi}Óó÷Ô:Ui&„EŢ´ éćňS§^3ü»ý¶aw,fűÝűňŐŻ8Ń™y3—u7ž,M×ד dĄ±ä€TĐH‘ú@/†Ŕľ’5##\"|/kžęsěl(E©H€rÍL¦źÁ8M¬G•2Ő’.%ĚëĎrlžRd€Łe­·…Ü=őžíŠÝ,xM?Řłye_/$ŁžŻ—.đmĐűuCŚ]lőţ›H‰ąy÷˘"Q¶čŢt^Q$om%łžŞ ‡ŰPŰz hťůť@m^ÂL»#5¤Î&¨@őغۤ¦çrő´˛ôż)H,ˇE>]xŕ‰ôµ÷fß1¸ßȬ} tĎŐëł Ľ6,Ú´ż˘H´lżýŹĽĂ?y/Ż üëy]6qM9—ţwí;¦gřó•Ö&íqť˝‘ÝéA)µßéâä? ľ|b endstream endobj 539 0 obj << /Type /Page /Contents 540 0 R /Resources 538 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R /Annots [ 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R ] >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [429.414 487.604 481.08 498.508] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.008 306.101 191.977 317.005] /A << /S /GoTo /D (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea) >> >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [361.24 306.101 416.363 317.005] /A << /S /GoTo /D (LIBUSE_encOpen) >> >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.963 245.775 231.074 256.678] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [202.995 236.31 247.598 247.214] /A << /S /GoTo /D (LIBUSE_encParams) >> >> endobj 535 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.71 197.993 200.978 208.897] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 536 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [310.678 197.993 347.539 208.897] /A << /S /GoTo /D (LIBUSE_encReconf) >> >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.522 140.747 186.51 151.651] /A << /S /GoTo /D (aacenc__lib_8h_a9b64b2026a1475eb5c7a67fc1364ed94) >> >> endobj 541 0 obj << /D [539 0 R /XYZ 89 770.89 null] >> endobj 14 0 obj << /D [539 0 R /XYZ 90 739.935 null] >> endobj 542 0 obj << /D [539 0 R /XYZ 90 549.218 null] >> endobj 543 0 obj << /D [539 0 R /XYZ 90 549.218 null] >> endobj 18 0 obj << /D [539 0 R /XYZ 90 549.218 null] >> endobj 544 0 obj << /D [539 0 R /XYZ 258.088 437.267 null] >> endobj 22 0 obj << /D [539 0 R /XYZ 90 420.2 null] >> endobj 545 0 obj << /D [539 0 R /XYZ 90 322.585 null] >> endobj 547 0 obj << /D [539 0 R /XYZ 90 261.925 null] >> endobj 548 0 obj << /D [539 0 R /XYZ 90 212.916 null] >> endobj 549 0 obj << /D [539 0 R /XYZ 90 156.897 null] >> endobj 538 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 566 0 obj << /Length 1742 /Filter /FlateDecode >> stream xÚ­XYoŰF~ׯŕS !&łËSl‘ů šĆŤ«¨$(VâĘ"ŔCááŁM˙{gv–IÓ˛bÔ€µłłÇ\ßÎÎ’73ŢŤŽçŁ7ç¶m„VčŰľ1_!3ź[žÍŤyd|»“Żó÷†,;´aŤb~…(&¦í±ńĄ¸‘8kt6}qÄ ®6ň+peFü÷łśpjÜ©Y©áÚ´‰q5ú}Ä´R¬ŁśÓRŽ3Űr=Çlŕ6)ăYJxłĘřlzŚŤĎ˛eIŇ0Î6uE¤¨Ł8'2•hĆ©Mň|Óݬißś;€LĆQ4µ “‡–ߨĺĘSĚ0CËő=bţĽž¸ŠŰSĂ#¸ăÓÄs)#-ťWÜh/~RőŚXLl6®WŰŻdŃ·gÜĹŐšćf§Ýí±^d›"źpo|wüö&Ż+”ĽW9QLřt|S§2«Ę!…Şü™ Ä"FAűÂ<˙Ľ·Ďř°ĐL-Űó»ˇ9+ŠĽ¸ŞDU—ÓpĽĄ¦/t=şW©`r۵Çí„ôUś׫SY.ŹÚwő(xkhx·X7ĺS+q -˙y6ľmyˇ†M@‹ţ,âJî÷¬ß.čĂŃQíĆěD?/cFaé6^ĘBŃ༊Éówëĺ ‰ŽočíŰŮěäě·“ż>ţşőDK@×%Í9l»ÄL'"IAŕI’—O°{Z"YVx`ŘXçAIČiŽNY‰ě@GyĚ x×O=m^µ Ůmp@¨ëŰĘľcqß1Lwją®CŮ–319ŰfD­ß/Z?ęÍ’$_Š*ÎłŕLmеÉTóµ^$Ę2ľÉđÄkŔ¬¨­ÖňOÜČlźŁWu¶T‘?Kjo1CÉćęĽ:9÷ń˘Áí6@Kˇ×.ôH]ʨ›đ«Ć–UP‰2Înu‡ˇßë%ű–ë`ţćVŔ´WľŘ¶7„»_Đ)×’Ř1Íkĺ1`*Ź/•i®LŢ2ĎĘ:ÝhËm9 dą^%¶e-ŹöwŰď@3ă]qçfáB3E]9%@;]1?Šü°“ŁRq§u:1Ďguş@IHŁ%ŽçŤ79€bÂÇ*ČĐŮç,×"ËdRRCŻ$b‡b(Ň -sÇ>­nƧ $Ф› )e3«ζšß`F$4RŚJ“^.ëÍ&/”ĺwÇ‹l=˝#0]ߨŘC]@=ĆǨmMŽäJAĄN*ÉŮ47ęRFu!i€ěĺŤęŔ™Í&.$'ânc‡#ńŠ 6Ř0nŽ^0/ĺRźBŚŞŕ7‰ľ9iśĹiü·ŚĘS®ô«žîYn§©#vôřl?şÓ¸­{©oďQbSŤu ů­Ž eô..ĎŢ™.Ńł €á#şv^'Ę©%ź±Ä AQ„űöĆ(˘v€R" ™÷ŐiO%÷[‡†Ó<ŞYöO–FäŁdŐ>śĐ-e"Au˙Ş d¦'ÂĆşţ5_ô§ôÖhé —5]ăß©ą:ţ´ísÚË«ÎřĹé¶ëąĐž˝»Ň´žr+’š­Ů’ç¶”Ý˙}ý„ŇŻŰʇ–çwKąk­cŁ«ů|że žÝ3Ną)lŤěÚ—wý"yßáÇ&ˇ~O¨3ëžz}¸Püqu*îI0÷9÷^JV=ŕ˛{δŐŃśżŔčĂD+ŁÁÖýňťDúúpůĘéOK'Ç›ŹÁý˙óćŘ‘\8í?iJ§§-ź“ĽĐ¬mµ‰Ę}Ö@ ĚmÚÜřjYŻŔě‹˝cUŰ!őIn’XW¬OIčŞ~y5(ŕR"•U/µŔJ2?Pë‹ÓÁ=/$>­‘: E{éÇ”0qÖóśľ+†şŞÁą5Ŕł·®Ęž?póÚŽ5}®Ĺ(Ä«*Ť]ľ ±­±ÓÔH«ËŃi×|j]NíB/o•aŘUUy{űÝý©F·Ĺ,n,˛î^QžiJtîXέĐÓnŰUůĄŐwNű^/nőůŞńŤżĎˇH9Í÷±sĽ˘U±Çü^qËĽíŐNĂhš¶­ţ ł3Ŕkyą¦í˛’z65­Ęš5U&î¬ĘâÝ"UîB·] ˇ{NŐ)ŰV4ŞWP`QĘB»f.ôĚĄŘŞů9=±U)ĐŕšrÖxC4gřzAAíToÖ2'Ô»*­DFmĄËqÖó.n–Aiô8 €«ěiŘěMťť‚ŘS-h[eeŘ<']­k=AIPT÷Cś¦z®H=*0A*˘Uŕś ^M9‘ĄŔm©ĚŁąÍw›^ ôŰŕQŘ˙;u,‡Ů?úö?úŮŇ endstream endobj 565 0 obj << /Type /Page /Contents 566 0 R /Resources 564 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R /Annots [ 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R ] >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [135.768 668.546 184.625 679.45] /A << /S /GoTo /D (LIBUSE_feedInBuf) >> >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [368.743 668.546 412.06 679.45] /A << /S /GoTo /D (LIBUSE_bufDes) >> >> endobj 560 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [422.8 668.546 490.067 679.45] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [139.086 581.879 185.631 592.783] /A << /S /GoTo /D (LIBUSE_writeOutData) >> >> endobj 562 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.008 533.07 193.092 543.974] /A << /S /GoTo /D (aacenc__lib_8h_a2a5f6ec334fff553f0fd9e36d9408e94) >> >> endobj 563 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [179.762 437.019 238.731 447.923] /A << /S /GoTo /D (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea) >> >> endobj 567 0 obj << /D [565 0 R /XYZ 89 770.89 null] >> endobj 568 0 obj << /D [565 0 R /XYZ 90 739.935 null] >> endobj 569 0 obj << /D [565 0 R /XYZ 90 549.323 null] >> endobj 552 0 obj << /D [565 0 R /XYZ 90 498.871 null] >> endobj 26 0 obj << /D [565 0 R /XYZ 90 491.71 null] >> endobj 564 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 578 0 obj << /Length 2006 /Filter /FlateDecode >> stream xÚĄXYsŰ8~ׯŕSŠÚ‘Ľ+3˛Ł™ŃTgmĺa+Iąh‘˛YĹCË#žěńß· đ–ăÉ>©Ń}~ÝÓ4¦ý¶¸Ř/^˙ĘąË]mÔ¦y®i8ÜÔö‘öI熽\s‡é»üÔÔŻŻ›~ł)—&Óš,Îë XërÝY~Ů˙±Řî˙\đÓL!Ňń Ďr´C¶řô…iđ˙Đaľö$NešÍ-řMµŰĹßLŞ7ţęZžćÇLT×´MĂe®ćq0Áă¤s¶ůáúçź™Ă^=nÄşârĹVx¦PRIy`mÚ†gŰđ :3é†Ďś»ăKVßmHÁ†8Ľ‰˘¤NЇDw …tϢ†űdňźöŃ» Br\X6?B‡Ch´¶Ăô‚šŚ}B[‰˘@…Dđ'"÷[Y4!íÜőő`Q‘Ŕ‹ćxőô۸:”É©.J%şŹX(5zUřMĄěZŮqZ·«kXl>ěVŁĂIN&/Ě#" e'Đ÷¸ć¸äŽęUt),cÚŤ„˘÷±Ľř”ÔŹ2„Ř>ĘŮGn~[hźfÄ‘´hhmw° óň•*ďgńáq=‡ažT€D–蔦>đ„h`ŮVČţĚEĺM…€[ĆQšät“ąŇ'BúyĘ'Čśř™h{A'@Bv ň4âň„Ë…ĚCÝ„)1ExZ ş1gÝő‰ş:ÍÄÄ TLžÇ‡¸ŞÂňńcă˝hIĂ€†IšŇ —*qĄÜKE¨ň„m•!Ŕl´m’ÖmÂŔ™™„a*Of#'¬—0—Ç2ĚZN‡˘be n.~’¨¤ęĺćę§Îo€Ž–„âŤh¶žĆa%É"ʉPQrś•Č“-ҧ‰’br…Tű"E:ÉN—+ß}źÔôc™YŁÔ˝—ÚbR ÝGĆ ZďEj9ĽUĐ1§Ăv•üK¤6Ç$#¤ź¦˘ł&„ †çXÚ¸!: uEŘ•âHAB DýÍVŢö ČD*đĂĺíĆO›éd*N¨ä @‘§DđŽe‘— Xd˛zŕ†xTcP@EŠ{b p‚fMů´qÇŤée™¸YŁó*¦Bo’Ý’B™Îł~±±|™P@´Í*Äb‰Á§ŽgËŔ[-RůÓ$žL¤°ŇHž”<×´mÉIꊨ“şÚÍ@° ,=¤ŤÂ/_AśŻżűu;Ky]Ŕ‘«ďŽ9Ç Ş|  š|9Ě Ă*ISA»RLĐWŁ9HBW®ŇéßíűË»íÍ Ň×7´#ÓĎ!!§Śë¦Ě[ŃßÎő»aPiDˇ©ç‘ɧŚhv/~°ůsŁ5Ă:9@QáŚň~'rÜĹC¤ Íź| ÓsŤd­á !jýMěĐDŐcsfű_Ţ˝µé›†gŁ ·{öăĺďp–ÇYݱȇ&Ą ťŃżľŮ·_Aăy+bn˘ L.oÁ٧7ł3öĽ”CĘn3ŕ¤Ŕt‚˛¸a2©Ď†bÜkuLÖ´ÓďmlZü8˝ ¨»r’’¨pÔŹ†­ëG„‡e~«ţĎÄřZ$ôéŔ>łf 0¸Řc'ątá—ĺÚöAĆ/$ęßôÓK®qF‘—ÜW8ďż”V–eŘž3H ™pÜ7Ü€źŤ6¤9$‰/´ ÇvQ…zZl˘çîýÝćăŰÝőÝŰÍ~łęxď/wďŢÝüC˛ńŐţŁR8xµÝođĚÝív˙ńÔ˙GŐĽÜE=ą=Ń!ą8".ô<‹±ďŹüLgDu»žayC şk8ĐWfß–ÁĺłM•9˘^Ď™#1iÖQ¶/5`Ď`úđŃĽ° ěů*ě˘E,©ť}°jăş¸Ţ üŮ>!“x&9®?îď.vűŰýÍvs%RvđÖyhťyĄ š˙LĐúfMÍţŠQ]–¸ĎĽ×&B˙ˇď"¶†Ď#繏Ę3čiÂg?|Ş÷!T¦X‚źă řKe›uÎśrÍY #«×J­ľí»ľ˝ÂTLqŁľňĽ#~Đ­Í ů@V˛Őţ2Ĺ®.g^wě¶đ¸VŘü%ŠhqĆn<Ű©t/ôń{U3x’PaÔňÎô<|ó•˛AˇŠš™z%6x\Tnś×É1»˝öÚÓ›ëDZű–a1ţW˙a˙ëjX+ endstream endobj 577 0 obj << /Type /Page /Contents 578 0 R /Resources 576 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R /Annots [ 574 0 R 575 0 R ] >> endobj 574 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.616 548.752 462.827 559.656] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 575 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 450.804 156.271 461.334] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 579 0 obj << /D [577 0 R /XYZ 89 770.89 null] >> endobj 571 0 obj << /D [577 0 R /XYZ 90 635.872 null] >> endobj 30 0 obj << /D [577 0 R /XYZ 90 627.792 null] >> endobj 580 0 obj << /D [577 0 R /XYZ 90 592.959 null] >> endobj 34 0 obj << /D [577 0 R /XYZ 90 592.959 null] >> endobj 576 0 obj << /Font << /F22 400 0 R /F37 546 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 586 0 obj << /Length 1607 /Filter /FlateDecode >> stream xÚťX[oŰ6~÷ŻĐS'o±"R÷ ŕ¤Iá.íşĆ۲"-Ę& ‹«KҬčß!©‹­ 퀤Čsçw.Žmě Űx5»XĎÎŻ)5"+ň©o¬S#˛ŤŔ'–G‰±NŚ;ÓźXż68˘yxĂ7U\=ÍÔłÍ?ęxÇŐěj=ű8#@dD ň+pŘFçŻ Űr˘Đx”TąáRÖ̸ťý>ł‡F9XQ`a±#‹ĐĐ(P4‚mú’Ő[kÓ¦·üVĎľmŰćĎrĹű”Uâę'é…m,"Ëő˝ ţ«LIpĂS x)e@´śA´ [8ŽE=Ż Ţđ8 PŮ6‡¶ÁýfNmłMçÔ3A0ž%`CĹMYÉ(ę0čő8J#u¬ rP#hĐľm[ żw¤[ĘôoŰł‘TĂ9ďĎJžČŃĐ·"ę‚gđN*RßË× BÇ ŘŤŘĆ×=1j#- Ýޢ‘NP‹xŢX'*Ť,ä)}ŃyˇÔ“Ô“hôĽcő@»JXŃ𔳠˘Mé„­’z„“I?&€Ö xic “PëdڱF B¬Čóčl®gQ[ĺ'µ\‹ÎDŘ󮚓Đ,çÄ6x˘Đ·*|çż 0¸¬Ĺ®Í!xrĂ릞€7¸Aáiüu­÷J&/:aq‘ś˘<–† †Z]§š^\Ôj§ŠĹűW3ăďăíU!ţĘ„ ÷Ą…˘ŰĆY¦•±amX˘Ť<5Oę¦j·M[±Úúż·\^^˝˝Ľ_Ëj:¶,±ü`ëłýe RŠŮ©‹x–ˇŕZŽëʎŕA9…ĽSPđ®E}a:«ţµcĎĽthQ׾´u/ Ű“Ňgőľl3ˇ&€Ň¦Xö‰Lꆏ¸V+.y™´Y9)ĎóL é‡ć[&Îc›pĹÄM¬­ÂµŃf¦e•Łgprhłš-Š˝ę…~ Ě*ô5‹imuś2‘šâC ďÝĺ @8đÍĽ­Ľ’®ÂZ±Xq¦U™#›ĎüÔ°Ş3ĽĂ°ĄZ_S"ú:Ü‚ř8Üp–°+^ě­,WÓ™lÓLiÍd„5,ł¦—Źě€–Š}ly%ŚrH¤‚€7ŢTü©ŘŇfNLH&É žp•^ řPňčé Wo×÷M$xÜóíĎyŤ+ńĎ`ă&u‘şˇĽphgJ­¸ą, ¤0á›Ä'é{rT§0†ş*©‘ šmYö] ®sM!śo몎˘"ľęčĽĆ|U%q Ĺ<č’Ô‡ěŤô"˛^ôíUq«ń'r˙UţZţy/Sř˝D›îž¸{ŚVĹvQŮĂQçy!…Y7ˇéĂY×Úé¨B]żü5ç…ĐĂŠíŞHKKJş„ä.X†!'0ô„0ËMŹ tصĄěŐŽ·®72ħUśłVěš=ÚDaÖóÜ‘Qý¸2p ‘ bq>Ńz{@AľP‘PłË©˘a pä[¶?¶üvůćÝÍŐýĹj}‹Ňp` ëƤăŮ‘Ď"ĐPŽgy‘n i#łÝŐŐ 6LvĂę;Q#k<âEWa܉Ň,(%W¤Mł×ĚŰ2Ç*âöÖŐ©_źő)ó|Żś_Ó«îP•[V×Úá×éK]Ő˘(Ú|°óĽ‰Ť• /*–ÇĽ@ŹDďĘř` < —k›JAÍóÚA'(ĆĄëZ'Ľ?~SÖ‹ůA˙xIűLVŤ”żŘ=®?+ôaÇ„L$)ËóňőaZř ć„Ţ‘ŁŞ0Ą]•…ŻH%I@áqÖwşôą`O”ˇ…6BŤó>Ś2ůĎ”ě§~‚Ŕôâ‹\ýŔ{¦˛.úˇű„B˙˘D[YđerÓŹ;Ä|5 Çî h`ŤśEYśăŃKŃ(§‡1řć©Ys%FJÄč ÂŹĺRŕö?6R4Š…O5(ÁNÁ*Pű @ó,ŢdLžúćcĹEw—¤ ®r&µ›ça/ç E'ú˛T‚óß2KÎż0Nhm۸Pv)ž¤,4w±U;¬n°IË ’KäľČ»SÜA;NxßąĘkáŮ8ýŽ˙ý:đ$ô[˙űđ/7‡‡“ endstream endobj 585 0 obj << /Type /Page /Contents 586 0 R /Resources 584 0 R /MediaBox [0 0 595.276 841.89] /Parent 525 0 R /Annots [ 582 0 R 583 0 R ] >> endobj 582 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [241.292 555.078 308.559 565.982] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 583 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.31 269.964 457.577 280.868] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 587 0 obj << /D [585 0 R /XYZ 89 770.89 null] >> endobj 588 0 obj << /D [585 0 R /XYZ 90 607.477 null] >> endobj 38 0 obj << /D [585 0 R /XYZ 90 600.016 null] >> endobj 570 0 obj << /D [585 0 R /XYZ 90 506.851 null] >> endobj 42 0 obj << /D [585 0 R /XYZ 90 498.269 null] >> endobj 572 0 obj << /D [585 0 R /XYZ 90 164.95 null] >> endobj 46 0 obj << /D [585 0 R /XYZ 90 156.368 null] >> endobj 584 0 obj << /Font << /F22 400 0 R /F37 546 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 606 0 obj << /Length 2105 /Filter /FlateDecode >> stream xÚ˝XÝoŁHĎ_Á#>ťhĚ×®´’'ńڞĘ×%íĂě(¸m·đds§ýß·Ş«cB|ž—}±›ę˘ëűWŐ¸ÖÚr­Ďç> a%NŠĐšŻ¬Äµ˘ĐsáYóĄőŐN4‹Ŕµoe“Ňę*5«Ë˛řÝuĹz_ĄŤ* &a,ěhômţëĹl~ńź ĸ–§Ź "'ň+Ű^|ýćZK ˙jąŽźÄÖ‹ćÚZáĂn=]üëÂeű˙Ze?˛"'‰\UöDě(Ěé­VŁqčşöďnŕ–ű&­ÖµSě·÷űćăk#ë_\ŘđĺZÝľřű ^ČţIĚŮň&Ž? ­±ęOh˙z#q‚pbuČ,ż+ůBáxa4pŔĉbŃ=@ „ ůť Ť=0Őó@_8qŔ^Ż(*ŻĺžűZŇ”óúúĂ=-šŤ,hµ*+Zȑؤ۝aÎŇ<§Őv§7ןT.«T#źő/šGžÔUĺ¶=śąZTiőÚ>ÜöĎt~/ÂQčžoŤ…ëÄIDÖ‚BCĘln™ţOŠř~î߯V˛:úéĐĆe<‰śrś8“#đ3G@pŘ…$]x!vŔ»ťbń\÷ĽjyWH9Vűá! ľë‘3q±«d-‹ÄÁł¸ŁjúĎZrI”ŐlčÔi©µAz˝ßíĘŞźřŢÄVÍń9»˛®Ő"gąMI'¨˘–snĄ9©s¦ZJĂą*ůÄŢFׂqžç$A@Ƶ˛–…Ź ľřî—Ş¤ĺB5uSÉ”sęeŁL^Ę"+—ŞX;íÉăůŻů(† ŹĆ/±_F¬«Ă“pŮH'í‘FÚ#Mk„ }ş¬hlnŇ"ă­MZąa “ŔrŐšáîđă«ć*3m]7Ďqµ;©GČŤc/¶çZ;`Ьlv'Ké=‘Lěm‰QĐ«}ÝĐj!Ź˙Źó)¤ ®ĐďÚ„ Óéhé<»»|ľťÍG‰oOŻ2yžgáůöţjÖ·_ŢĄU & {ń1-–§…Ąi6Łx<Ź»fs=ÉćOmÁ¨/ˇi_dXuÎ9xC <ö'š°{;j H#n3méŚ.Ó©qĚôj:'?đ–;¨ŢĎCÎ"…p„ϦÍ7şE·ŞąĎúKl©0łgSŽDů®÷tÁQnD[ݰÉő*¸65ŤKm ɉ=dŔ!SQyXü !ĂOěۇŮgâ(+âÍź®‡J˝n^sé и”Ćşˇ´ąl”9w1Î]„~ŁŢÉLˇ T`ĘŞ˘×p†Î­ełßń˛©öYi"ë÷(Ĺá@ âÇYe°'rBÁirąI‹5Cŕ)P)7±ËN—–wŽ\Íf ‚ŁŰzŞID–´X°ě4Ű(‰ąńëDűÎk[µ§Ű!á62“˝nßöZGżŁą‰¶éZw'Pái6˙ňđÖ˘˛ ÚôH/#@ąý U†¦= p5@A‚ąSIâQ5ýcręI†%:őŁgţJkÎ XqNŕ>» őz§ă¬ŠXˇŹ1ˇŠˇ+·3ý~ä’n>’+X•čĂČtP$¦hűwäOUž.ô#˘€ă¬moBnđjZńľ‹#‚V_•{VŁ•ăęBíp`ąÂ™îó†v˛·3JßRSqŞPŤJsSV€Dq ěQ"¸Íçřŕ“HĺnŹË¬Üâ|SŁ’z :fÎŐVé~TSó¸ćSüSÚf®>4eŢ f¶4’:ÍŻk!g0ŹLaxş^ý0:Ż^=^>?<"ůţÓőÍ›®‚]ńlq ?ý´¬˛ç]Uň?p¸ö$ľ~˘Ůö‚<(#ô®$ÂĂţŚ—¨Ř üČ Č1Čł6Ź!{eöŁł1őhU‡‚~µ`G/]y5mVo¤h6ŤÍ‚sň͉‡ń·xHúˇ¨ %ÖčłO{(Ŕś5YČćEĘÁj2“,vPĆ™›đ$°g€ÜDîĚLřHM;ÖŹĎ6ęó ÷Íî6hGÎk ĄĽ‚óS/őź˙7ki}Ŕóαmó‡ÁCVE<4ZÁşäö/µń¸ęŚéoť± ’MŐop™őőŤ˘8Ýë;~>sš<¶°v¦EĹÜbn±¶˛XŽÓś†‚ŘĚGŕ7“*1˝i¸VýF·÷Ř=ŕý—V¸楸íůŔczţ{÷2D SKa`ăħguÚ9DχML÷ŞĚik+1U˝eü¬Ôz­5CÎöčBfôtyú€#4&V%˛Ń\ţt5ű‹ĘYÚBÁw Ť_ŃőtÖ×U#ŰŐ7 üţ Š‚ŞÎ%Ŕ汣4Đ<ď—‡k®'”?ďÖđQĆŚ'‘oćz ę®I"uZł~¤ÔĆí6ٵV:|¸Gßi81ü®pś0ਫ਼_ß]Ďźź¨5Q—úňDܧďbČđ•Żî]c?†c.ş1Gž,„Ě4ŻőŚ'Ŕ‚6âHTŰ­\*p,MPT*°E_ł€t<4 žĎ˝ÓPśmäËZI)M•ÂľűrsĂú2áqD ňÎ`úĎ€éP[Ë\őĆÖ!?#¨¶~‚T.éÜ`éá»Ţ!óú(Ű^ŔŽ‹‡6Ca×Őűňţnţx9>ťĎz[óÇ›O7ÓĎOÝ{řńw=VŕxjI†¦–=:ëDŞÔĎś[¦ćj›‚˛6Gëö#*Îľž>Ś`˘ť>No‡űT/˛G-ˇw…6Ľ˛k¤™Ž×˙¶űŽďŠý´˙@€= endstream endobj 605 0 obj << /Type /Page /Contents 606 0 R /Resources 604 0 R /MediaBox [0 0 595.276 841.89] /Parent 611 0 R /Annots [ 589 0 R 590 0 R 591 0 R 609 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R ] >> endobj 589 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [326.079 530.217 364.036 541.121] /A << /S /GoTo /D (LIBUSE_encOpen) >> >> endobj 590 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [261.854 520.753 396.229 531.657] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a0ee251ffa58317c7ea29364d344c4660) >> >> endobj 591 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.239 520.753 513.996 531.657] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 609 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 511.662 135.668 522.192] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 592 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.852 457.354 497.666 468.258] /A << /S /GoTo /D (structAACENC__MetaData) >> >> endobj 593 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.965 439.73 257.778 450.633] /A << /S /GoTo /D (structAACENC__MetaData) >> >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 427.774 194.448 438.678] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a510ae495f7636503ecfe111f75f66d50) >> >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [126.194 374.284 296.714 385.188] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [341.853 374.284 477.921 385.188] /A << /S /GoTo /D (structAACENC__MetaData_a06cce4e89d53d956d27fb20892461aa0) >> >> endobj 597 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 362.329 234.487 373.233] /A << /S /GoTo /D (structAACENC__MetaData_a9274bda31c82bd154ddb3767b74be6b2) >> >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.735 283.901 493.846 294.805] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 599 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [336.762 271.946 436.527 282.85] /A << /S /GoTo /D (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c) >> >> endobj 600 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [257.591 230.411 324.858 241.315] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [244.351 218.456 344.116 229.36] /A << /S /GoTo /D (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c) >> >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [305.52 206.501 372.788 217.405] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 603 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [189.167 93.195 271.208 104.099] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 607 0 obj << /D [605 0 R /XYZ 89 770.89 null] >> endobj 608 0 obj << /D [605 0 R /XYZ 90 621.169 null] >> endobj 50 0 obj << /D [605 0 R /XYZ 90 611.997 null] >> endobj 556 0 obj << /D [605 0 R /XYZ 90 363.326 null] >> endobj 54 0 obj << /D [605 0 R /XYZ 90 348.39 null] >> endobj 554 0 obj << /D [605 0 R /XYZ 90 157.162 null] >> endobj 58 0 obj << /D [605 0 R /XYZ 90 146.838 null] >> endobj 610 0 obj << /D [605 0 R /XYZ 447.844 96.348 null] >> endobj 604 0 obj << /Font << /F22 400 0 R /F37 546 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 629 0 obj << /Length 1813 /Filter /FlateDecode >> stream xÚ˝X_“Ú8 çSä­0SŇŘ!„´sě.m·ł˙ʲ÷ŇvvLb ÓpIčŢöćľűI– „]¶ťą"˲,ËŇO2Ž5·ëCëdŇzóžs+°>ď[“™8–ßg¶Ç™5‰¬/íAçŰä“ĺ‹Ö(ćE<ÍEţŘérĎißb.QŞ5š´ţj1r,¦yľí»ž.[_ľ9VüO–c»ÁŔzPRK«Ç]ř&ÖmësËŮ1Š1;𸿕ĺ ZýŐńśĹpĂÝéöÁqĂáéčęô~x=ŃŚ"YKeďÔĄŢŔîő{ż¦öä|2NFOŞţE‹o‡—7Łgµ˙˘á§‡WWŁ‹ËëłfőűTőţ‰ě0ŻýĄnŔĹ‹’(Ľ^üŠTŹSĄT$š».3˘–`Q‹¸ĂÚá‚F«\ŞČřI±QýRÇ&]>×Ů7ţвľ(á°ÓsÚŰ+é0ĆÚ“Q-°´č&µłÚ;n­ó~Żý 2­ AšafôÝv!KâĚňlI”ňĎßxtÔ{\çOă2Ą$±H®di}YJ_Ę"Ü`˝śšťł-—3Ě×™ ˉ¸Ź"Me˘µ Ľ$ ±\%ßű!© l$éJzFxčeśš$Ĺ.d/J[íOľîĹ)Ć'¤ĺ=đî/N1ňŢŇ3ŕ«‚¨ú uŮp–ŹŁ.(Şkľ=WÔ:vź?«xł>Z‹„üŁf§9jjç÷e6{ÉľŮCJĽčŕÖ GţÁë&ÜÜÖN~ŚCwËlćş¶Ë‚m5âşťR¨QH\ŞTFę4K±0Ě×ŕ¸Âů¸Jä:}€‰Őş$R¬Ł8#*ž@Ę'XAŽ,Â<ž˘opř— ˘žF¨ Dűö$«ˇL#žÝˇÁ݆ŰBXĆl5Đl.µş=÷ E’ h°^ű\•^¦“’iÄb•E(ʆăűŰ»ńřúîęěť®™‡ĚŤäL¬“ňí&°ĽúÖÇÄqWĺDPÓűoS§&ËužVä]SÉîšëq$w[¸]]¸‡Č[*°ÁźˇÉ‰ËÇMő.b@BU»=#{¶Ű *Çěg ŔÄŘ”„;Mb"˛€µ‹ő|.ˇPDÄĆJ†ß©Ö  ^‡]T^Ľ$—%‘Ĺ)ˇ9“«[R®`97ÄÁG˛V,6ý3üÜß Šr&púhzáĘůjݲŇGŻYzć$z şĚ1MűŚ TČ'˝Gý¤3pÚęőU±MÁežÍÜmÁQć Tcľz…áXDQŚÎÇwň˙ÚÜ;LVëĚa˙Aţ8`),©4SĂ÷“Ńřýs7ľŤw­µIéą6„Ę 0ę>…™pżwÜÉrˇŽ¸óa`°i#Éý VS j“Pş¤ŻŞcŮ:Ń2 lŤýěËňďI&´Lś† F ž°Ć‚e<_”f/m`> endobj 620 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [355.495 638.078 443.983 648.982] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a02f49b93eaadb6a903b87670849255a5) >> >> endobj 621 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [262.824 516.334 387.276 527.238] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aef811ce5aab93dcba6584109d266b579) >> >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.239 516.334 513.996 527.238] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 506.869 135.668 517.773] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 623 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [265.141 228.08 324.718 238.984] /A << /S /GoTo /D (ENCODERBEHAVIOUR_BEHAVIOUR_TOOLS) >> >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [279.485 212.947 398.877 223.851] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a443da990a60343083e72726a65f4509b) >> >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [344.529 105.15 445.201 116.054] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a730a1ba1041f8671a11ca824fcd0455d) >> >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [463.147 105.15 513.996 116.054] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ab381330bdc59b0213ad3dedcb4f2f0f7) >> >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 93.195 144.137 104.099] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ab381330bdc59b0213ad3dedcb4f2f0f7) >> >> endobj 630 0 obj << /D [628 0 R /XYZ 89 770.89 null] >> endobj 62 0 obj << /D [628 0 R /XYZ 90 739.935 null] >> endobj 631 0 obj << /D [628 0 R /XYZ 90 569.326 null] >> endobj 66 0 obj << /D [628 0 R /XYZ 90 559.735 null] >> endobj 633 0 obj << /D [628 0 R /XYZ 90 296.746 null] >> endobj 70 0 obj << /D [628 0 R /XYZ 90 287.155 null] >> endobj 634 0 obj << /D [628 0 R /XYZ 90 172.768 null] >> endobj 74 0 obj << /D [628 0 R /XYZ 90 163.176 null] >> endobj 627 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 645 0 obj << /Length 1942 /Filter /FlateDecode >> stream xÚŐYÝsŰ6 ÷_ˇGůZk"őÝ·Äuşíš4s˛§.—SlÚŃŐ–żśĽC*˛« –´śżT UV4S,j,_]ÄŞÍúŞÍŇ•>ĺ8lĽBˇ=ŻśáҦłęËÂ$’­wCľŐxö˘(‰Hńáۨŕq(Űě,Ŕŕ<Ýl  7B‘0°hŻśŞHXŚ"V]*"6Ąš+”ĚŤvÜŻZ1aT CЬ @dkŹ_~äľ/ě ëŁYVăęÉl™¤ş`Âه¬ľ×¦€&ÜAHĺłb®.•U őâ!ŽĄ}†ĺ`Ľ¤5m÷ab|8±ŃÂŽdG=©Ř«Cc36²ĽR51pÇŕÓ%>ĹČG;ČŮmä¸É ÖŰŞ&]ÓGa`Źp©X«ĎÄ›«jVfwş*QD‹&Rv T–Ŧ̨ě‘˲X–éş'#Ü}ž=Y©µĘkν śŻYF硤ćQ/i¶0¸W(˝Ý};/x $·ĘŔ~ ams¦„ÇÇĚkíME:j><»­}”ĂFIFö˘,ÖD†µ*ń@z®¤Ŕp¦‰EĘc {˛«ífS”uE+:»dÂŕ´±ŕĂ}6»'R($ÖŢsQ]ű‡­REĎEŃ@öłşńýďńcťĐa Á!0đ Ű-Đx±ěvE±Ľľťŕl VŮ\if[ô.ť}:`®ZP_\‡óż_»ú_=MödńüĂŰÉ­ŔË‹ťŇaN•x5žtph?7¶Ö(÷5ĘŽĆńĺWiěř:·ĄŇŰwňuKą÷,wA9‚Ĺ-őţ3ŐL[m© řF}ÍmáeoĎ˝/¶pwňé# —ŁÉ´śP6Í•.Ň"©KŞă#m1Y'’»ćw㩝˘Ů9=ąçVĎ|ę)öU·ęZ‚Ţ› (Đȵ1;e „šxś+Ć4á¦K&ŇĽśĹk,#}ľťńŇ«4”@0[ĐÝ$Ü‘:*LÓq2ýĺ”ÄMlŕ®ď%öÉjŐ·E XYö~ŻĚľŕt¶Ŕl—ŹŐvąTUmŘW—qo‚Á$@1j©“Ľˇ Čߎ>ą¸Ľ˙0};™ö¶lűżęĹpďąňą?ęý _óü˛ endstream endobj 644 0 obj << /Type /Page /Contents 645 0 R /Resources 643 0 R /MediaBox [0 0 595.276 841.89] /Parent 611 0 R /Annots [ 642 0 R ] >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [385.11 93.195 513.996 104.099] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ad2accfe182077bfe80ba43a3f22cf7bb) >> >> endobj 646 0 obj << /D [644 0 R /XYZ 89 770.89 null] >> endobj 647 0 obj << /D [644 0 R /XYZ 90 533.064 null] >> endobj 78 0 obj << /D [644 0 R /XYZ 90 523.588 null] >> endobj 643 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 651 0 obj << /Length 2196 /Filter /FlateDecode >> stream xÚĺYsŰ6óÝż‚ŹÔ4˘ "Ő7ב{%qę8íCŰÉP$l±–H… ˘¸óýřo»ŕ!QŠŹfúPÍhě‹˝°»]ëÖr­ďOľ»>9˝đůx"`’k M)ŚśČ­tuňűꮕü'Ëuüilmő¬•x>´KëÝÉ/'nŹ+‡+†‘Gűoyş ÝÓ¤ Î\Rűúíě{ꕵżŤ„çÚg#á‡öŻZćw#áÚŇLĚd5 CŰŃÂşÖX„ŽđÚěb$B»\.Ë‘ÚŰĽ¸ĄEףص“ů’idRĄU>—Іő‚áiąZ/emF‹¤(ä’«d˝nČÝnçe͢ťw'_j™dń‡ëz·›*©ó˛PšëF{¦=˝đ#+ťąUByˇ3ńX¨ń×ůýMť`ŇN,Ĺë2DžëÚ˙Ť¶h©1ŁÉ}üogżöŃâÇĹřć™˙1^_ľś}Ŕ™Ë,N q©A†ă§µĎ˘˛ŻÍĄwKlÄ“yţhŇ+ňNŔCTíyĚ~$h|=A±™ôFŃšÇf>]!˙z>@ŰWłł«ďŢ_]]ľóňÁ‚}}•Űý•ÇŞĽQÄĹŐĺ›ëçł7׳+Îŕ˙ ß żzIµSc-;BđĆ׺Öô"¨A‹˛– ÚęŇ‹í\0_­ËŞNŠš†TtB'-«J¦ M6Y^Ňş¶^E¸Rům±’főv! ęmď™ňzD;Ţ+ż5 Ë9€6'Kg˛<@ËŤŔgɦ€ Ž¦=`d„.3¨Qńü,W5Tă¸Ĺ†4@fmvË€«:©ę–xMmmöľ©Ę˘Ü­Čś,˛îň‘jc˘y’ޱʙę»^Ç]ÖˇĽGč¤1ŕFű&Ęť.Od“tŻ'ÚŔE*«ĆJíŐ–śó}‚éĽÂ>÷x’L.%z„Túv)Ĺ—%ĺÎečf˙%ńvő9ÁKŇÎE(]&UŽL¤úšóŕ[NěÄQDĚÍđ·thwŞÝO7{ :ńŽxÖ)׋'Š˝^Ľü±XojÚˇ±‚ß -çeĂÁyGíăĄ#¬|óV8Nţá†.;9S0§¬(Kśýî|Ćs‰C=y_WťKy3@Ţ ö‚/NŠç–7Ś3€ó·łÝ˝X–Îň*ż]|A–ŽäúűC7cÁ‚!ÁÔ¦ŞĘM‘ńnŢ^V­Ůţ°há hýíöóÖ lÇvcŮ:Ěľş I͵Ľ“»ř]˙ žrTôC”?x|”RłĺAľĂ{-lýnłĆ,¦#ĉďňşJj©$Ę©ăF˝<éŮ/¦ÎŮŮ(]ŕ@Ř3Č1ôĆuUb`ú”gúE 5ŰnŔˇëűŃ$´_ÜXa…Ă1&éăš°â6‘§çL[ű0ĐĽ+ÓNجR§ÍĆ>mäŃ<~Ňëž0a» Šş]rľáZެ ť „c'€QkÝ´F8bś"a‘<¬ dÖP=Â;Čą¬:č¸ZQ?D4ÚL˝ ť®;âř“‡N «ŰŘíÖ»‘h×—Sl/]0ŔăĎlŃüŽÁqw ¤˛H‘ęýd& 1µw?üýb§*7‰ ‹ďŞ\íĚŮOÍGŤ’ÚČŰÇ%é"—¨đOČŠů S•E{fڎk\ą_ôwO|÷H…Ýo187蟓݂pˇĎ:´$1tLđŃąĆë®¶Ä$,7Lx›ŇĹ:v;z‡Q_ď4WŃr1ˇ1hš:s™&%ŠĂ7D¸óö’oŕŐś1˛)P\®%U=ĄŁ´x„Ď‘`+ýĺ{úĐ.ŻyY_AO~ObGb@ ®ů‡\(" ęŕ;bĎ<ťPĚ5»Ž‚H(KÉ }‚´™ z‰ą„âáĂęQ‚=Ô¶˝c9öŕÄ ÂI“D‹;ŤMpŔĺźâŮÔ öPµ›9¦&lxb^đéb¨pXC%ş®r˛¦›'›¸ŻE‚S‚Ţž€vÂÚŃ猄š¶~CÚ7ԮȡGŚcoPŰ.“L¬±%‚´DĹÇ%í˝QLĚDSn‚ tš”×Ř(đőĺ=W =č(Â)YčółôtôŇbŚn›/™Đz¶IyÉ\Öµ>wQÜř€ŰÖáX{ŮńŠÝ5Ú ÷Ď‚‰űg¤˙ţ±ű©=ößőűĄý˙éeŐü endstream endobj 650 0 obj << /Type /Page /Contents 651 0 R /Resources 649 0 R /MediaBox [0 0 595.276 841.89] /Parent 611 0 R >> endobj 652 0 obj << /D [650 0 R /XYZ 89 770.89 null] >> endobj 653 0 obj << /D [650 0 R /XYZ 90 364.929 null] >> endobj 82 0 obj << /D [650 0 R /XYZ 90 357.31 null] >> endobj 654 0 obj << /D [650 0 R /XYZ 240.275 96.348 null] >> endobj 649 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 657 0 obj << /Length 1137 /Filter /FlateDecode >> stream xÚíYKsŰ6ľëWđ(Ť#oG[qšÉdÚ4ŇÍő’h›­HŞeO2ýńP" ęMÉé4ž±/–Ŕ·ß>¸‚ óä@ç—Îí¨sýcGÁ1wFŹŽ€ŽË`9Ł©sßĹá^3ŘýL’( âi0Ő‚ˇÍgaüd–ý,Đ3?6 ·a–®¤$‡±ź…IĽčőĂPtę=Ś>uîFťż;H‚R \ÂśIÔą€ÎTĘ?9á9ŻJ+r(&rś9ĂÎďX3Q@(Ç…5Xçâ˛5ÂvÍ‘FČ“I‰Fčô± áúÜŃł|ŚŃ}Lfł¤‡Y÷UťD×Íüń̬ÎÓ¤‡X÷%ś -ńc­¤ĺůź } µÖHő–íÉ âI2 R˝:Iâ? ÄOËTA6Çů©YÉMÍyŻĎáäŮLܮ܄€`L[2 ˛ ŤÂ¸`müMŹ/aš- 79¤|Ś—Q&Ë…ţo.˛ ^ś‹l uŇię l¸#pNÖ>Čxíć¦ÇXwĐ˙—óy’fą˙ y®ú% 4­‹M€žHźćŕ”Ťj„R“Q©q?łëĹĂúyŞŽ[eUm±ÖŔ´Đ5cĎ~ čČס§Eľăý_ż—Î$kڍ´µ÷@ÄL´6Ëźě— fµ—Č–_mqüÍ@söŮŚWzPq[ú˙˰D]nŚü…z©oVB¬µ”·0˝Óz‚ü‘‡°A¦ôČ< ¦…mśn§ň/Á6¶şĚÂĆNĹfsHD›–ĺ8 ‡”´š{6fµ~N>ĄSë‡e‡cööăůĚ ±3ô2€Ť2zĆGG“tÁ?Ť± ő‰Lr $vOc˛• W‰mwsň”´ HNË •g î˙U ł©Đ"ŃjPĺjEýcŕ´> endobj 658 0 obj << /D [656 0 R /XYZ 89 770.89 null] >> endobj 86 0 obj << /D [656 0 R /XYZ 90 739.935 null] >> endobj 659 0 obj << /D [656 0 R /XYZ 285.086 690.081 null] >> endobj 90 0 obj << /D [656 0 R /XYZ 90 673.878 null] >> endobj 660 0 obj << /D [656 0 R /XYZ 90 229.999 null] >> endobj 94 0 obj << /D [656 0 R /XYZ 90 223.004 null] >> endobj 655 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 663 0 obj << /Length 915 /Filter /FlateDecode >> stream xÚÝYIsÚ0ľűWč“ZŃľłµťL¦KBO” ˇ K ™L:ýńŐb#9Á¦fJˉç‡ő˝Oź%˝g†wÉa'ŮKĐP "@çh¤Ŕ :ĐmaŇîuN56˘‰ů“łžŤ.çýůc;%µľÜő‡™őJN:ÉŹ'°»—PR®ĆI·‡ŔŔŘO‚T+đŕĽĆ€jÚ[p‘|NP•@B-^˘"¤$~ü“łăv*jíůćâđÜuPëW;ĹÄ´Ô|!1ÍMk­óľqcĘąÁ‚›mr–Ąµ7e â˘Íúy^H5d‚W…ĹW`Ů…ŠÖŘ"XĚĂJăĎ^%Sl_ţŘ(xo݇Áçlo<Ýáŕµ'4<ŰÍŕ˝ĆQ<MĎ˙­ŕESÁf‡řŻ…vüĆu> endobj 664 0 obj << /D [662 0 R /XYZ 89 770.89 null] >> endobj 665 0 obj << /D [662 0 R /XYZ 90 369.823 null] >> endobj 98 0 obj << /D [662 0 R /XYZ 90 365.215 null] >> endobj 661 0 obj << /Font << /F22 400 0 R /F37 546 0 R >> /ProcSet [ /PDF /Text ] >> endobj 669 0 obj << /Length 2253 /Filter /FlateDecode >> stream xÚ}XKŹŰ8ľçW9,d V$ęecwťGO2 d“Ěav1 %v‹Ű˛ä©îÍüú­e9Qö`°Xd•X¬Żt˛yŘ$›^$2ľą{ńúV©ŤJâ˛TĹćî~sH6e~‹}¶ąk6żEo[}öfÜîT‘DŮößw?˛DWű*E‰dł+Š8ß+xß×CŢVoU=Ůagá4ŹłĽT"\fq^Čײ8ÝîŇ$IÝ7Ű´žmă[‘Ě6‡řPŞRU˛’ďZłÝe•Šnßý‰4şąŮćIô–'& ·LnŇ]÷…WšÁ8f÷gÖäD—gĄit?ułîGóÇÚđh˘aÔý ÷Ěňá4¶?O˘Őه^wݶ»vBľÄîÖLř'żŰî“%^2:Pޤ‰%‰ę„žíŤëó9,‰˝gZă >!¶´íP',¦ńüů"Nł| 1KdŢüô‘‰ó8 ýO¶A „〒d“nF $~ţáĹć7–eh˝˙ôö÷7۬n>˝ŰfIôëÇwwD’ăKöźő¨OfŽ"ô™Đügrţ«+X¸™ÎŚgűďąłµőٲâ«/„ńőmVm Ş$Ä$Äô!±Öµ„ĺ˙ ŹwŮŢĚ|Ŕe™ elXDÖűIw]đ_ż‰•\÷‡ťňl(ěńôviY„{ 1áxÎńÄhęát2}C0fX`ě1 ä„ †ĂeޤÖzr—mÍ HŹÂ>jÇĘÓhčy­źNf„´$§é¬ó¦ÇxZ BP¦%"jPyAÜ÷lôŁ»vŻéÝ4šŻÝk‚Çu|AşëĄ Ć٧¬żxťŽUĹ”©ŮĂhĽ­%ťe„ Ą$fQR‚ń~y‘1ĄOg ]XÉ÷ĽđřáOfp@bč%ťŔrČ}–2&¬NgÉ_°Aĺ<=č›bżČsó¶Jň+ě÷­M”`W.>äVĄ8÷¨,˘ŁÁ\OŤuÉîj™Ýa"Ůö0Ú€uҏۋؼd ¤_–’śâľVŢjQ§y.ţ™Îž¬'śáŽÓ0ő~Í(t:dŃѨ€"ČŔčΆŕ$Ƨ˙rľEVŞöHäŃ#HľQň*ÉB~1˘'ßóHEýhzŹ!Ě ľ> źáŔĺOÜoˇB)Žş-ţ'ΠŁ/˛LźńF‡©kÖĚĄE ÇĂ˝ o‡ý˛|*8’ábT°N]cŹÎÝĘćv:!$4Zv[oőŘđí©+ŐĹdťÍX{ÉS˛Ż§§¦ŘC,'Ydĺ ÚËŘuśĐűf®L—®SžŞr>O÷dÉDŕĐ€3Í ˛§Ęľ-lĽ.wRŹ/EF# ÁOťÎ´˝—Í×ý în¬ €'…(÷hĎĽ(ęsęOŔŇ Š÷Ťě¬qÍápÔQ{®¦%# SőCĚő#MőŁ(ă4©@ ˙mĄÂTq•†żłÚ}Âă E!7Ě9€¦X($ą!q E’s±lJđ'eh‡Ü4A­Ŕ:ægaw'á9>^ŃaŹ»P\_S¨[*Űł^ů OBGúŮR°e‡Ĺ‡€˝ DR#˘-A’ČÎ8'«Ł#®k/,IŞúu5čő-źč@ńşv–Ç·öˇĄL™—Wíj^- ANŢ3ű4P…ÎŃ+ŇĚÎiçÄe]Ź 45ă°o‘0…X©¸¬+ą¤)šu=ŤĽ®eĹşiĽZbşR!nYŚTz±7lˇŇ ÇFPËěňđş ­k?gÁ‹®tSy¬ aúaâ3(I*J@$˛ë…ő:źBŻńl0ť­4żôV~ęÁzŞŤű @s2LťÍŔ]ĐhF7i¸sGłĐŃĐ$4e@RS†úŔÉö4.1SŞ˝0âQńĄŇ¬€oĂ(űôj+Ç Ř9Ëa¦;fŤˇ±z\ç6lnŢŤŮAÁĺʆz´Ç JmÝőuJ{|ž“ ÉÁ˘ł©)(2>5đä0ŹÝ ^ÁM§ł·CO0Oĺµ ›/'ĺ÷ĎĄśnVŮh—•UŘ™Ďá÷MťŔĹÎöĆ­UµV+5sŃňÍü¦Ş!ëć•€«µuűŐ›oűŔ©ˇ€ąĺë‹…çżlďÓ2üw äż[|n±’ĎöĎ ř/ň—„•ügH#~ă‰>dÇ˙ó/€çm¦6şČ0Ět•Ŕ·Đ19&5ŤeČŔĘĘ(ÉöŮP,ŘĂ\łi‰€ 쑣¨„óíÎ{6:Ó?P »™„IwšY`¸a‡ ĄiľS·±łÁÜĚ:o…XŢÔmo"Ô ĄłGÉnN¶rg¶řÓ…¸Źśţ€˛ B»—28`Ô2ÎWŚ1%¤-Äo AźĽ”Zµ]áaDoľ"‘Ąex)˘µűÂ,~…†®í΂#Ň"Ô0ŘçŔßÜ·“TkNĽC{QÍÓN{~ ĺl/‹ôŞAu– ~¦K‚(xc–ĹW›¨$[×*–؇ý–ü·łSĄ’'¶=<'o”7"‹cH˝d Ěbü ÉaS3ô˘;pć×n㨫gEúů˙óꬔş2•zĘlí-9uµ¨[”¬Ü€z,ŮSŚT®xÎ÷ą{ő}ýóňź¬jş YôŚ˙ 4Ě'ďŔÔ…Ô ,ix½"®…łÓYĎBú’;–{żßKŁŰ@ăPaq!0,/Iôńó»OLHďNJ)UŚ"ć® »śŚfücŞeŚ&Ădq.|"kŽŽPşGž†´ÚÄň…ŠÓă«˙R˝ż{ń?ň€— endstream endobj 668 0 obj << /Type /Page /Contents 669 0 R /Resources 667 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R /Annots [ 666 0 R ] >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [210.866 460.515 319.169 471.419] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aab4d4c3cfcad7bd7bdebfd947fea8e75) >> >> endobj 670 0 obj << /D [668 0 R /XYZ 89 770.89 null] >> endobj 102 0 obj << /D [668 0 R /XYZ 90 739.935 null] >> endobj 671 0 obj << /D [668 0 R /XYZ 90 553.953 null] >> endobj 672 0 obj << /D [668 0 R /XYZ 90 553.953 null] >> endobj 106 0 obj << /D [668 0 R /XYZ 90 553.953 null] >> endobj 674 0 obj << /D [668 0 R /XYZ 326.66 222.876 null] >> endobj 110 0 obj << /D [668 0 R /XYZ 90 205.505 null] >> endobj 667 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R /F11 673 0 R >> /ProcSet [ /PDF /Text ] >> endobj 679 0 obj << /Length 2621 /Filter /FlateDecode >> stream xÚÝ]Źă¶ń}…±@]ëH}+@vďö’ î’kÖoIPĐ6mł'K>QŢÍć×g†3”e[\ÚköE’Ăáp>ɡl&bňíŐÝüęŐŰ(š”a™EŮdľž”b’g2L#9™Ż&?2™ţ:˙~'"LaŠë»Ż—ÍJ·ÓY”ŠŕNoŐ4J'ÓZÄ˝şź_}ş’€,&ŇŃKó0ŹÓÉrwőóŻb˛‚ţď'"ŚËbňě°v“$Šá_MŻţ~%Nx‹Ďx‹ ™GÄ.,‚§©L ĚDE č·2kdi­[]wÔUézÓmÎSSßâĄÓ–A¤t`Ü)Ů–z:łă ă<›Ş"j­VË-Łm«SíTÁF3öÂt­ęt8ťĹ"~¬5M]6‡jĹśW¶!h§>NĄčwÄĽľ˙p˙­Ó„̤ Ë4%,›Ýľ2 · : no§đ}M íő„Ťç­A6T.đŚőb©oß6«ĂRskŮÔ¶ë‰zŮ9<µü¨6oÝ0u’ÁëVíô ŔY|1 ¤FvŁ+bHeđé *Ó˝`#"^YX0¶ĐôG6 ěP-Şę!ÄéL €ŔjšnM˝ä)¤"¤á4 ­¶ş}BćÓ2’^nkóé ‡DyőčÜěżňë=›n ëo‘ ĎlČ,Ovž ô¨; ÉŇ %ü[VćÁÖl¶Î˂نN´'‚†ěĆ{€ŕŘĂąÜ>X˝:!CĹŽ-ăXĺ,ĆĽN ó¨h(Kă°×-÷Ôô×5(DŻŽ ŹhúTę)nŮcĺa%„5Gvâ<§řÍě;jM,OÉĨźěĚ-č–(Í4 T»Ş´µ„*p˙Ž(Ă(I ô˘L…|Ó¸“3§ŚÂşLß0Á•ţE¨ĆíbSY"›É$é)1ę^·Ł.ĽUu­«SđŘ[Ü:Y””Án#€‹:H[ĐÁľŚ¦ss2TzE&Ţt ëÜâalhń€ád÷›±ťerÇř¸0×zDŠ}C궸ŁNVvoť˝$ŁˇÝ‡‰ôGĆbd‚ó°˝1.Ű8ó®i„tcäŘő‹H…ŮÔMkę Ť‘ÂahŻV«ľSŕJp¸Tŕ):Ió¬–ç9…C—˘¦mfčâŞr–Ž=× Ť„łoLÝéöš(ôŽěÜ˝˛gqiĄÉ•6Ç+ëŁLŐ ˙ĂČÓO_ZNzĐ IEŻč›ŃOŐK]2„˙F×H+j؆Đْ瑿ś3s ô2¶ŮVŐvgşÎE†Ľ¤•áŻřŻU[·óÜŰ:ŽuLśXî”5Kř u[Ô B•V+ťDrďyď]“ŤćŢľŃń6<¶ĐÝ32>˛¸˝MU–Dňä=lÝ•H 'Óvć?fYlő'Ż/;ćnÓqYrĐj ­˛w7ě]`ŐŃđő ­C7ą č6ׄâi× Źˇ%€śťż`sŻ—FÝWÔĆÝăżëązŰŞC˝mÖîÜiŔ hD–ţ âҸ̙4·^Ö Ň@+mÁ˝ť% tĐm•—ů1 :)şS.-áQă0Mů”‡Q(!Y ÷N{Ş3äbŔ r§śVmŘ/ŢzŹÁŁůÎC´Čđ¸ kDI'%­q‹‡ż,řî~vĚ_Đ~’ř§ ďÚý9í"čŐ h°S¦¶ÔŠDRĐěŻßSX;ś#x|Ż™(§j`lôq ¦F¦(BMÍ«í@+9Ńś,#ARčĆĆް~á Ż`çEíńż©˝c¬žNćĆÓ÷‡vßXż„=,ŮYĽuĽA©ŢŢý•-ÄlLç§¶ „Iq~ÔĄX“őa·đśăA˙C}]“Ô-ĺ@Ý2–ˇ…ż$ý0be(Jéţ1B# ˢGx —ÁOÓYÜľGë,{ČSyđ8B;ažö«÷ °NjvďI‚ĆŽĐÇď~÷:řf„ťY.B7·Y”…‘(˙k+†ű©Ć‰źú7ŚËě|rd™8 é*ÉČÔNř ÷AzL6’c¬Çˇ„'Ďůć’fćYîÇÓ8ŽFäó0Ę"DsH`…(öÓysíô©¬ŻĹŢz÷Ń~nźŹŃiĚ}Îx'–Ë-GqfeüőLůŹWÁĂt9uNÚłá(ĄČżę˘„¦S€5ŤĐ‹Ă8ý7Íň’*¸ŹČ{˛źńś(-A„Ĺ×vť˙uA§rŚSyćŮ…wl&IôĹŽ=ćÇĹĘŤ‡ˇ!ÎGcCĘôˉŽF†XBĐĘłÓČĐüŹéQ-ź;“,ÄŰĄój®a ÝšŽS«ŹŹ^®ż<ú8Ypřą9»™üt0~"V,ÎS9¨*=r*8O°O’—đüŚ{XY„e©IţÇÜ«ř?sŻ8_#q~}˙’I‘ŤçM– `ňŽčKĽC),őŻ»ÇńThąv©óŐúxâÇŠĎćĐ:Ę0¬|5ä2CçŮ9ÎEń¤ .OÔĎ—ňęeXCa—…öyť«/p\ŠyA8vxźO W,Ĺú2\«—‡Š‡o+óiMS}îv™‡eś ď0‰4úlŘĂ~ß´î­ůŹ®¶’Á{<Ôť®-•z_,B`Ůqů KäZ‰«>Y^ľsě:pĄ÷ş¦R6›š–ë<§ľ°Ś¬™ÍlLµ»Ŕ%™ç őłłáÖRĽł›ÁĹť˘{® éŃĄ‚ˇˇ†çÝbÉáGŘś«€8úĐѨłh»bv´r\ëBt»JÓÉâL˝Gz–°kŞýdź)v°řQf·ooP®îX҆ąpYKńŘ ›3B\--Ąn±P@˝Ľw‹UN 8Çš—ëčďžx= Ŕ¸Süź«ź{ľ#Zä3@Ô †*- ôŐH{VNôćČd©­5ľôąo‹gÝúgś^70Ř/éC­ˇOÂu˙…štҬĆć…VÁŹ@[Ş=E⇑7ś†I,óS‰ _´“ül˙YR‡®Áz6’{ÖBŘ?TČ|đšŤĘ,ZŐú·˘TJŻ…ě¸‚±ü sJ2ż$9V‚ç(T®}hŁ?>FÎ"_ë]č4®.·Mc}˝®^#Ô=¤šŚTS×Zuŕ\ŁNó°¦$đx÷\¦‡Žs[]Ý 7Gy"ö™`|ĄG˘â’¤q)¬ń×Gźž%ą`†ŚŻ„îč†ŹŻˇ'íh©ąŞŘÖW7g·=LŁźÜgyŠ‘îpş|ż÷đçďřd)ýŮgü?ÉÔ: endstream endobj 678 0 obj << /Type /Page /Contents 679 0 R /Resources 677 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R >> endobj 680 0 obj << /D [678 0 R /XYZ 89 770.89 null] >> endobj 681 0 obj << /D [678 0 R /XYZ 270.681 557.547 null] >> endobj 114 0 obj << /D [678 0 R /XYZ 90 541.456 null] >> endobj 638 0 obj << /D [678 0 R /XYZ 389.265 260.122 null] >> endobj 118 0 obj << /D [678 0 R /XYZ 90 242.91 null] >> endobj 677 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F11 673 0 R /F8 682 0 R >> /ProcSet [ /PDF /Text ] >> endobj 695 0 obj << /Length 382 /Filter /FlateDecode >> stream xÚí”]O0†ď÷+z ‰Ô~C˝Ű—sĆŹDą[ŚA(‰a ”čĎl·ą‘Ĺ%Óx!W}ô=í9ćIŮuöÎ/ A!a $‚IČ ÂĚśá"ZiU¸áČaîSxm úŹçÄ^ٞ4ۧy˘Ţ7Ě e‚X‹ q{Řő0Bč«ů&+µőR ˇDX+ńˇ¤ÂXŻTˇĚţh-ôЏI¦Ę3•ş¨b˝ŽŞ<[ćö¤(OŚČňşŇÔĹőŁXŮ—o™^őRd*52Qe\d+Ýä¸h.ąéčvE˘ ń0é5őcźűPf®ßﻬ®z|7|Té¨N»“ Ě<Śä@×ăčß/LĘm´ŰôVłëĆ‘Ŕw°<@ç[Zőw†1”ś·@Mó~áâŔ™—mV~ÇęTdý˛tůř9˙űČęIěPý*ŃBu«t4Št´ʧ˘Őću$(ňó3u_éC˙AŽhéÔ٢G!‡˝°ö endstream endobj 694 0 obj << /Type /Page /Contents 695 0 R /Resources 693 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R /Annots [ 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R ] >> endobj 683 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 482.911 185.567 492.839] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 483.873 513.996 492.839] /A << /S /GoTo /D (section.6.1) >> >> endobj 685 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 469.98 178.195 480.884] /A << /S /GoTo /D (structAACENC__InArgs) >> >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 472.037 513.996 480.884] /A << /S /GoTo /D (section.6.2) >> >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 459.001 191.107 468.929] /A << /S /GoTo /D (structAACENC__InfoStruct) >> >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 460.082 513.996 468.929] /A << /S /GoTo /D (section.6.3) >> >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 447.046 189.991 456.973] /A << /S /GoTo /D (structAACENC__MetaData) >> >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 448.226 513.996 456.973] /A << /S /GoTo /D (section.6.4) >> >> endobj 691 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 434.114 184.84 445.018] /A << /S /GoTo /D (structAACENC__OutArgs) >> >> endobj 692 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 436.172 513.996 445.018] /A << /S /GoTo /D (section.6.5) >> >> endobj 696 0 obj << /D [694 0 R /XYZ 89 770.89 null] >> endobj 122 0 obj << /D [694 0 R /XYZ 90 739.935 null] >> endobj 126 0 obj << /D [694 0 R /XYZ 90 553.953 null] >> endobj 693 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 702 0 obj << /Length 147 /Filter /FlateDecode >> stream xÚ•Ž±Â0C÷ű Źí@¸Ü‘¤YA€č†ČVu@XZ$Ô>źPÁŔČdÉz~2ă Ć––‰ćD˝x¤ "#xkśX¤Ma}٦Ô,śĎŁ©]őÇq,gâ¸ŘÝşóóÍĐ:ŃťlFvň¸`‚:śjZF—űl4VxLÔ€…hÎÚ>}óÇU©Q–U/ľ~0Ţ endstream endobj 701 0 obj << /Type /Page /Contents 702 0 R /Resources 700 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R >> endobj 703 0 obj << /D [701 0 R /XYZ 89 770.89 null] >> endobj 700 0 obj << /Font << /F22 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 708 0 obj << /Length 314 /Filter /FlateDecode >> stream xÚ˝‘ÍN„0…÷<Ĺ]‚z[ÚîĆqfü[vh EšőíĄ¶3:1n]ťÓpľöŢÂ+ ěôzU[Ć€!‘’ (ZČ$ωČ((ĂuWfe˘ Eô\Ü9‚“4K©%b!϶şW.};4ęýDPN.™'dB¸đOBŁ"âöAOłGČI.™ô$KIžHGŢ(ăózrZ9é-ţĺĆÖč{gžYŻ|üMĎťs{Ł•Ź6jŞŤ>Ěz¦K;Ä©ŻoE `ěÁšÇ]`ףi1M‰dÜŤWUµę—^ď#Ž!éÎî‚ŇŹ#p{}ď^^­lp훡›có˦2~Ůaů#mD—­jż§ŞSÖmxôb)WäYHY*ţ9/đWqeLY&C&ţhú\7Eđ Őšˇ endstream endobj 707 0 obj << /Type /Page /Contents 708 0 R /Resources 706 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R /Annots [ 704 0 R 705 0 R ] >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.177 481.935 154.843 492.839] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [502.041 483.992 513.996 492.839] /A << /S /GoTo /D (section.7.1) >> >> endobj 709 0 obj << /D [707 0 R /XYZ 89 770.89 null] >> endobj 130 0 obj << /D [707 0 R /XYZ 90 739.935 null] >> endobj 134 0 obj << /D [707 0 R /XYZ 90 553.953 null] >> endobj 706 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 712 0 obj << /Length 145 /Filter /FlateDecode >> stream xÚ•Ž1 Â0„÷÷+nlăË‹I“U°b71[édŞ­ŕ¤?ß4čŕčtp|÷qŚ+{ÚFZ·"*8qFă´˛˘úJűzŚgĄYçQiŰŰ4Ö+±\îi|-í"=h!şhlŁcqž©)÷X™ŕń,ÔŚŤśNt$ţ\úćŹËeXţU˝[x0[ endstream endobj 711 0 obj << /Type /Page /Contents 712 0 R /Resources 710 0 R /MediaBox [0 0 595.276 841.89] /Parent 675 0 R >> endobj 713 0 obj << /D [711 0 R /XYZ 89 770.89 null] >> endobj 710 0 obj << /Font << /F22 400 0 R >> /ProcSet [ /PDF /Text ] >> endobj 723 0 obj << /Length 723 /Filter /FlateDecode >> stream xÚŐV]kŰ0}ďŻěĹ~đť>-«ŚAŰdŁ•Ňć­ű•FŕÚű ŰŻźËně8! 6ÄŘŘ÷ž{îŃŐQ0zF}=Ăî~ą8űř…RD1„!h±B Ł+C‹=xWëřµŇĄP˝Đ˙±řÖfp‘$MFŔ#ę˛xłiĂgERżčĽŠ+Sä}*áŔxH]jČ€ W+âcě]\řBxWó›«§Ëz5Ó›¤EĽŻĘ:©Úç;˝˛ĽHäé<Ń-:“H ičŔiŠE-ř“'YťşHBv"©"›° ü4%ArŐÄqbK>ef ë 4I@2Ň~bŰw@*#0DÉ6ô¶^fĆ5zQUĄYú{uĄ7 FżhŚí”#!pŰŁÍ‚H9!)ô+ëőͽƠ˛ůÖ<Ümš˛yýbőÖë1¬ D‘Ńń"o ë¤NľĂŐ®—Ľ“ćcÖ\(Ťű¤ŰAqą­4‡˘ŇńU'‰2¦*AąKő4šŇvHG,}*<;«×©Ý ĆBQ]"Î`ŞNúďż7żô˙ÁtžísÝŰu‚ĺpÓYĎé]g¦«Řd:uîe]§4Ż;ŢĹFî"€ Ň´ÁK휯ZëöÁ䯵ó«8wŔE]ő/‡â˛WEŮĄ߮։ćyó+Rý¶ëßÄ%q–Á”á}1¨ă»~Yvľ?‹«řĄ”e Řë;=öđŔ’ŤÇ`„;XóýÓáü|F „C~M°[”U{×q˛žZ÷5ÓM÷ÝÚşŔźÖ˘aZ &b±+ýwbLyÎ)Şě&ý:ŕŚŘłZëăÓk™sÜ3ź0ÉŃ({'kĚśĆo>9tYˇŁSGѨŔđÜ9˘ö´ĽT4’÷¶0y˙—Ş*Ú»Ą*<ťTÝÖO »ÉLnňçĂzÇiZęÍĆ ßžGĎgż×˝c1 endstream endobj 722 0 obj << /Type /Page /Contents 723 0 R /Resources 721 0 R /MediaBox [0 0 595.276 841.89] /Parent 731 0 R /Annots [ 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R ] >> endobj 714 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 435.524 171.524 444.37] /A << /S /GoTo /D (structAACENC__BufDesc_a324387bb8e5f44650c6e17c209bb05a9) >> >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [146.369 420.346 165.317 429.192] /A << /S /GoTo /D (structAACENC__BufDesc_ab13b6a5c10505c3defd8bb1c19eac81d) >> >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.471 405.168 206.751 414.014] /A << /S /GoTo /D (structAACENC__BufDesc_a2c09424d3a61cdbdb80c8d9ebb42ce71) >> >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.471 389.99 176.575 398.836] /A << /S /GoTo /D (structAACENC__BufDesc_ace97d9ab9ad2f7b24041ee253ad7372f) >> >> endobj 718 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.471 374.811 185.432 383.658] /A << /S /GoTo /D (structAACENC__BufDesc_ac32946f846b95272038017687a96f2c1) >> >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [269.505 308.206 336.772 319.11] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [239.926 156.727 349.733 166.655] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47) >> >> endobj 724 0 obj << /D [722 0 R /XYZ 89 770.89 null] >> endobj 138 0 obj << /D [722 0 R /XYZ 90 739.935 null] >> endobj 581 0 obj << /D [722 0 R /XYZ 90 553.953 null] >> endobj 142 0 obj << /D [722 0 R /XYZ 90 553.953 null] >> endobj 725 0 obj << /D [722 0 R /XYZ 90 454.643 null] >> endobj 146 0 obj << /D [722 0 R /XYZ 90 356.227 null] >> endobj 150 0 obj << /D [722 0 R /XYZ 90 289.622 null] >> endobj 727 0 obj << /D [722 0 R /XYZ 90 264.292 null] >> endobj 154 0 obj << /D [722 0 R /XYZ 90 264.292 null] >> endobj 728 0 obj << /D [722 0 R /XYZ 238.442 221.46 null] >> endobj 158 0 obj << /D [722 0 R /XYZ 90 199.722 null] >> endobj 729 0 obj << /D [722 0 R /XYZ 354.316 158.904 null] >> endobj 162 0 obj << /D [722 0 R /XYZ 90 138.143 null] >> endobj 730 0 obj << /D [722 0 R /XYZ 273.44 96.348 null] >> endobj 721 0 obj << /Font << /F22 400 0 R /F37 546 0 R /F11 673 0 R /F23 401 0 R /F14 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 745 0 obj << /Length 827 /Filter /FlateDecode >> stream xÚíV[OŰ0~ĎŻ°´—äˇĆ—8iŃ4 (L m´o€›¸­%Çaą ±_?'vJRBÚÓ¤I­Ňşçö}ç;ÇE`řęť.˝Ł BŔ Î"ĺĚ# Á`™‚[ź `B Ť#˙Lń˛ &„!ž'u&tĹ+™ëŕ~yĺť/˝ź61Ŕm Ă2dŢí=©9żŇŮ<µV 5Oެ‡Ż1±őDCĂ`‚Bţĺő˛ItĂžcĹMđÖă!jŤcšÎćä$`Ě?;ż>{8­×sQ&ÇÇ«€ ż^/äoQ:ÚóźD˛Cd‘ ÓŘZ†ňµ} žlí'. Ě_‹ÂžImźÓÉJVÎěą%© ťBÂ<°­ű]gćó4¨ţşÎV]e]ýĂŞmaŤŽaDő[nčt ‹öhť»€ŐV:ń”UQ'íS€‘ĎݡEÁ+‘:×"Ď:_ŃES*ojy’zcŹLw‰Ç­;ÁN 8CŘÔˇ»#„ ¬¬V‹ŤíŤń»ť0C&ç‰ĐÉ’« D>ÜĽÚ®ŕŇ0"­ ş\!”u˝!®/˝v\ꓢA»qh=nD# <őM^aűDă˝>Í c˙“Ô‰ŞSg‰q_úĆfĆś¬?ŹÄ2sÎ:¨ć^´›!Ćťń—ť*1†3Ć~J!‰$ahMż×+%'ÉŞ*¤ŐQe'©Of_Ž»¶EF“Ó7Úćšä&Ľ‹MZŁúK˝ŕŮŁÚKş ÔČÁ(¤źéD'§Ď#čö¨ę¤ŇcĘhb§–ą¨¸Tťţ›á-äc·bß]·¦ç˘-Ę˝‰‘ú±v"ă­Â6í„–{ÓÉőaF'çşyĺ©IÄyă}®»„+Çd‚^Łîfä›xY;s^ń7®×ë°·şÚx;ǶáËřµ ±ß°ĂĚŽmE®©/žÝŢŰUÝnoׂÜąN–ĽôĐjÇ}0äý`:˙đŠ˙Ő,T®dúZ1u*ŠŇ%p;—ˇ¬V•4GĂX=çd˵Şl¤ň˙ÚxßµAÇ®ŤöňÍű×Ĺ?zuěČŘ˙ł8Ą"ňŃ˙Š›“©˙ endstream endobj 744 0 obj << /Type /Page /Contents 745 0 R /Resources 743 0 R /MediaBox [0 0 595.276 841.89] /Parent 731 0 R /Annots [ 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R ] >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 592.512 165.576 602.44] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 735 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 450.227 194.766 461.131] /A << /S /GoTo /D (structAACENC__InArgs_aefc45c133d4f9775d8d0aadf56302ae4) >> >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 434.584 191.997 445.488] /A << /S /GoTo /D (structAACENC__InArgs_aa33d59e07bbd49bfe4dd6793763c6d48) >> >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [229.386 368.779 296.653 379.683] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 738 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 168.668 165.576 178.596] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 746 0 obj << /D [744 0 R /XYZ 89 770.89 null] >> endobj 166 0 obj << /D [744 0 R /XYZ 90 739.935 null] >> endobj 732 0 obj << /D [744 0 R /XYZ 225.72 704.412 null] >> endobj 170 0 obj << /D [744 0 R /XYZ 90 681.628 null] >> endobj 697 0 obj << /D [744 0 R /XYZ 90 582.846 null] >> endobj 174 0 obj << /D [744 0 R /XYZ 90 571.761 null] >> endobj 747 0 obj << /D [744 0 R /XYZ 90 471.869 null] >> endobj 178 0 obj << /D [744 0 R /XYZ 90 414.953 null] >> endobj 182 0 obj << /D [744 0 R /XYZ 90 349.148 null] >> endobj 748 0 obj << /D [744 0 R /XYZ 90 323.609 null] >> endobj 186 0 obj << /D [744 0 R /XYZ 90 323.609 null] >> endobj 749 0 obj << /D [744 0 R /XYZ 276.798 280.567 null] >> endobj 190 0 obj << /D [744 0 R /XYZ 90 257.784 null] >> endobj 698 0 obj << /D [744 0 R /XYZ 90 159.002 null] >> endobj 194 0 obj << /D [744 0 R /XYZ 90 147.916 null] >> endobj 743 0 obj << /Font << /F22 400 0 R /F14 726 0 R /F23 401 0 R /F37 546 0 R /F11 673 0 R >> /ProcSet [ /PDF /Text ] >> endobj 756 0 obj << /Length 1110 /Filter /FlateDecode >> stream xÚµWKsŰ6ľëWđHÎT4’zä&KIëLd§¶z˛=%tH€%AŰĘŻ/^”DEU¤I|"°v÷Űowoĺď÷Ţő˘wő !oŽhŕ-2o Ľá† ‚Ţ"őýA}”2 ’Äź~Ľťţ}Ăł%ľxUC¤]ŢßÓŚVů”ŞDQ4N|çĹçŢÇEďßTĆŤ±dŁÄ#Eďńx©’ö@ŤGŢ«ŮUx1ŠÔ7÷zöŔă†ă$A­çH"ëů×f™3âś—˛bËż‘´6Ž´š”šh?„q4ňú…%VÓBIçŚ÷ŘOđ˙şą]8ąFS­¬{łCŰ-đŰ]#Ż›ězshw« x}¢_`lÂÉ–ŕĎZb\AúÄňü Ő‰đŔħů;ĂcĽlätŤ9§ů{Ě*\Đ/”ŻäúťQ©)­f4Ç›ź5ýcrÚ> endobj 739 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 704.694 211.922 715.598] /A << /S /GoTo /D (structAACENC__InfoStruct_a06f045f69acad8125b1fb814d565549c) >> >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 692.282 198.632 703.186] /A << /S /GoTo /D (structAACENC__InfoStruct_a5187acfd8fb7585377ebf162fbb9db39) >> >> endobj 741 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 681.928 201.013 690.775] /A << /S /GoTo /D (structAACENC__InfoStruct_ab919b721d3ef5d4dd56c46614cdf0047) >> >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 667.459 199.748 678.363] /A << /S /GoTo /D (structAACENC__InfoStruct_ac786a4ebf4dc7f2357cbc142265f5dd8) >> >> endobj 750 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 655.048 193.641 665.952] /A << /S /GoTo /D (structAACENC__InfoStruct_a993149bc5985d79c40d6e96a2d90a228) >> >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 642.636 197.506 653.54] /A << /S /GoTo /D (structAACENC__InfoStruct_ab5c902598267b09b625e440b53937c76) >> >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 630.782 185.91 641.128] /A << /S /GoTo /D (structAACENC__InfoStruct_a5bb3228c5af5584f97c54bdf8ed946e3) >> >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.192 619.87 177.043 628.717] /A << /S /GoTo /D (structAACENC__InfoStruct_a3356592232c6536392a58a6c9e185cb6) >> >> endobj 757 0 obj << /D [755 0 R /XYZ 89 770.89 null] >> endobj 758 0 obj << /D [755 0 R /XYZ 90 723.104 null] >> endobj 198 0 obj << /D [755 0 R /XYZ 90 606.782 null] >> endobj 202 0 obj << /D [755 0 R /XYZ 90 546.674 null] >> endobj 759 0 obj << /D [755 0 R /XYZ 90 522.346 null] >> endobj 206 0 obj << /D [755 0 R /XYZ 90 522.346 null] >> endobj 760 0 obj << /D [755 0 R /XYZ 185.222 468.561 null] >> endobj 210 0 obj << /D [755 0 R /XYZ 90 452.32 null] >> endobj 761 0 obj << /D [755 0 R /XYZ 230.083 412.503 null] >> endobj 214 0 obj << /D [755 0 R /XYZ 90 396.262 null] >> endobj 762 0 obj << /D [755 0 R /XYZ 252.31 344.49 null] >> endobj 218 0 obj << /D [755 0 R /XYZ 90 328.249 null] >> endobj 763 0 obj << /D [755 0 R /XYZ 123.803 276.477 null] >> endobj 222 0 obj << /D [755 0 R /XYZ 90 262.293 null] >> endobj 764 0 obj << /D [755 0 R /XYZ 281.769 208.464 null] >> endobj 226 0 obj << /D [755 0 R /XYZ 90 192.223 null] >> endobj 765 0 obj << /D [755 0 R /XYZ 318.71 152.406 null] >> endobj 230 0 obj << /D [755 0 R /XYZ 90 136.165 null] >> endobj 766 0 obj << /D [755 0 R /XYZ 477.971 96.348 null] >> endobj 754 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 784 0 obj << /Length 1249 /Filter /FlateDecode >> stream xÚÍW[sÚF~çWh¦/Ň4lö˘L§36ŕÖ;q<Ů)łH ¨Ł ŐĹĆýő=«]É‚BϤ/H¬vĎůÎw®‹ŤµŤßz—óŢŰ+JŤ¸Ô5ć+c€ Ď%ȡćƽI©Őg”y®9ŠyQX}ę`sśU"Ň’—Q–Zźćďz“yďď™Ř µ ÇCsŚ éÝÂFëď ŚŘŔ7žę]‰aSĎŘőţčá“x(üő¨Âă"†(ň­>Á›ŻßϤ‹ ËqĚŃäýhqť®,ę٬̫ ľűP•—Őęňą…„ :XG6úÔFľç*·|%Uv3f¦U˛ą|§f¶Rk" ˛°Y\FeQć‚ëýËZGýĺ)*7QŞ–łT¨ĹUάľăřć,úG¨ĎˇŘŠ4Ôç2}&yÁA;8ÄFHŘ„ ă(ŘEµÝfy)B ÄvÍ`ĂÓTÄŇc¶gJrµ…®‹’§„ðo^YXÓß@šČ%Ř(]«ŁŘÁ\‹« a3TVę —v<ŮĆb_ëزÁC—?ňFËŻm—o%Ô5ËL=—ú?feRĹe¤€×ydyăgËuLÔžđKmubľŃ›Ă˝¨­—txOéŘ.ę¨QďOúĂZ¤"çŠ_y4Ď’ć¬h¤Ĺq&CďI‘KÓX ëi‚Ü .˛™Aç"ĎŐv=PęěíR©”ŻuNMáÜ}ßç</.âh)YE›˝Suö1ŰĄ2´űŤ.8¤N“C¶ÎźNÖÜŠ’ŹyÉîY‡…©XAÄ_ŹPéĂĽôńQ­PJ˙)J¸ őNB:;†<¨Xmüĺ,¨ö Ůđb©˛ň@šG ÄfóŻ:±Áü:\´ů Ę…ö3ůd ¶ŢUË8 tÝ(ˤجtqčrŮ­­×€]—|«×€iđ–bz2·ĚĽPYaBLµ°OG‹»©\ţpu}3ůşä:¬ó`±Í3iGtŔÉŚ°ˇ˙#ÔA–lĎ…Mż[”=@-ź`hnů:uŻE !}#d¦>Ę’%â˙FŰąúk[$ŕy˝ČĹjwuý˘€zř#t—Ă?Ž~żžÖz7š,’hŞrś.˘p÷*枡z2ź]/ĆÉîćńuž}]%”ÉRä·Ńîőbę ­E•çY•†ŻŞ÷ ‚Ă,^>ĎĺY(ŽtŔn Đu[v€v$şގďEqÓŐǢňhŰ̵_u•-Skg!ĘjŰť$Ş\ c­ ď÷$ ‰jH·BÍzű’?ş&ĺ)¶ŘZ©Üy8)7=8ěF©=‰µ'OS0ŞĎ5ó•J6Č;µ°źńz'#„Ľ7śĄ2ýäËXČiń¸ť PŻk'=2ĐȆ…eĂb4¬cŞ˙MżbMż:ÁŠjR˛fwŐéŰL%r#¸ś+ź­¶ @9(Úáłí~rţľgBśüďîĆť`t/rfôŘ ë€!ĐLëÖ†_ZŰYA¤^„U…6ă(‰ÚjÂAń(˛H'j¦5@hĺqĆÆÀ·ą,ď_ꍸę w5˝o§çI»Šî˝Í< ®aG Űhŕ·3'ŐRá ŠL»!—čůóů®¬żě‚*µçŞĂ µĎĂô[ďÓ˙ďĘăá endstream endobj 783 0 obj << /Type /Page /Contents 784 0 R /Resources 782 0 R /MediaBox [0 0 595.276 841.89] /Parent 731 0 R /Annots [ 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R ] >> endobj 767 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 634.621 165.576 644.548] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 768 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 502.077 284.43 512.981] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 769 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [284.928 502.077 330.637 512.981] /A << /S /GoTo /D (structAACENC__MetaData_a06cce4e89d53d956d27fb20892461aa0) >> >> endobj 770 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 487.956 284.43 498.859] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [284.928 487.956 340.051 498.859] /A << /S /GoTo /D (structAACENC__MetaData_a9274bda31c82bd154ddb3767b74be6b2) >> >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 473.834 214.393 484.738] /A << /S /GoTo /D (structAACENC__MetaData_a77fd2ae629044c75369a51760a00d57f) >> >> endobj 773 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 459.713 223.807 470.617] /A << /S /GoTo /D (structAACENC__MetaData_af001f70f58df01e7e65105bf752a44bd) >> >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 445.592 226.995 456.496] /A << /S /GoTo /D (structAACENC__MetaData_aeb0d2d7748c98809112088d0bd997f61) >> >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 431.471 193.242 442.375] /A << /S /GoTo /D (structAACENC__MetaData_aa2fbd6a3c66ac05e69e42782807e7ba4) >> >> endobj 776 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 417.349 265.371 428.253] /A << /S /GoTo /D (structAACENC__MetaData_a47e42d88c7abcaaa2fa9a72f6b6eaa24) >> >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 403.228 246.791 414.132] /A << /S /GoTo /D (structAACENC__MetaData_ace0f370c1026d179ea122c0820e1d17c) >> >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [149.616 391.164 214.841 400.011] /A << /S /GoTo /D (structAACENC__MetaData_a1e67ac741a9080f11325d0c02223f046) >> >> endobj 779 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [149.616 377.043 225.919 385.89] /A << /S /GoTo /D (structAACENC__MetaData_ad2646dc407b31f38dbf71178b6780916) >> >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [151.27 360.864 236.281 371.768] /A << /S /GoTo /D (structAACENC__MetaData_a0ad6337da83fa3a43a22f87d4ee8b192) >> >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [239.926 152.897 410.446 163.801] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 785 0 obj << /D [783 0 R /XYZ 89 770.89 null] >> endobj 234 0 obj << /D [783 0 R /XYZ 90 739.935 null] >> endobj 613 0 obj << /D [783 0 R /XYZ 90 626.477 null] >> endobj 238 0 obj << /D [783 0 R /XYZ 90 617.294 null] >> endobj 786 0 obj << /D [783 0 R /XYZ 90 522.197 null] >> endobj 242 0 obj << /D [783 0 R /XYZ 90 344.658 null] >> endobj 246 0 obj << /D [783 0 R /XYZ 90 282.964 null] >> endobj 787 0 obj << /D [783 0 R /XYZ 90 258.109 null] >> endobj 250 0 obj << /D [783 0 R /XYZ 90 258.109 null] >> endobj 617 0 obj << /D [783 0 R /XYZ 283.313 215.753 null] >> endobj 254 0 obj << /D [783 0 R /XYZ 90 196.393 null] >> endobj 788 0 obj << /D [783 0 R /XYZ 414.431 156.05 null] >> endobj 258 0 obj << /D [783 0 R /XYZ 90 136.691 null] >> endobj 790 0 obj << /D [783 0 R /XYZ 336.891 96.348 null] >> endobj 782 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R /F11 673 0 R /F14 726 0 R /F13 789 0 R >> /ProcSet [ /PDF /Text ] >> endobj 802 0 obj << /Length 1123 /Filter /FlateDecode >> stream xÚÍWK“â6ľó+\•‹]=,OU,0›ŮšŮť{šŮ¸Ś-WůAl3üú´,lÂ2ě!'Ëzt÷×Ý_«…Ť•Ť÷˝wóŢ·”ňęóĄáaĂuâ”óČx2Ä­>ĺŘ-ÎÍŃäăČ˙´©†…E°ą*ŐÚ¬*6aĄĆS±°80E ˛ ¦&eÖ—ů‡ŢdŢűŁG@36H­‰»ČeÜÓŢÓlD0˙ÁŔyc[ďJ ›2ř&Ƭ÷[źµšÂŻK«mD‘mő ĆŘü<úu8ýŠQă  nn˘TřĆę3rF[*QÔŁ,×Á‰•É"ę ”Ŕ"öy…D+¤ýđE‰ 6Qś«á:(ĺ‘Ň–eÇ@!Ýń5[ČycčuĆ\bĂQNő›`Ř测ëÄjgÓdny03¶7‡–ÇMő#˙qj1l~ş˝»źśKĂ:˙B­ňđcš\†Ź“÷ät¤až® Q–űÔ\ZR^› ˇť*™X¬4%§µ{µ6n!cĚ -B©&hv­&ťp*ŘÎâi»ÓŃîĽű8żŔ= śšŞ?˘‚rs/,ÂÍW9!’·ýőą:ö•N—HHçdš,µ´ÝZ„Uł˘@k\*ĐGuţÍ iömăJç"qÔwWÚă;epě`%9¶ŞTÇť0ßFŢ€6{¨Ă Şd§Ţ@ †â¨MżźÂŃŔqÁů‡]ާ˛ž2‚l×ÓqęÔS÷Âz:™Ďîüqş»Mt2‹RdŐ™Đh5·I°ú^w©c“îúÉ«özů’oíě…×¶«JdM}Ó…,čY(í9“…t Ń=Ž&~ď˘\&Ü6óăh÷MP‚ś+Q«WE¦˘a}&óXß."éÁś7Ń{qP—¦•Żđ.ýä:î=,fÄV˝‚ęać}—grÇĎjeIľÚčcť}ŔC›ą&, —GďÔ¬ăXo¦Tże%Öeü—ĐG1˘ű ťĺXŃYt–35ť¤„Eň8W°N‘[±ň˙EmŚ„śŠ>Áß ü˙™2źýB‰=.¸ÍE.ďµ+Ňš lö«Ëvűď.˝S´˛năĄĚßfP%ľz> endobj 797 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [243.463 566.951 413.983 577.855] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 163.04 165.576 172.968] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 803 0 obj << /D [801 0 R /XYZ 89 770.89 null] >> endobj 262 0 obj << /D [801 0 R /XYZ 90 739.935 null] >> endobj 616 0 obj << /D [801 0 R /XYZ 90 626.132 null] >> endobj 266 0 obj << /D [801 0 R /XYZ 90 610.195 null] >> endobj 791 0 obj << /D [801 0 R /XYZ 417.968 570.104 null] >> endobj 270 0 obj << /D [801 0 R /XYZ 90 552.01 null] >> endobj 795 0 obj << /D [801 0 R /XYZ 337.021 511.92 null] >> endobj 274 0 obj << /D [801 0 R /XYZ 90 493.826 null] >> endobj 794 0 obj << /D [801 0 R /XYZ 296.703 453.736 null] >> endobj 278 0 obj << /D [801 0 R /XYZ 90 435.642 null] >> endobj 793 0 obj << /D [801 0 R /XYZ 349.285 395.552 null] >> endobj 282 0 obj << /D [801 0 R /XYZ 90 377.457 null] >> endobj 792 0 obj << /D [801 0 R /XYZ 126.353 325.412 null] >> endobj 286 0 obj << /D [801 0 R /XYZ 90 309.375 null] >> endobj 796 0 obj << /D [801 0 R /XYZ 222.412 267.228 null] >> endobj 290 0 obj << /D [801 0 R /XYZ 90 249.134 null] >> endobj 699 0 obj << /D [801 0 R /XYZ 90 155.459 null] >> endobj 294 0 obj << /D [801 0 R /XYZ 90 146.979 null] >> endobj 800 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F14 726 0 R /F13 789 0 R /F37 546 0 R /F11 673 0 R >> /ProcSet [ /PDF /Text ] >> endobj 811 0 obj << /Length 628 /Filter /FlateDecode >> stream xÚ­UŃn›0}ç+üxö5†Đ·4é¦VZ·®ĽµU倓"čŔ¬ęßĎ€IšvŠ2 „1ćŢsÎ=ľ&húćś'ΗŻ(Ćq!JÖ(&( )ć@Q’ˇ;ĎgŔ˘Đ](Ń4žś¸Ë*m YjˇóŞô’+ç"q~;ÔÄ$ö1x„#ĆQZ8wefţ ĚâzéW(fž Ý:7™ŕˇÇśĂ ľ@?Ű•ĘÓÇ\ë:_y@ÜV˦2F2aŘ-â€Í€Ă‘îřŢ?čÎ焸—׉ťîČÔËęWż K[¶ĹŹVźżNsnăäS0 čé‰.Ë[Q<«e‚Ó3ÍËô=Ąi5üQH`:‹†¬!ćz>%&ÓRj‘+™YŁČ&­óçŃ&“˘đ`ÄCĄĽ'JiM¦źä0¨ZýÜęa,jŹÎÜMď>»n]Őö[ů9G!Ň‹˛»ŞĚdâÄÜt*V·.Ja wŹŕVÉ®fËççîââzńhl77 wÓśťMjvX\ëőëö _µőJsĄDý:Ľf[Ř«>ä EU6†B6~”FöbÖ>|3„â`—ÁoĎýź»çĂĽ|3N›ĺŐ0llČ˙HďdGÜí#Çóűăw…ĘGôąnt-Eń®ŚYĘZč‘fÖÖyą9y· ’ô=(Â!Ř*'ŁvŮžű÷÷Ş~Ę-4¸Mm‘^:eÄaĚëş*&ĹYWJUť/›~Şë JžíÝ6ŽyüQó?(D×;ŤĆŹĘ4qńÓÁF<=˙f 3Çţ…ă endstream endobj 810 0 obj << /Type /Page /Contents 811 0 R /Resources 809 0 R /MediaBox [0 0 595.276 841.89] /Parent 731 0 R /Annots [ 799 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R ] >> endobj 799 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 704.154 190.343 715.058] /A << /S /GoTo /D (structAACENC__OutArgs_aa08d19137d0dbd54d3d86f88a85eb149) >> >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 691.202 194.766 702.106] /A << /S /GoTo /D (structAACENC__OutArgs_ad4d8784f4d5504a5f87ef44af1e7b6db) >> >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [132.999 678.251 191.997 689.155] /A << /S /GoTo /D (structAACENC__OutArgs_a7d481a0e52142dcdbdfa34677b111d7e) >> >> endobj 806 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [234.367 619.715 301.635 630.619] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [289.908 423.742 357.176 434.646] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 808 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 381.499 165.576 391.427] /A << /S /GoTo /D (aacenc__lib_8h) >> >> endobj 812 0 obj << /D [810 0 R /XYZ 89 770.89 null] >> endobj 813 0 obj << /D [810 0 R /XYZ 90 723.104 null] >> endobj 298 0 obj << /D [810 0 R /XYZ 90 664.677 null] >> endobj 302 0 obj << /D [810 0 R /XYZ 90 606.141 null] >> endobj 814 0 obj << /D [810 0 R /XYZ 90 581.812 null] >> endobj 306 0 obj << /D [810 0 R /XYZ 90 581.812 null] >> endobj 815 0 obj << /D [810 0 R /XYZ 322.456 539.982 null] >> endobj 310 0 obj << /D [810 0 R /XYZ 90 523.255 null] >> endobj 816 0 obj << /D [810 0 R /XYZ 324.688 483.439 null] >> endobj 314 0 obj << /D [810 0 R /XYZ 90 466.711 null] >> endobj 809 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 828 0 obj << /Length 558 /Filter /FlateDecode >> stream xÚ˝TMs›0Ľó+4é(úôć§M?’©Ë-éxT636¸€ů÷H¸6™¦=x:>ćíîۧ} °|đ»Ţ¤Ţő-!€ (á -@Ś€`1äiýůFí;Ý!áČ—ÁŹô“E0(#‰{!çEÄnË­¶ŐIťvşęTWÖŐ‰¤L‡2î¤$ÄABľR™®˛Ő¶ü0äĂŤĺűÍĽÔ…i Gľ©ŇŽ™‚Ć‚GL$Ś©p-%ź-n6ëůćöaQeu>:3RŤjžíCYÇE€M#™SÜhu¬}Bl5´şTžëb aV÷]YeŰCn(„1uµS٦¬ôŞ{Ţk¸ąęńAĆWę—µ+mss ľ±}“ąŢë*7ó 0÷ťŻuŁön–EíĚLGýľ×9dz]¤67`€%…±Ś‘F’€lçýňŚcAŮPrz?Ľ‘îŹë»Ií}3ż‘, Göđ„~L+Ć0朸´’ţ¤…Á|«ÚV·g&CĂ2ÚHc{"„źaŔcČÍ´]sČ:÷¦ď«Y»—CÍI¦÷óŐ]UÔßO!çĂ΋@ዪŢŠD·ŮŰ’äÂFgĂú­Ű˙iôáĐý›ěeÍ~ŐťJT§¦ˇ: b8ĆŠšÜ2·Íi ™o–=×ĹĹ"ŮY>»ĽÎɤă‡d±´_ ĚNU(‡‚öf˘Á¤= ™Y@ű8»Oľ,VŻŐŢúfĽkâ‡b endstream endobj 827 0 obj << /Type /Page /Contents 828 0 R /Resources 826 0 R /MediaBox [0 0 595.276 841.89] /Parent 832 0 R /Group 818 0 R /Annots [ 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R ] >> endobj 817 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./aacenc__lib_8h__incl.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 833 0 R /BBox [0 0 256 164] /Group 818 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-0 834 0 R>> >> /Length 495 /Filter /FlateDecode >> stream xś­TMk1 ˝űWč¬#ůS‚2‡…Rôv ‡Ă6ɦ”¤ôĐż_ÉăÉL6›fe‘l=Ů~z?ş xt±@Ě@śA"<ÝÂ7řĺěyşłÂÝď>ţňI?Âąľ?Ýĺ G¸q„đ¦eĚR`¸‡hĺiě~¸µučk phuSlŹî&ŮëÉ4arCÔU¨”C_!¶ú Ż´UtąíčÄ‹HÍĄM=Łáőřă;ŰopJpÜ»ËHC¤µ Ă&dsbźH‡Ü'ʰ‰fëdr"[d7\Ťçîă¸ú­rhB2JjKăĘ⤉ůŚ9…vbČÇ)ř(ă]źč„ž™Ď•‰_kBhŚoćÔŰ!â*˛”@{HŁçĹKj¨´– Á“®¨ Š’$Rť9€_CŐ@ń1`ňÄ Â>#C%9Â5|ý÷­öďśÉcÎPŘK±îŐŤ±&ÁÇ”´ţÖwŐ†MŤW Ű“„¦dýŘtśÜ¦˛âĄŰ%_ˇOjöL Cřý@¦áŞY6Ľ¶w…năˆ ŢîH‡ż[ܨGTŮVň¦âĹŞ\’ęžMŢ ¬ńőŹO^I«Ľ ů/ę–ęIo(“Ż]TU“Č‹ĽTČ““ëtŹ˝JÚ¶»ôÂýv> endstream endobj 833 0 obj << /Creator (cairo 1.8.10 \(http://cairographics.org\)) /Producer (cairo 1.8.10 \(http://cairographics.org\)) >> endobj 834 0 obj << /Type /Font /Subtype /Type0 /BaseFont /FreeSans /Encoding /Identity-H /DescendantFonts [ 835 0 R] /ToUnicode 836 0 R >> endobj 835 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /FreeSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 837 0 R /W [ 0 [ 500 556 500 556 556 556 222 222 556 278 556 833 278 500 556 611 722 667 556 556 556]] >> endobj 836 0 obj << /Length 838 0 R /Filter /FlateDecode >> stream xś]ŇÍj„0đ{žbŽŰâqÝ/ˇl/úAm@“qW¨1ÄěÁ·oĚ_¶Đ€ÂĎ™ N&ÉĄz©Lď)ůpŁŞŮS×íxďN1µ|íŤé^ůUń­†ĆŠ$×óäy¨L7Š˘ ä3'ďfÚ<ë±ĺ'ADÉ»ÓězsĄÍ÷ĄĆ§úníl<Ą˘,Is¶{mě[30%±x[éďýĽ e_łeʢ%~IŤš'Ű(vŤą˛(ҰJ*ş°JÁF˙‹g)ĘÚNÝÓeHOÓ,Ł2hí =”C íŁöt@LAGč ť  :Geë. b'¨…4¤˘Ž9¤ˇuO†R¨‹ĘQ2…P'Ń_ŢBčďŽäÚßšąö‡[Oh9ÂeŢŹů¨»sa4ńRÄ™,Óč ?îŤíRź_ŽűĄÖ endstream endobj 837 0 obj << /Type /FontDescriptor /FontName /FreeSans /Flags 4 /FontBBox [ -958 -462 1632 1050] /ItalicAngle 0 /Ascent 1000 /Descent -300 /CapHeight 1050 /StemV 80 /StemH 80 /FontFile2 839 0 R >> endobj 838 0 obj 309 endobj 839 0 obj << /Length 840 0 R /Filter /FlateDecode /Length1 2464 >> stream xśeV{lS×˙α}íÄNâ‹íĽ ĂŽó¶M‚_ !ljHcbC}ăa^uH›‰eĐ.$ĄĐ1č:THˇŁ{üQiUU7S§˘Ş*{iű§•F‡„R©l«´¶aťŘ4ş?Şäzßąv€i÷ęśsßů^ç÷ťsl P ó ËáL*—ţŐŔµŁ4}xć¤E9Ę]D|qý±ÜÓŐĄóÄď!ţýÓS§Źůř˙|„ß‹Şs飩#˙~nő€úĘ|ipźS;b¦_źÎś<Őú’2ř/cSŮĂ)€@ăAϤNĺČUęFü"bKî[Gs† ÉףxúČĹmĚVŤ_Ľ•WYy+ą#eIXúŠh·WŰ·űV ¨Űš_ˇUÔ -€Ţ >·«ŇÄÝ®g«klbť×łCݱôOŁ­ŽS\ľR®0Vör¤Ž8KJl•Í-ŞXrdĽD»Ńŕ¬îŢXżµ±§ł«[ ĆkŽvűȉ7w‡¤ZčÎ’†ćáŘ@Uă¦}…şT©âjk+›ťíŇŻw·&uzť3âŔ„as~…|‚9U#°m!Őd¬ÄśÜĺD·eIîĆ4~O˙p88iŠirÉÉŮąă2$ѱ={hüř™“ sg_;„„ŕ›qŤýa@µ˛ę±3=óUU©˛úĽňň(‘Îł=zĚÓĎŚMĎ?źőÝôäöˇż"‘@˙ľ(]–ľÜuîěŹÇúȇٛ٬ĚňbKżi–‹z+ŤĎ:źa,䂬Ŕ»ůuRČ•ľ8męÜ#DÉdG;ăĂü˝˝i8 ť\ç“~Ť|ZńYő¤>ÁnÝ'ĺhŘĺŮ=soqď*tT7ŘÖqÔ Hß!®ŽČ6éťő‘Ĺ(ĎŻ€D_Ć0ŮxyŹÉűŢËŰĽnŻŰ$í7k*š6mő D©®_zuŁARۛɋý—/ËyóŤäŐ[Ářô2*w…Ű@ÎŤ­´$7×ůÚoh-K T·öÂTŮWµ1JËĄtˇ.ŤXsˇ.UĽŰô¸0ü“uŢ>•>ýěŃ”˙eą,±čÇôł‘äŹÎÍ^ KčĎ˙§.cč¸ů/)쫉˝ďŚ“Üq ˛Gz›.Ź®Śö…€Ý ÔUł¸y««RĎŮš AíD 5—~ňÓ‹ď-NĺrS‹tů7ŇâoG/_ĽTXűÚľŚ¶Únž¸KŤ,ŽŹ“ÉSŇ]â–ňĎceHNHwĄ™‘ízń|Šśáţ°ÚĽ…CŤÖ…µňnňéPC¤kĎ<,˝áčnŹ#ÜK®J?`G…´°śkŃţĆ­3»ßÖ]°{ˇŠWo ¶ň`°nÄwü™gŹMyŻôÇbA䎝ťŕVű«çgŻí%ŇĂÜDvú@2‹~ëŃŻ„µ(e;‚Ë€WDŐă:ý‰ŮąéÜě™l( ÷ŽPóÂ…ç®.ÍÂpćýL&‘š(0«G#yô€,8*ńEÉ?Ťů<öČŰ8˛Çn`|L2GĚ^ *”ŞA•,E–uP†ű¤+ĹĂdĎatô-d"ŚúJ DńÝ'[ďĂ7 I"†ÄÖH\śD°í¬9{ĽGeł‚ĺŽH [Şť"qX,·‰j{"n± ŘB©ă–¸ĺȡNłŐ*­‚S¤ŽˇŃxĐ&Xť˘Â1Qmý‘¸UôăŚŇÁ\ZmÖgâź?̨_3˙ÍD•=.†fY.Fĺ(KŚ9EαTG.`R– ‰„Yô˘v,ŐË"˙#‘Ʊ·lksB%Ňűý׊Ě7+şż˘ZĹŚ®?üµ›®Ź«ÉĹTÖ"ÔŔ:ŻŘ+ľîŔ÷ćj`őw°(üČCčŁhĹq3ŽÍŘBÔ‘ż÷đî˝Ä>R O1ą˘Bř]ŽşF&§‡aŚ~˝#{±Őb«/úĆ4ř&ÁĘŚ7y۱}‰µcőc—Ŕ<¶ßa–Íئ°-˛m‚ m•8Żü6ü/ ęd˙äěMä&oă*©ŚKŠ‹Ő€ň&Éź‡!Q‰/ň’°b…őXmă(~Ě ›°T‰8JKPTŘűEŤ%ř ĺ÷¨]jš®"਍E ˛ßOp—0łÓEPĘ&KćňĹI"j‹ÎËPK»Ú—ˇ„:¦W¦¸Ź$ĺL˘•-‹’ &)R˘G'ţGg ú'„˙«77 endstream endobj 840 0 obj 1825 endobj 818 0 obj << /Type /Group /S /Transparency /CS /DeviceRGB >>endobj 819 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 203.393 226.467 213.321] /A << /S /GoTo /D (structAACENC__InfoStruct) >> >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 190.712 220.928 200.639] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 177.054 213.556 187.958] /A << /S /GoTo /D (structAACENC__InArgs) >> >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 164.373 220.201 175.276] /A << /S /GoTo /D (structAACENC__OutArgs) >> >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 152.667 225.351 162.595] /A << /S /GoTo /D (structAACENC__MetaData) >> >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [248.544 95.352 364.141 106.256] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 829 0 obj << /D [827 0 R /XYZ 89 770.89 null] >> endobj 318 0 obj << /D [827 0 R /XYZ 90 739.935 null] >> endobj 550 0 obj << /D [827 0 R /XYZ 90 553.953 null] >> endobj 322 0 obj << /D [827 0 R /XYZ 90 553.953 null] >> endobj 830 0 obj << /D [827 0 R /XYZ 90 221.097 null] >> endobj 831 0 obj << /D [827 0 R /XYZ 90 111.748 null] >> endobj 826 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F37 546 0 R /F14 726 0 R >> /XObject << /Im2 817 0 R >> /ProcSet [ /PDF /Text ] >> endobj 886 0 obj << /Length 755 /Filter /FlateDecode >> stream xÚ˝ëo›0ŔżóWř#H ó“đa„Ž×°™´µšÚ´ŞÔ‡–µÚ¤i˙űĚ#SŰ5<V¤(Ů÷»;ßť ¸¬´ĄĐŢÇtllq ć62)F@\€ŰĆ™8„8&˘T.Şź×7c†)ÔýűóÇŰÍÝĂׇëű»jŞĆ„öMCr&¨GçćśPp~«ťśAp!źhg~Ôłn…‰üż\ű¨ÁŞ!d:”âťnXŞ:ÇŤěN˘·5ů{ŤŢ­• É›mZdf›óÖ¬SŚéł%ŕdF!Ô7RdűĽR{ŐÚ‘×3*]×° î±Ä+YžW÷iţRR5ď×>1 Ó˛0CTŇjóDfúá5aďgĂźP^Gű$Ă˝RĂä“ŐÝ(ô˵›řëÁ`LĚbé ›ęź»}ó”8E‹,«PPĚ/3ĂÁş›»1¬őź—&A¸ęĂ%L({΂ބv<ś„TI|™§`UŠČ†C”·EĆ–áÝޞPň—úl0Æ0Ň Gú6÷żźĎ›í*6ťž°ž./ LőËÍ6ĽGĘő©LŁÍöĐâ&ĄkPŞ~–~s „Ţlg— †ú¶"$^EmíA# »üG~É™(˛ĘŕÔJ Q.CÁEÎÜx”!d ˘Ů’‡_ďi˝müí÷Żź{eÖ¤dľ~v*ž÷ÝĚ$MŘ:(­‹y3Nšą?EôŽR Wk1E4¦Ć˝v“˙ŁAźáÖäXž1ć­;´?É„)č‰< ˘zĽâ¦Y}„÷e“zw-…ę ˇz'Őŕz˙:‹fÍQďĄr7á»Öş“‚Ôś•3yXIÖŇ@P/‚ §aÇl‰Eť˛y˝í ó÷EeÂĐ®ĎŇ´vďDJž”Ý@ľ »>ůč@ů±ěKű*‘ÍÝ8‹Ř`3TŞ{ő¦3D}•ľ’9YD¬ŚX˛ë>=z6ăĺç1 ÄcżĆüÚn˙ą endstream endobj 885 0 obj << /Type /Page /Contents 886 0 R /Resources 884 0 R /MediaBox [0 0 595.276 841.89] /Parent 832 0 R /Annots [ 825 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R ] >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 704.483 218.886 715.013] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 842 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 688.856 175.828 699.042] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea98f5f419028ff1b93551adb910ca0281) >> >> endobj 843 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 672.885 247.519 683.071] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea10b93e7c1f1def31f634b6fb7a894409) >> >> endobj 844 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 656.914 243.424 667.1] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483eaf35935e997b3321eda6d083c9322f347) >> >> endobj 845 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 640.942 296.644 651.129] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea1a79b7f1cefc5f89ba7c10cfa020116f) >> >> endobj 846 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 624.971 243.653 635.158] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea47979433239c09930ed98e85f5b81971) >> >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 609 219.155 619.187] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea189c4a7532530a89ab214aba35b1e982) >> >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 593.029 244.769 603.216] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea5af1b153eb8f1a28a543419d10562cbf) >> >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 577.058 242.966 587.245] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483eae9b8c1b6153a63fbf152a60e422ca433) >> >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 561.087 235.763 571.274] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea51de868cffa67ffe361085555a6e5ea2) >> >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 545.116 251.434 555.303] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea8e8c0fd770036a2bc58fc062f5044454) >> >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 529.145 239.638 539.332] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea5a631fa755a8d02a97a8184725da4b57) >> >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 512.831 225.641 523.361] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea3b7906c278268857fa6f8d7e39b2b5c3) >> >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 499.848 248.345 510.379] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47) >> >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 484.221 193.153 494.408] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47aea749d078297e7079337d6d47171a8b6) >> >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 468.25 211.325 478.437] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a857575621d11cca83fab4d5c70b55181) >> >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 452.279 219.355 462.466] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a510ae495f7636503ecfe111f75f66d50) >> >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 436.308 228.032 446.495] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a6a362853fb508e259718dabe65c7a57e) >> >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 419.993 186.747 430.524] /A << /S /GoTo /D (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a51cb08659a6af422761d58090766faa8) >> >> endobj 860 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 407.011 309.058 417.542] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) >> >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 391.384 272.087 401.571] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1a7560bc907e827954b0b55f87751fdbeb) >> >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 375.413 321.132 385.6] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af88950dea139037d728aefe7722191ec) >> >> endobj 863 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 359.442 298.099 369.629] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1a95efe9f7b6df0a6628ec7e2c61646fe9) >> >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 343.471 328.883 353.658] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af4a650d61726dd5bbbb560042bb0b8a2) >> >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 327.5 305.85 337.686] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1aa9315468e85d31968b147a4080e352a7) >> >> endobj 866 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 311.185 281.511 321.715] /A << /S /GoTo /D (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1aa0dc03a5dc38b25ac1ea9d8ddf892fb5) >> >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 298.203 242.687 308.733] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846) >> >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 282.576 214.005 292.762] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846ab97edc65b5ed3be8c11f3ba9bcca22f3) >> >> endobj 869 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 266.605 223.419 276.791] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a96d66031cde3d5d89d8457e45036bd94) >> >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 250.634 220.839 260.82] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846afcd151f12c441417e69746762d34ea33) >> >> endobj 871 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 234.663 243.862 244.849] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a82028e22ad9293b97d10ee57abf67bdf) >> >> endobj 872 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 218.692 244.928 228.878] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846abcbfac74b1bcd90099e3cf6b1fcd19f3) >> >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 202.377 205.706 212.907] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a08acd30267f5bd8c4047259fbc40fd98) >> >> endobj 874 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.538 189.395 220.58 199.925] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 875 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 173.767 180.969 183.954] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a5e46c726aadf91189ccb4f1ec3e4b52f) >> >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 157.796 202.398 167.983] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a02f49b93eaadb6a903b87670849255a5) >> >> endobj 877 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 141.825 231.728 152.012] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a80b535c275f9f60c644d91263f0638a5) >> >> endobj 878 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 125.854 225.651 136.041] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a8a8be3fdebec2693c86e3e63f35ee228) >> >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 109.883 214.582 120.07] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a730a1ba1041f8671a11ca824fcd0455d) >> >> endobj 880 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 93.912 253.855 104.099] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a2e2b4d3e563dc169c06d590d8c833243) >> >> endobj 887 0 obj << /D [885 0 R /XYZ 89 770.89 null] >> endobj 888 0 obj << /D [885 0 R /XYZ 90 723.09 null] >> endobj 884 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 962 0 obj << /Length 1257 /Filter /FlateDecode >> stream xÚÍX[s˘H~÷WđU±Ó®ű€ SłHjwË™˛bb•bFqvöa˙űž¦Ű™ŔlRó"mŰśŰ÷ťK‹•'+7­NÜşö)UäÔTâ™â`Ĺ2 2(Qâ©2R-D´65°š$“4›ŚóGMÇ*z»ţ|‘ŠU”ÎҵFlNń-›QCĄ–ö%ţÔňâÖ׍X!…ĂB3”ɲ5ú‚•)ěR0bŽ­ü]śZ*:eđ\(ĂÖď-,­ﯟ¤ hg?{e?!:r°ĄXö,*śp]ns× »ăî­†^˙nĐó Óv˛•QáĹoÂül^Ée­đl1ó”ôAÔó˘*ńVsńĂN4Ž\Ť˘ĆÁ JÝ\ëÇ^ÔŃV˘°ĘŠqs ŤŞö4†Ő?‚^|[Ą5×Gn8Ľ{řóĽhv‰ů·ž ĐŽď˝(ôŞä“ nÂ"Bý ĽWł”azA|î‡?rďĽa•ô ˘ńĺ€Ä^xV)ą Ńܰôűn¤™†ú׸Ä»´¨—q čw^¬9Lu{|Gę)6jd^˘°;cĹţx(TŐńÎ÷/QÂ*±ľ/Ö˙îťŰ=Ż}]Wl¨Ŕ¦^T`‹6´±ę ß»B 4ŐzEńe“ćů<{_^č †š,Óś÷řťĐ=‹äĺ*ŰĚAŘVÚş‰°#—żÍ&ů|•mö$”»…‰t/R†¨Ą‹?Sj”´sÔ"˝˘ Ľ˘ę7™ăđfęe“ÁKš•#ŻÜĎ@ÓS0ŽTh1˝ľ7ţ©|Pn6×>Ń_9IM ±á'áĆŚ/…Ú¦Mwg^žÝÂÂ'PsĄµuf©g®<a,Vg›Ë(šŚô4BÔÝjş]¤›+°”Ŕ—B_-“ďÝç$ËŇĹ\'ŤI&+Â)fůś˛DŚ#đm5Ďü9Ý'"O­ăD;A›6ĄČÔ)&ĂMĽëęA6[•óŃ$¸N~ócµň›k;Čď“b­}ŻD·~ťę’{ÜňaľŢNňsŃ)‚:Ôhšŕ‚ks1d:Vi~ś|ÝÎ׌ é®úĎ$=’G  ʼnMšĺď×0>OÔ±%ź¸ăašßŁń:Y´~§VóŕÇj‘‹Ý"Í&ąUž8˛ÉţîJ\Ňz™đëűA‘ßĂg1­˙ŹĹęvľžÇ©ü‡4Ś­ Ó¦˙G˙JZ0 endstream endobj 961 0 obj << /Type /Page /Contents 962 0 R /Resources 960 0 R /MediaBox [0 0 595.276 841.89] /Parent 832 0 R /Annots [ 881 0 R 882 0 R 883 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 966 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 967 0 R 958 0 R 959 0 R ] >> endobj 881 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 727.536 238.363 737.723] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aef811ce5aab93dcba6584109d266b579) >> >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 711.176 242.796 721.363] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ad2accfe182077bfe80ba43a3f22cf7bb) >> >> endobj 883 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 694.816 214.582 705.003] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ab381330bdc59b0213ad3dedcb4f2f0f7) >> >> endobj 923 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 678.456 233.302 688.643] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a443da990a60343083e72726a65f4509b) >> >> endobj 924 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 662.096 222.214 672.283] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aab4d4c3cfcad7bd7bdebfd947fea8e75) >> >> endobj 925 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 645.736 217.342 655.923] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a955c106558ebb10a74a555a38b45ae1c) >> >> endobj 926 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 629.376 242.796 639.563] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a017e2a6349d3ae944338a6f0ba892947) >> >> endobj 927 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 613.016 249.631 623.203] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a39b30031d8438b4018173388aead5bdf) >> >> endobj 928 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 596.656 232.306 606.843] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a87c7912a645d479132465e6d8e694b36) >> >> endobj 929 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 580.296 222.632 590.483] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3869e3bae5904258eff0b77d2ebed3b1) >> >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 563.936 264.286 574.123] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3923cb84146e101030271772fe33ea5a) >> >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 547.576 248.286 557.763] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a0ee251ffa58317c7ea29364d344c4660) >> >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 531.216 242.029 541.403] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ae6283b321f75b769e9306c6482f2acd5) >> >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 514.513 189.108 525.043] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aaf0644b51fd01b31c73eb2ebc140a1a1) >> >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 429.411 194.259 440.315] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [196.243 429.411 248.576 440.315] /A << /S /GoTo /D (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea) >> >> endobj 936 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [253.88 429.411 369.476 440.315] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 377.762 194.259 388.666] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.757 377.762 248.206 388.666] /A << /S /GoTo /D (aacenc__lib_8h_a2a5f6ec334fff553f0fd9e36d9408e94) >> >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [252.021 377.762 367.617 388.666] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 338.442 194.259 348.973] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [201.106 338.442 261.738 348.973] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 942 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [301.786 338.442 417.382 348.973] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 326.113 196.301 337.017] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [273.953 326.113 356.344 337.017] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 945 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [438.978 326.113 513.996 337.017] /A << /S /GoTo /D (structAACENC__InArgs) >> >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [148.042 314.158 229.705 325.062] /A << /S /GoTo /D (structAACENC__OutArgs) >> >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 274.838 194.259 285.368] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 948 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.337 274.838 245.689 285.368] /A << /S /GoTo /D (aacenc__lib_8h_a9b64b2026a1475eb5c7a67fc1364ed94) >> >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [280.194 274.838 395.79 285.368] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [463.147 274.838 513.996 285.368] /A << /S /GoTo /D (structAACENC__InfoStruct) >> >> endobj 966 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 262.509 156.301 273.413] /A << /S /GoTo /D (structAACENC__InfoStruct) >> >> endobj 951 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 223.189 194.259 233.719] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [195.234 223.189 286.711 233.719] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [315.004 223.189 430.6 233.719] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 210.86 195.952 221.764] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [140.843 171.54 233.973 182.07] /A << /S /GoTo /D (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c) >> >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [262.614 171.54 378.21 182.07] /A << /S /GoTo /D (aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) >> >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [463.147 171.54 513.996 182.07] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 967 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 159.211 150.413 170.115] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [113.91 119.891 194.259 130.422] /A << /S /GoTo /D (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) >> >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.757 119.891 270.333 130.422] /A << /S /GoTo /D (aacenc__lib_8h_a28cbc417258c73ad55d613526df8fad5) >> >> endobj 963 0 obj << /D [961 0 R /XYZ 89 770.89 null] >> endobj 965 0 obj << /D [961 0 R /XYZ 90 448.781 null] >> endobj 960 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F44 964 0 R /F14 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 981 0 obj << /Length 1455 /Filter /FlateDecode >> stream xÚ­XŮrŁF}×WđUQ‡¦YçM–°ŁYšHř!™L©°hIT!PXĆ™ůúÜ^@€elgňbÓ ·ĎąËąŤtĺ čĘÝč&ýzkЇ<۰•`ŻxşâŘYV‚Hů˘®ö5ř¨â!lYđź˝ŤŞŤ KWgŮ®:Ń´ Ë8KŮÖ‘ŚţaŘ©+›łäKŮťF_ľęJóĎUžř®“bţ'ĘfôűHďAĂy–eÔŘ €ę…0ÂÚë:ŕ e "‰Š»<>×ŔiqÔ•±a"bz’Ěě“xk2ŃL]ťŠźî˛ćbÄŹy8-iľ×°®†;é…# ›˝éş‘P$Ďí€ A®E.ř ‰?ĐSý~¦ÝżŕŘ^ z$¸­ĆeŰRQćŐ®l(Z–:ő—ÓŐĚ_ łŘl™Ĺ¶‡lnČ+‡;Č„ Č=żM–ł…ż˝fşăö1v¤{VxÇé´íôcFŻ8ŇĽ'’şź‚Űrá5n¦öěv+iÜJÁvߏۛjż§ů<Ł1‹=Ŕ5ĺŇ“ i6xÔ ]­öša©űz.’Ůśĺ…ۇ¤ŤMĎSc|mź s*Ş‚ {zŠËcśľíXVآ˘ó,íőÝHůÂ7J6Ěc®ŔVK°±‚üđˇ{JŰeő ˘öáÔ™či¬#ĎłÁĄ:ÂXć@÷,˙Đyőb´[& (@é"˝®Ćůr AŐŐ‡Ů|µť1Ś<Ćű3éŁiÇÖµi fREqVëÄą’e×s/xë—––$4dëß4l©µ‚Í—Áöóô^Vpx:'´čű¤Ch,`ڱ…°ç\(-§óĹb­aWýă]¬°n ś[óJwq’4…e(žJÉöQ==Ň(Şiżz=.AhxfQ+x¸ Ź{_@îSŘnüŕáó lŔł]Ůв:·…±Ę%ň}–·)ÄéA O´ćĘXż_Öżz¶7ó`¬ýÉýű‚Ŕ2Üňjě7­ ĺ ™%QŃsŻfUŮ$ßPËcžˇ±ÝĚ˙ô7C8yÄĽ “¸ę.˝ŤÓBŚŠř収šíĹ wGńîv´«4.AŮnKec“q a:Őň6ę…”˛7E‚ÂP“Wť”—¦±ĺ!KwşµĎĂ„]éc¸řŘĂäŰnwc¨+LőâvÁÇw›w4„g]9/Ď’ćnA®˛4k)€sî"$%ÜŐ2¸Î‹ĄňH_Vr¶µĄäÓŐ2XłŃj±Ýš2ŻaŚŐŔďI5·|Á…´ Ą8Z–ł˘ůťfą$Ŕě–5äNP 5|ĚŞ˛ąßS8Ë4żĂVc «-qÄ?¤6}Î3–DdĘĽdłĹVäČÄĚ›/ĺlĆôXrţ”Çe˝|¤ŇNBW ą°Ďł“¤ěíŘ6±ňt¤O×n·”ÉĹsضŢŘáÎçŕźí€F“„¶Lßůrl—«Ą?Ü"ld6Â:“BźfRwĘ<>ę4Ž;áy­p»5ęcôĽťß 뾍ŕm˝®yľű0I®Ű)‹Ş„Mĺ±ËɡĘß‚Yś6y#źI˙°žbLí6—Š5-hůfÜ •߯Ţ<¬çyŐç!N$¬'ËÍçŐZ#ěz=ÄŘ^ŢKA(ó0-ÎY^6_YâA*K&Ę?‰A#2ŻÜ„ęS_â°öáŇLnŘ7ÜĂí­řZy‘ÉšăµXđ/=Ž„j!§˛}ëŽÇubřVřzl$’ÎŻ›Éb1ÄĆO°Ëwü•޸Ú14yôy$C]Đ_óY­¦Ň<Ďšf=żżüi`ý˙¸ú4ä]Ďn>Ś—Ů3Çđ|¦)ŤŘ˝’o’\»‘Ň.łţ).8[7Ţű;ĘżôšxÍ endstream endobj 980 0 obj << /Type /Page /Contents 981 0 R /Resources 979 0 R /MediaBox [0 0 595.276 841.89] /Parent 832 0 R /Annots [ 977 0 R 983 0 R 978 0 R ] >> endobj 977 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [463.147 537.367 513.996 548.271] /A << /S /GoTo /D (structAACENC__BufDesc_a2c09424d3a61cdbdb80c8d9ebb42ce71) >> >> endobj 983 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [89.004 527.469 195.682 536.316] /A << /S /GoTo /D (structAACENC__BufDesc_a2c09424d3a61cdbdb80c8d9ebb42ce71) >> >> endobj 978 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [179.07 334.18 307.189 345.084] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ae6283b321f75b769e9306c6482f2acd5) >> >> endobj 982 0 obj << /D [980 0 R /XYZ 89 770.89 null] >> endobj 326 0 obj << /D [980 0 R /XYZ 90 739.935 null] >> endobj 330 0 obj << /D [980 0 R /XYZ 90 689.23 null] >> endobj 841 0 obj << /D [980 0 R /XYZ 90 662.618 null] >> endobj 334 0 obj << /D [980 0 R /XYZ 90 662.618 null] >> endobj 338 0 obj << /D [980 0 R /XYZ 90 608.736 null] >> endobj 733 0 obj << /D [980 0 R /XYZ 90 580.067 null] >> endobj 342 0 obj << /D [980 0 R /XYZ 90 580.067 null] >> endobj 902 0 obj << /D [980 0 R /XYZ 107.713 490.398 null] >> endobj 903 0 obj << /D [980 0 R /XYZ 107.713 475.201 null] >> endobj 614 0 obj << /D [980 0 R /XYZ 107.713 460.003 null] >> endobj 904 0 obj << /D [980 0 R /XYZ 107.713 444.805 null] >> endobj 905 0 obj << /D [980 0 R /XYZ 107.713 429.607 null] >> endobj 912 0 obj << /D [980 0 R /XYZ 90 409.01 null] >> endobj 346 0 obj << /D [980 0 R /XYZ 90 394.774 null] >> endobj 913 0 obj << /D [980 0 R /XYZ 107.713 273.198 null] >> endobj 914 0 obj << /D [980 0 R /XYZ 107.713 258.001 null] >> endobj 915 0 obj << /D [980 0 R /XYZ 107.713 242.803 null] >> endobj 916 0 obj << /D [980 0 R /XYZ 107.713 227.605 null] >> endobj 917 0 obj << /D [980 0 R /XYZ 107.713 212.407 null] >> endobj 918 0 obj << /D [980 0 R /XYZ 107.713 197.21 null] >> endobj 889 0 obj << /D [980 0 R /XYZ 90 189.509 null] >> endobj 350 0 obj << /D [980 0 R /XYZ 90 175.273 null] >> endobj 890 0 obj << /D [980 0 R /XYZ 107.713 96.348 null] >> endobj 979 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F14 726 0 R /F46 984 0 R >> /ProcSet [ /PDF /Text ] >> endobj 992 0 obj << /Length 1605 /Filter /FlateDecode >> stream xÚŐX[oâ8~çWä1‘ŻăÜçŤBJ™-—…tĄŃĚĄÁ”¬B†0—ýő{Ű!P´íh±cţÎ=XyR°ŇoÝ­ßn Q<äŮÄV‚Ąâaűud] Ę'ŐAşÖ&VĂ0˘i4OâGÍÄ*ZńŮŰ8ˇüiJ—4×tW…UlĘ5ĄOű|hůAëď–'bE/O°ä–­[źľ`eóŚ ĎUľ•«ÖŠI řO”YëŹhqµi×Pë:F›ŠC`Î!z§ŁŮ–ÚőGÝů`ô§ćZjç~Đ›ßuF˝{żÄ%F]šá!õáU)ç.Lň–›p»Ą ţ\düąKŁ"ÎR>ŠÂ$áOß4hŰňAś2Úľj@JÄ ttţÁmÚ@[·Mśg×úĂń”qýqîO§L0 /d"Ű5ĺ…†tťĺ?„Z“$‹Â=üe ´z"yâĂhö0™,«ß›OJţ§ťˇřÍX=ڰ^‘?Ńt`,×´ó*!¦Y!°kDR'ácB/@’ĎA®Iw<şô›9µ‘­;g7K?cLžvyŤĚ é&ĎŘ=ľĆ‹ËĽr±çA‚+•®ë I—ű4ĄyHkŚ‹ěđźXšçY®Y–z ËÚ§ŠńµÖi!ו8a+ěčrLmňPšę[@ó#IťÝLŻÇk’ŠXŘ÷óÁ2ůŤhÉ•`‰‹»r§@3,5Óí&Ë‹ź [śÔÜźIę\ Ţ4qÜ}Ü*Biʧź†^u=üĆ=˙Z!{U¸ V"y@fĚqúTĹ„n·'sÄş|·)d¦y”ÁZÜi—RNľohT­ąÚ¸8¶K÷ß6Çň-‘7ôS"[ň eĘĚi­DŘ;*6ĘDgb°–đ<§*9L­­cĚHŰ­ą @iU 0Đ<é1sîhžĄňńĽ7íÎ'eŇßx–?‚Ž•61‘azÇ6Ő«lŞ›­79¨¦˛ˇIžńmŹÉ=ĽFž—!†df·†°[důűťgÔCtD€a‹śČúÜwz,ă•\_b—ŤGÍ5Ťm [RcŁ,˝”-ņó5Hŕ~8ăă_0í5ˇ#şOĺčPU ťo (ľÂüBŇ”Ű_Ťő~Đż š«pĂ{0‰źVĹĄşď}şáĂlĐ}•ŞèbćnG/âRě=Ú+ČtĘŃ=Ä«Řtk…§ý2|ł‰ďwď±9&r˝ŠľŮ†Ňhu:vyDRGÄ.·»¬¦Ř5Ńł¬„/§Z¨Ě˛ŢҢŘgYóđĤčcr)[*nĚÚŻüIôaÓ~KůÔ6lʵv>>źŃ˘Ş¸?c ĂO? «ÜâÖz&€uBl6ŞŠ`úfľÎA©‰` /ŚNuŇ‘,}……îŞĎ0Yš<ÓÉ–»ŮÉ{`ıÝJÜ×čŔ¸Ň‚Ú=š„o°T)Ű´IuAěýAlŕ§«0Ťltâضe8ę,.?˱%ŢrńČ8g˙i&źö{öj ˇüXą"űú÷=¸ł©óŘ`Páú1NĄúŕ…Đ <ńnÖ,(ÓrJďŘŘ€ôĆľŕ,ŇUŃć€%Ć-Ő ;ˇ:›JŘ&Á‹“¬§B?óśúšmV!ýy÷ô"›ĐącJŁ ˙U0–î-çţęp¦[6Ŕ'žł‡Ď*· >1kđáď|X ŕĂŰ|đáé>űd(ßÄłHHůżłă/î.4HĐŻżđűżŰ㎠endstream endobj 991 0 obj << /Type /Page /Contents 992 0 R /Resources 990 0 R /MediaBox [0 0 595.276 841.89] /Parent 832 0 R /Annots [ 985 0 R 986 0 R 987 0 R ] >> endobj 985 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [108.167 306.217 206.279 317.121] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 986 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [329.268 306.217 429.033 317.121] /A << /S /GoTo /D (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c) >> >> endobj 987 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [413.324 158.478 513.996 169.382] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a730a1ba1041f8671a11ca824fcd0455d) >> >> endobj 993 0 obj << /D [991 0 R /XYZ 89 770.89 null] >> endobj 891 0 obj << /D [991 0 R /XYZ 107.713 729.972 null] >> endobj 892 0 obj << /D [991 0 R /XYZ 107.713 714.345 null] >> endobj 893 0 obj << /D [991 0 R /XYZ 107.713 698.718 null] >> endobj 894 0 obj << /D [991 0 R /XYZ 107.713 683.091 null] >> endobj 895 0 obj << /D [991 0 R /XYZ 107.713 667.464 null] >> endobj 896 0 obj << /D [991 0 R /XYZ 107.713 651.838 null] >> endobj 897 0 obj << /D [991 0 R /XYZ 107.713 636.211 null] >> endobj 898 0 obj << /D [991 0 R /XYZ 107.713 620.584 null] >> endobj 899 0 obj << /D [991 0 R /XYZ 107.713 604.957 null] >> endobj 900 0 obj << /D [991 0 R /XYZ 107.713 589.33 null] >> endobj 901 0 obj << /D [991 0 R /XYZ 107.713 573.703 null] >> endobj 615 0 obj << /D [991 0 R /XYZ 90 565.144 null] >> endobj 354 0 obj << /D [991 0 R /XYZ 90 550.715 null] >> endobj 906 0 obj << /D [991 0 R /XYZ 107.713 468.875 null] >> endobj 907 0 obj << /D [991 0 R /XYZ 107.713 453.248 null] >> endobj 908 0 obj << /D [991 0 R /XYZ 107.713 437.621 null] >> endobj 909 0 obj << /D [991 0 R /XYZ 107.713 421.994 null] >> endobj 910 0 obj << /D [991 0 R /XYZ 107.713 406.367 null] >> endobj 911 0 obj << /D [991 0 R /XYZ 107.713 390.741 null] >> endobj 619 0 obj << /D [991 0 R /XYZ 90 381.24 null] >> endobj 358 0 obj << /D [991 0 R /XYZ 90 366.811 null] >> endobj 919 0 obj << /D [991 0 R /XYZ 107.713 256.333 null] >> endobj 990 0 obj << /Font << /F22 400 0 R /F46 984 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 998 0 obj << /Length 2435 /Filter /FlateDecode >> stream xÚ­]wÚ¸ň=ż‚GsNp-a÷- $Mošt ˝={Ú=9ÂÁ·ţ ¶i–ýőwF#c Íľ i4ÍŚćSX˝ÇžŐ»:9źžĽ»´í^h†ľí÷¦ó^hő†>3=›ő¦qď›áXýż¦{ŽšĚóŕ# ˝LRŃŘžeŚŠh•‰ĽćuRäz2žžü ±–NŚRCtXő†Î †ĘŔµ[:Î©ŁŤďÓçńŐÖQ´@ąTx­tźˇ2U%”k(ŤSÖŮşăËѤ;™‹ăNď&ŁńäđĄBY˝«Ą«ÁF-§¦cGR¨ŔE)ë)\´™ŘńlČ›ŚyŻn(vű8 DB5|Źj„ى Ąń5NÔxŻ÷rs9¦üń\fyS¨˙Ú‡JŇ7ëżc}†eëđ 8ăő…í y±mWěÝdylý Ő’Ş^Żď^,™śvÉT—EŠ…'ř6ŹęëÎ_řŁzW„ËÖĆŞŇśFL@8Ú¤™îÄ#źŇ ë.]5yV§jŠUcc!ŢČ6f˛q¶ˇ†Č´'`F 3,źd–cÜĺ„KUL •4…›”>ďŘŞÄŹ‰"Óµn>•5·"ňsĹÓ¤V Ą„/űŁTŃŰ‘±nÚÓŰĺBĨoŁ-¦sÇ ĺ{ Áę>ŕ,†SŞ»ĄgwKĎî>=ň©¦'hÖâ„Ć-šň¤b9C+ĘD|`˙Dж•~›µ›€+–Î+‚¨O•’ŮśPt¤ >Oņ€rDíئ”TЇÍó‚ń†÷0ŻŞ¤Á¦´ÖIäĂx 6±·d']¤ěXD»’îD´Ýş˙÷«ç¦JÚXĎGo´pdHÚ-rĎ.§ăÉ9žóerűBľłˇĘő†Í++uH!Űę`5Ń Wä¨!Ł'śČ‚Ł˝Ăçđí źVe®©ĚݎEÄňÇžn Q›·5ßtśí§µ6)Gµl8rrjČ #¦4/ž®+Ť6[ÓX­s`‘ŔčgécQ‚?g´ű´H°Ř’ôó¨Ľę{ĺˡ.ÖÄ&y€äŻVg§UńĽ©”âç*)Ąq†ˇ±,‹HTą1ě.ŐŰ•Ż®×5á&•¦Y†Ťµ"‚ "n@Ĺ /Ă _+äNvŘ-ôk›¦—̉ ŹăDŢňÍMdřPľG0‰j•-Ő;ëĐW=nÉyäö·Ňć`Ě‹š0¸ú®, 1ĚLzůĽžÓ¦ľ™>}ř§s<°<ŘÇpAoj¬Ă¸îí¸$Uµ4…;Ë›aŃ‘ř…0¦µ¤¨WĘ·© gJË8+ZM ĂŇxĄ+ĚM » q&ö !6÷®xófĎűIr}tĂk’1cRÚĚčĹ»Ua·ęÚM˛•j_Uc\żNĚÖ;ő†Č˝÷Ůa7€őŇ1<ţíˇ{˘×}Ő9˛2<Ç[:»aP˙z=zṸ¶÷ÂsCë˛f`|OI\/ş-FŕĐ\©yŚôY’‹mm*° V›®÷ŢB·›Â}YS{úüNçÍť?Ţp§ ¤aśWď0#».1Ţ‚"ŃÖ´Ű—ň/ ?˛ţ«źÄ˙˝ô: ›ú­ë;HZćGÇq±”(2„«HŃVAfÚoEĂi÷ß•í8Zˇz”ŹőnČýcÉăĆçw> endobj 988 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.635 715.84 246.453 725.768] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a80b535c275f9f60c644d91263f0638a5) >> >> endobj 989 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [279.597 699.003 356.029 709.907] /A << /S /GoTo /D (LIBUSE_suppBitrates) >> >> endobj 994 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [331.363 653.375 419.851 664.279] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a02f49b93eaadb6a903b87670849255a5) >> >> endobj 995 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [370.764 123.167 416.483 134.071] /A << /S /GoTo /D (ENCODERBEHAVIOUR_BEHAVIOUR_BANDWIDTH) >> >> endobj 999 0 obj << /D [997 0 R /XYZ 89 770.89 null] >> endobj 636 0 obj << /D [997 0 R /XYZ 107.713 729.972 null] >> endobj 920 0 obj << /D [997 0 R /XYZ 107.713 684.344 null] >> endobj 921 0 obj << /D [997 0 R /XYZ 107.713 600.897 null] >> endobj 640 0 obj << /D [997 0 R /XYZ 107.713 573.081 null] >> endobj 922 0 obj << /D [997 0 R /XYZ 107.713 499.638 null] >> endobj 637 0 obj << /D [997 0 R /XYZ 107.713 438.149 null] >> endobj 648 0 obj << /D [997 0 R /XYZ 107.713 392.52 null] >> endobj 641 0 obj << /D [997 0 R /XYZ 107.713 344.939 null] >> endobj 639 0 obj << /D [997 0 R /XYZ 107.713 249.538 null] >> endobj 676 0 obj << /D [997 0 R /XYZ 107.713 142.181 null] >> endobj 996 0 obj << /Font << /F22 400 0 R /F46 984 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1002 0 obj << /Length 2168 /Filter /FlateDecode >> stream xÚíYës۸˙îż‚ßJMM$ř3“:[Îů.ŽUKí´“Üh ‘˛8ˇH…ŹÚţﻋřu:_rçNgú‰‹ĹXěă·K’÷3Ţźý°8{sĺşFdG‹Ť1# ŰwcźĚĐvF–ë3Su’Ż—YşyĚ´·Ä˝Jł„¨»d“”#gl‚˛ĆÜőMîŚ~Yüt6]ś}=sŕDf8ň?´CîëÝ٧_˙'Ů<Rjgx.‡gfĚĎţvĆ”¶¬Żµô´vf»Ě3BxˇKŞO&ŁŔ7/¦/–‹»ÉÇůÍß˙)µŃŰŔÍyÚĚĂ”\˝qß,E^틲YNä™őÓ>AŠ›uAśUBϦJb.9ćű09Žc.n` ’í!­U‚íšÇ ĺČY™T°’řďčá|ÓÝCÔŹŤ[ýĽPéç}ý€}L?RúuT?XřަŮ9 ‹Fń‹ M¬Dg.m~#÷ˇĐŰ^0ľ<`xK‹˝$ŘsŹĚźňµ˘z^—ľĹÜźĚĺ}‡1@HZŰG BhGś?Cť§“ËéÝr6˝»ľ˝< =<°yĐBĎU)vÄ~ë‘¶Ŕ0Ѱ>ěĽOĘ´iB”`÷X‚rÓÜ"ëâL‡˘N‹ś$V#ŇrX ]Ţ8N†<t´„ €§6@§7ÚF4Uw@éF€)â ŕĹ÷M6Ź»ć$ŽS<]dŮIŔ®-Ý Ľm-á( –¨· MÍ.¦Ä)“}RË Ąćl¨˛6Pń6-cQ‹ĺ*+Ö_ĐĎč_›âB˘¶ÂF8Çţv4|Ľşz‹[E¦hęÂÚŇŇ0N6#8I4Z)Ŕ ¤ éE$‹ĺÍĚ[""ť8=cĂ:ʜެöËňyú¤íÍĹĚ9§ `Ďň!­Ô}™}"«~ćr•T*^©č4ˇČö÷$ĐüúýLJ¬ýpýńýňćörz2‹<č[ĆmÍÓ{¸¶TjG0‚ ,ž[ís ŽÇ:É+™!Čš`ôŢb§łÁđ :‚mÁ¸Qôâúč9ˇy˝Űgé:­zˇsë/2Ę8ëb·‡]aCĹ7«NśĆ€„ĘČĐÁٰóf6}oyzű*‰I¦w•ż Y‘„Ś"$pŹ_AÝÖBýünKŁ*a]qVI5őxM›Đ{†ŢÁ)#ŵ{'p”ăšmĹşŢ TĐáŘŹUÄK[«Ké^LŔz&—=0â;Ł«'z&“˙ĆIJĹ‚ĺ‘yŃ_T˘…1Ç\Ö_‘· `úÂ:X.¬"—Ŕ¦S›U§Lg‘!ľĂv ¶çZ«Vd‚Xt°ć@ĆÚű!Í2˘˘2«–±Â]O÷¨Ö¦Lľ6§h%X_«=6«ČŹ`?îyđG UAÜ·ů¬ˇ]¨ć ‚ĎĘŇ]ZënZŽ}S˙©v\PCtIę­.:2­‹ňKuŘË ´ŕ‰tz}UăBż>äE=ÔţPůÜšW2JŰxţĂÝ2şľí1˙eőC·÷ÓÇ6GĄ'űČHEĄCFwY|Âb€Ěžç~Ŕđ·ĂCO R08OĹŁ…öđ´ĚÚA˘í8Ť0$WŞů†pa™C:’*›8˘AÉJÓ‡é˙ú ,‚AÔ:[(“X‹˝ ślz´(ÝFł9=ɶRŽˇÝ”hj€čöWĚ}ÉCŁb@ŹłéäŹŮŻ÷˘Ť~-Ň\k6??čĘŕ€Ze C:ő× 1xtu[vzy1Ĭ]úřŕęů¸B)p.ąÄóűŕ ú-Ú×=Pň]@rs›ÄčłâëW7m×N>AZ9°wRBžv 6đ•^ż˙!÷̇&řÝ;çĹ ˙„jôGˇ|ňYĐ+BÜ›Ű4)EąŢ¦k‘§ŹŮ0Äv°)F”Bę7ć0MŤ9mS´nĘ<Ö”›šňţzŮ3 Ńő żŇ¬šrŞJ묉[Ľúďőé< ş2ůşŚW•Q Ę(p\€{ô\C*›°ź,›ŔčĘ& T‘jĄž?N-]"ʤÁ«Ő=7ňŽTŢČëˇxäiÄ‹<í<Ń‚- Fş9q#Ýś 5´*r†V•{¤÷G‹Ýo·XHůŠÂţĹC}ݰWľĐ››ž(…4Śdů‚§6Voug¬PA zć Mˇ…^šŞ#R}~[ ŽN~…‚ńٶ W]“÷2j đU˛U¨€ŇX׋«ĂŐĎ‹ ń 8d¬­ď솆Ž|Hí·›o©'†Ĺ}ŰÂÁGž®‡ą_(Cđ¦L«ňPR MfiU'y˘–Aâ9J%ńTO%jR¦řű¬˘ej= XR©-…ú~ ł_HĐú ?–a 0vł=<ŔĐc Yď{(ŘM†Vŕę“omqćk+Ă$ÜŐ—Šâ:ş> endobj 1003 0 obj << /D [1001 0 R /XYZ 89 770.89 null] >> endobj 968 0 obj << /D [1001 0 R /XYZ 107.713 729.972 null] >> endobj 969 0 obj << /D [1001 0 R /XYZ 107.713 602.45 null] >> endobj 970 0 obj << /D [1001 0 R /XYZ 107.713 518.764 null] >> endobj 1000 0 obj << /Font << /F22 400 0 R /F46 984 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1010 0 obj << /Length 2375 /Filter /FlateDecode >> stream xÚµYKoŰHľűWčHĂć›ć ËrÖ[öJÚÉŔh“m‹‰THj˙ű©ęަ(ZV’Y¬f?ëůUuuË<śÁ§ł‹ĺه+×$vşá`ů4HśA ;pĹ`™ >[ž;ücůűŔó[lŇŁWůZ GnŕX—eşŰ¨˘‘M^¸ôlş<űv&`Ą3š\Ů‘ ŇÍŮç?śAăżŰKâÁ‹^µř®ßő`qöĎ3ç@4Ż#šp;ôÄ ‚oą$IĄŇrd*˘ČjJüĆ–*Ň2S4ö’7+jĺ›í:Oó†z‹‹9-®óˇ°ž ąÎ‹g{8ň×ÓL¦LEëSą•Źk&Z>Ńw<úŽ5ÝLhGY¬_ ŰőZ[ĎŚ„°°ź–ąY©‚¬ÇkˇE|¨ óÔ`ŇÔŮĘŞ9§ćË*OWÔÜ(YÔ˝mD+ŁŽÜeyÉŰPÝŞË]ÁóʞČFë|“7*ł[i}ŰsBöőPVYŃęŰűé§‘Ëü*`˝-«†»Ż[Ĺ’|qg|ą\śŹ/ŻŻ #Îűęvü€âäl{žd2۲®s°÷i±<7¶nî†^`ŤŘ‹,‰şéáńPa-oĎiBážď†3®x”é×—ˇ3UYM‹O[@łö3.é‡]Ňę}eőµ¦‰¦|Vŕ‚Š'5äp|Ľxĺv÷ýßZ@UŐ=żý&{ľ kOĆ [ր̲ ®6 |›•ÔPHBëI{&îë†#=Ýp¨«ö[ݚ̲YĹm^· EúČ =¶}ĺv˱腮ŽEŐČÄĆx1±ąEź6Ľh™l¨…Š"66Ś´ˇ‡ ˝v7yIr ťÁęŻů–·ĘŮőb _ŕ{ÖL ÝŔúŤŞ*­ęQäGdr\ţßÝfŰâB목)›Aˇ–ÖŤĚLŚV8§Á0˛ Ą˛şK'˛ľ%Jđ˛§ÚU‹(Á|ěXkU<7+=Lk‰Á€Á AÝ€QÂě۵ÔÖ˛u'‰"Śh›Ŕ€¤Ď“’Í®R4§wáâÝQrľpIąX‡óŹ%N ŻŤrěů¤>Ś6,?Źjń`¸•]0 ş“$»đLđÁÜq m~­uĄŔťĽ_Ľé$F JÇí : -h‘jG 0rŽřŇj3I“Â>´I‹Ćë’Ŕ†wS€ 3×µaCN†q:ő2#áďĺGŮ?˛2‚dQKHßtŔčCôśZ˝D‡‰ťó|7ˇeSVŻĂ0°0!x&ç±Îy:ájŘ íŇ [PKuů7ިąé+®ĺ&i€ńSĄľíŔ`¸ë•†đŕ2‡+t5ŻĐ‡ÄGýT˘Ó°ĄřR Gx|;ŕA[ýýŽ–¦<- 3ćŞńvD›GŐ==ÍyźsiŃw” €Śř8 [đOo.Ďi„…—KááA j^j˛Uc!IÓĄd[•ć_ÇMihRŘÓgPě¶ĹM‡,†Z`ĽăLě=}C!ń˛4á~Ţ+jĄó$—¸Ş_0­äĐuř8 ‘‚‹*ő„1ń¤ŇĆÔ8µÚQ˝-l?\ůa§Ş‰ÄöÝľˇGč#c2ťM–÷‹]\ÍÇ·ÓEŹLŻ8öí(¦@źí6Źşjtţ¸‚q÷HO•ÜčR ÚÚA0)©Ű­é`TŻäM%“;–¨p­™ÇÂO;i$śŔö\˙ĐWb ó×nÍFűC3 „c‹Đ=´Ë× W}ŽŁy~ä U~Ď7» ;É! ŁN;[›­ ])ČłyÚ(jŘ»~O¨^äĽ'Ď[ý_¤sO# îIAśh„9Î[dÝϡwřo9ť,Żďf'&ۉb0Z;+ŰŞl r“‡QŰş˝%¬ĺ«Ş>Úl¶Żý W;)geź/Gy`:ˇőapš‘`F“9_Ŕ$pŮ…ě%s1Ҩ§ UŢ3›W@¦üGĹo5žM®onĆó!D×.®—óń0Ŕi'ý€żD×_u# ö‚,RHm˛2—OŮČVřJ6ęĐ…¨Ń‡jť"ë…ĂH¸ŕ:׸.ü±ë×µ¦9ß“@ LŁ^v%Â.I„­’ćE­D8Fg›LąkâH/˘ĺŹŻŤŇ{Ś×¨ČtQćL8/¶;&ç [4 ÎuňŠm?Ś‹m`3.Ň $ÜÚ‡´Ä—Žę™ź<ćZß΀.Ľ.ĆşďąîĆę[Ô0ţ „Şu­¤×lť“ÎĺgĚ2ć4…ýţ?ÁôvşDXŽ/1Hˇş˙p{wyŞľýŁ©E$žu«P‘řÖ%čbăUUX ĄŢ·>îęX ŕÖľq™Ž`¤ý´«–8šÁŽ|]÷•€CÉÁĎĂ}sYšŠ¤®ću¦0•ˇ~Ëid¦5ü;gŽÉWÓ=u|­1OBhŇÂLNťg]‰˙ľî[ľŇ”MÇ5úĹsjr7[ŇQuó° HýDúó<¨‡Úô·ä˘.ä DZT^CĺłkJ¬eSęÂy’Â]źÖ´wŘV@~€:[ż`…ř43Vş‡jMĂ\ŐăőÄUчąÄÜuÁÄśâm0Ŕßq\ŇŔž…yxˇ·@NXş›®dńL NpÂtč6ŕý®2Ceš‚¤>`QBď°„ČUHďHu :Ó˝ŹÓ^‰ĺ—‘—*oÚw;s>«f?ŘŮ HS•沑ͮ>,}ĚĎ1>ŕýd¤÷ňěd9żąşŃýO‹Ó©ödľAáěnvp1dżĹŰH˙ázýľNćt‰Źă(l˝ŔŽ’„ÖG¶°ý!Î9ÖŐ®čÔQoŘ{öŕ,(ýCó® Ů‚IŤu¤hů§óůĐšsĘtZ¤“uY«ý›íPô?Ƴ˛éĂ~/¤ď9q~‡łçÄvŕµW@©G«ěŠ-ϬٮƚŻF˙[]Â\°§G…[ĎÎp˘űv‚Úü3EG‘pŞ0O÷ť(Ű_€#;tá— 1ž¶…ĎŃť&ag¦>Wć–¸*ÍŻ!µi_5zXéę9rě$ AĐŽ@9-Ă=˝ÔRXV ď VÄvä`ÚŚm'đŽř=´jK·®»/uv;Ľ\·#dšĚhkV>¶ż;3öęÄţOB±ÇŠű«żýäác endstream endobj 1009 0 obj << /Type /Page /Contents 1010 0 R /Resources 1008 0 R /MediaBox [0 0 595.276 841.89] /Parent 1004 0 R /Annots [ 1005 0 R 1006 0 R 1007 0 R ] >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [217.003 380.925 292.021 391.829] /A << /S /GoTo /D (structAACENC__InArgs) >> >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [353.899 347.612 440.713 358.606] /A << /S /GoTo /D (structAACENC__MetaData) >> >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [397.095 259.426 501.244 270.33] /A << /S /GoTo /D (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846) >> >> endobj 1011 0 obj << /D [1009 0 R /XYZ 89 770.89 null] >> endobj 971 0 obj << /D [1009 0 R /XYZ 107.713 524.585 null] >> endobj 972 0 obj << /D [1009 0 R /XYZ 107.713 462.66 null] >> endobj 973 0 obj << /D [1009 0 R /XYZ 107.713 412.69 null] >> endobj 612 0 obj << /D [1009 0 R /XYZ 107.713 350.765 null] >> endobj 974 0 obj << /D [1009 0 R /XYZ 107.713 286.49 null] >> endobj 975 0 obj << /D [1009 0 R /XYZ 107.713 245.923 null] >> endobj 362 0 obj << /D [1009 0 R /XYZ 90 228.525 null] >> endobj 573 0 obj << /D [1009 0 R /XYZ 90 202.933 null] >> endobj 366 0 obj << /D [1009 0 R /XYZ 90 202.933 null] >> endobj 1008 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F46 984 0 R /F14 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1019 0 obj << /Length 2076 /Filter /FlateDecode >> stream xÚÍŰr۶ňÝ_ÁGj&ÂxgŢ”ÄnݦvŽŞs^’އ– ‰ŠTy‰ë|ýŮĹĽ‰–ťăN§3š!°Xě} [;‹[?\Ľ[]üëĘq¬ĹX«­s+ óa­6Ög;db6w|n'ÉZćë»,˝źyÜf{‚^Ą™¤ŃRne9‘ XŠ\Ç·]wöŰę§‹ËŐĹ8rK(~ČB×·Ö‡‹Ďżqkđź,ÎÜ8˛ÖÁňľ™őëĹż/¸––?)u3Î=+t]ĆC|)ëäńíĽR2ډ·GÁuđck."Ć}‡H|q°×ú<÷9· 4ÁűË›÷w·?ż!ő‹śľUł^ËŞbĂ}{ĚăÁ‹ _ßüw&\ß^|Ľţp÷ăâćĂÇ˧íL€WҬ)Ąâ62ÉÜL.|C¸ť7™ÇśŮ\pbçűÄîrąśąÜľ]íP9ű2Ç_±A_†ÂţÂ}>›űž°×E^Ő„FrÝutn?\.I/č×ó™ˇC•űE˘i—łŔ·ßLJĎÁࡹ,ö}ÚhXA_öwÍö¬ÖDEx=*‚Ç,Š=Ă÷ çî„t‚3'Ś RškzSbůq«Çß!NŃÔçä zCy ĚçEĚĆ|:ězB^ç‹ăgWMČĆĚ6çĹÄ‘Ű-)wŐ”„‘^§rO‚ۦ>#BŠ ˙"8=Cˇ S"ř,Žz´|ˇ‘úů?wb‡\ŔŔc®r›X›MZĐp“Ô‰Ę9•Ř_ŽGř«}ZÍćnäŘŰ&_×)ć*ľm ‡$ÍłG‚m‹’€™¤ůŽŔš .›yČ#ű:'P˛Ů¤Ůz/Oą9ö:Ńë÷zą©äfÄÔ Hť‡F™^¶aĘ—í.pvM™4±,&*ťçF`EÎgĘݧ÷ż€~ ásljFJg>¤YF#Ą¬•˛.S9sĺ+vĄ,oËâ@#‰ŕ?kYćIF[ZĘ@ećp»Ůâv<©¬ÉëTc’-†šÎYŹ›ĆK˛¬@ŕCĄyvŢY˘ 1/‡Ć¬ŹJ*č¶LPłç~ä›A¨öa’Ą5†Nš »ĎÎÓ~쑪°r˘`=¤őžVKąiÖĘb®ŇoZ”4§ĺuq8&eZš|]­ŇŤ®’ŕAĄ¤’ľ?^Îđ^Â(ŤiÉ|WďGQ37‹  çŁćz‹„|rľ˘ĘIÖči1\÷L ¬JÇLV4IT»˛k2×Ë©^ů&ËBť¶ý{S™ĹÜXgĄLsČDpÖ·6'|ŚYtMîµ@ÉńĄhzEEK—v,źRţŃČŞ–›WŘj±ď„:¸a ó ĐJřM裂~†a5ÄÇĘŰT{Šo뤧 ŐÜ›meşŰÉRłřšj╬kM!čH÷ÜÖ¨]7©‹´Űž°ÔČ‘"Pá‹ßą€4sâŇ ťi¬ëťZŢČ,y¤a–ć*.`”’Ű&Ëô˛¶ň"Lö2לöy@¸Äć3×ôr-ŚV8Ő4îÓşŞK™¦jŻ*äPě™Ëťnž—ʵNčšP:JÁŐŰ·ys€ů»ÇZVٰ–|ĎľjJş<JĎĐdJčSt8ˇG9zQ%|«tY 5ćýă©NăÎĹ*ö ÎńîňöjÁÝâLĽ;Ď×7 ¨J˘Be©<ë5tĘ‚«˛š`Ŕ±¤JźMEKşdá˘!T!‚5p;"ŃBˇÂv(-®÷Iľ“(*µxAWRž,§E†w9:%qtoú”®Ü pKn†qwRáL—GB@ńoÁ˝˘­łîĺgµo3Éô'8SuCeZV”–÷‘:µĄĐądÓ|#ʎm’—ň´/pgLT¨łÂ†3P`Ř+ đ°4¨wJÝ@O8Łu)YgźhÔĹČţôég»1~·7ß{s’kŚÄ8˛ŔěÔ®î…ÎÉr=fPZ‡RÜüçăÇ×®®î,q@­ŽTMp˝niŘ‚ JÚ¸ A0f›˘ĐŢe4Ľ˘o®ÜSk†´ť±NÉ×®î[qđP¦t– ¤|Ř™le ˛Š¸«rí ‡ötnJĹtNµÉŇV·ÎĂ͉# ędŰ> endobj 1012 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [133.245 462.905 275.8 473.809] /A << /S /GoTo /D (structAACENC__OutArgs_aa08d19137d0dbd54d3d86f88a85eb149) >> >> endobj 1013 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [264.962 305.639 347.353 316.633] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [276.588 263.646 358.979 274.64] /A << /S /GoTo /D (structAACENC__BufDesc) >> >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [222.761 234.834 297.779 245.828] /A << /S /GoTo /D (structAACENC__InArgs) >> >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [219.174 220.428 300.838 231.332] /A << /S /GoTo /D (structAACENC__OutArgs) >> >> endobj 1020 0 obj << /D [1018 0 R /XYZ 89 770.89 null] >> endobj 555 0 obj << /D [1018 0 R /XYZ 90 693.046 null] >> endobj 370 0 obj << /D [1018 0 R /XYZ 90 679.166 null] >> endobj 976 0 obj << /D [1018 0 R /XYZ 90 96.348 null] >> endobj 1017 0 obj << /Font << /F22 400 0 R /F23 401 0 R /F46 984 0 R /F14 726 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1028 0 obj << /Length 1528 /Filter /FlateDecode >> stream xÚíXIsŰ6ľëWđHÎX4\ŽŠ-§J˝UR{I2Š„lN)Rá·ýő}ظ™rś™tÚCO‡·żď=Ź2ŢĎŢmgçW„ˇzÄ3¶{#D†ďa›llăŁé¸ÖçíĂqBS —ÄîUš1kN(2/‹¸9°ĽŽę´Č9éląť}™a Dě¨oű5âĂěăgd$°˙Á@¶Ćł :.qŕ736ł_fčUŐ|úD*áŰŘvmÇšc„ąXX”šËŰ‹‡ĺzm9ČĽ[KŁ(^ćń{V_§»Uľ·5 yň QdÍ)Üľ^˝{XÝ^Ýq ÎŻ°ŰKŔň´éźr$•ëő••ŁiR‚Ht#č„3Š‘Ó#š“б `ľ$ ¤ÚŔľ(ŇăŇÂ]Ѩ3–ÇEÂJů‘Ą»2*˙”;‹ łIłÄEĆű¶GhŃL1“?Ź)wÔW Sŕ)·Z'‰ŻŞ.›¸nJ•Ďiý4!U2(«VמňB‘6ŕ#GÍ‘†x€ÚľŻĄŕę(ŹŮ‘\Éxű”VśŚšű&Ź5ŘąfÉę2e8)˘(şf±—ő“=Ń”‡śF›RAŃÜ!ŽąĘĺi”$iÇI–|OD'\xČŁL’M5«ÎZ›zlu€~$śoR3‰juĽDů]nr#ř–0B\mĘR8“ź¶ń“ŠŐuš?VňëYŕ9'Ú©›%Ç”śüĎ=0u+9‚w…M’&U·€ąä EÜ$i10FŐŰćČâ”ŰsBb^(«äWšËß8Ş\I[ąŽ¸ëžĺÇ=_G`.d&«…xlÖe”WǢ¬%M§!0)ĺ/‹7Ío•z}gqDÚś_/,Ś±ą˝™ PO2ˇž’,’#”ă»/ÂÇ7eřřJ…Ź/eűć.ÍUGä·Ů,<3ŞäoĄ=©RĹtµą;_-/$캡7wä ¬›űĺűą;™gÉř đ^Q&l>Ő0xóÉuŮëIB7ʧvşëĆ$Ćś¦’ëXż†t)vu”¶ ĺ(ÎŹâ§±ç!4JΨ Ş'ĺ[íŢ I›C×ýßnFíFŕI Tb›śěĹ#X‡»7[ň˛a쟎 ńđŰÚÍČ:-< ÖjŮó]”† SZ$í^gl—Ö?Řüńźjc;|ďj`üb endstream endobj 1027 0 obj << /Type /Page /Contents 1028 0 R /Resources 1026 0 R /MediaBox [0 0 595.276 841.89] /Parent 1004 0 R /Annots [ 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R ] >> endobj 1021 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [175.807 377.254 263.737 388.123] /A << /S /GoTo /D (structAACENC__InfoStruct) >> >> endobj 1022 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [234.747 220.956 332.859 231.86] /A << /S /GoTo /D (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) >> >> endobj 1023 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [418.694 209.001 500.736 219.905] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1024 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [258.786 149.271 340.827 160.051] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1025 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [308.429 105.442 390.471 134.508] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1029 0 obj << /D [1027 0 R /XYZ 89 770.89 null] >> endobj 374 0 obj << /D [1027 0 R /XYZ 90 739.935 null] >> endobj 557 0 obj << /D [1027 0 R /XYZ 90 572.871 null] >> endobj 378 0 obj << /D [1027 0 R /XYZ 90 558.11 null] >> endobj 618 0 obj << /D [1027 0 R /XYZ 90 309.023 null] >> endobj 382 0 obj << /D [1027 0 R /XYZ 90 294.261 null] >> endobj 553 0 obj << /D [1027 0 R /XYZ 90 96.348 null] >> endobj 1026 0 obj << /Font << /F22 400 0 R /F14 726 0 R /F46 984 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1036 0 obj << /Length 1949 /Filter /FlateDecode >> stream xÚÍYIsŰ6ľëWđHÎT(\:ą(ŽśşMlWVzI2Š‚-v(Ňĺ’Ążľ7Ń´“Îdz"oĂ{ďű aëŢÂÖëĹËíâçsB¬E>ń­íťa+đ]Äkm÷Ö{;@®ł$ Űqśđ<ąÍŇťăaÔěyšqő¶áwĽtÜІUb*¤„Ů”9·ż-ÖŰĹß 4bË•X€ʬä¸x˙[{˙ÍÂFˇőY®:Zˇđ̬›Ĺ [_žÝ®7‡bűj–E‘pfť'Ĺž—·7Ľľv\𯌏Β¶agÉ`YRäU­&]]ľzłľíD^˝Zo„s?ź{~Ď" ę[K×EcʨêŐćřĚţIířáSDBNĘ Z­jĎ…k'đěŐfővB«ë…ľđ ś™ŇC=„˝)=ď..·r™‡ËĚúOqÖđ ©Âî†f„ĎŐ‹hoŃ’ÂAQL­%ńő"µ˘Ż (rťGUšß›śď!×ÎÔ€ëĘô×0„đ ˇÔ/ÝůDG}{H+Xëúö]“'uZäjgYá@j~–_„“ű¦Ś»EĹ]»X˝tĘaK«\+¨x’ !|Ż&Ň\¦˝Ę÷ň^'ţćőÂz/żkżÔ©F¤=Ő6ÓÁ~¤t­ăä „J­ËÖŐ^‚É8@ĹaűŘČ…·WĎĘqm®ç>§őA˝Ĺú#Bk˝´'%ŕ;Ř@ˇ Vz*ÍAQgjôID1ÎŇ}Üm’q "»>h™§Ńív6zMç÷ÜXźđPzůö^ĄIŰ󽚊sőěźK~ŞIůňm§ĺTé=lâ{pŐóČ­)Nę&Ök'Dűâˇ,s f!žµš‘ˇ€§Ĺ„GUł«řß Ďë™TQmz‡j˘1™ęꥊ\§Ž«˙aT¤KŚ˘:ˇ˛@Ń6>•ĚýÝť”aŁ Q€#p%DŃÓţ62 ßU<Ď4‰•*ă6‡žŞ÷śwĆÇL[*K—!LhŻÎEęXŰ!¬Ť‡R\ęą3í‰×˘* n7śĎÝóŞ|Î#mťrÉ5áÇ\vă —Úňë92jŞr¸çUR¦&Éžokßéđ0G=†B “tĂë¦^äŹečđD r™ÉPM >ÂĆEĂđŔŕ«ß2@¤şI^UC{e÷ă‚/.˙t\ĘěŐ›‹W·ŠE€¦Đ'ýEď.oŢ]_;ń±˝]żę·ޮ7§Ë „ČóĂaW(;»ş<żx=rëN–|š5ĄŞ¦ń ĐůÔ•OϸbUÁ<«ň=Ý«®¸ĐĺSC¤H0Çž\Żx8B€u•ŔtŠí`D(mÉÎsřU|<â="„KĘ0ň#wĹGČđ—0l ÚÓŰbßdĽšR—„Ţ÷­cüĺ :^ÎłjĘ‚0ž˘[ÄsˇĽ!ÝŇg#pĄ­éŞŽcgżE×;đa>aYşVŔ¦É hčÚG~,ĘŻâ­(Ő¤Đ$žm?ˇÖß˝Uqą^=  L;– >íy^Ô‚k‰ÁNë“&÷7ŞQÇŐІ}ÝKžćiťýĂ'pgM doT…Ôdú\GáGC1™¨…9,ö‘GÜ?’C qĎäÉ$Kř¸hă·¶šR4îü ĚV† šjWYs.@ĹQ[a7‚‚ß}ť°ő¨EMŁyóđP”µ±<ÍMú§ŐL2ü2lůKBPŕŽÇcČ€żŕ_TܺґfęŇ‘=şĐ ŐőCĽ8ÄŕvšĹ»Ś?îč`Qä…ŃĽYĐiŔ- ¬č@Ć“ZÝ9Z«ôĹ)éÝ‘J.@ůŢôb—6u_é]”üÎ$Úçb}a®_z‡/›||ŻocqÉőm§¨ŞT9*tŰCž®ŕÄd¨9Ó¤8îŇ\0ú™ôQx'ˇńçNĽµ Çčšsě“Vĺń|ő+A˙I7Ńşo^nľKďwŞő´Úë›é­k*ć-Żc¸mĆ?NąLń/ńń!SŐJN#‚Ľ.ł–ü5ÉĐ&ü°ŠB\x%ě))A˙P“âW],ˇ•1Sč˛gŞˇzé:)1÷o˘oľ0—ŮT¶ľ]‹­ś—-žCÄ„ @LĹcˇś1 (’°ŃŤ[b®€}Ť·;Ý+!óLĚ ŮaFüęQ”­Ëć¸3˝Öđ¤ÄH™DČ˝FĘm +Ł›ÖIkŞ1$íÓ;Ř;^ŞČ 6"ăůµ:#qřÁ3áhŚâ/é±9ŞA>á÷ ç©T`˝n4 K\M‚­9Á–kf鮌m|fOŘ–›3źöěw•`„^`WkőÖ:&Ć1ń.ĎÎrꅚôÁ>YRŽ!şđ.NH<ŰČ €Ą{¶g[Kłă ť/ ŔÄ/Ęł}„Éů»[ÎovĺŮAËrű·2 ͢ĄZ/^L\ó˘¶TBŃLDfÁ%°-›@˙&:0ŃKVečç`bśôđIÖXĐ‹ö©X"ŰJ!EŁźÝ4“‚¶®ł®(ęPOŇo * î¨ĚüHţ~¤š;ţł%3áîűŤ˙µü ‚Rv endstream endobj 1035 0 obj << /Type /Page /Contents 1036 0 R /Resources 1034 0 R /MediaBox [0 0 595.276 841.89] /Parent 1004 0 R /Annots [ 1030 0 R 1031 0 R 1032 0 R 1033 0 R ] >> endobj 1030 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [377.026 672.89 459.068 683.794] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1031 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [135.768 637.025 203.035 647.929] /A << /S /GoTo /D (aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) >> >> endobj 1032 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [236.659 580.716 318.7 591.496] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1033 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [319.676 565.568 401.718 576.562] /A << /S /GoTo /D (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) >> >> endobj 1037 0 obj << /D [1035 0 R /XYZ 89 770.89 null] >> endobj 386 0 obj << /D [1035 0 R /XYZ 90 739.935 null] >> endobj 551 0 obj << /D [1035 0 R /XYZ 90 491.223 null] >> endobj 390 0 obj << /D [1035 0 R /XYZ 90 477.065 null] >> endobj 1034 0 obj << /Font << /F22 400 0 R /F46 984 0 R /F23 401 0 R /F14 726 0 R /F11 673 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1040 0 obj << /Length 276 /Filter /FlateDecode >> stream xÚ•MkÂ@†ďű+㏠f;3›Ý$ÇTŁU4ˇi(”TDü(‚´(ýű]×´ôŇÓŔË;3 Ä}#îúĚé̱f BâH[&h–ĐJăÔ´1™&kýRHű›íJElQö‹Ónµ?ÎŹ›Ăţ\E#Ţů&…s6щ±°Ř‰vаôůP›,…ĎĐÚAĚĆĎ-<‰Gßhxh®‰I“3°Ďľ˝2ŰđţgÚČ"Ę> endobj 1041 0 obj << /D [1039 0 R /XYZ 89 770.89 null] >> endobj 1038 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1105 0 obj << /Length 702 /Filter /FlateDecode >> stream xÚÍ—MŹ›0†ďů>‚ÔPbGqKLdśVŐŞBŰÝí‡Tíˇ§ţüšB¶!ŠłłaQB”?yglżŃ7„Q:Ă'ď+5{»v]ä.ś`¤ľ˘#?đĽđşG7ĽřmVďž‚t„‡B'ô]ż ŔhN±CHýó(˛ŘŠ™Ëh­\Ů[{)¬r ˘ă\Šć„čřer{{÷đxWţüńĄ uľżiVĂ _Ő’Ő™ÎĐÍÜĄŘňp‹Fç:“óCÄ<Ë"iűÔúT®¸’‘M±#r ‰lJ­ĽzT]„ŕ"74CXٵ"‘ض>ňDm¦ŞÎ‹Ôă ۉŚË5϶O7ýE8vĐÔŻÓŰlS†yÇýÓĆaWtM‡‹:V&Ďšŕжű‚ÇĂĘM)V`6ćÜęÚbÇXĽąÂbc|âh_?B ńÉň÷fÇĎé;Sł?Ď^÷ endstream endobj 1104 0 obj << /Type /Page /Contents 1105 0 R /Resources 1103 0 R /MediaBox [0 0 595.276 841.89] /Parent 1107 0 R /Annots [ 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R ] >> endobj 1042 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 608.529 175.539 618.716] /A << /S /GoTo /D (page.30) >> >> endobj 1043 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 584.593 175.539 594.78] /A << /S /GoTo /D (page.32) >> >> endobj 1044 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 560.658 175.539 570.844] /A << /S /GoTo /D (page.29) >> >> endobj 1045 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 536.722 175.539 546.909] /A << /S /GoTo /D (page.30) >> >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 512.786 175.539 522.973] /A << /S /GoTo /D (page.30) >> >> endobj 1047 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 488.851 175.539 499.037] /A << /S /GoTo /D (page.30) >> >> endobj 1048 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 464.915 175.539 475.102] /A << /S /GoTo /D (page.30) >> >> endobj 1049 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 440.979 175.539 451.166] /A << /S /GoTo /D (page.30) >> >> endobj 1050 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 417.044 175.539 427.23] /A << /S /GoTo /D (page.32) >> >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 393.108 175.539 403.295] /A << /S /GoTo /D (page.29) >> >> endobj 1052 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 369.172 175.539 379.359] /A << /S /GoTo /D (page.29) >> >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 345.237 175.539 355.423] /A << /S /GoTo /D (page.30) >> >> endobj 1054 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 321.301 175.539 331.488] /A << /S /GoTo /D (page.31) >> >> endobj 1055 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 297.365 175.539 307.552] /A << /S /GoTo /D (page.29) >> >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 273.43 175.539 283.616] /A << /S /GoTo /D (page.28) >> >> endobj 1057 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 249.494 175.539 259.681] /A << /S /GoTo /D (page.28) >> >> endobj 1058 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 225.558 175.539 235.745] /A << /S /GoTo /D (page.29) >> >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 201.623 175.539 211.809] /A << /S /GoTo /D (page.29) >> >> endobj 1060 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 177.687 175.539 187.874] /A << /S /GoTo /D (page.28) >> >> endobj 1061 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 153.751 175.539 163.938] /A << /S /GoTo /D (page.29) >> >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 129.816 175.539 140.002] /A << /S /GoTo /D (page.28) >> >> endobj 1063 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 105.88 175.539 116.067] /A << /S /GoTo /D (page.29) >> >> endobj 1064 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 620.497 392.02 630.684] /A << /S /GoTo /D (page.28) >> >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 596.559 392.02 606.745] /A << /S /GoTo /D (page.29) >> >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 572.621 392.02 582.807] /A << /S /GoTo /D (page.28) >> >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [447.791 548.682 459.746 558.869] /A << /S /GoTo /D (page.30) >> >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [478.774 536.713 490.73 546.9] /A << /S /GoTo /D (page.32) >> >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.458 524.744 407.413 534.931] /A << /S /GoTo /D (page.29) >> >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [436.703 512.775 448.658 522.962] /A << /S /GoTo /D (page.30) >> >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.887 500.806 428.842 510.993] /A << /S /GoTo /D (page.30) >> >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [446.217 488.837 458.172 499.024] /A << /S /GoTo /D (page.30) >> >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [452.852 476.868 464.807 487.054] /A << /S /GoTo /D (page.30) >> >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.285 464.899 469.24 475.085] /A << /S /GoTo /D (page.30) >> >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [456.518 452.93 468.473 463.116] /A << /S /GoTo /D (page.32) >> >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [440.13 440.96 452.085 451.147] /A << /S /GoTo /D (page.29) >> >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [454.127 428.991 466.082 439.178] /A << /S /GoTo /D (page.29) >> >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [468.344 417.022 480.299 427.209] /A << /S /GoTo /D (page.30) >> >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.285 405.053 469.24 415.24] /A << /S /GoTo /D (page.31) >> >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [459.258 393.084 471.213 403.271] /A << /S /GoTo /D (page.29) >> >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [420.195 381.115 432.15 391.302] /A << /S /GoTo /D (page.28) >> >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [437.908 369.146 449.863 379.332] /A << /S /GoTo /D (page.28) >> >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [433.644 357.177 445.599 367.363] /A << /S /GoTo /D (page.29) >> >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [465.923 345.208 477.878 355.394] /A << /S /GoTo /D (page.29) >> >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [428.493 333.239 440.449 343.425] /A << /S /GoTo /D (page.28) >> >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.454 321.269 469.41 331.456] /A << /S /GoTo /D (page.29) >> >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [435.328 309.3 447.283 319.487] /A << /S /GoTo /D (page.28) >> >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [450.252 297.331 462.207 307.518] /A << /S /GoTo /D (page.29) >> >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [458.351 285.362 470.306 295.549] /A << /S /GoTo /D (page.28) >> >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [458.142 273.393 470.097 283.58] /A << /S /GoTo /D (page.29) >> >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [462.008 261.424 473.963 271.611] /A << /S /GoTo /D (page.28) >> >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [457.913 249.455 469.868 259.641] /A << /S /GoTo /D (page.29) >> >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [345.336 226.751 357.291 235.717] /A << /S /GoTo /D (page.29) >> >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [427.029 201.606 438.984 211.793] /A << /S /GoTo /D (page.29) >> >> endobj 1095 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [411.746 177.682 423.701 187.869] /A << /S /GoTo /D (page.29) >> >> endobj 1096 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [434.78 153.758 446.735 163.944] /A << /S /GoTo /D (page.29) >> >> endobj 1097 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [486.575 141.789 498.531 151.975] /A << /S /GoTo /D (page.29) >> >> endobj 1098 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [496 129.82 507.955 140.006] /A << /S /GoTo /D (page.29) >> >> endobj 1099 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [462.775 117.85 474.73 128.037] /A << /S /GoTo /D (page.32) >> >> endobj 1100 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [403.597 105.881 415.552 116.068] /A << /S /GoTo /D (page.32) >> >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.317 93.912 402.272 104.099] /A << /S /GoTo /D (page.28) >> >> endobj 1106 0 obj << /D [1104 0 R /XYZ 89 770.89 null] >> endobj 1103 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1193 0 obj << /Length 1147 /Filter /FlateDecode >> stream xÚÍšßs˘HÇßý+x„Ş 7 ”G„Ѱǰjws[Ń1± 1‡¸›Ü_’Í*D Ěj^D>óťîžžnJŔÝs€÷†AďĎ„ś*Ş T¸`Á©€ë+’ Äsî–—·ŕ'«@TDÚ]5Îčá ÷o/ż8i÷0ę‹}qłUďöŕćôú'˛:ŕ~ěîZq×P¦Çó{÷Ŕů! ß!âúűp?®¦ ׀ױه/˙ęćÖÓuţŘ Ú+Iď I޸ÇÝ^AxżďG¤W’$Ş•ĐöqšÎP?Ť°W†¦h_ł'ö4A’$Ş»N2¨ć*eîĐ m×x/U_dš.;¬9vńše:ăFŠĄ¦č`âO‡#Oł±Ď,Os|{ú™Ůü§Ž?ťL\OPň°5‰ B^ËE'˘LĘ—‚rč|¨ŽyupzY§ˇćč¦eŃ˙%4r!…WUćµnťă„ř©aşżMŤ˛•Č!]źÓI7ľ; ń4(żÖĆLÚĐ üŔĂšÝŮ{_˘7W»Ťm·đ(ööyĐŰĄéç iQ4#É,Ś—wůŤâCťő”Tˇĺ-'žŽL˶ĚńMđqĺůűsg‡gśG©ŇR©=őMý[ňŞ(Ä’;ĺ•F®LYµ˛ă:řcÚן`¬ß|Ň!Q+˛,*đş$r¸]d3«E:Ú´ŞŞ‡;~»Ŕ±żüŹlZŹÚë‚%@Ä/HjÎI’-˙’ô˝ŕC‘l(]&Z’íjX/‚ çˇS+L÷rJ§uX˝CĽ­F_ÇwĎţ6M×Űdn×/Ă˝ótÖ|ęr-ŞŰĚOóqŕ›ˇ±z˛ľÇT2ŮĐHčśč8\-źćë\âŹ$\Ο؀©AďĂ”,ÂÁě•SL6z7/áÔrYÉ-Ó@Óí“YkٶHk˛¦˝ŤĚ´·ą®|÷qüż,ʶý[Ä˙5ŔŻĽ endstream endobj 1192 0 obj << /Type /Page /Contents 1193 0 R /Resources 1191 0 R /MediaBox [0 0 595.276 841.89] /Parent 1107 0 R /Annots [ 1102 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R ] >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [220.64 727.536 232.595 737.723] /A << /S /GoTo /D (page.32) >> >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [242.936 715.581 254.891 725.768] /A << /S /GoTo /D (page.28) >> >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [223.658 703.626 235.613 713.812] /A << /S /GoTo /D (page.30) >> >> endobj 1110 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [212.59 691.671 224.545 701.857] /A << /S /GoTo /D (page.30) >> >> endobj 1111 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [212.59 679.715 224.545 689.902] /A << /S /GoTo /D (page.30) >> >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [247.638 667.76 259.593 677.947] /A << /S /GoTo /D (page.31) >> >> endobj 1113 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [230.313 655.805 242.268 665.992] /A << /S /GoTo /D (page.32) >> >> endobj 1114 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [215.349 643.85 227.305 654.037] /A << /S /GoTo /D (page.30) >> >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [128.854 621.16 140.809 630.126] /A << /S /GoTo /D (page.29) >> >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [209.332 607.984 221.287 618.171] /A << /S /GoTo /D (page.28) >> >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [191.161 596.029 203.116 606.216] /A << /S /GoTo /D (page.28) >> >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [217.362 584.074 229.317 594.261] /A << /S /GoTo /D (page.28) >> >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [184.754 572.119 196.71 582.306] /A << /S /GoTo /D (page.28) >> >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [226.039 560.164 237.995 570.35] /A << /S /GoTo /D (page.28) >> >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 536.253 175.539 546.44] /A << /S /GoTo /D (page.29) >> >> endobj 1122 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 512.343 175.539 522.53] /A << /S /GoTo /D (page.29) >> >> endobj 1123 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 488.433 175.539 498.619] /A << /S /GoTo /D (page.29) >> >> endobj 1124 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 464.522 175.539 474.709] /A << /S /GoTo /D (page.29) >> >> endobj 1125 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 428.657 175.539 438.844] /A << /S /GoTo /D (page.29) >> >> endobj 1126 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 404.747 175.539 414.933] /A << /S /GoTo /D (page.29) >> >> endobj 1127 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 380.836 175.539 391.023] /A << /S /GoTo /D (page.29) >> >> endobj 1128 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 356.926 175.539 367.113] /A << /S /GoTo /D (page.32) >> >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 333.016 175.539 343.202] /A << /S /GoTo /D (page.32) >> >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 309.105 175.539 319.292] /A << /S /GoTo /D (page.28) >> >> endobj 1131 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 285.195 175.539 295.382] /A << /S /GoTo /D (page.32) >> >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 261.285 175.539 271.471] /A << /S /GoTo /D (page.28) >> >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 237.374 175.539 247.561] /A << /S /GoTo /D (page.30) >> >> endobj 1134 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 213.464 175.539 223.651] /A << /S /GoTo /D (page.30) >> >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 189.554 175.539 199.74] /A << /S /GoTo /D (page.30) >> >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 165.643 175.539 175.83] /A << /S /GoTo /D (page.31) >> >> endobj 1137 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 141.733 175.539 151.92] /A << /S /GoTo /D (page.32) >> >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 117.823 175.539 128.009] /A << /S /GoTo /D (page.30) >> >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 93.912 175.539 104.099] /A << /S /GoTo /D (page.29) >> >> endobj 1140 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.864 727.536 402.819 737.723] /A << /S /GoTo /D (page.19) >> >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [373.36 715.581 385.315 725.768] /A << /S /GoTo /D (page.19) >> >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [394.68 703.626 406.635 713.812] /A << /S /GoTo /D (page.19) >> >> endobj 1143 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [347.348 691.671 359.303 701.857] /A << /S /GoTo /D (page.19) >> >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [364.503 679.715 376.458 689.902] /A << /S /GoTo /D (page.19) >> >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [366.924 667.76 378.879 677.947] /A << /S /GoTo /D (page.20) >> >> endobj 1146 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 643.85 392.02 654.037] /A << /S /GoTo /D (page.28) >> >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 619.94 392.02 630.126] /A << /S /GoTo /D (page.28) >> >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 596.029 392.02 606.216] /A << /S /GoTo /D (page.28) >> >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [383.492 583.357 395.447 594.261] /A << /S /GoTo /D (page.20) >> >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [387.397 571.402 399.352 582.306] /A << /S /GoTo /D (page.20) >> >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.167 559.447 402.122 570.35] /A << /S /GoTo /D (page.20) >> >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [396.403 548.209 408.359 558.395] /A << /S /GoTo /D (page.20) >> >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [363.039 536.253 374.994 546.44] /A << /S /GoTo /D (page.21) >> >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [365.251 524.298 377.206 534.485] /A << /S /GoTo /D (page.21) >> >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [385.714 511.626 397.669 522.53] /A << /S /GoTo /D (page.21) >> >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.848 499.671 393.803 510.575] /A << /S /GoTo /D (page.21) >> >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [389.22 488.433 401.175 498.619] /A << /S /GoTo /D (page.21) >> >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [387.955 475.76 399.91 486.664] /A << /S /GoTo /D (page.21) >> >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [386.839 463.805 398.795 474.709] /A << /S /GoTo /D (page.21) >> >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [400.129 451.85 412.085 462.754] /A << /S /GoTo /D (page.21) >> >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [360.14 440.612 372.095 450.799] /A << /S /GoTo /D (page.25) >> >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [438.206 428.657 450.162 438.844] /A << /S /GoTo /D (page.28) >> >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [432.548 416.702 444.503 426.888] /A << /S /GoTo /D (page.28) >> >> endobj 1164 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [408.747 404.747 420.703 414.933] /A << /S /GoTo /D (page.28) >> >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [498.919 392.791 510.874 402.978] /A << /S /GoTo /D (page.29) >> >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.441 380.836 422.396 391.023] /A << /S /GoTo /D (page.29) >> >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [381.848 368.881 393.803 379.068] /A << /S /GoTo /D (page.32) >> >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [389.031 356.926 400.987 367.113] /A << /S /GoTo /D (page.33) >> >> endobj 1169 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [403.975 344.971 415.93 355.157] /A << /S /GoTo /D (page.33) >> >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [375.751 333.016 387.706 343.202] /A << /S /GoTo /D (page.34) >> >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [421.529 321.06 433.484 331.247] /A << /S /GoTo /D (page.34) >> >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [419.875 309.105 431.83 319.292] /A << /S /GoTo /D (page.34) >> >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.733 296.433 392.688 307.337] /A << /S /GoTo /D (page.35) >> >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [443.995 285.195 455.95 295.382] /A << /S /GoTo /D (page.28) >> >> endobj 1175 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [395.288 273.24 407.243 283.426] /A << /S /GoTo /D (page.22) >> >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [393.624 261.285 405.579 271.471] /A << /S /GoTo /D (page.22) >> >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [383.522 248.612 395.477 259.516] /A << /S /GoTo /D (page.22) >> >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [419.208 236.657 431.163 247.561] /A << /S /GoTo /D (page.22) >> >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [413.41 224.702 425.365 235.606] /A << /S /GoTo /D (page.22) >> >> endobj 1180 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [374.107 212.747 386.062 223.651] /A << /S /GoTo /D (page.23) >> >> endobj 1181 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [409.793 200.791 421.748 211.695] /A << /S /GoTo /D (page.23) >> >> endobj 1182 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [423.92 188.836 435.875 199.74] /A << /S /GoTo /D (page.23) >> >> endobj 1183 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [442.5 176.881 454.456 187.785] /A << /S /GoTo /D (page.23) >> >> endobj 1184 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [388.643 164.926 400.598 175.83] /A << /S /GoTo /D (page.23) >> >> endobj 1185 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [422.396 152.971 434.351 163.875] /A << /S /GoTo /D (page.23) >> >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [404.702 141.733 416.658 151.92] /A << /S /GoTo /D (page.23) >> >> endobj 1187 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 117.823 392.02 128.009] /A << /S /GoTo /D (page.29) >> >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [390.137 105.15 402.092 116.054] /A << /S /GoTo /D (page.23) >> >> endobj 1189 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [387.397 93.195 399.352 104.099] /A << /S /GoTo /D (page.24) >> >> endobj 1194 0 obj << /D [1192 0 R /XYZ 89 770.89 null] >> endobj 1191 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1241 0 obj << /Length 867 /Filter /FlateDecode >> stream xÚÝmo˘@Çßó)ö%$Wnw—(´ÇŧšÜ]Ż!‹%ôZ{źţ±V©Ř*&—!ŔÎď?łĂ̲L7LÇb>_c ^‘°,(ČâEŚ€ĺ;ÖhúwîŢú ZHࡠÓq«‚’_et‹ůÍ z´,ĘĽ,ŔŤ»{­ř8™®Śopw…EČâÖú~ WńŠ(n, ł´óśmč ¶̩*ׂlWtí§`V«ýUÔ¶–ЇÇ%±k‡Á$Ä? Ô@mę±Ű g ˛ËßĹpm.ýÍĽÓ…Úŕ’ö‚‰űłSEűř~ě;}nŐĆŇH'6u|Ä!‘u'ş”óM Ňą5 ç$>™ëbS›¨]Řśp˛™Ż‡fđ‡,*ŃĄZĐÉ|Ť,ÜpTç_Ă9,˛>I ŹÄiđ BL’ )YTNůY±MĹľ<ń4•R’ôeŹäńĚ“ž„uDôIęhNę*ńuJ­;‹ćö<™ĺł’ĆčR‰nqmH_wµŮ)IÇÄżp@bźÎrl^ŞÍ4ÉÜôŐçyŘ ąś‰Ţ,ś<›Y’̲ŘëżŐsĎ”^âž'ë´ÝŢ\ 5ć­P#ˇóÜ|ę–iŘZ´ě=†tRČ‚–©¦ŕÓŢOz$ž¦Íż _ÔÖÓíö‡š>Ţ·Ź‰oAH‚ŔK¸őľ…x{ź&i[“1°ŐA×čőĆś$˛?l-7­r!ÖâžnÂ$}hÉR©¦l3WÉ"{«Ă:R¤łJéëwGmęÖí¨ŃČ1m×AVÔé\9ĽŁcžĄÝ'ŽI¸¨ś“âWé*†#g©Ćîę;¸xŮw Ď?Â3ż‚/žËůöf Úů}pµč;· ŕ›{%“Ôýş6[5Jęl­ĚĄ.Ź_{rµ/?Ę»2˙M_v‡ę8tz9-‡·ÖşjۦńS7­‹9ĽcX¦5ÖŐţZFą8ŤşşKo–Wč§ŘĽĺî:§şX}hťó*,tÍ;µâŰá±íâü*Şcrz5ĺ<]Ľ|‡T~źZÇËńő®s[ŕŹÝtţ Ňßs endstream endobj 1240 0 obj << /Type /Page /Contents 1241 0 R /Resources 1239 0 R /MediaBox [0 0 595.276 841.89] /Parent 1107 0 R /Annots [ 1190 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R ] >> endobj 1190 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [173.686 726.819 185.641 737.723] /A << /S /GoTo /D (page.24) >> >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [169.262 714.864 181.217 725.768] /A << /S /GoTo /D (page.24) >> >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 691.671 175.539 701.857] /A << /S /GoTo /D (page.29) >> >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 667.76 175.539 677.947] /A << /S /GoTo /D (page.32) >> >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 643.85 175.539 654.037] /A << /S /GoTo /D (page.33) >> >> endobj 1199 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 619.94 175.539 630.126] /A << /S /GoTo /D (page.33) >> >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 596.029 175.539 606.216] /A << /S /GoTo /D (page.34) >> >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 572.119 175.539 582.306] /A << /S /GoTo /D (page.34) >> >> endobj 1202 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 548.209 175.539 558.395] /A << /S /GoTo /D (page.34) >> >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.584 524.298 175.539 534.485] /A << /S /GoTo /D (page.35) >> >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.308 490.425 206.263 500.612] /A << /S /GoTo /D (page.19) >> >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.308 466.515 206.263 476.702] /A << /S /GoTo /D (page.19) >> >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.308 442.605 206.263 452.791] /A << /S /GoTo /D (page.19) >> >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [194.308 418.694 206.263 428.881] /A << /S /GoTo /D (page.19) >> >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 384.821 210.687 395.008] /A << /S /GoTo /D (page.22) >> >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 360.911 210.687 371.098] /A << /S /GoTo /D (page.22) >> >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 337.001 210.687 347.187] /A << /S /GoTo /D (page.22) >> >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [199.847 313.09 211.803 323.277] /A << /S /GoTo /D (page.21) >> >> endobj 1212 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [199.847 289.18 211.803 299.367] /A << /S /GoTo /D (page.21) >> >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 255.307 210.687 265.494] /A << /S /GoTo /D (page.22) >> >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 231.397 210.687 241.583] /A << /S /GoTo /D (page.23) >> >> endobj 1215 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 207.486 210.687 217.673] /A << /S /GoTo /D (page.23) >> >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [199.847 173.613 211.803 183.8] /A << /S /GoTo /D (page.21) >> >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [198.731 149.703 210.687 159.89] /A << /S /GoTo /D (page.23) >> >> endobj 1218 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [199.847 115.83 211.803 126.017] /A << /S /GoTo /D (page.21) >> >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 727.536 392.02 737.723] /A << /S /GoTo /D (page.28) >> >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 693.663 392.02 703.85] /A << /S /GoTo /D (page.28) >> >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 669.753 392.02 679.939] /A << /S /GoTo /D (page.28) >> >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 645.843 392.02 656.029] /A << /S /GoTo /D (page.28) >> >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.329 621.932 428.284 632.119] /A << /S /GoTo /D (page.21) >> >> endobj 1224 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.329 598.022 428.284 608.208] /A << /S /GoTo /D (page.21) >> >> endobj 1225 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.329 564.149 428.284 574.336] /A << /S /GoTo /D (page.21) >> >> endobj 1226 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [416.329 540.239 428.284 550.425] /A << /S /GoTo /D (page.21) >> >> endobj 1227 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [403.417 505.648 415.373 516.552] /A << /S /GoTo /D (page.20) >> >> endobj 1228 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.062 493.693 422.018 504.597] /A << /S /GoTo /D (page.24) >> >> endobj 1229 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.79 470.5 422.745 480.687] /A << /S /GoTo /D (page.20) >> >> endobj 1230 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [403.417 445.872 415.373 456.776] /A << /S /GoTo /D (page.20) >> >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.062 433.917 422.018 444.821] /A << /S /GoTo /D (page.24) >> >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [410.062 410.007 422.018 420.911] /A << /S /GoTo /D (page.24) >> >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 376.851 392.02 387.038] /A << /S /GoTo /D (page.28) >> >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [380.065 352.941 392.02 363.128] /A << /S /GoTo /D (page.28) >> >> endobj 1235 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [415.213 319.068 427.168 329.255] /A << /S /GoTo /D (page.23) >> >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [415.213 295.158 427.168 305.344] /A << /S /GoTo /D (page.23) >> >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [415.213 271.247 427.168 281.434] /A << /S /GoTo /D (page.23) >> >> endobj 1238 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [415.213 237.374 427.168 247.561] /A << /S /GoTo /D (page.23) >> >> endobj 1242 0 obj << /D [1240 0 R /XYZ 89 770.89 null] >> endobj 1239 0 obj << /Font << /F22 400 0 R /F23 401 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1244 0 obj [250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500] endobj 1245 0 obj [250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj 1246 0 obj [769.8] endobj 1247 0 obj [500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8] endobj 1248 0 obj [500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] endobj 1249 0 obj [277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.3 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4] endobj 1250 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 1251 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760 276 500 564 333 760 333 400 564 300 300 333 500 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444] endobj 1252 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 0 0 0 333 500 500 1000 500 500 333 1000 556 333 1000 0 0 0 0 0 0 500 500 350 500] endobj 1253 0 obj << /Length1 1629 /Length2 9022 /Length3 0 /Length 10089 /Filter /FlateDecode >> stream xÚŤwT”m×.R"Ý5¤4Cww×P’ 0Ô3Ň ’Ň]’*Ý ’"!- RŇ%ůă›˙÷ťłÖ9kÖšy®ť÷ŢűÚ÷z†‰N[ŹSĆfQ„ą 8y¸€˘9  äăy±@P„äo9“Ä…ąţ/ 9wń “# 5`.ŐN>Ź (Ź(ŕEţ6„ą‹äÁP€@ćc1ÉÁ\˝Ýˇvö‡<?X¬Y<""B¸dś!îPk° @ڰ‡8?d´;ô`ÖPÂű?B°Ű#®˘ÜÜžžž\`g8ĚÝN’•ŕ EŘt!p»Äđ»d€&ŘňWi\XL=ţ§Bf‹đ»C'¨5ÄţŕňÂĹâxČĐSQhąB\ţ4V˙Ó€đWs<\<˙„űËűw ¨ËÎ`kkł+ŘĹęb°…:AZŠę\/ěbóŰě‡=ř=ŔP'°ŐÁGetŕ‡ ˙ŞníuEŔąŕP§ß5r˙óĐf9ł3ÄÇú}>y¨;ÄúˇďŢÜ ×Ńćéâű7˛…şŘŘţ.Ăć…+·ľ ÔíDEţ/›Öż2; â@Ü/k{îß @Ţ®?”<żĹ5řűşÂ\¶e@üˇ¶‡,_8Ř@¸ż€řűţoĹ",€ Ô°‚ŘA]°ţŤţ †Řţ‰ćďőčÇţţüódöŔ0‹“÷żćŚ[FEWS^›ýŻ’˙QĘĘÂĽľś|ĽN^ €Č/ zxđ˙Ď8˙tŕďę˙jˇťîETq±…~§ř]ĹCűţ®Äă/j°üµ7¬€˙Lˇ { 4Ŕň/˙M@ë‡/ž˙ď-řĂĺ˙FţßQţźü˙ď)ľprúCĎň§Á˙ˇ;CťĽ˙˛x ô ÄĂrhŔVÄĺżM !n´ÄúÂůżµ*đÒȸŘ=ť“‡ź Č˙§ W„zAl´ˇkű?Éô÷4r8A] Ú08ô÷Ĺóŕţ—îa÷¬.řĂĚţTá‹řcĽż1äaŐţó .Ö0›ß;É+ »»˝±(ń€ľ<Ëkńúón.âÁđPł?ŔćŽő{Đ‚4ű-ú ¸e˙E"n…Ŕ­ř/âp«ü‹„Ü˙"a·ć?HřÁOű_Ä ŕÖý=DŃűń¸A˙f°´ű}÷> čŮC,§ßíů[ đĘő\0›mxÜp'0ÜţÉ4Ëú…»űC7˙`ůC'˙ĆÜfÄkvf-ęPÚvY-CéÉą1"Žv~iÄË9RdŽčU·XMÔËÉžS{§8ŰĂŁhîС)ëv™»4sâ»^G[ďÍÎI«¸eGkőzúţüŃd’ďý4n3RaŞ,Ťh©{/’6u4^'¦”Ť]Ż®ßłÚîoIžĚDeŠBŞamšíťŐeŮę$T"{ßu-V  S˛gyßťăCÖbL_ĄifŇ«‰·˙ÂJô¬Â[éXŔďˇîŠRőŢ8d Gŕ+ PÉó?®2Xxóô&ŻÔc7“Ŕ×J‰Pzצ÷ý2kęe­ć±ýúń®Kr§˝e˛m ĎžĎ/j|×"Ůt÷üÂÍ(›ůÜZ”¦~ɤ ¸AwTůÓRĹwjGŐ05ďąÉ›ji*&Ł}ˇ,‰wĺë{ţ Lc=lĂ‘[źU§âŻ+°“dłîřۆĽéctĘY8g ›4ä5N·oI–,„¶áóńáx@Ó+őźr7üč\l|îëĂ÷椽]–yέ*Ú%– ĆgĄnÁ/ł¨ŕꀇűs˝uFMŚśŹ§óęą_•ת™zż3¬ŘżÂ§ÍYŕçĘ ~\ L@›űv§#*4–Ś«ő}ĹüZOäM9ňk¤2Íü÷W§A$Ă}°6$>,ʞ «]źŰ]äL€&–k˝Ú;mb1ń;Áţ7˝ŘČ’ł÷G’­iZŞüÎ2Ŕˇ[]ľĆé6˘ßvö7$­ë"ř«aĐŁÉëZҸöţś„ó,q8ÁD:!ۉń1m2+§-yѬ5”“?ź´•Iap‰Ľý‘˝{ĘgGIq’-ń”֤݂öŢęfA|(KeP´|Őüĺqă±!=íOräőĆś¬O+ŕămŘsE¸VkhrÓ ďq‹gŚć‡Š eÉ3y˙łCŚůś„^ă”§m?ëkxžW†Ř•=Eďŕ±joÉV}öłl·Ź-µzÉÚĺir`m tH>¬5Bňľ´Ă"L·'×k {ĂŚöŇźŔőŽs|ÇvÚľž¶ŔęĄtâ÷1Ř>ŮrŃ=Yé ¶…HWŐ±!űřĄ&¤BąšD†Xăú3˛dĂőâ–á|ŁńńŽůć1V‰™‡>_Z0ŔŘ_Âř-dŃ×vŃ®űF®xŘÇćđ'áî6ÔňşÂ˛ĺŻłßżBi÷’´ťQ®»2ˇ5)św9dęDpł_cŻŻ“ě2Óńť„×}Ś]kOó˛r”é .‚léĹlřß‚ŠqgD9Ö®<¬Őâ٦ĹŘ}F‰ĹTřŕ8H‹t&–={%Án}V‚<±*W-#jxĚaRŻS ‘;¶-Ťâ‡j7qŚŽÍNçKL§ÎŚfx"kś=!ů¤Ž`ő//)~ĄFµy|żRąäżŠ›ĘUśóµ}jłE˙ţ3żÂ÷•úř.sdg'Ö QŽČÚ`ÉĘŐĹ~ò¤TáÜz=(˙Űl_×3sbU+‚& Ňr€Ĺ}ŚůŞu‹šŞ‹ŚÄűúgóS˙ĐüÄćśŃ›VzˇŔc7DčŠí•'ÁćX2ku¸0Şžî„QŠ7)x6Ľž×!EËĽm5¤Ź©óIĽ~NkŘŠŻäd,w~yŐ[9gŘňp„©ÜżŔužÔ懯= żdAÔcsOů’CiΩÍÓ”0ÔĆxĚ|EşŁA Ăő ”OŚŞ6H¶·E†r}MÓzöeŚľBÍz{Ó ëTňćó 6&QÄFEŘüůË•wQŕ,+!:c†ţ¸$°60G@‡÷9ź(YN倸±Ň/Ď彵 y5Š ‹…»ýĺ+DM``Čâ;ÍÝp^3k(xőś˙ä^â€zŘ=ă‡÷|•˝9[—˛ÚlŤźéé7ăWž„ »…|l =Qţ\ďŠEJH«óčÁmőřO!ĆŰ™ţŻQßňú«…÷- ŞIF>Ä<žâ.ě řň xě(›Ůwç´/陸d´#ţ]Ů8¶şŐËŕ#ˇŕş"'c}–KŹŁĽŽ®B¬®˙é¶CQsOŽ#öş&ů9Ĺ:˙ŻŚÓĺş…{¶,K»ńťw5µ,%?ÄľUëŕčӆʹZm K‹]vË!‰@¶™MX˘±ŢÜ„ýzý«Dj„,Ö)ęgz[«ĹieŘcüq[- ĂĄŻČkeye/~/bą+™«Ξ|/űŐ0ő 3¨†sYÝŘŕů;«=~Ł\“!ŕ‹!I…IÇÚŔZ:ŁŢNő×퍗ý úiŐçYkŤ§+2Ő€ËřťwVDżŻďţ&ş ăŁń3ŁT™e¬oRú´-jV2§P$+MéóH7„sq‹ ‹őŹ©<ÚUôIf,iÔ˙Ć­†Śâ4c+čĺ¶’OŤéŤUëé_¬¬Ě]ÇĆt5o•âTuc\ă óúÚčPąźćUX«÷1ĹÔ»Ő…TŞ5×`+Xµ‘ść:;íĄ#8,ß„ÄgaČ6˝& mĆV…mŃÄ–\Y€„o‚•©íčm%^’Ű»ĘF-´SÎçt1ä4ą»ŞÝXʬTî:篨uÎ _‚ȬÔýą%G öČ.$t<ßhÝ ‘ÜD2PЦĚpĽŃ· Q×–Jhč$Ő”«ÜÔÓ8ź‚LáĚI¦<Ĺď˝Üx˛qÄÇ6ăŔ`Řť#ż#ĽÍx<áwśKפµ<8Ő|G±=§ž$fńËF'UU…±±5µŰx€ĺ‰ł®ŰáEˇŞ Yb€í4ŠGę{Áşď¤äÓ˘čż&ŘßŰÂě$ď,=ÎFrýD$ňz^ˇąŘPËŽs.uş+·ZyŰu“ě)Xť†ĂÔ§čö÷řM¨‚šoĎ«žˇPMŠúí¸€·ˇšźOŕřÉZÚˇß\#âq‘¬ÍvDĄĎ,ß\'hZ5 mÓ¤¶˝ánŠĎňÖ#˙ÎŐĹ=D˙‰†á»¬s®„Ćś­ŚôíęŠZ^źś©Ł„Đb¤,q=AOSϢĺ«ĚÍ(¤ĽV$•]’1j Öśç'“<…§zśb}k˝aąUéč`XŻ^ż—şüp‡LzTăËŰ^Í꯺őčźŮ¶}^›Ľň,©ÁC.ůµsÓŮóĐ…ŘwŁcocŕ8Ýłm±!߯¸Ü—0ŞQhNLŢr˘”ß6íť=Ý ) ňůşď^‰†»ł2ÎX,ű[™;ęőŃfY’3ŔôŇ s eîřĎ A Ü2+ń4Ĺ/ł5‰Ą†„?oą”eűP¶ö–ß±íCKn_Şcńęéő5šJçčEé%‹"™g›3ťĎ[': 08u!Γň&(±ť±®_+_aŁ-$ÉÜ ;ËřĚžýČFµiף_Ď CK,kw]n;O#n&—S*y¤ů5Ż:®gŮO  öx_ŻSfůb˛ßŇr˝ÝA”™éy]|ŕýť~ Ű• Ąé·“FŮÍŐ¤ąńÁť íFW‡ŠŔÎľmĎnD;´l ZY¤ún2·éfđQż¸÷Ë!|˸5Ç!Ě˙ –é'„˛ÜÎăÁ_4ÜXň«€ľPHĎÚ“ ”rń‚*ĘöťŃ[żO\ľiÖŐN—Ŕ¸ÂH–R’ą—réěűĂTÍTłĎ›ď\ĚGxŕRÜzF…w‰ŠĘ±ÎH¬Ë¤KE|hĺeÝ h–#ÉË‘îV.C4Pdű‡ĹçÇő1é?Ë?á|Q’č1o˙m‡Ő±*«Š)l5‘p) 7'˝ôRşçJÇŔÝ%ÓşĎ|˝ďPµ¦HZhűŠĂÁ>ˇĐťŻľ‚Ű&×}3u´väŐ°oľÄÚ\F ěR؉°:ć«t;éfż5"ÜU)Ěę›LGu˙h:ßř)řóý÷k]ĚŇ#qµŐ݆ÔUjot˛˛*ŰvJn„˝ćít‹!Úąkřä‰#ú›‘™|Z<–Y3Ťuň|\L<˘ó…×ćAcSZ)5N‹Ł_˝%¨NËĚ}b‚Č}X˙\~qÔ‹rŤ˙(sl_ęÇűi‰¦:śtçÝÖ2¤¤`?ÉĽ%E($\©¤´LÉY“‰¦K‡™J«'Aifşě=\źŽŞgl]úbáś caI° «ď‹ëUM7y“Ű%ßď©yąńuŻ|¶@”RWdmżţę7f8Ă ,’ŘTH®jMć:ŕ5_qŻ+ÍcˇV–,‡lÍi-ÖMŠU]|ëź)őw6ĚŢćs¸ĂGŠ•JĎ»Zř"C=Ń´)ŔUm7ë§Sć­ űX+ĺÔQ_kMD°~‡¤]|qJÁ(śßáDđÄ}ă¦ŕîO°OIZ¸uĽćŢđ]FßK†eŤä†Ć÷ˇ¬í +1áżriűĽŰפq$:‘rĺrű‰ŃZ/p—R€î]bn+0%ęűśt]jcŔş<ć°Ř“—Çő÷'pTę<óťj ;ąĂ7 őA‹Rż¶vg|‹ĹZ%µą<üUNŞzĹŤ¸Áî>Ů”{+¤d×’ţë3Ą(î/Y ĆłÇGý»dŚYlM‚ gWöî¸gt!´r±­/OÇ {ąĘl.”î€ é«#HEKŇ<ëŤĹ±^Đę(wnO†š«Ţ'WŕM»ţ°+Ň|äém¶Ćuk"Řň†Ž2­ńä3j†(±-ÄŽ“KśY9;üÔLĄĄŤhŠeż2Čź\.ţ¬Ąx„"Ł•ÇR˙l[ĂIJpí:"?ŻLĎËŚ–Îé…­vPýĘj픏Nâ…‰ÎvrË®Ľ¸XťCuĎ`ÓŐň¬ĘĆ/^8ő›Ćĺk™z»pĄ¤aM˝ţ(ë>ŢÉ›Öw®đĹ5ˇ)ą8s9ŮüŐč­j"‰E÷×c–©ÇDŮNn,Ľf‹šĘµ­d`őžTé¸+OęŶylúńS"b|Kí˝{Z µĹ{)…_›j”YYĚuě'Ż ÝMy1Mfb¸˝¦]ůÚ‘vżë”»… 5°![ć»Ţ^Č`W$é ÷ő÷Â^łąÂźPýÂQ(>wr,µ’vŃa?ÓMqÉM|Ĺë=^E:ŰčOóaKmű›š(„á˝0ĹjLnŠ«‚h»ç`N5vR^wy·„ĘŮö«RŐ~ËĂĎÉF¬ş^K‰ŰŻQzĽ0ƸćěË0Zĺ•ÉwňfČÖ ]-$ŞĹOÖ›‚ŠEÝPIúě˝ŐëďĹÄŤďóľ†ÝtűżoZĆśÄ'<q»wÜ–ĐVČôXí´őÖ_Ż;•39ůś3ÁđIňÚršüj¦Ť‹Ç›R Gş.ă)ô;«Ž ‹y§‰ŇzůW~ŞŘ¬÷§Ę¦¨”čDţÉăúRňâ¬_RĚŠ˛n‹öS>&–_ÚVúÚŹß•„†Ô” bÜRŃ8_őŽFĘ&áçÖ ö«nę`Č“°¤čCCFK@ŕŽ;Ň@ßlˇ‹[ýJÉÎky„µ–GÉN#&“…Ş4˙ňĄŹ0žž»+sx-ă+Çłőaé5چ’ôh°F`ä§TR"†ÁZßuú©UŐwš ě'őá±`Ú`¤ßčÄN» ë˛Ű× <ĹfŞVrˇ„Wmqk/Zôη‹Í^‰ű$Ľ[ö´Şq-‘Ťp˙!˛SěUos\ /‹®÷úhâ;— µ0"dçÖ„ĄÂ¤BlČŁ}EJ 2‰;ő–OžíxělXbÁh ľOőódĹW±\Á­č†‚Á~ŕ>řGN.Ő+=߀Ś4ó¦·ôÇź$ß'‚ąŃŃĂ;SaÜçń1 l/씓3ö!6ˇĆĺQ‹KńS2¸V`KčQÝĽă”@šŤü*U9®&ÄĆŃĐUhĂÍ[w\ĽźfŐ [â”3Ű#őFi”ČżÚ¸eßÇ:cň´j”“Š|äl0˝ĚR®ž™şfhýöŃťűw n3Ź"Č_Á쨍Ż`ąTʉŠYŁŮ;¶ĐX®(Óę×ZsI,;¦Ś'±Z!ÖĹGUEB6fˇ‚ŕ:µ“ˇ{„8:˙ÝĄĆ …(2#ŕYşGőµ”Ž7–ĂJŘ×ܢŐä—]Řé~śŐÖęx¨ˇ§ő TüĽ}ź€||äě{Jő+ŠpˇÉâ %öçť_ňdcj–Ł:v$š1؇‚@Bď…^FĽfH_éëpJů$LKÜH[Űű±Ů^őş©¤+źę ‹Cě˝Ő‰„"†’Ăz< HĐ tj:¨®†‹´z"•÷óŚ'_вŃĆ+’‡§q–uĎ×ýÂé(^x_gSŽ‚§đ2ézą›(řz_iŃĺKő.)`ý"çÔÚśžĄÜ¤`!7(ł¤TÜŞŰŐQŰ´4^ŤjY†SŤňsiy1z%zýŔ?Š»4j&Ď/˙b'¬¦Dd±¬Ł š†ťú”†}Šöٶ±٦©ŐµuÜLP=Ľ…»E€ĘŰíÝçvŽŐ“E ŤŁzÚ2kvďŠÔm$c^E «=Αľć›2Ý×Ó.($yf‡ş]˛Śˇ/µÄş>©kĹ4v=‹i Lß’ŚÄYëé`MÇÔJÄz˙¶ßČS`›ţËŞźcF „ś‘›lIő}»vóJM˙YW.Pă Ć`ď:Úfę9ŢxÄ©›Ď"YĚ6r…9^¶7Ŕ+iß¶uĐę§Â%đ˘ËRG»đb:ŐňčmšŽNă6ËÍă ţ$˛”:óŇĄĐ`"Ťĺ*X$5†€›ĄÔ°®˘FÎJwŕÝÔÝZÜŽk§íÜ2˛ ĘR»@®MyQKÂOµž]u,ďf7ĚzŮÎFĆnégä‘‚Űt†»+X#ŻŻűTZ/9®U@]ڱw#ŢYłűIŹ”S]ˇ-›÷ÖöąfdNĚóËŠÝ‹˘-źđ´Š¶˘0čäEˢń‘ÂX‘ÉÖ˛4Ľ’núé-ÔÓ®¤¨>ٰ]‰FLxÍ„ĽXöZů]±+µ…Űب¸P=¨sá_¬ÄĎâęĚÔuÂl—Ťj?SfŘ›¤%!\śs°wń[wrä•丨©}Nx}c¦äşěÄŚݰTůâŚ9»đeŚ;ď _;ů[`ÚČ'?ä5]ܷ؆Î+}ň+í/Cf/M‚Kz™#:ď7'oܸ*Ł/©;żGöŚďö;%xńťrŢ=9gR·ňˇ@·Ň󙨇‰ľžŇűčJ őôÓćŇşŽ&–ŁWd1CfĆk#<kúúî2ÍqšÄ¬ĺr¦łçµpÁ¤©fç0ź«UżBů´Őd‹ÎeAĺDěĹ•ű<öH>Ś<#·)H¶‹ĄOm4ęŮWj%´nĄ€·bgí?'‘Üf‡f6Đ»˛`vË °pŹňźdŃ%ŞF”hżÄűy štîÚË Ę#áTŮć! É-Îzâ…ĎŰđ'—xł™˛WBę™é{<ź˘ţ˘EüÔla.G%ßbE’ËÄ´T"škÔűńa˙ŢÔĐ kK°×|߉;íé]:”;\ÇŐFŽÁ9lŞHÄZEŁ˘úŽc”/ž“?ĆB߯Ôç"¬6K_]ĹÜhża“Öáś+ŢĺÉr čo­™Ó›ÚÍů ¨€ FSܰ#"0ÁŞccË-ÝĚöQÔ† úw´/[_ ŻŔѰÍ“^%đ§Fôb;ŘOxťsľăű.~í)Ą\2oĺ´ë’KffżA˝“żŃé9sÎg +ąüqZ†ě:óöşjĐÖř;zßĐŻäç"‡áŻi3°xp‡Ą]ÖâđkU™|ďŇPŃŻ†3Âý÷dż+-U¨ćŻifh« 'u^”ąż „Ń ˇâ4lx„gś^dNËPÇÝÔŘmUžäľč3xÚäÍöţĺłiR]y­¦¨Ę; •ÜH nl(ľ„řH;ĚŢ-/µ…g) čČtkdY¶kÚj†K˙Q´źąeĹD¶„÷ÔřU*żő7c”† y-«™n ă>ňx“p'®ĆvŢă‘ô©g‹¬¬'śXżWzŘÇŽŞS†-öGŃ|ř‰€bdŘ.WĘqčqą|űX…ąXŃ őV7pü±†aĹ.îôD‚ĆŽýią‘Ć`I1íçótj'.A‘Ű'ĎýqOŠ_V“»Ceu-:ľ®'ę6°‘’Ň}JęÜ Đ1 Ż)¬~_ x÷•‡^qŐ‡Vđ‰ÝbXči“’íůH^€Cŕ‚˘ď!#­^YŔ–†q$:µu «*ÁČůčîLđä÷­y“·5ţą"?"eF$9ÓbÖ|#"Ňž0rŞáěÝîÄ Ż§ybôPăżtř˝+çĎ–°ŠÍBŰ锑ăÂMčođ¨=iŇe٦•q·/M97“bˇ Ž!Ť§4ţ,n-j3m”Xi÷†ýmGkú8;(/âQÎP÷·ům—xŕ(YŰŐĄĺ…¶+ô1mtüăÝôć«ËCç`±O~{k]ßóI~`Iň€ YÉýŁÜŐá8ěě·ôőÇĆi‡(M_#Vžř#+»E–¶^‘J.úT  )µZK–©¤dď˝]ÓéČŇÚë…Ł–F¸«ŇŹš]=r۫ВŃ?fGU|3kf/:żÉ7—WĽ$8»ž«d+·|•s7S#Ţë?˛‚P8GKὩxyK]ŽĆWĘ?ŽR"úă2©ÇCt¨viž‚6ń(ř‰`™ÂnBJą¨Lˇť.vżŹuýË©OďËďą>ç=ŮätSVů¶<řţzďsK%şŞâcLsŐhRĂ´9Ç®irź¦ňŹĺUÚ|ť7wmŻŕą~a{GơĚLšđů&90yôĂë~źg˛tŠt`°Y&ĂřkŠýŢh~ŽšIě[š…¶Ç%ĽĎéÓîQä _Úâ]Á4ý ݸ&h…÷? «€z Ĺ}yąnExld ëôŹkI‚¸ôŁ©!xŠżöN§r‡Bż¸ŹĄ‡ű?ĄpŕnŁ?~Jô¶Ę6)śćU÷˙.w6|(ô|ć!ľŔ‚¸üîfË­]¶Pü˛5Ž*Ń” “U“/ Ffh9„]8m©IDmĘSÎia‘fE­<=Oě×ůJ˙ˇ0#őŤŢx+ŹFňčݙ󬍎A‚öíĹNĐlóVöşU7Ç [ŘźiÜG—,¬oŁţŽ5śŹéĂâ1fgVáKď!KŚ«lky"ÎÎ3»4ťë;ݬ熚˛“'…8łOŹË›žż%ůxFĹ2®Ę\¬pÇC7nŁp•mő+nIˇšP 45ťcŚRrCÓ%´9ă ©Âg ţÂŃ‚H ¤ĄKCâŹUŢŠve«sçťt†ż=Ţ7 §'cˇŽ*Ö>žÍNěű®Äúöö¨Ýô'¦#h ä'mÇö…@«}Ú¨!{Ką=ćŃpŹźˇ‡0ĺ÷ŽIPúŁ(tíŔţ˘Ć+Üz.68Ä^»žmwń™ĺ†Ü·¸»KË_Âe(:­‡9Ŕ†ű‰;Jw/Ö"ĐżŔÁŁ˘TB‰ć˝°I>şh˛c»”6ď…’á8*ją¶Pz¤±xű•3őĐGOýűÉîSráÉ%¬1dz{ˇqRn5îa`Ô­éĆxfĽ-ë Ń|ő}t§$(9)„Ťu1oWČaŘü2ţc¬v® ’žťřć´¸cĹL¤łDYm…˝”¤ěLUV_hX@IuťTČŠv—ŹJŘ™€ˇĄÜˇ!*âš&đšzL;M–ź,m3Ç=_+9>9ÚXč÷ÉKľś'…TÔĎđ‡îĐăDŮ’b+#fBęÓR)‚ءĆĺ™ęŔ·Łś·‡D ´D9’xF 4žu¸”3xřoÂy­´Ë)ć]ÔĹpO©śň‡Ťř—TĚü«éi‡ŢC‚Ű9©isÖl’ ´Ć ňĐšË\¶g›{]oG3Đ1™‘ń‡Ă ŰÔ˝˛nÝ >Ě<{2°Đ˛çn7]Dç2!ú1ø†!Ł_ł7B.Ćh@2oLrś~Ö$)(ĽQÍoöiŕ§ ß±”|o€pF`^ WÁI}"rś-Ű6ťtú˛zň"^~ĎV:XÄyq÷öÇi-ÚE_ľńĆľ™ücv-h"ÖŹĂ]ôŮ4쥼\ßi§+qĽĄň'Ş–xŤ~čG/Ož;Ö3?ăç\¤7L>ÇFeNS"╇~’*¬ÄôŘlü™qGŠ+ś^·ć«7ţ˝Ľš­üë ÁÔš KĐă.z\fŰwŐĘ]›‰Go«Ń9ő„ă÷ýŃ™q«uäp&ŁHжjH{opăcőíĄůǶצ¬ćbv§ö$02§®ý4ťp§ŮŢýč©l@e ®3!Ţ1Zś=Lľ‡Ďd$_cŽSý ·!)ř€ăMÍ€ELŻ˝¬Áţ=í®ź]WY=kWéŢŔČÍ/’óĽ~¤4`á\j‚˛óáT:/Q"{łj"˙Çą2ËF¤ZIĘĽ&±5qA§ąńÎ%ÁĹP»~ÚeŇáN“{¦CŚŮ˙śJŽ Kp¨Cý㱪ň×9¶^㌭ĹPVۧFëSÝ&f3f¸ř[¬©ĺ0;"–ĚŰ bçŻfÔn’Š]*ŻÍÔ 4®ZĐJ†˘ä{‰Šź“dÂ[[(#´‹öŠ˝ýpĎ{X»«1žÇüRP|9ÓĆ$Ć“ö¬ Y—ś]E­#›ŁŠrĄE[Ó†­©7¸ŃÉwřěő˘TôÎďÉâ˘ß7KPxeBTU^Ů9UšúzëšwĚÉęѲ'Ôö¨e(pc9“ ĄĘ~]D¸,źčS+†!«X€¦¤şćťĂ¦CĎűŤ^ltG§C°ęţQţ-›ü#±‰ěbDö`LW/ţáEń”Ú1ůlŃn'Ů˝ćdÇjňě(Şxe‰Ťô-%¶ý¸‚N$ö©Ńö›Kiâ.MůcŠžt¦Ë«üăZď1ËÁgőz ýĘZ(ŘŘós{)Źă2ś:űŃŘ5»NČF+ŢIĽĎ_š¬‰¤ăŞ™h+Š©BV"|}©ÍY(úŐĂg@!_‘Gü+eŠŤ endstream endobj 1254 0 obj << /Type /FontDescriptor /FontName /AIRNDP+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/A/B/E/F/I/M/N/P/R/S/T/greater/less/period/slash) /FontFile 1253 0 R >> endobj 1255 0 obj << /Length1 1542 /Length2 8229 /Length3 0 /Length 9262 /Filter /FlateDecode >> stream xÚŤ¶TZ6L’ŇH Ý0´„tw·Ŕ 3ÄĐ ")HJw¤”tIJ7Ň!]ßč˝ď}ă˙×úľ5kÍśóě8çŮűŮg 3˝¶·Ś-ܬ‡!¸ůx€b9 ]> ŕůq™ő!(řo‡ŮěęĂÄţĂAÎ B 1y駇Tݡ>ź°źŕE˙ĺwČ< ¶ €*vĂa–;{»BěČcţµ°Ů°řDEE¸ţ„dśŔ®  B8€ť'Ú€ =¸ ŚđţŻl„ł/ݧ§'ČÉŤîj/ÉÎđ„ ş`7°«Řđ›0@äţ‹3@ßâö®·Cx‚\Á$…Ř€anČw-Ř€< §˘ĐrĂţrV˙Ë đwm|<|˙¤ű;úw"ěO0ČĆîä ‚yC`ö; ĐRTçAx!¸ íoGÔ ŽŚy€ P5ŇáĎÍAEIđozn6®g„Źú›"ďď4Č*+ŔlĺŕNN` ç÷ýä!®`dŮ˝y˙ęě Üćű÷ĆłµűMÂÖÝ™×qq«Č˙í‚„pţŤŮ! ("*»Ŕ^6ĽżÓë{;˙ů~ĂHţľÎpg€’ŘbFţŕřş<Ŕ„«;Řß÷? ˙˝ĂáăŘBlk°=†óďěHl÷×Ů|WŔ ÔřűóĎę9R^¶pÔűßîúËkh"ݦlÂůăl˛˛p/€/· ŔÍ/đý™rá˙ßiţ)ŔżČ˙AµAż/÷U`vp€č_ĹűŹżeÁö÷ȰţűM8RË`ŰżĄoÚ żřţźŕOČ˙źîgůżI˙/¤č…ţ1łý±˙Ě 'Ôűo¤”ÝȱЀ#‡öż®FŕżFYl qwú_« „=ôź2BÜ!^`[mÂĆá/ ý« ČôP ¬ wü~lÜȆýŹ 9p6/ОWL`ä<ý÷‘ 0¸íďÁă€\]AŢ8ČÖ#wB_>ä„Ú‚˝ţHŔË#!$=€ÜçwG‘AĽQBÂa>$ââŽěÄż!Ż©÷~$wwýđ"ľ;xÝŔČ÷äD‰ uţĎy ÂÁü1@$â ˙wΧ^°ë_Ŕq¶qwuE>T‰,Čżö^0Ř l3;·uüÚ|ńQć‰'÷ŹágăĚ?ŚŢłsűÎş¶¸_=zřŽ˝2=xŮőLć]ášŰ©ôÝ­ďÎ皇Ť :M×~7–qşc?špfFÉ{FňvdŞ»i°©ąőĄ7ün]ü ^ Fý˘Ęśĺâţô‘vÉ…g—’WuwÉü`řÔťŤJa5Ü›’oÜŃoĚ 'ł­3&)0Ü4Xć^§găÄFîéTă8qüwŁň}MWřß^Nú,–éó»µQ2QšRĐ źޱřĘn%©>žö-Ę_č™ńú,‘O÷ź+y›g‹?­˘«ď¬ňśmĺ[Ďze}ŇC˛žPU\OjéĘ EVŮdE‚¨x¦Ůjµ“]l>3l·sL¦žýV}Ŕ7qŘ lh÷˝®qYěčá>OnĽčŻXk÷7*”ę–˘¶÷äăPp0‹\KŁIĆ(A ˇµUH ąć<Ţ=˝Á…IřÉ^Qń­ć¦O1:Q©÷…˛üŽŢú—×j¶®LMC=‰ź‡Ü‡kŢ[I><ĚŁtP°JgËNShť˝ĂŞ#ţ \;RÂ{¸RNÎ#_ěM§ż*4sÔË”/¨˘Ôůcş˘?Ň<ŘŰńR4—gß°Ü )V(W‡~}7Š{h«6¨O6$¬KôĚvkő¬´TÖ‚ě'Üđň°Üó•l˙Űďú"ˇŮŻ[u?´ąiĄ(ÉDˇśŻMvb[3îéËzĐ;ŐÇé?»Zj+¸ńä*Q‘gfÍźŐčVű)á7ű|F>ż“ňc 4ůëÓú@ţO-Zl(xé„‹o™Ó7ćŃ-[úë Źî¨dźčé_ä0ú¬ tNZŁ˙:¶Ćä -7/ěj ˝IA‡Ć±ĐOݦž,?c{ygٰdŕ)S3G]•6Ń^Ţí| Ëř°EH*9Ľ« Č+fM_RĎç$˝źJČt\őÉľ˘‹ixVáfţi‰ôT"¬ô™y› *Ó˛ĽÔ+měŃŤáwľy)eëŔzKź¤FR®C*™§3é§ÇpÔůQW™e¦ýZË`§cfŚełE……˛&1ÉJÚ÷)&éH—D[@!›>”[¬Š•hĺnTć‘*A%Ćl×'9ŐaUD K§Żf¬pcáhçhŰÎä”ňä“„“(ŢâGŠÓöž ŠB‰1žGzŻü*ďŕ:Ă›Ăɸ¸cV/ë$2hů€Ĺ~X)÷M?ťję/gŇ—ú—˛B—ËbŐÖ~ü&ŐOi%u"’´CŽk9…aö®őä©—¶„ ß$ÍÉ3ÄČ…2Ęľ¸pĘçW5wľźשr(TňeDů§±q˙3o Ú©»—6´ĚćË.捍‚Z‚ôfi–ç*Ť9Ş+oČz6l˘¨€Ë4ĄÇŞ—L€e1ľÂˉSćť4×.ý© ”ĎÎŃ3ôż™¨ń,¨Ql÷ł·s=VPó˝’3•UĘlÁˇĄńžg{©ĆŢÉŻ7L®VŃfb‚^˙Ľ*kŕNxĽbÖF±3ꏺčĄÂ˘Tśfág¶O´®ô‰8W¤Lár‡żÔ(ăď˘đYrŹOÉŠćHmâ(ŔďîŔ/»ý2\´,Ő•«–HnĂNńuäü»ůˇýD9‹TńÚŰ‘®_×0LýĎ–„Ťf¦,[Msą†´Ľá9­ł©é|#~/ş­§.ôę¶ß*ÖžŔw^®óňľé“}&]őëjŹßn’ ÷ądÚ»=ď dî*˙2ÖOćů}é;˙sxIç2 ÂňVJĹá+űV¶¬Óľ"ćc±ZľGX3I¶XĹ}ŢÂçÁmsKEü˘P uޱ'K1÷ÎřÇĘL%ź‹"ŃmŠg}¬ńël·Í*7šW5SľëZÄ€GďůĐŐ=l&ťČ0 µm,} »ŰN]ŇőF“áĺyĺN ÖĚŔŮ÷WV©;»˛–xíN;3 -ĚÚ üŮb´†2ěz˛ęĽ%äűB$%r™2ąËçPń ߯m¸lŚŤ3Ć0EĚx¬(”÷(ˇO}ugŕńDí]úŹŮÖ-ŤѬeîÔüถ$SăÉFDËwÔq-řŢë[÷ÂĄYU-ç D&–´ßN6oŠâ]bť€7-cĘš †Ćô¨R·éí˘şSŮ}ŁĎČĹLlbhÉe)C‡ŞdřÁڎlŚ‘,µ˙¦!{콾y%WöAĐRá.1yy~K“bt/zI‹vĎV‹ú±@Ż‹–fĂƆŻ÷žüŇÉŞÄ×׾?őÉşÄpĹ;ßÍQ…¸8$\5$¸“ņľ±â„úRaťuΧb-Ąí P)/k<Ć|( †Č,?~"í1-ĺŁĺ(YďŤ&®ŚŃŕěµv ÷],Ä*× ß24źÉnz5ţź¸B‹G+sÂŐüôiémČngxý‡gćĎV¤W®Ô/ôł­Żßǵ˝…˛Aí+Ú3欿•G/Ň7l•L&M~5˙~{ Ôá{üqđ% TtŐĹ0żˇp0ďfńb/ÇÍömě‘O\;ÖĂňÜÍ<±)jőLĘço‰K\q#ósJB<4ĺ[Ł4”DD™TÔ!w, 23öOľĂ ÂިŞŘ1ŠZµÇjŘ?v´‡ň´ŢĘČP x„',}ć°lÖ^ü®aťF1šýÂŇ– RÜQ’ĄňB°!łßܱ­3©:äpžövůČ(çO~@Ĺńć96ËňúĽşŕ“q//ÉŔs–á1ĚŐ›á·öLä´ Šóö5ÁTÔňźq»Rči_®—ŠsŠ8›çyzQ›¬*áX, )T -l%S°\řś¤T{ţýđg ­ ´ždlźĎjá©;ω;çţÚ,ĂŐ‰¤ř!W€OÍ3Ľ©r9Ë ˝řŢ-hŞŹ’ŘOŃkdb+y`ç]ëeč}Z;G4–ÁđśŃç%ErˇłÇq;~Mx\ĘŮLwŹ«¬čk&2X‰\ąßU˘ÄVšńĽč)Ęč ͉(µŹ¨YăâąmŰ Đ Ĺ+6LÜ™7š'‘¨â+ßómďĘ:®÷PăË o–9š#%z ˛ß­u“„’” »µJÔ*ĹŕË)X…ţĚqXiéďb&ÓIV̇k·t­Ž…0•Ķ0Ś 4źk‹N‹îšF»‰F ˛Z­•ÓâďşÎ]Ši&ćďöąŤźö&ÖÓIcÚ…ŕĄ[Đ-†±đ zC}p7&řŤH>y.†őěj‰Zßçţ`Đ*ř@20dÔɡHü|‘·ŔĘ»äŤNö«ţDsťwO9J úäGŃ[š€3[Ë\ «Ľp=fýjÍF5‘J,NÝ”©]3×ü´›>“Ón’=°sŐ 5^~ÔůŚI„öŐ/śaET…śÝ“»7‡ăj!m“ĘoX?ŐJ˘šęH¨Ě® s×ď“ŇŰĚŠŘEşXZo˛†axU”?MX'ćAuúťG¬Ć®Ë)Ľ0KŘ;tUőlr\,¶$iśO›Y_GSqĘk5i|Ők—ç-^¤Y/uŔ¶_’ďY©Wć>ÇšĺdŁ~îö˝yEě±z ľĽĐ¸‘#đ‹ď=S‰«“ĚýľŰ;ŇŽž“cé2:GJÓłâó·ÓCx©µ´oś÷.˝ś]”ďc,ŁÓşÝÚ ŕcs˝›ö{[&î1ółĘá‰4u ç/ $x~ź_¦Ő<ÝşâéďJŞă´îőń.ňˇűnůIÖ§b âCř/~)ʉf,L´í“ćÓéNcTP.ýSĘÉ<'ś¤ů {ĎYú‡8X"?±M¤˝őžż< ű€–R~ …ËNý,KŔ¦KĘđ ^nŐG*&ă-._í+,Ě^Ű]h{ *‡e‘ům?4ş©źW˘ť"%4!aý%4{rłqń]ŮśaĽÔ ó‚/i8eĎFHóB´ÄY’_DµIöö¤ÖŤ}?˛ÎžíW±™×#„¤YĹęÓˇ%·î† 1:]&Ńç¤,Ż®śĽ+Ř!µ”‘ý?;ÎŚŠ˘Ô»te-hteAĐ/;^Ő–YÓ&bź„4 +,oěĎ“D>$yŰTNPű$ čš×1/lĄ{6›ŢÉ*qGžĹ:°Żd}JÇř3¦ňrá&Á B%ŻĽ; o’gÖ„úHzFVęšDhůk¶ԅߪuł†ŃÄŕVLJ%E%KaX.‘[X†ÍŰ“Ć׾Ě$ď‰ʶ˘ý8şW¤&±t( îŞk_ «ŚkŔ‘LÜ‚~ŃqŽ §*Í go ŻË¸¬Í?捨GÉŠgńůTlń@µĘQz›Ô«´:D ¨4 >ÜH6Żă‚ö¶¸7ń…>ëçĂLBńL‰X—'°™u÷ T]Ž/Á¸ 4D•Śă7Ýĺň-?Hj=jÔ‡ONŹłŤ:W›Żó%-¸MŹW T5Icn ô”íhĽ– ‹¶ÜŻó×ÉYSHMŐčéÇŢ9?łŠTN*_1ý<^)čmŕ˙Ą»kłóW&©`Śţk’É»Ým”Kú T¬ “Eă(Ő·lň*viŻÓžÉÎŞ<¨‡Éw`<o$rx4h¦®îPbÂý#řĄžëť7H ˇm˘T<9*N+ú šúůâ±Ç&(äQaŇBń‹ËclT8éq’¸ť!őýňĘŽ9„knd®dÁ^ I8<’sŁS••Ů#/’+ć ]â,I•Ś›s©ŹÁ±ěvcëŠ>iVő˝őR9k*6(ŇzĘ,I÷ÍńűŔ0”§$AŠÁÔćk†U%Ý' rzoďć5±ŁqNŇLú\ŻCڤ`덻©×ßyíü–“Ňvľô®1('•o˛Úi¸Ť=ś 362¸őż9«­o0骍¶Ŕ śfvęĄWn=ŇRľÇęzKgyY%ľńiř8 nUµÁ#űѧ ç Ś8LłKćY夂„R$Bő(nišöľ~l?’N(§ČŔN•Őr“¦ČŘD†˙„ÂŤPk4ŘŽc0]Qę ç­¦Ga&ľŽóV~P4š «FVhÖmŔJýŹš›ěÓqíŽ]ßÄL…Ę÷φťA[¸A3;Z/Đ­2ę÷ÓÖś/®đĘźş{/0ą'-žĽsDZó·qéäj÷~I»ř|2ăęÉEŰî#®rÔVDűDLů8«U+¬kž­Â¬ô“FѰőÎe“\˛Ě}kĄ‹[IěŐ÷Ł.źĚ°4eSsć=Ź™6ZüQź5 ЕݞŃŢĚšú« uĎ(*ŚwV¤šťHUă/ČąÇBĎi kÓĘŇ ±Av#!·/tyvŇNo=X{ťxY‡ôÖ:ä›gˇŢ7t" ä9x&§SrŐĺÝN?k-ę*•Ü…,•Ň^ÔÎň\ xßLŕŢ­D®â¬ľ®â+‡˝˛Ľ–—ôwĆäܰ+±u`˘ą*ęF}.} qi5cńíł’Ú™¸P)fžgďNÓuW—™";™ŕe"{Y`ÇâzçqËŘÁî7bWÂź4ň§gb1Ńs¶´uóŃ 2"Ľî’X.RöŐFPI^ŁĂę¨ŮDˇű=–Ţ&…¨ZnöK_çFţđďđ"Ř80ŞĂxňáöö=ĆńČ÷Q%TĘ´Řç$ęÝq”dĂćÓ=:gnő1–ľÜkô5+I€UMs‡URÎţâ—~·©FŹŻM=ć7Ż9âɦnuľiZŰ…qÎ7·.…f°Łg °›}ĆNě·í‡@ëocÝkłĆR$:IŚŻĽJĘFŃ®8šŃúěĎůźwÄ )§ĺ¤M§Z´Źş¨áźŇß일Ä;ĎŹŹ‘ÜeďÉ;IQ†Ĺf˘5•Ë0üô•וŕĺGÜjt÷ţştűQxýBTĹřWĽ]nqúúęýČí5'Él±ÂnaaĎöwú¶ŃNŐy=‘Gms&´•XÔ[Žóř4,ßfe¶Tń8K7^}ůÜ„EliĚHK:˛K9X­k4ż’ĽźÎéżůĽ˛g(Ż:é—ÜŘhLŕ?V(çŮ÷¸GżO¦o ׎âí}n|˘¶ż8F$ĂxłÚŮ8ăpś~Vý#Ĺó+óMŞŰs‹‰t*t\ńě6żm]€ĽyW0ľ˛ű„đ˝N÷íč{Ö >kq/Ɔ·t'tzb%ŽÖD{óĚ Ő¸‡Ľ’ŮZ÷űé4®†KA”^Ď?~Ćl–d_=řĐ^ű<šq‰.o%4ŰĚU'äŇd)b%GšWię´«+O ýĄk“ŇŰ“žQKí ´FŤĄËŠűŃ9ϵó5­Cu<ýóŇI|eŇŮĹÁ-ÚK´Ťäś‚t0GÝČ=aěľźÎő‚-đÍNÚÔ>c.‰÷mńů—˘%®Ç¦{:ŻUřé›s“îIGb4Fź/2Ő’`ŕę|ÖŽ0ţµĂ݆N9%˛NjňË™a‹~ř•ŐZ [¸jJG!LdQ?hIĽ[ťVŮ­"žŘ÷ëŰţ@+ V«zĚóş÷+A·r´.ϤV”zyűCđwu•T şŰŽ1\ş=÷Ч€lXľ †íß÷˘¸Đ[źqPK[Đ…[űű™Ř[l_h Ľ(> ëg‚ÚuIĹlŞ4Ąâ ¦njĆâ’<ŢVéeĘ2UkGB•žüx™”ÝÔólhŽšŞ1Ľm˘) n ÝčMd`ď—Ý"«°†¤Š5⯚ˇ-‚˛ăv¨­‹ ¸LU3Ââ$Ľb ůÄÔXFîSM}ÚU—˛wý _8¬Í–iT®Ş+5CŁŐg-đ˘ÍŽ7GUOŹo ŇEü—˘î^3ř„M)ăçQe`˘ďě`ÇÓ=iRÔˇă˝m'¦0·÷|/ ynZť‰µzęnIb. 1.şŐŘĄŮ_ug@;Ź˙Ä'\·§S2úaĚe¨w3ČăÖ˛KŽŤ:ďŹńĺO˛j~]fµŕ=6ÝăĎ[IúéŁë×Ô•4lfRdF ź}í* U,oŮ_»Äpâ|ŕxë÷ő­ćrŹš^hlłĄlč\~;€h8l+˛H-&ŮHĎ÷€ěËr‰´j×"Ĺ/XýSµŽµö"doŢöŐL|TŤ^,ů`üN»ßŢ ŘKě˘ÉÓ˝Ń?Řa·ńÚPąŔFĄČ-Ń}ĘţĐmúYý;ŔAodą§đSŔídZJÖŻc+ĺÖ VŻźrðřhKĚŁm¬&<ô{y|9 ŹńSY¨Đ¸FŽß,8¤ ę QŇ+¸Ź-ă8ßʬvP Űs.ë"ěw€‚Ţ’îô>/eiUżÝ]×^¨'Ú,JW<ĘÇgŰŢČ‘‘\‘şÜ§–MČ’đ .Ć™(Pę7°*ěHm~ńnŹ'ŽŮLź—XWZYĹŔăeÎ/ť]H߯íúĄ]Ş%­í;Îőë×/Ś|›şźô ůńz#„é<Ô\ÓuąşĎčăş^č:Ą¬H~đ^Ť­P‡UŢi˛ß]_'c˘=ŔŚşĆľ†ŇČřy™'Ĺđ‡}ßëQzĐ‚Q,bw[ÇA·‹…ügMŤU‡@ś)dŢ´{<˘^şeĺţ|}Ű$ŢŚ—R[ěoőUżGzaŃďycĹ»ű$,ç˝ÍŽňq‘1jÝĹi`úSµ2 z îšîŤAô±ąďŮ‚cÝXkŘZŇjŐĚŞśy b4r#GX!í-á¶ĂďÚÂ^ü.Ż/l®‰Ĺ«mB{Čxţ~Č)ÝE\’qeޡ#M?2‰ťouDŔIĘŢd)’b ]"5§FÜŔZť°ęôĘ.ëzżuăvNÓR‹^î_®°pR)čr?Ż3R°čzę­PĆxŮçAÚ4NŚľ SZŚtü˝ /z%TˇWZb{?íľŮľ¤¨RŮ{´ ”íqýŘăČgóş;],@F_e ¨ń,=®źE›óTý+›ôŐm\ăÜdʢo‡€&‰š¬q6“÷l¶ÍCĹih9ŰD2ÂëË,~I`ěćÔ €ŞM­ç<†u¤Á~ćŞUUšví¬ĘʩÒ5ĺBŤŁDÂ\ŰöîÚ§‹˛UŘ iĹV7řź8onŔÎH›»Ôw@s”ŐŐa©ÁíTŢ}'!Ú\3źl"úଶůcÝ;›z—©ŮZLĽÓĄpVĐ™HvÂm~ô$?‡±ßťö÷·đ ”°›®ą0x¨´FĆw™Ń: ̰iUŞb˝ëLźP¬]0č™Eڱ@YPHť˘*É<č†Ü„L‡…[7ĹŞŹ3üĂe–†2ůÉő,ŠćRŠQ“»ąťíi˛!)Ë&üŞ•”Ěůĺ8ĂŠUNyJ„u†KyŽŞÍhÜďť[Ż (Ęş¦śđĚ ĎęCLÄĐáŻU• [ ŁľÄŘĺw˛őá˘WÓ8EŹcotnظ$GĽrNŕŢ©ív¤˙nJ 6ŕ=(6¸űĚ^FdE,…Ůŕc —5É0®Ž]Ţt$äĹ5ZřĐnŁ'‡=geA"Śáéé_9Ł9hčł v84R­trJşhwŻuë¤V‹WÚŞg5Ę{Čš93#Ů>¶LIaëá<Ł^’G—’ĆvĆR˝^ř~äýŽuMÚš ”NńŐ¤vß> endobj 1257 0 obj << /Length1 1425 /Length2 6103 /Length3 0 /Length 7073 /Filter /FlateDecode >> stream xÚŤxTÔÝÖ>Ň ÝÍ€t-ÝÝ]’ĂĂ 2C¤”tI#H‡€„4JJ—”(HI‡€€ ňŤľľ÷Ţ÷ţ˙k}ßšµf~gďgď}žłź}fÖ°łó+:ÁÁjp’_H(PÖ5¶€@ PźťÝ‚„‚˙¶ăł›˝8Lę?Ę^`$ʦâ€Duá0€–7 $—’Â@ äß@¸—@ĹÁâĐhÁa`>»2ÜÓß ââŠDŐůűŔâIJJđý(z€˝ @×é ö@U9@ĆpŚô˙G .W$ŇSJPĐ××WŔÁ!÷r‘ăćřB®#0ěĺvü˘ Đsđ˙ˇ&€Ď0q… ţrĂť‘ľ^`Ę…€Ŕ0*Äćö ŞŚ5uúž`Ř_`ťż|€?‡úWş?ŃżA`ż@ ¸‡§Ěs8C `€ľšŽŇÉp€9ý:@pTĽŹęŕüŢş@MŃŕ€bř‡äńD"č/Ž‚żŇ ŽY㤠÷đĂü_űSxA¨s÷üÓ\wÜř÷ĘsrţEĂÉŰSĐyč ÖTůA™đ˙ms#b@Iqq1!ř!ěrüUŔÄßüŰůŰŚâč ÷8Łh€!Î`Ô~ ÂÁ @zy˙ÓńĎľŔ BÁ.ţżłŁĚ`çżÖ¨ţ{AüÖ@”ü„Ŕ_Ż=Ů ć‡Aý˙ ˙ÝbA=%%sesŢ?”˙ĺTR‚űů…%ü’â@€8@BB üĎ<˙:żŮ˙¶8@ţěî?2jÂśáÉżH Nďo">”Áőgl¸˙¬ Gé ŕú·üĹ€ Ô›Đ˙y~‡ü˙´˙+Ë˙*˙˙Ţ‘š7úŰĎőŕ˙ń;x@ ţ(={#Qłˇ GM쿡ćŕżZěńöřoŻ&Ň5#Š0”Îů…D€˘Ů!5ŘÉ‚ąţĄĄż›Ş…ŔŔpä×˝Š˙ˇ=;ęnA ZöŰFMÖ?ëŞÂ@p§_#(,&pđňrđÇG)µ ˇfŐ ě÷[âA‰  8śá^řż+t@ 8Cî¨>¸ţrţ¶ Ĺ‚Ž^ż ˙¨ňöňB ĺoi ¶ó÷ú÷ űAřKópt¤ŰËČΫzEz_ţ­qěŐµîŘdË1$ÇÂł@Wśő™‡JöNµ4ŁO +٦çčyŽ®&üĽÉ [ÉÔ(D˘©l(ťđ ;{ăfr‚ÓąLJ<ŤÝ =N1d$¶·Ć´ćL3źż~,Ń+˛ýâsÉM7bŰJrŕ(» aɤG&(tďŁ?±da[CŽX> I$ó˛Îň6Ń4ťĽAIĽTꌧýćżať=ňńăŰĽÁ§"§ĹÚ}uâµQä´Z,Ł©C´”)yZŻhJbĘ•ɬ´ĄQ+ö+?f‹;R†DĽ›]ô”Ăîę?kńn„‹ÍËô®ś2Řmćš|$¤iMŤuĺ«ʦÄ^ç„v1’u\'-ěäb`7v/ßęÎÂË+.-uĐß·Äă<бýZž:ąŁbxDҰq×°÷–m˛Ł×‰ 0®­va·•«}ą§R4Ҳź|˝Łd9v"1żR¨ôÓ4ÄŽĽâŃB焉_·Ď›Ź -c¬ ±é=3!vĎÇ»¬˛^Oôuqflűi4żŔ’·70j €.1JĂŐî˙đ1ůđIĐB_ü­ż"Ľ§áčŃţ¶ŤůCz•pÝ6ěKŃŐňł¨VŇbˤą±b Őťá ;á¶»µm•pŤŚ@|!jżZŠá=ΞNoÚ 8áŐĹws=fFŁŐôÓ˛Ă춤YôóéYPfµ[Ş!:¤čF®B/Ô ż”ŐNóFC •ŻleĄË˝\¸‘ >Îsđ^çIš<ÝýCćĆŕK¨<g%†ő¨Ö6ĨćłM•GÔ&É;Hy¤v•ţđL"‹ćÝř—ł/lÓ|5"ýi‡ś5—Îîű’5ä­ŔuŻ É3VN>{×ôY^`ĐĆׯ†Á"[jPŚŚîłű~5ô8%3ČT sĹŠŢÚuéF–÷f+S? •ŰG("ĚŕŤO—}Ú Rĺ{Ó™ĄÓódG?ČńEn”Ww?`­ţÖ’‘C=mtĺc¤ś±XŠ™g¨âŠOK4«`ÇW0D5šGÜĺNF•ŕč ÝVÔĽ2°EŻjĚö]Ę!/sŇÖpç]ŠDřýHfŠ;015ĐltÔž¨GĐ=&8·¬ë,:<đy“4i]Ôöc‘©U‡]żHa?[#"*ŤLfĹ€3QëůčrOĘß [««ią®üyăľüZš'Ď|¤„ѵě˛"xCť8MˇD/UĚöD$#Öd«ńľs{€Îß°,:˘Mź;˛‰°(1űy†ťč1^¤:AÉ÷TŁ€çäggλŃS¶¤*®Îe6‹łł×•2F÷ćżż\*@;s*źůݬ×Ű ˝}ˇ`bşźÖŁ“xČAűůŽv̵¨»ľ,őáĎj…yS@jĹ(ßG¸ę“ęĎîčď˛y$pbXżgÁ>¸üţjbqgöĽ#ÜvíGüÖŮ© é}hFŇć+DGdäÁäőu[î“­ţPÂ3ôµšŁĄ©Ć5ް.cÖ"餝Śko[4ăX|E±Ólq%YŇĺbŘr¶ÉnmvRĂd'ëăéËJrAěqţŕŔéÁa…ÂŮLŢ' 9˘;7• ‡ OŘđňFÓě§ąŔ*B˝Ęp´cWvÄ·ŞÝ“ZŰš^ UřćVŤŮű͉ˇ‡Ę›óů9>ôĂSGd4-Ë•D<ĺV?Ƨ׮Űhw¬Q2Ů`‹apČbčy‰÷&™ţ˛ÍKü˛óŤtiŁUćNĎŕ¦Ď"“¤;?i"UłFŞż§4ťĘđ ͍öP(oJęÄ(Ҧćc®c€ş˛<+{xřc©/ËNCć¸xÂh©‘ÁŰçWmR·]︇»Uď-î”:qÖômőĐ󷵼F¤°I Ž^ꡏ_ü@Mŕ1ú¸Îęš®żX‡čţäëóĄĐčYó$śb ˝&.WGŁô]»ö‡ół–8 x–A–ţ㥅ąwđÉítÇâoěůq€dfŘ7ôśçy“ S•HăŠáb'ůŹ ”ä\–Źű/ÝőĚ›-_Ş-Ęě(7fîş7.÷á¬r˝ź›´^d'˘+^ßxDv ĹOďB<"ŕło*Ei ·Ú)k#‹üóÉŇ’Ţű0“ó>J.)dęOWm%ľ{ą„‘Ş;¸ż X{ÁHµŹ\|Śq­ΉZ2PnÚőŃ;ÚfU&(; <Â),°i*R¤N~źÎ´]ϵŮf6÷e5N˝˘*®íLoN°âUhw(űCť5łJt4ĘBPĆŐCÓ—ŃuL řˇ±e)`F§Ď*2¨-VĺÓ (?ń·5 ęˇgKť•ń÷Ö3šµčÜĆ·k´‹­Š›émoşĐî† Ť›"k4“0?Ä„n1ăcXž¦g`peR™sY7šŻűűh¦+ !n ÜŠ$kÂTßq8qńgXSuź™<¤‡Ś,6ŕlűţŕ@PO©śÓ­›żINBX_ł™ÇĐç§k´ËÇ\”GhSÎRŽ_·çÜ‘ ŔęŘ2‰Q^ ěG>jOČŠÂ*‡3ň>•ŚôšśÓ|Rw«3=Ôľ ÷s+jŔăĂżâuŞźů… O3Ş˘slh…!vŮbŔźwžvqĘLYv­bů„Żâ %ÂâyTĹî=uŠţROĚ ´Q®’cű‰ˇ†ŕÂ2ĂóŢŽ6‹ĺ÷Ž_ďGŘáxéx-üô~Ň€¶ŻˇËÇĎ<![r˘pů¸ü‰ŢýłŘGçooŻŻ<) „6ě¬eöÉ•v/ _ABč6=__ $2Ťŕŕ RŃĹü,"’0fĆ_půĚPlRtVvá$¤]Xě^]=çö1¤ş—  ®RÁ¸Ćü0öUŇľCĄąá.{@ä,ŤÖ˶E‹şâ^¤¦?°żűąćě˝Řë´{%Ś*÷Tß…§zzÖ©ńTW|mXÉň9öŇźuš€IŔî–Î`8KFđÔŃXH}íŢ–ęĚ‘â_ŃatFO ě“LĺpHu“će ¤ěFăqO˝WLué«×ćŮ łĐîE_6ká X˛:Sd|ĎŤ;şĽŰ8gŇ™NÚ—ťĽ¬3±J¤µ|şk«©¸±.;‘BČähîeůB±bý=(-óö71łČ}çiÓ¸˝‡aÁ—×3A˛·ń9¨ß3˝búA}Ř;É/ĺL‰Á›[i<řŚĽ.žŠˇ|ő|odÜŞ…ĹH•‡Ă%rżÎ¤gÖ5?]d ŘT« §ng"ŤňÖÚăĐX|Á®t´=DˇĎŔ›óž§GZŃđ&…ú†ő̰[»“=Ĺ™‘ňuCĘÝ%&łóGl'’ŞĹíTÉn˛řOläŐ;ůľXuvÄb"—ĄjG.ł=Ť˘ůJŮ;›ąŠŐdk]_NžŚ3Żľ^™mƉcŠ.Iž:zaŕLóŻćŚoŢx Pü|Ł‹á™WIąuĘÇ7>öź:›~$Pź÷„ř]ŞłÝŇG–îM µMÜKUAýa˛[m<;Tß“.KSűĆ™…ú3ĎhW•¶ŕ¶/v¬Ńýv.…ĄĄ'9„ Ö.…>=MʧźËY°ĽőČQ€R™ß˛Î)kě\ĺßçN=—‚%ă•§çM莳WZŃ5 P6xŚŽÔk*íŹ ż$iuWÔ´‰ć¦Ö˝"i1.ţ|k™ąk¦ OŔĆÎNšă¨ŕ±MdJáĽ) ŻÓ\sĽ’Yť(yzŮÍ4MwXOv»·TĹ›"Ş m‘)zäĎéq€É6Ý “ôd±ëF/7ě|˙u“łL/W˝éx +KŽ} büµ›MěLÄBN«(@~Iĺ0TVďęńť.G!cBŕCjGK.9ÖĄű<;Oş‡ÇÝ+üE®ŕëqWhˇg±˝„I*ľëmW6%ˇ]ôÉ”űNĎUS)GJűžř†-Ń®e“ °Qš­m»Ň!ó.ÜŮÜÝŮlD÷ë(1O@έEßëH:”1Í3NGĎ~ä_<őd†Ö=K3üś‹é¸VA)čyv§ůěIÚĂnµéűv?çIS{`űä†ďpn‹=´9¤ećz °ĂŞWm.Ţ/xşGXT‡­ëłµĘĺFŤ,ŹŘX~™,†}9̵™°0D3§y¬żBăA$˙<±öĎČş›z* ®'ăvď3îOÎđíţNˇZňE˘×ŇÁĚÄ'Źč†ä湤ÁI ňŹŁ6Č­˛E™´c\˘1+vJz+·‰ÉâóLjŇsś¬ěÚAö†ÚÁźŠßnśz«DĺĄĹźq„Ţôß—¸™/ďŘv¤óQń†¨öđĘ ‹•Ĺp@%Ď-Ú ä¦`.çxšjŰRň˝ČôĹdlcSý Đ ‘›°˛‡ué§j} ą0wóďîĄĹ•]čŁuś/Ź˨ň){eLË_.č-ß×;ą-#DH˘ĺ˛ďŃÓ}ÉśFrZd8QJňŞJ4śčmbăf;Ĺß°9Ť÷hËڦ˝;ř…¤ c!‘˛Ô‰Î‡ö‰%z¶ećĹOf_¸'ůůn6K¶jżAľ„š<śf˛ßÍ€Xrý´–5÷ŤKšR\~üÄŔ’ÁQâą´’­a’~ešČ·Ą»"Ťް ¶W«šD{·…vúŘŕźöďđ™łŘ^ŻÚ‡óKR ö—né6‚C äß ďÍÔ7ßa"9pÝ݉+s<éÁ»ŮíŘ«¶Ű–™ľĎäĹ$9@2ôVŐ[Oć5ÄĐjý¬ÔW(a×MŃ _Ů%D–5/ú`GDÍ= ktÜî;Ő5SŁŠÝNđşkn ›KĘ9gWľL]ő·ś‹ Ł[Şoۋܪ˘Ęú‚XË›>ź%Ďă [SÎęÄą˘'Z’Q6r/ÂĹ$Ü)W¦ÝcÁŃH}€ĆWă7tލCř–jȨi“nlF/bŤş–ßmłź˘yŚćÁ·2íjĚonE–D„1ˇEĂůŞţrD¶bóŻŢV~Ł´J*–íJ_lŐ`3Ň·Ďn*VǢ˝";5Ęj»5ýÍĺáOI`łę —´'«ěĎgĐ‚@®»:âpNyt?l#O˙Ű—}{˛ÜrĎÔ¬ŔÖŐ MqjĺLíe Aßú| śę#ĆďŘ^ţ`šVÖ9/>KiĄňËňĹűÔ]ĆřX­u%‹đkä¦jšÜxTP‹´=&ńĎö+ć÷u&Ö‡ yl›ăp0z«úSS:·„ŐjěH˙¸¤Źßś”·“a •·•żĹK'Ö´ŞçŽĽŰoôŁlˇu~ź8Ĺ}O7Ä-^*“ô¨h3éăĐľ‰vÎĺrQđµq.3ËíµŢ y´/¤öm—É–XQħoh]?×g¦ŽˇEřŽ~Ŕ÷-“Ö•ďŁŔĄŹŽ÷.rďXçřO¦Î±a‚…j–ÝçÄž:)Řs ·ť{‘NĂ=—ÍřJ?©­^ţ»0‰QEo±ßŰť}\ćĂÜs_%—©”őÎ㛎‚\Ö…*h®ăÉE€t[C–¦˙ÜŐ¬7Ł{±ž^°zÁŻź‰ddAűFb‘Ć—źűŮĂąw=Ť†®V–^W±Ň7{ăg©‚SĹ®xű—ęĺV§śt¸ mĺ_ł>m;Ćľ¤;?©7†’ş \’iép|hŃHVB×± k<ĐŁ(Š‹ÜľŢ¸¤RÝĂáŰ› ĎĘęRĂÉą)řĂ´@CfźJ¤fčL—„§[内bަ±÷š·?‹Đżů:ť"ĘŁđŁ]ÔzćJݶä¸^ý°¸8Ižt°'»/A–nI“ÝtqőödŹOQ 6˘ąŞ—!'=—˝Fhă€hŇăŮ~iŇŢ–Lľo‘—5ašˇűÄşă± `ŞqąóĚ«ęÔÇ飞˛“Ë•Oe%?—˘×®˘wÇÜ˙ ůZ–=ďî’ą<ÓI:´úC GÚŰjĹ|Í>{w҆«sżŻ_.íQÄ@§XOBŮ,˙»i(9F˝ţϬďWĆdX´VßvS—3Ä*iÇě˲T371[sŻVAüŤ“-XgĘćúő×E3č®nâö[hYo:ş%§C®ó8nvĆ˝$f˝nE Đ KŽ.@ܢŃď›&őęÍ÷Źâ°®]Z'‰Ő‰ŻVöşx‘Ľ1)»q‚<‘*IĐI«~au3‹¬†›L“ů~Ěüýző¨ŐFŃÂfU}Ű.ç.ÝÖ ÖKŰĆë-ŐG捆\.)í­Yť/űîőf3îŢödą¨lßsŮ5Ý—ţáIżJy) ßĐďL‚ÔsG«^o8Ĺśůť9çPLŻ«ŠĹÎ)H=“ŰÍ-lp™ß ŕ1H‹ó\łťâÉű±\9ąmârÇŞŻŁK捇îíŽ +Áőá` oö‡|šě€$Żî+lťĹéůŚ#»ŮŢ*”łnäľ*.qĐďŤf!-«+~ôIŰŞqhŤŮ6ŇÖÜŚoĘlĆę8H c˘"ąŠŔ« Ą„gŞĆ:­|ą#}^ćJĘ„xM=l^ŕšNĐJ–Z­p!ő?}Áw endstream endobj 1258 0 obj << /Type /FontDescriptor /FontName /NBBWCW+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/asteriskmath/bar) /FontFile 1257 0 R >> endobj 1259 0 obj << /Length1 1399 /Length2 5955 /Length3 0 /Length 6908 /Filter /FlateDecode >> stream xÚŤtT”kŰ.Ý(Ťô €„0 -)Ň -8  1ĂĐÝHIHI‰¤ ’ŇŇ%)!Hww üŁîýíç¬uΚµŢyź;źëľŻëegŐÖ㕵BXB•p/Ź_ ݎg, ŕçäăç bgׇˇ ™‰Ř  H.ţżä‘P0 mSŁĐq8@ÍŐ€DÄA˘âüü~ţ‡"â°Ě  ÁPCŔˇ.Děň'O$ĚĆ…nó÷+€Â=|(úŕw:@ÖŠ„AŔp€e uDw„€z ŠňüW NI[ĘItwwç;şđ!6Ň\î0”-@ęEşA­ż4ÁŽĐ?ČřŘú¶0—?v=„5ĘŚ„Đ wAg¸Â­ Hş9@OU ĺ…˙ V˙đđ×l >ĐĘý•ý« ţ; ťŔpOÜ` s€´”ÔůP¨0ÜęW ŘÁλa`KtŔď›J˛:0ŕ_đ\ HĘ…Ďćđ "đWô”áVňGG(ĺBôë~ 0$‚»'đĎfíáw¸÷_kÜĘú+W'ŕ8ĚŮŞŞđWÚDôŹÍŠó?@ťP-đWy}O'čo'č—ŤŔ×Ű á°F€ú¬ˇč?"o°€BşB}˝˙·ăß'"` –Pśčźęh3ÔúĎ˝|$Ě`ĘŹćŔ˙ë÷ź·§hzY!ŕž˙„˙Ţ/P]V퉡ĎÄ˙ńÉÉ!<ŢĽ aďCa$€~Š |˙]ć?řüo«6ö×ĺř˙©¨ ·FţÁ€Ţß8Üţ˘ç_’áü»&Íe(€óę›ń óCĐĐ˙·~§üßx˙«Ę˙‹ú˙}!%W‡ßnÎßţ˙Ă v„9xţ€¦˛+ - Zđ˙5„ţ‘˛Ô ćęřß^U-Y¸ šâĽ !>~ˇ?v‹ĚjĄ CAl˙éďU {8ŔŕPm„ ěםĹĎ˙_>´ę ö诊 zaż]P´¨ţÝWAXýRꀰŚD‚=‰řŃ$xĐ2µ‚züć7ČG Đ)4F_€5Iôk­…@„ÍŻń˙,ÚGôŻúW$­ľß4@7˙űü[ęP¨B49Ž€H„ŘU„4~/“epç]Ŕ›_lzgÜ!Śâxím«Ž˙JyÄYî™UÉťľíooÆÇ}¸÷ľzµfÎ%«dŁ0;—ĺxs>_·Ú@™­ô6C˘)Ď—É÷ăun?3Ĺ1˝źh8ţ3T´MpýĂZŢU“ËşÉĂm€# ŕŚŚ5™#›Ő´ŤeĚʶę56#‹Ą@š¦şę«>şÂŠ‚ĹžË5FÓ]x.›Ć¦őÎÎödtu¦˝yÜ^*RFIGĺĄĆšŐ—ĐMGźˇVă‚Á!'|&˙6)î.]ľcǶcĹ‘‘-¶ŽßPČh×' ‹ŔL@jÝVŞjhîŕč‘dýéĺ‰÷š]jŕV#R?I Śî…•pB6= {ă›Öšź+W­ÎO$ą lŤŮ2#őşîôí¶qĘgĎE9¨ÜŇÔşŚ\XoM‹sj‚ >eŃů ¬0l2Ą7­^AâŁ#2 ŤÎűj{Ľf&O÷‚‚âŽü]‡Cٵ‰WʇŰëărň—řŚŰ†é¸Ą÷1×M5,.U4Ž"úÚEŢň@(-§ś˛ćM,«ż7űgâî÷™#f„VŞ6{_“D+—é-đĎ]›gŽż)1ĐżQĎđCńĂ$ őҢ|k»r–MşŃXĺŢs«ď1+ő¨:řŞŇâřSôÎcđÝkŹ"”‡%éďUofMGÓ„ľ5Úy}ňr^f~@ŁŠ—”_Ý4•KăµUę±xMi™ĘűCSĺm"Mď>¸P†\ž;?ŠlÖăçx «j<éÁőý­2×ÔŁô™BÎí\O ĘřÚĘůŃ ›ÓNh¦Kç r(‚EOţÁQK=Ú5P&gŇÇÜ‹ą Ö¸Ě`z›Kĺsĺ÷SgpCŞL v›Ä!Kl\]-VĹ›V±çiäm5÷9˝Ňü(?úđGXr˘#WYU%ŤŇe˝(Ü÷úŚÜ¤Ć2űQÜ©‚šfňĂîĄEĽŞ¦ë7¶ćKBÓ†<ă»Řo[ľą¨s_üţĹ ŕO$‹:Î]]qvĽ§%®f‡7›Ţ95ů2č_=uÂ&¤Ň¨í–KŔ{``ĘI·íž¶†&«ŹĹL—7XxجCÂ̋ԿúĚYŠĘAv>‚rć;î;^ÄŢ ęüJřÉ(§°|¬ÝüvÚş—YVk&ţ™¬Ž€×hźIëŚČë™_Í™ňî¬í©ţd›éşyŘa(ßŃ]¬‹kޤ–mî^ÚMúřľÄ+09›ŕĺ§ÓBź ˇŹ…ÓůO$7}ď CČßrĤľ?‚ěęöOĂEślż˝2ˇłöň:’‰|ÜË@L5IwÉa|Q­†F:őö“5żÜÉ^ 8Úă;Y6ź×‡f&¨QÉ‘ŹşßŞý(sEć«pLăđ' é1‘2HIN*Xx·,ZŁč/ őö1­AŰ/=KZĂ:KsÍŢE„á%ć¦VŞ uL mđPbĽËĆ'Sś`ę€|?>¦´“śďĹŻt‰C ĘŇ´„8łI»7źÔ;âĆŐ}ĺľ%JŕüŘń.F‚ř'‹ś3ž—*LLPSDRŇ‘ÖfĚ’uqőIĽ‚§r[~Ş„ż‡ŰÖů°.“Ł%›^nXüł; ‘~n]¤aě.}îŰ |EaQő»ĄW–#ŻÍ}–a2ÖĂ›ě/YK@Ł+ßçŤď(äѰÄÓÉŚ-ÝŞţ¨Đ‹čú†˙ăĆ…ÓAP'ŇߣĆČZ>µ 4Ä2ŕD5€ ¦ Č*Ä&#3ç[řćL}%Ď—EŻH§bđ¸ŐçDý ň\˛ł¤ĺŻË>ÇD—úĚőfĐž}S¸ýüónöŮ:.ęśáf%°űÝö4AčfGs˙ë¸ŃCĹű’›ĚI[mŽ\{±jMdzî4B¬‚U;»Ĺ‹őŚď˛*qú‡*CĂR ę¶Ô’WťÇ>)1i™5MWűúIç1at·zŠXéRhĺh.Ý#ţ˛äę×SÓ6ř>=eJĺĎôWí÷“(_$ ¤fޤ7LÄt…”Ü‹dégÎüĽéaŮů,Ř8đáűĎYp„wÖŘ(M× řÜí‡,®<Ôž-ł‡˘ †Ź+…_ţĺâmĹ]—Ű™Ň÷Ö^iô‰”(öł’Ç«ślrČAxľó1ş€ö9ëčË#t’h›éÍ«FËFă4¨Pďs…{{>^©xugćÖfőĂÔ ŚéŁEoG6^Ąn`ŚĆčĎŇP–¸dă<´E83f&€ď-ýSÁČ&şŮ⮓h±Ů‰ Î-÷¸™ĆY®g…Ţc襭Ţ-¦ôĐÓ8*PîłbČ= jĺ‰hĽő˛ÖŠž/†™®apGnĘVÇëK–„čéÚ.†Ń ÝöGKĺçÝP!ÄĄÇé+ŰÓ9śčű%Đń'!Â$nďła$O࡯"ĚÚ©ËšĄDŚ‚űiă”vŮý§¬X6Ň+‹•X‡ÍďÓăűúE:+ŇÜ`H*ö´Ě .°Â.˝\šźuÉKą´iŻ{h28ˇÝŹß •ö_Ą0%ˇx} Ř6kÔ=ó¦l ľŽĺ^`ĄšB*Ż™FMí/űöŽ‘Đc ZI¶“}WȅѢĚ,ÂĘňoü‚›oł#ăű b÷neĽňsfăďL5jK+ś¨·˘ís}Ą)Š#îÇŢýÂGčZŠ@řuŢhŽ‹ sCőkĘ/1‚Ö$ÁŢ/“]‘4^üÇ€,Ĺ#¬‚•!vVŽťěáŇäĐ$Ak±ěq‡ËM«ŕźşéĽ›řß*]Ŕ±¨30îź)»o»îµăYpÇÜX®0Wá~p/‘’5v–ľ2“Ëťěě'«Š#ĺŇvY?ß"lM®izďi·ţÚčY!NWJ¤ScE—wŠłĄ«Ő"ýßF„:`„f±3”ËxPZä ë¶éĘS^Ç3|\ËbO™€Ôí¸Ťâ÷mNÁń_čß?:żł&‡“Rldq2`ža—/7|ŐÜţĺÖ!™ţ[xDŐ1·3‰€P:G‚o^š°A?੠ÔĹźľŞŚ‹ÉL}bľm2–ü`ĄŞĐ3ÎőĽ1aëÉYţĽ’Bţjř­¦O„¦a–úřs”3oeű¸{łôşÖł»÷;#î:]HeÇP.ŻÔyz±ľÍÁ$‘ngÜ@ŘźŮëCeĚx÷öźPÄŇâů¦ľăJ./’j™TQ·Č˛ďĐßr|މîTOWJÚĽBĚÄZń4ň4µřVgżĺÜö$ĺF`%(g·¶ąĂඇ"˘4Ją((MąI WR¶ît{Bő˝¦ăśźaĹrĐłŕ;HÝ»L˛9®×ž’Ň›ý„Ď6@ÉY9Žz6("¶«źł1)4\GöťĄ{Ź"ŮÖbŽn—LGeFČôŤoĐ«§Ŕeó°e^đ{rŕWE/⨀ęŮđ˝ŢD]˝ÄíëxĎŇH[TWô„łBE>1Ţd‘Ú7ÄŻ(°‰|{óJŠ©’A}nŰšŕ?µPÇ{~[(“›ŚçšI'\Vgo‹źAŰg:9¶á]őSUŁĹ é÷ë_ŁHć2¸ _vZŕčÎ?Ď5fÇŞŇţĽ.˛3j±ÓT`ť„]Ž4ĄsŇSÍló ö¸”ľčČk9/Ů ŃvzBť‚Ç"xF&3qÂ1ü&5 A'˘ .öxÔŢ  áń©‹x'Ś®ŞlŻ#ÂZZŰ­CƢM’’¬DĘĹaŇvű1ůÔYćbµĆňMb’ uĆÍ­+Ť-3ĘĆL:Â%ć>Éß™e;ź‰Ą -/Ć–*ó—¶ť]K-Qiůń‚ßŘDRĹ"•üld,¨ĹÎ.˝ON]mży°ŹĹ/ů4ă3ËÍ®…źŕ-ĘÂZíjGŮuÄL;/#oŞDIŞ#m¶ő˝G„Łťü^ŘŁ”©¦ÝÇ"(Ź´Ţ ŃĺoXßI0˘űřQăt~ţ^Ľ˘VfqylQ%qř\´ö4nâű (LK‰űÂL_NKëG)wÇH„Űd5®ďµĎÁ*ý˘‡©g۶š[‘P p‹jpćU€1šäJ¬VNU,z§ń‡9 ńµ‘ĹY…ępEľ–Ó«|á–piÜ6{×·‡E?rźn™°ÎQ›’¸]ůżÎ"Ç) |%D§ío9‚ő…†}ş ÓŹ‹‰ĐĄ*eÉąNĺeÉ)vTŽD°ÝK·á;ź˝÷Îwć˝§7xĂíyT´ČöqËćŻ  n"Ź´úĹ•hö=ŁĄ?8sâÎÎ<¤ÂĂaâ´o•;ľŚ4ŻA莜íÎő›ýĘĺýfI*Ž6°wŮí 5ŞĽc«ť‚żaÜa )ţęż.üę^Í(sÁÔxž>©ĺS[!±Ř”ÜҶŕ©4˝ł:xGz  ś`8˛-0˛ Úv°uO¤×ר^Şi3§fĘLë5ď>>r„b©ĽnIĹÚŔ‡~{äđäî«É·űöi^)üתź)ŐÖxueąµŐ°ş6??¨ŢĺęťnwĂy MĚýxuĹćőĂ"4µ9î„áĎ|dqĆuxĄäwę>EÂNqu)Wš=Â5ŐůSţ¦¤ňŔź›ň,]+^SÝÍďÇE‡Žü٧ÚůÝ–uéMźŐU1G˙<źęäŠái÷ą|ńÎŚ"¨`p‰őÂúąůčeĺ<7î!€=ŰśôB*µ{Ű)+šŞD˝ äĚłńŤÓ™Ł1ŕ­(ĺţ~aĺL5XnşŮn>D1A¶Ňśô¤Ąí'ťľŻźP+“4.‚ͧž T3*„ĽÝćéiŰWőżü¶śđĽ)šSkž ;V6ĚHMHÝ8ýÝ]>Ć`&cď3gdݧŇaů©{HŽfúĄ[…ˇőęmŐb†FŤŚ ť†»o-ćÜ)LÉ+îqë‚9 9ů6}ęŚR× ŽŽ‘ 1lĄ}ç#c:çĐ؇cˇĆšCžOŔ‹D#cš˘~ňťß.`ć ń˛H˝óŁUşčSĄřOĎurŘTő#ý¬ŇŤ‡“ÎiŇj†fŃáú5äő+ŞŁ>ĂĘeĘÇ ’Ě×d‡źŢÜl=é(ŃB2m¬ňFň~ß"Ę‚t±ż4ÄÖ•ŐÖˇn\şJű¨‹E¨q!”÷i’yĚ #ôNpĺ9§LëŇGM:5Ą{ŘţĎŇŘŕG˝µÓůkÜL‚Ł ˛˘D;ä~kń§÷ł©|j’4…ďRîű‘ôč¨>©†QsO^ä,Ç®Iü€7–]RmŔz;´ž‚Í0gßó;}ýćůĎ n.$Ě4l¨C)Ĺ‘Ě7§łçĐé1ľ.łźĽ˝ĺʇ$ö-¬ÜŘÂndÇYTő“Í”šyyÚť&Źíš»cźApł‹r{5¬—“Ôs DŃÄ+{ů‡"m%_ŞB[@ĽčřÚÚ.ŁžťĘ_f_·iŘ[ë<¤#«łôUçÎ ÂőŤŢô6Çl¬ ´,Ç~ţ†=śĆżc Ą"Ucm§–ÓIŇ,j?ěźf´MĄ 5~QČBŠyަÚ÷Χs0¤¬ćóD\‡ĎĹaxýŹNĚü—d‰¤í'Ą)Đ-µ™ő:ÚĚm:Ń ‡8“Ť‘ăü©JQYˇVýDí §˛Ś,ŤÁ·Ot[Ę’;đ¬w"đ§y’⛢A«IÍÝÜ îďú%HÝűˇĂ^Ĺ:~ÓcôU’qúéĐůę1Łn`ť…Pőd§î±wn"+ËvAŠY>Ú`ßy˘ ^ą^žţöą´›ĺ—?ş`SWĚţí~_ë$5D?L†ő8ĽlŰ’tYÁpď÷ÍňýÔ!ŘĎĺ Ç{ˇ˙NL¨»xĹO°S_„¬¨°đ¶ĂYĆč-Duk6O)Q—…s4y{Ť™Mú@gëđ¦vxá5#I6łśAqFëĂ»š[—‰0Qú·»ÂĚbTéHą•Ž$“iIĎŞŞ†Íđ$ é¤kŰ€˙ŢăŁuîg@ŰĘJm»µ&ď•gôÁÄÍ ň'î”¶´'µŔ2'A¨ P5CöÝg.ŘA›ý˝µOźb?+á@Ü9ŕě·ü$ŤshŚĆMeŢů>,ő<č1Î'˘yŕžŕŁjŮ/>•XĘńްí+"wąc‚Űťď­ŇCß|ľWygbôčŻ çč fšv›¶3e´ ס_B˛¦ůxű†ŠWź:Tt5>*Ëąz…AMu-9¨†µÍ«\8ÜńČ‹ ů°q°ŻřŕÔ<Éz´„"79ŞŞŞšßőDn¶nŘ B'sŰŠ-GŮ>sRdçë|›ÎdÖĄŹZÝ?îQ°’7I'ŞRęÜRńxK•··@0»ŚîjQή­¦C^<Ěř‚µŰdóů)=?}§×ڬý ™Đýăögz"CrŮ{9Vcëĺf+ćŇyńöĆx˝“1‚b],ÎÍëCśÝÍč= ¶X”ďˇ$3‘ î% ˘`ĎłĆXÚš/ů ›,áđ­n÷Rh1U=‹Ý[BßwÔžˇ,}#s^~˝×g¨Öż|j=!NÁ‰öć>Ú†wyPŹxíąµ$Ó–®˝ęńś~ŹŇ.Ýx<Űk¶z±Ž5™őŮÍů±ĹRfË…$ďBÉ´}­wĐZ@®DďvvÁ[ë©´ÉĽ.ŃĹĐďTú çÔ_WçI‘”bŻ'꽲I¤Ż‹pŰ'ró©Ů}ćÝ!ńË=›šŐDLÎQTŃ>śĺKńnoęÉđ5ˇÔV5Čă Ě·řÖG¸F#2ÍvĽŮ2*ľDzV?f04Á_h–-ąs$Ďślot*!ĹĹĽ"äŤůĚśµ%Ó [ŔVĽŢ$±ÜDÜĘőiEÉŃQ/bsfĂĎ®“43:¤ś€öE˘ţÚG”sW%Ý`Ť 3q‘zĆŘ9śzN§źőş¶Ř—*Á">’őÎő\N‹jmśy89¬ń}E9wÚnYµ:’ř'¸HČßml$ú¬äer endstream endobj 1260 0 obj << /Type /FontDescriptor /FontName /LAJUWJ+CMSY7 /Flags 4 /FontBBox [-15 -951 1251 782] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 49 /XHeight 431 /CharSet (/logicaland) /FontFile 1259 0 R >> endobj 1261 0 obj << /Length1 1612 /Length2 17771 /Length3 0 /Length 18612 /Filter /FlateDecode >> stream xÚ¬¶eTśÝÖ% A‚Cp‚îNp‚»»;…Cáŕîîîîîîîîîî¸yĎéîŻÇą}˙ôý~ÔĎ^2×\k®˝G‘É+Ń  ˘ G:&zF.€¬ąµˇ“ ČFšNhęřküGF&d4p4Ů8ąj@c€0ĐŔĚ `âää„#l]íÍMÍ”*ŠjT44´˙eů'`čú?=3ĚMmä?śV [k Ťă_˙ëD% ŕh[Brň˛bJ1Y€Đho`w2´27H›m€T=Ŕę߀ČĆŘüźÖč˙b 8 ¶@#óżi@# í?.Z€-ĐŢÚÜÁáď7ŔÜ`jo`ăřwŽ €ąŤ‘•“ń?ţÚM@˙"dkúaý×÷Läŕč`donëř[U^Xôß<Í ˙©í`ţ× ™üŤ49ýÓŇż|aţz ĚmŽ@ÇjĆć¶V®k˙łµ7˙ 'sÓ˙b@ °šŘ[ţÂüĹţg:˙Ő'ŕëŢŔÖÖĘő_Ů Eý/ćŽ@+z8&ćż5Ť˙Ö65·cřgQ$lL@&ĆŰŤťl˙§Ďh˙ŻQţł3TIl¬\Ć@8Yăß’Ę˙;•é˙űDţořżEŕ˙y˙˙‰űźýo—ř˙ď}ţOhQ'++Yëż đďđ÷…¤˙Ľ1Vö˙Żpks+×˙CÂŞ˙Mň˙GÂŃŕď0lL˙ ÂHĎřoŁą¨ą ĐXŢÜŃČ `b`őwR˙˛«Ří­Ěm€ý×0tLŚŚ˙áS637˛´ůgô?ţíÚ˙'ůż"ý‹:¨„†¦Íľ©˙Š’˙«˝Ł˛«í_b˙Łń˙:ü!(r¸Ńý˝tĚ,ě¶ż9<ţŐţĂô_gG{s€Öß–™ţŐř˙řý×Iç?`DlŚ@Ć˙ěŠ’ŁŤńßőú_†ÜFNööUý׍˙Űđ˙<˙kŃ@ ÜĘ"ČŰß"9-ű+kp\X«·› b0Ŕ¶¨N9?×»Ô啼ÍY¦˙^@_?ÉőŃâşpjűg_’ú`¸ÓŠ˘+x™çABŐ“űmĽŤťćŔ—A·1ĺL-Üíj^z R“ŤQő`g\AQ·đ˛ŤĹćę‰Ę›Ä9םôŃÉÓ(©6 ŁĄ µ:ďôŚ<îř鑢dhp ëŞg—&3 –ŚŰË3á”(ŢŃUßţľÎčęŐ™ý×·‚J9ýY|s¸Ç°#á•Ć€@¤Ŕ`°/{nŁ6YĘŚ‚Wfżc‰R&óHAŽ7á˘hŐdo=ăÍ@ďę¶–ěŐvSť=şÎ–!m:L“)/ŰúAäO—â}—0Ö=›ˇîĹP¶]?’~ţľ›Vbq#®s§Ö«LŻîUđ*_†˘©Ţ°ůw%Ě·wŇök,GŕÝ@ŽB¦Çâq±š†-÷®ĚhŞy† ©čgĽuéZŘ@9 »ű;ovmxccß~pé;­Ä:Řô†PJr‚erâg{[“WOŁ© _4ş›ç,éi¦žÂŘOÖŚlAšŐ0‹­]¬l@§}2ßâ+ mlČ• ŚŁ•´ó–ÜőP­W{Nü Ľid÷{‚1OĽ&™Ń…ŘDÇĹĽ@×eÜş€ľ ŢĘŐáóň÷Hüť~Ń3ÝŢÂa•}á$¦ Ţśľłvž7 R÷SÔqŘ©Íz~YýéiŚ®g–5 ‚1+bO2źSsŮ‘^7…Ř;‚ÓöKq"$ʸ©g‘<.ĄŮ÷†Ăşňola|˛^růýžŰF cbßď{-*~*čŘxV/ËöŞĚVďc·ž˝÷Ű×*Ł÷ď"µrĂ}ő^ö ç‡Ür]…ć×i,`-RĂ«)ýôp: U íłCKČVZŮ_ÄâüN@-c‡‚·Î'ŕ¬Vç<54ĺÉáľźŤőĎ]ŇW*r˘âCoéăPަ«7} 7ŰĽőťať®WbŇčíBnLH Ů8:>%ÇţHMâ *G ŕzP¦;hÎt‹®N¬jLěDŞŮř-­ZÓÝú˘ĄWdCZÁ–Ü ¬ë›?0Ő*+ďç"«(ĘŔNzDÁ{¸ŤäźłĚmŽäZ5cÚâI·”ŘčkČ4G8Ms˝~»ÖFţ’ŁĐmizIŰ]đ~L¦*ńĺj:’v'8q°%6»BŮZČě«"4ýX0"ĘxČú­°˘ÖXřgÓôc_0/ŽŞÁ(në©ŰŔBOÔĄż’Zć.VŔ7z¦Á­ĺ“óf3\Ň(„˝ĄßW,Yő*w>îOŘt„Ő?Bśŕ:€Bť-}‚p_7tl‰’šĺłxŞňá,Ić'ç‰ĂX’ß:Ĺ€Ł3.…/<ŠXdbżzş:XLy´ "iľ`x/ň8wáĹřhCM+hÔŘŤ@Č®M ä‚čć‚ŘDĽ&8Ŕ8| -¤ź—jv˝y¦zFŢ©;˛)đXPĹŘŕ˝h/Ő+ŇŻp™ő ×v;­Z;Irʆ¤O”=Oé®fâŃ̲–v&µć5Ž-‘ĂSwÜęé}s«7e…~šÄĄ ĎsđqP®‚‚'é§őAÚäžtâă•úJ$ZRĆ•J±Řălíб ”¸/XąY#Ăţµ“='ż‘8ŹÓxł±aŻ`UľŃŢÓ5ŰăOCbˇfŁ+GŮůN[ĆB}!ěU> :߆Č=¸QLĂ/(s‘ďŔĆyŁ_I€łă-N:¤ĘŔ«X¨·w Ń¨wůÔyÓ`ŕ5CŔŞ<)jx‡Ou[ôBäŐŚWťŇ(:—š  I¸ŞR^WĺhÇ$čeE4đ7Ë{ÖÜj›kJÉ6ţO”¨_6hmś®Ň-÷Kżő=Á˝¶•}pć=TÓ&°réÖKŘód8 |”±ŹÇŮöĚ­ŕ_gď´M?F! „˝1áFţ‰ şAÔëŚŔ/ů±Ě™¸‰¦ŻF<^Ăję^~W5ćŇÔB]•žĽĚŇkĚGŘ—l4wÉ!ß܉ŹĚŮQd{6—öZýŚß™Vă2ç2Ąr`±JBçI¬ŮĺľÉl¨#ÄWžGăo6ltîC¦ÉŤëw_!ň!‡+/6¬1 »lčC­ąüž˛~Ü.(n}:IUhl‰¨Ós{ZΫ‘Őö ę*4Á=†aF Ă/ˇwjË=GS¦¸mšR¤ˇxeť§I1Đő .“©”©>ëFdîH(/ö €ŔĺśRCř!Js%±žsjśŃ·Ů ń/Đϵu ¤ą»“ąđÄŤ›Ě?.{Dy¤‘qaŠo⥇/KË‘@* íÁp b%HągŢ%­^ŠDęB…n”˘źŞqcŇţęo8F`č~Ňmw'Č č/‘ŃJCfŰnLşŇ™ÜAąFe\·Ź’/«*U<ףL©Îhn’˝PľęŕS~¬Ş6˙žB±Óµ×řŢč,HQÚV"-,ŹÍ‡–Q´C÷ČáR]u=í®p@”›Úň é{˛^-4e+‡ŐŃóJčÚ:D¶řľ‘j‹ô©cŽŹá0_ř«¤¦®ßď­ÍS®ú!hÂĐN¤ eĆ'`ˇ+` ďSpe#_. $˛źSY^™Âż5ŰÍO”[r¤…†Éé&»Ën]ÉÖíj8•OČÂ+uTr[kö ő:ŻklíSOoÎÓŰx.ĐŰÖÝČËčáIeyxU4„·a‚Qž:×z@ăYůŻ|{[¦µTR˛źúäm%›&ĘĘŕ\˙,°K«Wť)ó–´Č„ŮÁŢh˝ý”ű ńŢňŘízPĹ'éÖŻ Ę|^‚q`hĂ­źůOj»]b­í7 !dňÇş®’đŚu, çŰ ‘?|) îŕ0\ĄŽÚżů;©ćôX cD††2‰„Î"ŰbSŢé•ČóŮfÉ?¶o†˝0ńëhF$†z¦;źÄÔ&”n`B,ëŻ&\iŘd+Ă ]25ëw.ĺž)=0©¤U°ĽÍ+ÜíĘžXAŢźrŢş«Ô=DŢi_ňéř63cEâąH o÷ôIéZÖČKź™&Ú¤Pä6> Źi0ÇöćÁK?eŇ„Il®§Ą<·0Ď`šf’ Ż>‚§ĺa*?»f°í©Ur4ś!w™¬˘ë¬cŁ|kaŔ¬Č›u)í”ŢÇc ő ‰Ó#Üh)Ęă!$ˇpE/´óvąîňôR,µo“űwt“g)‹pvFĚŽ¦‹4Óú&žúsŘ& StâÖöľVâv6X˙-4ă®ňZ_`ßç©1â˛o'°/xńO"¶µ_6Ú<‰6A@ł5~~âuYČK\˙D)‘ĺÉřD¤iF̤ESO¨­č4áZĂ˝Ëd"Ű˙­/?0żÚ+é#Qiőě÷d˛bk–ßW/dO籹őË]~ĂÉ/ Ą¬ąŰŞŠXôc|Đ ÔZúLťďçłÔ —7§EáűăóĄčëńŞźp·ËrddmĂîóDëĽ:1& ţ ´*©…ÜŠÁKcr—L§Ł»äĚS\¸ęÇoć ć=ń?ôúó=,ÓĚď_>CCÜĄ¤´¤Đ[•†őŹX("Ń'cËľ7dŇ)ÉĺI †5ŕ$FƬÇůî%űëäTfŘ„ÓsC±óíše ľ»HaúĄ_ë"ŕpRŹl«RÄŻašÂoĄ~бE­3˝SS'ŻG‘´“D/'íÂÖ B‘ŢW°«óç©ĆÄx׉˙±şlXŤ”â˨Ä[ľcč˘4pQ’ *%Ůá]ÜC®‹¬˙Éŕ ZpGNe‚2ŚsđŻźí?‹ó‡S‚˛8Ž’ťlýĄO űPd)ošµ÷ueş“ęÝä¦hëâď‹GĆĂĽ=KSç—7–1s#Ü6ó|Äěi«s9M»Öĺ őpš^ČDtríHY zŞ_ĹIt¬ÂWîzM=Wę‚nčAh泯XÔtĚČŽü÷c‰ř¬źęż§úŔŇ8Áô"oZđ(íÁgř!¤řˇÖGăćł…żçëňŹ%§ŘVUśë+Ý›HÓĘ` ÚŁY-dú ˛őă ® „˛ž0;V6c>2ˇ@›$tdL]Š++ĹÚ¸Ęň‡®ťxőĺµĘbď•-ŢZđÂč^¤=ďÁýV´Ł’ýdä˝Â§UVŮĐ‹gXw8ĎR[cšô;ÚS“Ĺ“í­@ÜśSIöGN§ľ ĚyźbíN°ŕ@ţĘ– Vht2ĺ™’#"¶VËO®Ó =â•m‰±BwćEůüŤŞ| $-=§P©VZáL†÷Jżg$€:O3WŔoVkL Ľ˝ç˘%Ň4—K˙¤”ĂŰř Ö~3×&w¤E٦Ć™´ŤmKŃrę}ÓčÍý¨/Vڵ“Ś’  ‚ŁžPç3†ň /fÁD}xđî–X%'Îuű}E ÝOQĄ†îvy'r`A˝LśgBÍäVćeiQvŤ¨µ~»pĄfí‘{j$é+â/Ś®1/¤ ĄT4ă€Öč~ôJüń-2Ó'huGÖ5žĎŻ’ú(.°đĎXÂt·.őHdIę­h\ŇźĐ×äĚćV š¬číÎ?˛î”4\”I!‘É:§‚>ń‹ěęyě ˛Jqú/cb+ç8őÂüÖöp"É–[őظŢĆA ŔŁîMŚOďł•ŤĐ­Ţ0‹†˛Â"šNů‰CQ‚ żň8ŤnH ŘCľ?’ň…Gőúä¦ţřÚ˘Coô.Ľ"Đýtv‡JüϬŤĺ‘¶Ĺúj‚FČ|!=wxűěÍĹVĺ^ZdăjßŢýb…¨ DĹ<ä Š§ĎÓŢî gh8©%*)ĹuĎ˝·4 ł±ˇëŔąW…Ĺ‹µ}óődËÝ/Ľ“u’ŽX>%łix+UĐ3Ű›áş9†ö:®Ŕ·§×(‡Ďcph€ í¦–TjröH}ë7ő۵śANîI3Ďr˙ř¸߆U{1ľËfžG®—Ŕ!sŞ»ţmŰö‰ŇtĐě·˙¤.:ć ăŽ­7:" ¶ż‘ĺÇGW°*ČEU‘VĐ:ĘOčřAj„ÁÜ8 żŮžýő<a¶ŹMžy«:řÜL·ŞÔ=d[·o?D鱿¸ć&ŘÍě+;Ü•OčĎřD+¸aG°`gŤF(ť®úőőńúŞD8îWŹ”Ó;~Lk­Ô'ţʦţŇ!A‰'âMčš{I¤cé|)®µeů´“dČöł(CgŘ[ĺ]¸Ľ€,Őű¦a—LjCvˇ”qíýVč/ĆP+¶gŰÍ5L#ÍжE ’Ó|Ě.îʰ;v±@őuN`/ń7AcŞTNŹ?TĂ&,ęŵP~ęoŚ$/A)N, PUčGđŞ˛ă,DkŃ’—RŕU8…qLß2@a—ŕ®!YŮ<”ştŠ‹iWďsőK2×ë­HĎż%4™śÜśź0Ë3ńšDbˇfĐđŚKR&ż.MKź"Ż»ř S±óŕ»Ě:2Ď&•§Š‘é…¤éćťë‹–ftßâŕč ÇÝEť%ĎĂÝ­‡rzT»ßí ËěB$ĘáŃgřß±R†Ť8fĺž­y0LI^·_ˇ´Ň¤řö+rćÖă,ť tňRůłŚŐíIĆ ŕ >R˛“›¬OjD¨5ĺbâ1îâ?ɸ픥óLQÝ“rm™üĆ|S˘f†& ]<& QItü˘†3yÚđ¬ËÝ[Ěh‘°â==Mup˘ń<}í'UĆ6Zkďjp“ó™Q6öl§Ű‘ľÉ u°— zŠulî·z‡n}«Ŕ´—O :ŐŁ×ĂÍź·=ÉÚ)´k}Fe¸őnré;o[?ľ=ĐĎL§ ٤±— e@2ĂëânpúoŹęßŰ^„żZ§-kĘŕNCÍ~ľ9ťŞLđ|Ľ4Ŕ@DLÄóVńŐďĺMbźMŘŢ*Čfg¬qV `T¬Č?ߢÔëEŚÝĄ+ă5Đ-46}švűş@µéúăţąŕ€÷q_,bĆ‘účŹfËȦăŤ"ťň&GIĂ ńN§<|AŘŠçqáČA‹c%‘xťČ}pµ{ĺW8řyŘ›Ş5=ćfWL;ȢČ•ńŕ%8źďĺj°/_—ęŁއ‰ó˛Î ×™Žşňíňń¶çüGĽľiRÓců–ôSĎűŕű›Ć|‚ąT+>-ĽĎщyÉ}‹DŘ٢ݛRź©ąŞéÚŇb ą1ę+z„Š3@ŕ—ěł_RJ3Ąër©”Ë®ÂiżÎČʵ€Íq:U(gťFS”|¤=×çgč|úQä{†ŘzÍ"+T8I Ą»ÂĄ“w¶ĆÂsa5˝%xUxýWBN÷°iŠ3›!ę¬×ĽN«ĽuR6XÇ4b{®`+éĹJ”ęJT>;3»¤V‚’ŮĹíÔ˝"t •Ł~ąDWh~SˇĂxě¬o9-9RN/§×ç¸Őô„á â*LÚ2m|ňýâ6ŃÜşF+5Ëp>qÝJA“ťáuÖa~ŁoGÜř0dż . 7ř>¤O~c°N®”‘ő›‹C€Ŕа X%î\a…¤$Ükú˛ć=,-V‹–~˘´UbćP{wmwŞŃs815Ć·ňŁ)eć˘ Üw„ŐkZîą|ńä !Đgͱտ±ÜKŕrUŔRµćôľţĂ1±Řrë;"íˇBWĺ~żŢňřšź6‰&şNá·U´ˇÚ@–;ţĚOřôž«dÇopťŃś#Y+Ą§i= ™1µ·;,™0ćr†8đ¤XŻd/ĺ ťEčOÇ'g#•ľ61j=˙‡ gě(˛­a[xŻ”tŔâ\ţI2i‰äTU¤Ĺ/ͤ#`•[Z/¬J™xËš&ą ¤Z\ű‚¶T39­Ňឧ˶0öőĐ”öËîÝ$×=é>Ö˘P:ˇ=ą‡XÇ|?÷SűřĘ+Â#ÜĹu[“oAŢ8<Ú‘ÂŰŃâE¬šßö˘7â "Yř Ć}a\OOf‹’Îw2Ő uŽÔ‚dŹ?•Veˇ}şŠ#˝­ă’ť”±rt’Ő,Ň&VŚŽ˘E÷•<9(;żv-©űÔ}IĄK„@€—l÷Už°—ŞVësFR¶ÚDKŠPWĹąß<ĺµNŚ®¶{‡ë±ŢĆŕ|"ĺŐGxşLrRŁpŤÖłAí,-bDYÉĽŞ%c>Žă1vű¨b<żB DŐń“ńŹő˛ČÚŽk”©Ęk‰^ĆűĐ‘€G'ÖĽ]YůiŁÎxśĆ'@‰uűT~™ü(%K#V5Jżndłk{zËËÇőÜ őĂZŢĐ˙¦ŢwĚ&”J8÷őÎť©ş8u×2púěă­ˇtV;A‹7=ďśË=!d¦T‰=ŮݧŢ3.8ŽwĎ9°+‚!Oďéöv»ř o-O:ţ˝Ŕ8‹YZ<µ˘9Đ`¬r\™ŐÓ‹”RďżÓŽŃ0¤Ľź&~+ÇW° đ(Mş‹(©uf÷ăh 'ęčřęŚj3‰AyqíÚŹę™'Eˇş"{Đ0ö©.‡´şqŽşéçrł>6ăN›âČďúT6/řŢŹ´˘[÷‰ Nß§ÜľpÇŤ§ŠwÜ3™>MUńóaîÂW¤w}Te|Íj·XĎŚ&®r lĂżlˇZfÉ­@Oů€©~VËĄß €×÷}Ľ„dÇŃř „zq0€‘ŃČuĘ'ŞEęg-7†# ąĚę㋲ě^—łö/ml\P¶¦ÚBѱµ)ĺżG…ď şÔDh]ms×çV”Ś7Ěč®ÜOĐŞO߼Ž`Wĺ"ÍHa.?ü¤íÔu|É㮎QA©qŹőĄ-öÉ´'—ůqQ)eĄ2ĂďŁĆ:ŽńDúy3-”Ž«Ęđ]»¦ć„ĐÎ  8w—đVL Í])®5dÇ`›ăŽ)Ş8’LG¦ĺlgkk±6±—úŢÔţeŤ[ź.ń"n·m^%®ŢÝůŽ~&M±řxˇ™Ż«"f»Ł¸çčŚőJőGŘ,(×-|Ď<Ň3šx *˛xŚřd¶…íäŰľW”•¨B&u1”¸˘ĺŤůx »=|]^˘µ‰)cú.”ámË.Q/m\lä+J'Uu\p‰1‰¶=kňձ⠲´Ď~Ľ|ţ-ß,:K<%ĎD÷ŐëEj†‚č×đTúąŚ—xŁS8$ ' Aüws´ź46Á{ZBHtŁ›Ť&ë/cfľD6Bű´6‹bą”íz_Í3”Ç+ÜşŔ‚ĚÁ …ă{„Jô Ôç|™\$ÁŘ9 uŚóĺcKwó§×L%žôsöĹDţ„50ü9rÄ­¸ŔĹ‹S82V˝žů‡Ú‹ü›wŇ1Şű~Ő8Zf஠ďÍ™Óeđ'ů97’ÄY˛ąůŔ™ęąś-Rc”żąIťzq7F§S˘'jűÉ:ËăxšĽ,áç¸AÚŻT'č?ÜGgľÍ‚c&ú5ö9eW̨Mň Ţ2_Vĺ­µŹ5ěj¨WC <§hâ3†EěćňşűŤ’ĐiŘkÖ‡InŤ%Eť˛H*ęŰöéU ĺŚB°u Đ|Ś]¤Ú4 LëkWŻĎ…,˘@‡4"Ž´&´Şés…aěLMPĺC:Ş-č“jôkŞ1´O˝ëZ­Ěř4BS­Y@—d°%v誸kÁąćÚ]Ü7?h‚±m•ßS ,ŽŞÓ,¦¦]\şlĺ¬Áć`Ř0#(–üĘ#3 Íbęď}}i•YŮ&—…—¸FľëëLî‹dnŃq… ©/°űi®šŤë“]ik´ä"ăţ‰ą˙ž(%Maed-ëă¦ÚĺŃ­ŔnćŁ Ůš<Ď8^QĚ s9YáŐ3śÂ¸+uŹ$QÉë8—Ňrx@éh籤‹9ĐV»Ę8ĽŞ¨@xA¨ŃÝčmłŔťVdőĄ@Ů+'̵…újëł~Ă :đü´4gÔkŘrěů0@†ÇŢş'z_§B­6`‹~Ź#‹ď8ť>kŇZ áç!|k o.wă:…Źąë˝C5QĚ Ë ŔfĆ,,dĎ÷JláĹ· †;[»€C|TSůţ;¬x›±íż” /iË2ĚÉÔÜíŠÖmMŠI°j˘ó‡ȧ:ŃmĘęÝj`#ů°ŃM3ĺ…Ş|i1¬’ŐlgšĆ—đxš¬ŇNÉ!b™Ç±&§mrFŕýćj^Q—kŇűë´T_r§RwÓ°HjýŘÖ‰ú]ő#ú0Śg»LbôÍy”üÇ™‡Ć`¶6ą©pŰź{NµÍV “\)Çđ+y_čQęaD^řĎ.'Cĺ^ŘΙ5 ş1}»ý{ŘżŁ‚ŢĹřö€¨b¨ŰĽßRT;L; ®î¨PRďÔQx0dڎç×ÁčY(QÍŠ"iSXŢň„(iI‘ëW*0Ža^)—,n ź­‹ŹQ*‹Ââ\yxŚ0šeˇ`4ä*¶űž]1Ö°ÉŚCń5,6W·-ŚŢB° ¬xŢi”şuŽ&{ëaôëyŢţ4~Sk3Ť˝bEůAxą_“V–Ô=yG›#l "'¨ľ3-ţŕ$k 3tăz‡•Ü!Ďžß4ĺ î{3Qů_ Xv}./ĆůteŽáÇ×ňéV™79?ŰöJčTČž bO„î¦.ť ߣ‹JË”1g–‹/¶Y‹ľ§c˛l» 6çőlΠŁ:ę˝7W–´MB>łú—Oř9´rf4Đ”o4’Ę'™Ť^çÓ3®DÍv}3Ďťw‡…ă6+đÂţĽĎĘea|RÖł. ˇcŻËÚQä·íkdkűP¬˙Š„jż¸ŻËp?ŕ«ĚĎîŢÁ ĽˇŹžŤuBÔĚ'źź…ü1¸Řś*Ţ!K­ęŃ.Úl?ę` XF0[ś!cÔů#ßÚU^q ů~‚—A íe.w¨JÄGô–alÍ ?ůÇ‘qŽTj°ź{]UŐćóěÖĹúąré-49“)0o¦ÜÝ7)ÁŮ÷'@ĽËhűÓčfżţ:îĚ$ІUb95ŚęN'BK„H‰0~i ‹Â:žďPXÔCüýÓ} ¬lĎϰh÷2ű:ö‘&˝ßź™Á˘PőčţČÚ™u=–q ěĆŢ)§m˙Q?Ô1öü Ĺv-ýTěkC@Ü×*,¬Rڵŕ‡6¸5"Č0e⚦ĹęÁÖ\íô6ó&‹%i2´xݻʯÇČuşí0Hu—ĺ<¦m3Ć{ˇý¦]M­P¦Tp?,˛čęѤŚŁćV¨Ďü®&ĎvOSg˝‘ŘÓĄ/ŻÖpJ$ÜČO^˘eâş$řD·7!˙‰y„ 7Oá0ÂEi ¬RµČ‡ëy–ü =?OňJwyhµ÷l‡žńűbř66JšqŮŤźź_¦0îXŽŰ V[‡!CőĺÉÝvf3ôA.ä€Öë¦Ý€hOl^˝%!†ĘŰÖ>%n˙Nâ.ÖÚNӢ𠶜ۗ„S’!F\\ěqÖ^Řý/ÎŢ/“ßTϤĎ+‹>’”ď-r$ÁQ6™,0[–“©îC¶U›»©ď‹¸j5.·W’M p….+8R7¨ ‹úyżJ”ĺgĎAE±W” öŐďŞÚ‹ĺĚ­‹1>vgfXb^ČM8´ T©ŢI 0o¨eHî¬'^~Ţ®6O˘H/ç <šSaIwŤŔÝ×ă4{ęhR»=äŔ5 m‡‘|¦"€c<âOÄ <’¶›ŽL|ń}G?Â-Jl µ™EŢĽ°őŠś¶ě´\׺žź3ňývJŹ86%ż”UWgX:Ç6†ZőüvÇşE/7 NĆô®Ţ!¤Ćî„>ŁĐ9'Y4ć!SĘĆYĺ/•ׇ݋đjąZ'‚Ö±Á(·1űŚ›.ĺ ŞÎĽpwľ Ůrba\NËF?ď8í4Hë:Ăô‘ߦ z˘UjýËXŠeLÚÇą—Ď@›Q{č3¬áAř»š`¤Đą]-Ż×-ž 3NRŐD©%µw—;ŽIĺožöj@­Š¸ŕs16â,mÚćKoîQůZäz"˛Ó=®!¶ąś\KŢźłńžTD+śpíoŔuRO±PRŮ$–!IŐŰąsř}Óu#$ną§=&ÂŽéµŇLrXŢVLŹ-ČďÔ‘˛šôý$ÓsadLMűŞ29Š^¶MnżĹÄtI)™‰ŁÔtwv®ł°űQ] [ádĺŕ\FŹj?˛ĎV騴ТŰĺl+¸¸ŮBÍőÝ‚p%Čű(ŮeGŘÓŰťŁ'–=N'žĎlf$˛â\·Ô9«ö/ńqŇŔűŐŮVÁ‰2w_Ż„&Î˙K·¶Đĺ^•ő@ŢÔ«ů żÇC+†ą@őbľÂ.?ţqbH§;ž\­Pz‚(—ýô ¶h›ćń‰\Óá‚/ôk-ĘY9ŘÓ=·% T¦C~O¦iqyÍ„ Ăs6Ą€éĆwě±3z’÷§ąZózÂ%űáő4ó)Ă`›ňŹĚj٨ó‹ÍČn¦yOTku˘%ţÜ5mP ˙:±'ŞŚ‰ŹR%A{ÜĆî¸Ůăęؤs¸`ca€Ăw<Żr#xüR7ůţ@>ř<\P ĹŃ'XŞ>BLEJ«ăíĽSt(J[·˛ÎZç‚(_l3ĹăJj+ÜĐçqČeDúť}ú#ŇαˇńR˙`° *đőń§­Ťm”N“GÖ»2“)pÚg°zť|¸Eçť­Ćá“.›ť)7{ŞęDÂI;ś°˝Dţ”_A$ ę.—‚f,u{Ş ňOűŇ~«ŃÜŽ˙~ őŐAÁÍůMŮŃrTC†(.îŹrá ź‰rśKů #¶wľ©5É;R´ ˝ˇ°wđŹ%·wLä°ż˛YđĎN(n(‰'Żď ÉN;#Nę>mg[:”ű3j·É¸kŘúg_6˙fp‘ś4ę¬I©·ŢMőI°<Ťň›®R%ă…Q®ěAÁ¸Ą¤ÝŻ’¨R隊Ĺ›ŔPĄzľcPçŽ$ĹŰ1’µ´é«D`>AÎĹ2šŮě-´Q;1Ó ŇŐ’„br2ѲIÇĎđcť1'ˇRŇkĚ‹(ŤNĘT6”ď4_&'(ů…1=°äËv AÍx>Vă#L ‹MľDşz·ŕíę ›ß 0€‡ż*ż\Ą%9ŹňD= u ć‚AˇČu¨µł¸Ń(ńwŹ’čO_.§¤†Bkď~Q­©;N©‰[\ÇÚňžkŢpśÜc\m7ĺ âŐ˘g\ĘQ­$úA‰ăöçĘŻJăđ—ŁÎ…RŢĆËŚÇ›•ělSŢ RЇ$EâŞß\Ě•ŹPJČkp!>ĺŢąőžŇ>­V™ C(Řn}1…˝…őßžV@pű‹ő»5·ó”ŹĘM^’ÁrYHąě)s×îĹ ‚ü|0aµŘ&ΩVćŁĚw:A«ňzxÉÇ–i‚Ín§ÁőČiĐ`m_g‘ş‘şŇëqĽĄÚr#ŢĽŚ÷PkrŢ„+{–óřl2 ßľsf~foOŃz‚e´ۂnjŤÎOá:řÓ:ý mÜĹb·T ^q&SůčâĂ^™üLxÂŕÝ5KÝ!ŐNĆ»°=Š'~÷Ť<źţlň¬±Ĺ˝÷š==x\´ő‚Ţ /PŮ®ŔĺĐNŽc4XÚGמ†T«s­ÚseHFyŠĎʢýëŁV–ę•,pĐ6rť‡¦>,Mđ´]»E$>ÝnuÖňpđtrt¬§WŹŽ/ća†űu¬Ł·k„áĄ<0/4·UŁéň®¤Ěů$”úćţÖB^Q~ú,ŕĎ ×§Đľf«sź7ę×ů-Žřx$‘ ł =F˙lĹśNm“Ú˝2ËT©”Áµs§čkUÔĹ ˘çZęÁ‹{oçYŘe\¸×óĂNGzC]kőÍNĘÂ3_găWöŃ“ěď…Ë_HËŕ¸SÖ€xta’RůK…ľ×"đëhh‰ł[<Żpg˘6ȡÄ(‡ů—öĎŞ&ňj`Üł´źű˛ţÎć É)f»`żÍż|„^lŮđŁ­ÉĹéH;ţ>\Ąşż ‰;*tf Z6úü°ë˝Š˝·Ç1ř®y4Ą™ş?pëóUĄ‡6t$ĄŘΙ JçüJŠ*†9ÍAÔç—äŔ«Ëë·K·(w`7…=ŃE>ômÚçÝ^T×~Ęqň¨:c¤pËÉÇŹl€`Hqk–_® b›É>/„ ›”,Á÷w:}ŚFíŕxäťUb0 ¦ß"ĂŁp¦ężV [#\‘“ĘRšëŮěčőF ň›ľŽ!jď˝ \Ó1ĚeOJؤs e/ŤŮŰtéÂűÝť$~ýŕż8P˘EęŚÓţˇ­ÄŮn9xÂSI¦^UäđSE‹ź/Ňd‡3%ÔŤ÷ű0ŕRS¸ U)t?=łaPűűs‰ÝhaĎýąËź=:ŁŁ1v>Ő#]wtö… ą?C”ÍßL–akđ‹kť«¤ĎÓŰG+9ϸQÄëEŰ/%m‰‚”˙ş©Ĺl;ŔŤîâ·„îŚ vzG—})ńű•o%6v°tŁ%†@ÚęňVĘütŘęËqř”Ŕ,^éé\ą†{7!ŰîY&ĹöďLÓyŇőĐ—í+l4Ő—mÖ§ç_[‘P‡ű_‚ w2Č?=gŻÝ–8¶n ,K,‹ť6T]Ó?˝RY6-ń…©_l &ٵ~,u†Ěţjc˘ńĘ91QgŤĘ6ż˝ĄcÚcұ}ŕ¸SvilŢ· «Ę:Ś•7ľ*ŽŐüUĺ$Çi˝ËŠ`đxŇom_Ž0˙jŤH©|ěńúë}Ł×`fâ–H€ťä†9<¶6Ł’Đo>4ţ6¬Úoe^#^–ħ›ąBÚIăüZŕ$ĄäÇČ3•ß7ĽÖ”ĄNNšř o·1ĐŠvÇ”¶Q ×?Z!í·d:¤PqsDhü1RmŮŢE«Đíşăźó†ĚŞKg~ôě±ĆSđąß8x ďHS›‚|™ÖŚŤKý·öj>ő~®Ç;6ΙK)HôsN€|&ÎëÍíL#ó$¨1S4"î>ËÚyÝ1Î8"ÓOż»čYšg•®Ił\Ţ´™1ĂmbS€ň"sLsÍHc«C*^—ŠĘŹą]4t‡¦c+ˇ"zČS…ń SĆh¦’Ľ¨ +·§›Ě< ™My ˘FrKŁvĄ,3äŘQްmV4Ejη ˙´ÝühŽ»Ë.˙¶ď…ţ{3{:LŘ~ Ëî żW§ciqO±ŢčcµžY*EĆëćţ€ żéĎZřÔřťH‰ÝVź™łĺ˸•KrÎÝň8Ó ×ţČŰő?šű‰ú,|ćËú®ş1Qěuĺ Vż·*h0] SŢ9ô+d¨ĹxĽŠ,pn®ťB'ôp 1ŔJY‚;€{ë€ĺJůŁÂ6I»{d)Îďd(áón5Qř1Ěŕ»ń0Sť“7ŮékŇ·™É}Fť„äí/í(äŠ\{Ýräkç‡=˝G|Çun†ÄÓjÚŤü ç!š9âĚţĆ ś đ:ëŔ ”‡—ő”ş@ŻKŢŃß¨ŹŞeA›]>#űŘ0ps3 Ť®ŘWˇ>÷•xŰťn¬=6ů]9ď űÍŞâ©¶7H›Ő‚ŃTĽ¬µIä56ˇÉ˘ćX‰ôb±ŻIşŁCJ>c- ŤKť`śŢ>XcÓVž+É÷ďTś­Ć0e•µ!éÎ2ČcJÇżž®ó hXDbyM/ü ˛ş<ßNoÖ™lť+ŞJ¸¤"9TtďąÉOe«3Ů' ÂÂüúĽŕ•¨z%ű—éô:yů82FYőMOí ˘ązwáîfÇńć#p"yB*2a^źwuę˝Óúş–ź% ŐŕCď¦v©ňz°?źęçB: ż ¦nçÎ1a“;Ś—P–lžćĺBiĎé(Âóă/ęµWfÖĎDřA=Ö˘ľĺŹT@Z`g¶¨¶Öx »šVCzŠ•Z˝;zśü˘SĹĹűP×Ń6YT 7H¬E„ĐHČÍ«Ô9¬†G׾ÁQf>Ä;Úř–«YčŹZńk”ýI’nÚ’ż°B]Ŕö$pĺ®Ëłn¸ ŘďŽI‚ ˇÓ=\XCý†!•B§±ĎtßaŮÂK‘9ó™ę®‡ ›ă†‰0¨ŠhƉ˙} ô;{‹.’`+ĄÚNĺלçŹ].íýěľ­ĚSžď"˙ˇÖşjkFoq®ł%°Ż“0˛*1çÍQůh* §*JNČ +hO´ÄÉ5u-éG ±Ú]"i¶wşýź 6äŮôÄBdqnXń.ˤ¨ă®DŃú%äď¦ý•CšVP¤Äk˛%]0_tU^6–É*ÄׄőËőĄ×·5K®W;\r=ű;ó)Wâ^äÁÖ× Vv:ëĐîśü®JiqşÄО¤a° :&)ă]Ŕrsv€Š†GC¤ß˘é5Ő»Ă)M—ˇ¶Ë¨vňąĘÄ+ßr“w%9<+łČĚI„ż9ÚĚßódF"źů+~Z÷1ĎM UôŃβ=1ůˇ˙1ĹŹňÖ°1†čŐ“ƪЧÜI3 ŕóÍřÓ…ÇU}÷ ˙ÓKňHZ⤬]0˙”LXú‡˘˙ç5É›-4.–ü%|N }8€?g"ŘPÜz=€Đ,†V›@†؇[äÚĺž3ň1Â$­MP:„¸32۸řVĘ%.ĘÂW=Zwkş®Í;H€„RĽmŽÍ–ëL†J,´űiT´÷+ä›í’–.šíAD c[€‚˛J}—-4^-7™;żňá´ ,kwůZŰgf‘'ÁĽ4č´AŢ_¦”›Ą9Źö#X ×ŮăiW4ĺ5’­«ŢEw|As F۬×\âqý%¨kçecĹÖtäSĹóŰ„:şMVěč;řŕ™9¶ĺţ/pá =Ď PdÔk6ła[ÉčU~{án&yMuyĆw5řÎřT’Dܡč—ËţÇś{ź7õ|&ĺbˇDIňp_ňÍ\”EË…Mx&Žâ)ßA¤”×%‹ł¦ţW¬Ş GđsČÝŞVš˘ŇRŰĆß ßáý3„)/«·&»B@.Ůi¶;™~쾬׎ňŚ#’:õ@XnÍűCp߇L^]ú“eŹ•RżÂšĐfżl Chăňs!´´·E}n…Ąv×WPRőýáń[ŁTě…Gëbďzš×Ă^ŢĹŠ´řµPIňsÔQŇF™{‹ ÓZŮĺ§hJS‹Ü‚Ĺ( ÇY92ŢŘvß ĆYWj*ź–“ČČźô0ʵňQíy†%·wp%"É0íÄ0¸oů´šű±!ÂČ‘\N€ýŻď‘äËŮţʶ±ĽpŁĘ@ż°{[č[nžúÄČś@—CZçeŚz|(FľFđýAŞ<«¦Źx´}ĽvXlZĆ`·•ÍŞ@ď°!ŚŁI+ţw‡é¬5h‚Úl­NFn-­_Ż2f4ŢËĎaz µG_čKtg“Ć®r·»‹XűĆĘ©qíuĺë®R“ŽŮ0»öD-ŢÓP€TĎ/ŁA­ŠąBŹP ˛ĺ™“ ľ [oŁt#O>¸lÜg©—ĆřOK`÷ąôĎź4đ@)|ŐX ®ĹÇ‚ŇúÓäËľÔKśýSň‰rRńôŹŔčc¸÷64ţ­ ĄÚ»|íTŢ~jMĄ˘`b˛ŃA\ĆBLKťÝ-i±ˇŠĽöÉyöů$-Ź×,î5aFYŞ»ý§2O\Ëů^–ťĐÂ'Óh;~š5Ri6Liż üŽÎS6óŐĘŔ»AC.Jí|dč•„hť%G·´dt ¸ţ#MčÚ¬Űä4“ăç­¦ˇ€q—nŮ{xĚčÖč%“Ű~°' y˝~˛ Ý›t5#¨I\fĆĐ‹CůU¬‘eA¶lŁpŁ­–'{tů˝ń đŔeŁ[tŚ|ü×äbhuŞ$ŇM‹Í?š?η¬Ďz§Zgv­Ě[^˛¸ÓrlŔ}É@ü6ß;75­‡ćŐľ6ëŹvőeB”Ľ}„Ťáe–ů 6ĺ>—Ţzz~+ިřÂ㍔Śu°úş_Vaë¬SI”K¬Ŕ"%w3µĐ ŻŻÔ¶‹é<ĐńěUŹ“ńšlľíFŤţŁIżŤ$'2´D¸–·¸k‡ÓöçY0:4)ţˇ,q„GÜŮ»mš6űłćjZµůFéX‹%pX‚ŮűţĂ˝×Něp¦•u«í$Só çÖ«5Qµń ĄKŔ·CŢÉ"<Ö ¬ëRoŹ\Âhń uÔfÉďc­Â_vŤÜ^x°‰^+ÇeÄëaËňvgşŐż,†$›Ł ÷3ÓcÄáŞć>Ż<@u^‚„j$îĎóz ŕ[lHđx@O)‡‰-š~Ł$’™ś7>w¨ ë .ĺ6ĆîMÎSÄ(^űşˇŤŁĺŁahÝ-÷QjŚqo1Ba-¬›Ţr–šĘź7łg} ĹŞqpŰŇ YľşC!~άĽĐ=<ĚÖXŠ\ŮpÔ~N7îúDZîÚr® ,n6}Üţ…™eÁAĚă'-Isç8 BŐ}ě˙'µJřF`yő Eťf «¶´‰ps~4|­¶•îŰ‚B=Ĺ÷!eź›Óă[tpBCÄ‹‡Zą‚Y.« ”¶SďŻP)dŮĎµŞ‹hˇ rzŔĺÇď¦ô'$Hήú:¬Ä’ŘâB ovyéšÚÍň“:’ŕ怜eÝá< ÷îë-FuäS™Q’t§®š%+$ą\·Š†˙m0ËË ÁźQPl“ĽÖüGU`|]˘V­ w*rż·ë-[úĆEWéĐŢ`Ĺó¶näŽ3îáY´Ú‘ňnáÂx#=/Íşi¨z<ňnZÔâ¸ű öµűm =TÍ'µźW““ę‹®‚§„ŮŔŃţ\¸·î8»1˘­ţb[ń˙ˇAŽűKĺCGÎÚ·F×ZN(PZDüö›„×± Ö@`gR‡™Ź­­žŐ ×{Án%9’śŇ_Úź śćS® ©OKĐ€‹ö^}˙DnđpQ{šŻ Îżpbp0˙Ě tô˙‚÷˘]˙V4#XܧĐ /–ž±žü'Á%^ŔmśԪ©ĘŞ· ŮďŘG±»Ć ¸$UF¸ŢŞ8Jr˝Ç`EˇżoO-4¦‡Î9]ľáÄßÁ·ťI˝D(±¨ÓHé›BóK*&Őć)żŞ”˝ÇÔŘ(ਵćďV˛q_ĐŽŘtÍ ć°Lů?''!ĂvĘĂ  łuy ćFřr#Ţ"ÜärR4tů°'źOž3ţ%lWűHëíRµź˙áďe5ř=N©t­Ă5˛ň›„80É6+۬“ʆڭq2-»äTĺE‚–\Á-wŔŘň*7IIZ“đđÜŻ€u~ÍKą™OéS˙U~ľŹJfÝŠ!} >Ů;f-Vî­J»ŐţĎ“†c8;Ę[*iíđ–;Đrô˙^ţ[âž=TWŚś!%<ÚÉü ŮLkĚqă  đěóE(•sÂ::íKŢĎÎŰÇÍŠWÁ§ ř2t łŘuw»"'ă˙SYćˇď¦!Ş‚}FWTÝ4ĺ8źA"‰ĹĺĎÂÚ&ĽňĄßYş°OŽúµ &{é%CĆ~GZŐ Ń+É8`Dü»Rů CGV—Zŕ>銆8Sn·+ĂC4§‘ţÉ3i*Á8€űÝă2MŻ_c.{`*ŔK©Äó±Â TŘŇÉŐđ‡|3}ŕ„—ÓŞŤFj±źîÔőt‹0 qů?©ĺ»"ˇIĺ&6Ů˙Aźŕg7Ä >ĘŐ/¸y#¨ädřőަâçđţó·ż.j)T§°7 Ŕ‰ř¶e{`ur µ—aĽH˘~y~ZÖÝhĚçJ7Ţç2cOď+¦M1žrL%Q´Â:&§íÎĚ6‰5) yĐ6r Ę—µ,Př*Íçű®`Űu‚Ĺżľň•:ŇŃŘîö­Ęĺđ‹ŠŁjťäąÖřjjPŕŤřLŃĄH»™¸ž˙ #Ł#»ĐđZČ“™cŕ¦ěÜ–D"†a ůťŽE;Ţ+ô ¤Ăć+4{¬ˇÍ)ĂŚĚčâNv§łŰôţ–ţľč¦uÎ üřÚűÁ:ݸ-39ŢDzďd2H˙ ôş9őčôz –łĎ?÷¦ŘV[FĐ@ág“zŇß:NŤF‰ç4¦oĘ6 >ZkGgq˙»ÔŇ–§>¬Fř•ýÄ4‚ă*d%:Tnń†@µnűśÚr}éUÚ«ŢńČťŘ], Ş7BčşG„óÍËSKí§rh± â?ŇßLRÍÇ& ¶ ľżB¨Ô„0}DĎ‚T$,uâŠ^·č9‹ď T˙ł€ąŃĹ/ď(˝HµÔ Â0jJŤüG‡ˇ·†ĺH˘FťIxm†ůQő3k˝b« ŤüV´V2Ą9ç®6·]ŕ˙µŃŔ|Ĺ„|˙…űĘĘSČ)Ôugőt–cűšůĎŔ™ą Ź”.ÍdŁÂ_/»¨˛`稙K ak_=ž·ˇRcřžN”źó„Çiýű?Tŕá ă«°4©n¤łâ3Č ă§ę•c˛”mčýtísO»¤M0†ä„^K×qă&ŰÉ×*˙!ŽĐÁ'ŤŢ=Ö‹oô„0ˢřw‡be˘Zuďř}Ř9µA:ńâB«V_fďĹ'7B Ků+V…±Ž"Ş)Ő´Â$‘ÜlďA9(Ý"ČýŻT4‚ßĺ€mŞďĽ1´?Ń`čOt“$ÁSIŃ3‡ř #Ýéo‡7v=ţžöXTQäővYµ’c%4ŕ·ű…BşëQ 0ôB$uď]LęU˝ýĚľšQŠť8e ǧZ+äHŢ*Ď…ŁiČńFJ‘ŚŚg2¨ë.Á —îiŰ!ĂWl­G Mń"ŞJ»U–.DnÜ}™08ĺIŔuVéQ RőTSÄOŔť—}˘đŃÄAl‚#Ň endstream endobj 1262 0 obj << /Type /FontDescriptor /FontName /FIYGZI+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/quotedbl/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1261 0 R >> endobj 1263 0 obj << /Length1 1626 /Length2 15654 /Length3 0 /Length 16502 /Filter /FlateDecode >> stream xÚ­¶UPĄÝ˛%Š»»łpwwwwwîîP8îîîî…N…»»Ű­ďî>űö}é{VÄ7SFŽĚ‘sƢ QVc1w4J::¸1°02ó­íMÝ]Uíyä€ćÖ€żv8 1 ‰›µŁ¸‰ 4ͬ¬8 €Ł“·‹µĄ•€ZCU‹†ŽŽţż,˙„L˝˙§ço¦«µĄ€ňď‡ĐÎŃÉčŕöâ˙:Q ¸YÖv@€’˛ŽŚ˘€ZJQ tşŘ”ÝMí¬ÍňÖf@W ŔÂŃ`÷ďŔĚŃÁÜúźÖ\˙b‰¸L®N@3ëżi@/3 Ó?.z€ĐĹŢÚŐőď7ŔÚ`ébâŕöwnŽk3;wóüµ[8ţ‹“‹ăßűżľż`ĘŽ®n®f.ÖNn€żU•Ĺ%˙ÍÓÍĘÄíźÚ®ÖÝG‹ż‘ćŽfî˙´ô/ß_ż^7kW€ĐËíźZ¦@€ąµ«“ť‰÷ßÚÁś\¬˙EĂÝŐÚÁňżĐ\€–&.ćv@W׿0±˙™Îő řßş7qr˛óţW¶ăż˘ţk7W ť# ëßšfnk[Z;Ŕ1ýł+2ŽćŰÍÝťţ§ĎčňŻQ˙ł34I;:ŘyĚpLŠŽnK¨˙ďTfüďůżAâ˙˙[äý˙'îjôż]â˙ż÷ů?ˇ%ÝíěMě˙.ŔżßŔßGĆÄđ÷ťČţyhÜí˙_)&öÖvŢ˙_I˙­ü7[QG;ó˙ôɸ™ü‰ĺ_Y™˙m´v•´öš+[»™Y,LěţÎë_v s ‹ťµđŻ®˙)€…™ů?|ęVÖf¶˙ŔńoĐÁü?é˙•ę_䙥”µ$UéţŹëż•˙.›ş·Ó_n˙ŁGó˙uřFTÔŃ ŕËŔÂÉ ``cgů{÷ţâádö˙?”üËťLÜ\¬˝zűffůW÷˙ă÷_'˙€‘p0s4˙gmÔÜLĚ˙nÚ˙2üă6swqů+đż.˙ß®˙çů_;zÍŕV—ÍřBm2˛3ݰóG§ÄőűYŔGÜʛŐKŠ‚ęű3"·yŞŤßëĂ[fx?;˝—Nť>öei~öcŮQőĄ/ üÉhŠP7(»ąč‚™ Ë3Ď´b|Żĺ· t9™5v¦TT ËޡgşŮ\`®žh‚Č<Š‚0ČťĚŇ›â1{PZ@ĐŠOĎ(“Źź©†ÇÇFGún öńéňâa)řL°ROIRÜĽŤ]î›Í>!_=¸ś@4ĆÝťteWĹÍ[»˛,j7hł™†čjµw–ęëďěR5 bDíËÄUÜëŹçĄś!Ú‡‡—Aš˛H*!_5úźb[Ý "Ćáfą9 eŮj:¨Ł,űŃŁN@!*äĽŘĆ}X9R•|k4 ŕP|4Í:řě˝8ĺ 繀ĐÉňů}ýí'˛)ÔZ©v?Ě q¬DK÷Š;Î4U`DFŻ|ĎšőőćOÓ± đ4(á{ľÄ$šqí¸ÚmS^ěźĄŹ¤Ĺď›ůĽ ułÇk6°ŢpŘ3ÖkË™›iÚ÷–5 _ř_+!¸Ś“/ ‹ĄsňtÄź’ČbŔjÖ`Łć7 Â*GD§IZËu€7 Z˛ˇł\;Ô,OëöĐVčŽ5eńXzFÁEzĆ Ń"ă¦T­Ű›»’ő2ZjÁŃşz°÷7wě^‚Ąh7ürçŮůÍ%ÂśčóC[Ć>á?Î@aŠű–« wôŢo0}9QęŚÚs3X‰tÂóŞÂľÖŇl†°† vł_sŇŢíĂ !| 6 Ź’ćâx|±ŚŐš2FĆúóΩPŻŹ!ëŚÜEĐn ą®§Ý°}S‚«‹Ço[Ź źşq÷‰­~9 ő[\RđA“ŰŐLâ%#BMŮ'7ß­hĂŚ>-ú~29Ą×LŘg•Ý7?¨´Ţl\˛2¨á=MtQ:ľ±›Őúá/„’¬C™6ŁxŇyňh bĎbvy!'ćý 3I 1&L»¨`óL˛Á˘mpyZĂ#îčU[c:qÍs*üAň ĆămÄö˘´ ›ęč°‘¬#]¦Çöˇ÷Úľśüńµ7ÓgµUbîźČ`|7Ăo ™Î ţ•nĺ&;S~ŕ_)Řý;čÚ ňÇ÷´‡ ÓUĺýĆÖîz/©Î^2KË6:Lú«ćÎ#HŔ%RžkĐ.ëŕż‚’Ó…Ů$ŁÎjĐÜuôN Ş­«śjółNŇ>ŞűçďNŇč÷Ĝć]Ť1 0ÝĘĂ0Dz…ĺW ±=¸kXŹá“Ţ»zŢ6™ě<ą9”*Î4-A ÚÖ7ýŹř…É7Eş´ąá"]Hřżř i6TQ4#t~·cšp–˛›i¬çKńŕýq—‘ ŕ XréIDL˙(ÖEÝ/Ě 'Í~ďBMGEâ]ęb— rX˙™93#BÎsOŢŕÄE§-l«Ú˘uń·Ů|Š)Xrč;4#r/B—íĐÝ„O[ÂĚĎ 8@ě#ż‰Ĺ‘±#šŐHL˛ŮH‹šg(çä× ń¤ŕá)#¨Ť,"đĂ®śŘoL”¶Ť ťÓőä-ž˛KV'ĆÇć6Ş7*ĺgřćU®ľB­eŐŐă)`kż9Eˇs‡0Áo|5E2$䫬ůˇŚňXÍÎ\ő[Lť8S¨¬™íˇ± …T"Ó.Ůç#˘ş+©ŔĚw†ŽŹ4<“™¨˙–ů)Č Â/1ąÓŤç€đ‹`%1xˇ‰ŁEź &ĺKDRÁµ!Ž9ąÁ>hfYÚ]ňŤ5Çn´ËFE÷ţ‡ńö§>‘0´­€qĽp;2xڬŐćTk'‰ÇŔcz4µ,M±K(şlgşFS/”üç[χ.,_µxWřgßTß^ŕ"n{±¸![Íú™™ävQ˘<Ż3Š(Ř›Ą˙đ]Ć1)őL'ývcýřÍô(—Ëŕ+uD Ş#±\/5u~F+P{ťĄ3ęś’ÔLÍÓ4§6N>ţý#źěW?âFż–a˝âŹ‚ľş‚ /ÚÉč„Cä-OCyÝłVďÔĽČ-Oˇ7çXżOP ¶6ÓĆ»fnÎéôô¦ ¶Ůlšu[ןśŹ= {ŞzĄfx"+;śŕG:)K~Śa@âŽČ áۤľeŞP˘ŞîÁ­NŠÍĹ#4 ˛ťGŰô›š|č‰ ĆĺIb’äŚó8â:łžĚ>i˘č×í;ĂÁ“Ďަ…}Ţźô%>ýĆoŇt”ëŇB“qéwŮboß6eÓ¦ěO‘xďĹđ©ÎAIKöÎ4†;ĐGËŚÄ«Ż(űłSÎ,VoWĆC˙Ý ÄwÁ›ÓO?ťüIˇdÚŕřۚʡ†©ĎĚÄß°wŕ^2çä÷l»¶®Fľ. ]‚2—Š‘ö…ŁÉcÉ4h ˝âüć_¶‘Ľ<éx>˘ÇRńT¬Ś•Z/?Ť÷ÂIF߉ĎDŕ&o O)F–Ďí’¬áZµiňţ9ŹIęłVö>ŐĎ[$YČĚĘ pJŞî˝gŠ^~=ČŐ“čnIG6©j 既ؑôË3BË*CXÚíŐ.Ę|Ôđu4łÉ(× ¶z»ö9Zr¬¬ ±ŕˇűłFDŻnZëţlMݨńB~9^ćHÁg&í€­ąž„ź¨­műŔ䢣h…hâZؤ–˙µ#ä2×,Š'‹]yTÔˇ!r—BfP8,UűĂÖç(#rä‹/–ěíŃűo§ć&š€~R„ÄçnűĘ`Éč öĺ8†^8şúĐбNö™őź/˛(Ł„C>Ižúđ–öěC4Ë‘qE«źß‡ŮÍLŃ|ôč0j©µČ˛¶±ś=š¨źŽQ–3‹óx&ěěΙ ŻŻÓĺSj?ż»VŞśr–ă*­„©r~łYuZ4,'IűšS­Ďk*Ť2cGŐGiťI‚ĘóőÁcudGÁ˝•Ád=/ĎęúrÎłOş×.Żsé^`Ęe’ެĆ%Lľ®·{0  ŕ*p—\ß=WR;ł\ń0…a˝2jât™®= w˙‚p{wĐ×ËŐxŢă;Ţé]mĄIŕ¨@Í?W㺉"rę$´Żdřž«÷3{­ĐU±Ň+Ó¦>Ő7Ť?Őص s苊ĹŇŰÓďçŮś¶™(}CDľźőͬ¬—\u6–ô÷ëŻ{¨9}§’Ň"ŢÉnĂ…2«é§b#ŇH„Ú>[;=‘ŻžXľ7» űx=,8#'ĚěÝlä)l.##7¨.lótî*…M†‡źţQ¬­Ŕ‰_Nü˘ Óxü’p»,jôóişjĹ’Ěj"6L@N÷?ŇŃíźŕ=]íŻyĆő›9\Ý‘úň!W‚ó|AśÁ×ö÷e~ŹÇ„ńÝ$žr7B€ź=ë÷yĂÍ!ľł ±coĽSR7l ôôć—†XÖ¦RŐ¦’ĚäҢÎPÉC•Gňt {ć©ůxÝůŃđ”⬾mł#ô4Í(LLâ~•V)aç”1›«.‚ÇĐ` K ě÷WR,„Qň‰b$vJĺ[j-·Ó3ĐşÓ<óüFł4Ď—Éč.GűČtÎcf R)*˛ Őe›"’ĎD:;µ˘¨9Ď(IÁ?”A”®AąC@{+=ů­ýˇŽ;•Ă<kŠ6óEyŮ„ţ Ż'rű˝űĆË5ëÜaĎU¤%ć6iýf¬j/¤ßÚˇz’˙VhX}:8ĆőćI™Eż‰áA(V(ŃĎňŽU˝T"TŠí{:™r 4c°¦-mŹłŹž&3˘ř‡“j™ÍŤ&§mdâ¦Wř›?ĽPČ‚}L5˙U |űwgUMs`nTXżU áť7UŻś¬ÄŻ»óĽÎŰ˝XĂëĽ>IŻ_Ős”4‹R©č©ţ EY¦ą2„-¤»żř]:‘`ŕHń/żÓ/j0ÝŕcŞń™đ8|9z…řg:k)Ä<Üf¸"ôĎT łÉ{¨dńm6|ńý¬5Őoi<'Ź:FóG>Ż+˙LGRîśhOŞxT7×ňßF“ÓÁvűČśWŚ×_“ŃăhĹfžŚ_ #npZMŰCŠ>#»jFXYE µÁűnBżľ%~«Jv6o^51p¦÷@¦—LÝŇVyĘť¬öőÍVúşößßÁZďôĚe_5Óü*ü±XäxQŠK˝řnJą0Ě…a(‹˙éťŃ źľ„Ŕúwo<"éóY7U±Ó©UyűpLĄPš®\(‰kŤ^d’I׫:ŻAň®ńűř-ň!S¸âĐŮqĆŁ­Ęò®Tĺ}’:8©sâÚ uDą~ŔÍţő:¤¶ś¸x Čš{šęÜ —ď¶ŰJEőÔ˝ž-k‹µźÎ,­łtűŽ„ř-3 ötN{3Ţŕ_—ČL‹ äI:c·Ĺ1%{Ŕ ĂRŐfĄ_'}•;“Żŕôt§ĚŹç—ű )rŤDD{“[aµ¦%^‚ăZü¸öďe(|x uZtH´uáZikZ©-Č 4rž‹ő¬ř ¬\l{Ř!L_PőÜAD‰3ÔÉ`hW—žç…‰ňJí„Âý˝8 ŕKl:ÄttŔşę»VpČ ­ś%'Íđ­T^ŕî¬ëg0e$|“RN^ţťŢ(3Ŕ˛Ś‹ń;Ďu}Ó5„ěi„|¦Ç•Šś‡VđŚ«ťk$ňďá‹ĹŮ'©µX(ÚýÂÜ!m¸NS ţňqÇ’–NŕOÄ—kŘj{#dfoUŤM`ă9µ;ź·o|&ű/ä(ßFOÍŁÍâo÷Y,‚VuŇyŹhĄćě ÷ÝQ (ČV !ń6 |őDŁ,.I”P§TFsr’®%Ok+‡ňË(X§|µş`#@nKďf ŠĂŤÇ˝Í”_V´\˛Č ™±TóšĽńG°H\wIUc ,±’Çľyű9>¶¨pމ~‘ÇĐ]şôęß›…/§ź(?[Şбv;Ź·5SďźĹvXôžebU4Ëä‹ęW–ž›§Ä=÷~@[:LN­j…¶łxJ6Ŕ˛ROHŘ8⬓<•ť˙żÍLyy$š37N iőyЬpÁTę[$bď6_Îf–r.“ŘTIwɆ>G%ýBT-Z¬ß,żĹ%Z6ű!ž6L¦É™Vµ¨űľžĘ’üFćBŚŹž€¬™5`>ŮŻ,T2AăSů e>tł¦Ś™a‘WŢ#¸śŔ°´ĂđŽÓ˝î¸jĎ'>dČ":{'ŇZ,%,–ă2¬0ľöĺ)o§­"ęWˇ7D\f·ňµ#xž áóL0/‹~Ťî‘jĐţΧ"\w 2úMY’9ç­FŁ®e[ Řýë}!aRđü&rP´DĄărnŢŃŃa3š Kë¸íí(Ëjm"Ź!npÄŘ]Z§Ű űŢwMwÖVq]ĘJô÷­ Ný ?‹±íÂ?PKO.®Ë0MvN¶±qĄ¶ÖĆAŻůvĆ9ÇÄŃă'd+Ҩ ·­Él€‡/r|ő[4ýšTîíĆč{TąxJXÖf*ŕÁ©…ó+ćČ rĐŹ€UË÷-đ?Ŕů{<Í‚*»űW%ŹTřÖÓnŮo;€Ř…ťj¬öđwřęMů'Bw¤€ÓUď ~…Őś/%ť×ťćúÉKu,MŻÁů·°tđŔHĎ/#ýXiʶ2U’ Úéű¤vH;ÝŁş®ę Ĥé"ţ_€ąŢú€xmö ?DźÓl˙´®ër»\–öqpň&ӟȤ»Yąíóµ®a-Çnţą±!čŠńI:Ş,‹+8k¦ĺšT D:äŐ2Żqŕ ÄbJ ĚđíZ‹ňó¶č˝GšřŞŠ#@X4N;ŠOž­}E6„:aجGŮóěaqł +¤ßęSKÖ~ú»lŮśŞ`hË&BD(ˇ®Ëe˘XO=+7ćś «)ąĆTcö'N<Ďv~ Ř±ŞŤĂŮĆ0R\nŽĽ‡ňď¬'«®‘M¤ÉĆuş äčpç¸Yłóď‰^c‹#vúq÷ś|О˛xµĆš ŻĽŞ˘p¸ďaJ­|_˛ŹFt:ă=·ańóänćń'"˙ë]ášw/ #”Č)V Ť,!DÜĐ}˙xşŔOö?7]ÖŽîjPYřfŕ´Ň{Yĺ¤ĘOŞ‘?tłÇ©ąĚőĚk(ďj2â 9®ÁŐ i)0(Ů_Ëő{dú™¨äĂśÂLD ř+d2 Č‡’°Q\ß9y §Î/Çf ăÁ4f«×’"Žßv ŕCÂňĽ˛ ÉBg)ů}×ĹQŁëKC®Kajüĺš”ĆŢBĹî±({ pŃË5ĆOŐ• ‚ú9ÂW´3‹Ľ ť/şzÄy7¨¸Ďé]ş`źF!]¶ńC<†Ł㧸 ÷\-ݬg·řËíHĚýEí˘’,ÄüŻsiÔ5tÜ:‰WžŢ쬓Đń­˘ýő3´›®Č»¨);Ě–ú/2µĂ‘“QG«ę§Žżž†vŠrŔ‡ěŻ3ȧ™Ütb™Z&ţŔ•+¬."8/ŁtÝJ·üí©đN— !ĹČ[¨Üë6~5˘Ůd†&Jë(ö=*ʦ豧ÎÁ węGwëĺ"“mĹŔ Ýa‰‡śÔ€Ţű\{čo=G?§–Wau]÷!ëOŁ+PFDšZ6SÝíĄw± h}KOmÖB”N!’ěfJ‚&j»Â;~Â.®J ú÷rÝëň6ß‹¤µWµ öj^D­‚Ys°9q¸f'•…ÍEfâ·ĂŇĄŐLČ[Ö°1}ű%şĐŔAŻř$ O‡X•]şîC¡ÔÚáţ0™ţ‘ÎÖI€r¸ž·0:E&d_×ędďXrfZ×' P ď>÷âw¶«—rŞd¶aK ¶5­Ż;ľZ@Ö:Űήš"jőëm˘%1ŹYhqÖúŽâÎO˙‡JóÜ’µ ‚Űő«ęYiĐ×aŢ{F.ˇ!ô´a”v4OşÚő…8źv‘A3iĂ%źęÚci[]?¸Km+®V¤ůÎU?kíĄâÁ s4Y×Ő«5tŰT@ü3JĆŚB«RěyBöTĄ˛Ŕ†B9,űX–Ş0gďÔëh …%Ő'ö°yA¬¦tóôü­J-¸s3߲_äĐ™6ĄÝŹłG¬U™Żő3uÜĘ ę" ą«?i§at5źµŕ‹¸AXËCľvî\,»ţ» Öyłx ¤DćłŇ3ěšđ} Ă&»%=Çîxß˝1‚u^ż]Γ,Fű´VŹď„qÁâCw•äOî1ŚĎŐÍÓ3ÖĹ+m0:Ü=âydŤĘ~Q4UßőŹ6üđ1hĽ#Ö§ß©xłiÉAďüë›ëüxüČÔ#í_Ś$‰(ěýAV€ćÍ3y¬´$Y>ţí+îs8vđah–\ŻxŇM‰ÖřAÚĹŞśUčÔµUőĽ‹îat´ąÚtĘlZMlÓşú8 ŚŻÎĎ<ÉN–,J|6ňRAŚ8:vŹňz.BŮoîTYŰŐůc´ň©@Ń‚!;ÉĘÁDIůˇę4r™ĹVĐBżá4—ݱ•Łâö+ú}jo¦ó’ ˙H†Öx ĂvET‹îľ ÖŻ2ZK§'ż›öčT¦”q   2;ĄŐŁ bYŇĺÉé˘pEgq¬ˇ˙QŞJďGŤ¬.Ľ¦·p\7îúy—üývm¬IÖ¦f4kŘë°|B˝Ó®á¶„ę:˛ż<‹ř†Ý‘„Šs%¦pqţěÝÚv5o– qU`­ËÝ[vx!¶řÇň¤ĺ;“Ä‚ŮRŚu†IËąp·äG4DčOś"G±°-°’ťQ‡áü¦@Hú0„Iö7­¤âˇrr°­Îfý8řSâyżŃ’ÂC˙倥cĚüľ{«: ‚Tbĺ†ŮLq”)ŃĘ çńű9Cakžm#CÚKć'{•â_Fł¬tź ĆŠ¤(wbcÉ››opt¸ÜstĎ8ŰÁEm9°`ućTŽ>öţ¸AVgHgĚëw KP4ç–˘jŕŠĚ Ř žßó›3ŠaÁŘ\żÜe@ăt`·,†SÉŞEČ™–sńŰ.¦ŇľEÔú»uŕ0´Iżn˘öߏ›<˧i‚ĹÁ8[ÚľKě×Fť­+—ăń“¨ âČUŞI×ls’–Ě86˘ ŐĄđd´Á‹Ö¨&ßѡť™­@ĄďŰ/ś0o!h‡\Tĺ†s¶LŽ)W’/Ĺç+Äěä>>µ,ŃÍO8Ń”.‰†$1HżĆ†˝ň¸‚:uŇD#Ú áŹüĂD@Óü:vn”TóĽ6Ó8 Ů„%$Ŕ•ż- Ea(±<r÷$ýý 4ˇĺ›ĺ04ćÜ@@‡-îłÝC‘XáŹpP·ĆĽ¦„zyŠÂÂeĽíŐtµ•V°ÍžLމíVbĆŮň`¶«˙<ßz@§í÷%ŢMA-¨~3Ď\ślÓ Ą)סMČRŠzŰÝ»|Źe|˘˛Áľ:M.[B÷ý¸ ŮÉÄ´ăfŘ 8Ë}Č<®_3Ű]¤l¦čéZţaĂ‚÷óÂE\Ş;»Âd1B¨ öŘčv*Ú0¸Xě4—{QÓţË$ĹRG,‚§@%ř¨DťKb OM×›‹Tîv=€fŃ?Žö‘?-›¸}N-ÉRŢŽµ“F‘’wJĹ\.ÓÍaŕĚvSŁe™$Ög›Č…ꍹń] Ěz˘ ŔkXˇŤvĂťŇU‘ÝĺX•ł€ůÜ´ˇdś*ô®Ůűˇ°Áf·<ś˙ďęĄćĄYĚ ČzŻ„hX§¨€ż-ϝٲ+[GwW#!c— d¨ °\ŁáĘg¦[/ő/s.˛±ˇý‘Ë×)˙ÍZc©oŰ}DO§3u(÷mef"T$t:ĺ&.ÎţťuCŔÜš;Á2żMô]›"+BçVç©Y>\¤fPcÝAj/¬žŃ¶ŇB˝¦€Ř˙ćmLB˙§{ŚéńŠřçĺ±*ŻĂwŔ˙˛té稂űjŇłŃP˘Ëw \FnŞŇ†¶©ČăÜ.e¦uś'M¤ĺo—ßCYn´Ç%€\™­Áʨ+‹ßWĆKÓY 3mçO˝´“héčŽ6Ž«K˝µ~IÜ;u#¬¶Č§Á"'|≮]&Î’&:ÝZć'ź¨Č\‘#xUť+Fw¤ó‡q·]ĆđŹԔˣYŘĺ DiKëFű¨ćG6ČÝ5’bm·cDüP,%18-ßwňu‘Čĺŕ,Fř^ˇ¤Űáµ~Ą I˛Ź)SB`eApQ|P¶óŹ7m!CąćşËŕŻ˙a ÍľďĆaš˝8/%ɇ~%űö…ČŠ@Ä~HXpŃNëŽ,Ąé·•˙ě˙6Ň\F‰ÝäÉrźˇÉ‘[4{ę/7±çjŔ)ü…f%%¬®˝”"„‡Ő„5Zeá|xÝýYdÜ:‚€×:ĐÄ=~# ď1Ö®yúĺąĺv/W‚R9 woŢN®:u!ôółĘŃÓ€>Čç÷”‘ÝKP‡S°[ł€ŕ­Ä3 "ŔPŹ]\1"/PĄOĐ¬Ś“ÚM”ĆI–ű>±lëX^<‘Ľ†Ń¶v=Č ‡…ĘMúű°XŚE›‚bÉ".pc»ŔF™IÎ36űÄXý®łĘô'ôľŠą,Ŕđ–™ĺ±šÔĚôA4ńÄóÓ!kĺýîCâF"jşžvC~s‚Řó»šÇeĆ0ďQU·§'ďÔŚűb7O䧸¤ř˙ĺ®é8n€?W±ş!Ü,ÚYĂüzc´ł4<(ˇĐř†?Há>9ƬŽýüĆśË-6ťaUí[ˇ_Ävv”ݲ’ćĎ?Ď/$ ˛}ttUA]z%řś¤­řE˘¶¸ý Mőgř-WhjÇŐ˘ ¶Kß ‹a—)¤ÖbŻ#Ţ-ć ş¦šőëUx]Ä˝$µÚ}á8€cŢA™ ÁŰ(DÚĐ|:O«#Ö-Ń‘rĽO  ››ÖČ/-A<7v–Á?úRá_Ś®hN* /ŻýDóáô˘  ™ęv“*ŢťS8ý©ëč“/măi_ş(xg›/ĄNî¦o;nóľîLk§sÚÍIb“ř%Ͷ}V}ë×jŞ4ŐlŰtH3­Š%ÍR«ż€űârzľ‚°ţ<ó0¦u¦1.c~Ć?<ÚŁĆN6ţsŠyÍ5[µęk{.W_ýDśv;őB –†‹C¬h ”g=B‰clG-n&T/śŞ. nó·˘jŢŽ–•ů¶XGH™ >oˇc8ĆîŮÖěé!:ćZT‘obMmžęeĂőŇj Îý3ű`îá©—/™´(ŃŰV™jŕ}¶!™Dv?ř—Säo^˛Ţ .Ůă6ű®KçĽNňO'~$zwQZÍ–uf„4ŇlË/FüŕĂ&rŕ8+”7â­Ř;ăT’6;b…ödJ7™‡ĺođr‡SŚć_p ňŇ~"é/o”Ý€MaĄTÓ±LÝËG_#őűÝ Ž™_Úí%ňę ŰHÜšxŐ<ď|7ŮÄ˝{}Ńşöëů\ˇź“…—ŮÜŞlüzŘŞ°xĹ9µžr»ĺneëŃ®iőTšŃ% "őúâ¶a¸AńJŃF=P_|ZůÝ öĚFjđx+j-:§pUŰ2łţč3 =1|۸űhŻ@4ŃmŞ®É}Żá)ĽČë;Jż:DÉG˛»/ľ¦@âCźVŢG„ Úa—CĄŞă8ŮE]Ď‚ÔqŁĹr:•mśĐŠ6ôH çČ陕 &Ď©ˇ~ď(V(†,§ýh]„'=ô§c†TEńF ‚Kz3Ëč!źZ˛ôřńĚÜ㍮—Ţ6-m1Ó/(ĄřÉjč®őcq¶c®ŕ•鲸ž\PŤĘc‘ziëÚĽÔ=8ý3ki|ĺ{Á⪠ Ď’ŰžPAÖ…) ę–Ë–˛ťS\ ‘`ťŢĽŇlŕbČŚĚŃÓ*řÄ˙ŔM s?&De• tîжSˇć8ě89LőM­H ˝‚ˇÍZÁ3G†¦3ňb*Ň:ÓŃu~˛i¬E0Îo«c—Ȇ V/Ąćµňśţ<ßow}By¤5«B-… Sîś5č3‘w,Ľ® ŹÓŽX+«ď3űŰ×oÚÄŞ[8ň­ű\W·rZęyş6%ähä¦ir€Ś^¦J ĹW[Ęlě)óůűFĄC@Ë)ňm(Ž~ôő ćôĐQ¨"SµůQ—𡬡ԛvĽVwď°ŕsĽůČÄAŮvĂűďŘVő©WRů‰Ś|äw \m ¦Šää•b±ź¬ŽÂU(ď¨č¤kBłCpÖtNűűĎa}! T06;$ÚÎ0ć˝±>q€\ZO äZ¨-ŘnÜÄׂŒěŘ8 ÷Łź#ź7ľ+˝·=ťFż5±}ć#›‹óí–zwމŰΙźJĐ&¬]ă± g¶ĐűeËŰŮ WŠBöÝQňGąŚţ0Ó$·ŽlT¶wOhÎĹ x¦ŤĐž%K h¸}^řËtq©ŃÄ «ž…ŤG;łÚź!~gŢŮ#–ńń®\Z|>˝Đýţ«Ól!EĚç;ÖýHšţ>U ~ FĆ‹;ðô«ţŁłPřD¤­łŃ§_y[úČt9{šĘî+ľŕqŐí‰FŐşa3îó‰¸qźÖ3™¤#řľI I DśŁś%[ßéŁumî~IMŔ"EâË*–©é­§öž%éČÜĽ0/nłcö§$/şa_ú˘©č{Ü ĺ.6é+»–ÓŘĎîyĽ|ˇ˙rG–ţ¤rĽÚNDőZvuŽ/eA ˛Âtiް…jg#śßĚäµ:Ëä´r*`Pĺvç˙:gYʦҺőĐżň)¬‚Ă;¦Âˇ#äÖ¬ń„9ąpŽsZ*şM>ޤ8ßs‹>ޱ dl­#S~DŤX›¬vŐŁOĐěŰщđŘŕČ6‡ćo¸Ę ݆bńŇż»ČqG đL@şŹ·™Ď­(Š¨ËľM|‹ZM.šfßľßó/Tk‘LŮ ‰˙±ůdłr#ßŇ;ëÔ˛DřFďÁ(6ÖPŤˇA^­gH×ĂÄB0qÉĽ ¦‘!Ü× mýq`*ŕů47{îŃb:ŕôZźK!ééÖF Up•[ÔNĄvŁ“ĺ“GQWg#p÷ˇ/*QQ0˛w;ʍÝ#%ă$=+ţĹa#L‰;—řýÔ)MFk–gÄ"U Ň1V—IkĄÓËóVřéľ8kîXŁCبˇµ#ř±Ců‡Ąý$ţňLD„W°×b•đHáŘ#»™nYŘŮxi«¤7bŢŻŐę >Š1 )ąŤŹŤ)ĹnźŤ"79ŃáTón˘i4™O)X «îŻ‹_ź ÝZ“ąÎŁ=V×_Ë„Mťß̦ŐÓśA|+'Ę ŹhýżÂđS»“ٍpŢcótHŹH_÷ÚFX! ŢHŞřC©ˇĂĆ0ńK\ŮCA‰Ę‡ĺźÖ…ç¸fůÍO %Ä=Ăم܆\gi?(·Ůc9t†h0řż |Vř2;OŁ9Ň#KV÷Ź?¨Żyp'™˘u0ŐÄ$űĺĆú8”äŞÝfZ—Ĺ1îTôűńCI©öý?>y~®™G]Ľť9ˇŚ×=Qni4n˛bđ´|˙áGüíqśüŰCéÜđj´yRpOq]YŹĂZe@ °°”Ú^V7y¸Ń®Ŕ ôŁą<,xDSŮp{í/’SI_iü«ŞŰžĘĹîmkvă˝»čľçÖG‘‰ë˛§IC‹űú}ű…-˘Ăzüý¸JÜ>¤Â¦Ë¦EhĄ$Žúăcd MňŤ‹ý+%­ŕŚ 4p”„ yhʲ§ »ňŇ‘˘Ő‘l)§EL]šŹ>N8%ÍŽ˝Ëúéńňţ‚Ţb1I{|9‡ÝĐm.Ľ†µűŠyă‚U’#—f v[ѡŰŢMiµ1 Ę ů% ŰYű«˝ŚźX9|´»­°ŕsSűÖűç]­\Gú#ŘţhN#Ę@”Ú/ żÇV]ř+[)ŻĹ1qfuÍI-hly¶¦‚”.SÔ5»ňc‹:8xĆL}˛)t„ßĺá#ÎťeNm‰°JAĂŽíţeg‚<.˝ Ě^ą6–±]ą@Űa^ěžř–Ł&‚¨‘.˝hR`‘6ߏĘŘô„Ë7aq÷0˝±Y«ŢLÖ\q|Ń€—Kg'7ńtAfÔČ?HÖ†\Jy´áuíľ>§ŹŁČ0‰Ąĺm{CaÜźÂň“UçhEo –gŚ€š˘öv*¸ů€ ß™Jô,‡sŹęr\ŕŰůĐ[ÂŽĂmˇCü˘(–:­.Ł*;,‚ŻňÍĘ áMę4]ʶ3˙lfŹmʸ¬â¶Ď)átv,™óÁx+ÄŐ^ű˛°”UhJ‘ÁUśäŢ_JąT%úŃnŕ(dKôÍ}˝\ÄüĚ#®Ňôcâh‰äf6ŕ„Y«­›SJ_ŇAâ ę“”ÁqbĄ”A,>h° ÓZBĂe•±tűđ”~Éö[5EB ÁTôb]“5ľ‹ÔKşgYßďŔ+yŚ,ăß óפŁĎŃs茖ď2Ć0•·Xöf+TéÎĆŠOĄ´‡Lf $/ý‹×[ Đůć·čth’P/x8pď+/Ű$bťK:¤9Ź!›—–SóMófźŠ ă2¸ďýJígOÎZ=sčƶď„ÉŘAkś 1‹ą4G«ńź¤PČĚ4•ł# ş9uYQnĽúqH °{µ śŃcTůŢĸś?ť>­1 '$-ZÉX§B/‹”<»Ů~ij (ô’űŕ # qÝ/ ŹÜżfčqs™:zjCřŁ ôHč§ŹĘ— ˇ}‹ĽĐlYŔ‹ŰĢRmG`BDMÎ ikYˇŠďŇŮ*Ď„—Ĺb2s•¦€żĂÍŻÁO2ę?ŘđěTĄViÄä©Đź«ł!§ŮŞmÎdq,¬c2ůűTq±+m»hŐÉ—őN ›ö\Ě™¤F]ůÇö‰ĺ‚ľřcŮžÓ¶Í·ŃÇ.%đ0^Բ̮P­Ńřšr˝ ?Ëg¨Íî6Ň%tD´áeaç¶j]§Zęl˘Ö$ž ˇi$yůč{3 ŢE|ÄÝuCEDđúâ^u€´. şľá[őhítl{Ő–Eď^łľËŞŇŁU8HäęőW/zQ‚yh±mţŽ®¶=ä ~l)čř 迲>ú÷®ýXĆfp¨ŕgj»Ę?WtM‹}f" ÚĹ!)XwKiÔ,&9k1YÉęL“°_Oç7>5± nĆ)`Ůą}Gš…}ÇI¦TSěż›xQD+‚9 Ëx'eřÉ 3üďŽQkŠŰ Ĺ_fŞ˘2S8Ďż+q[dFŢLü]#®hˇ1Lö–kA’‰®–p2°zŚýârů /ÍŹíŻfÍ_Śšú}ŮM$đŹŽ‘]r(1®ĺsB< ĽĺHęĹ' ´YŘŻ"ç$÷ęâ©"d‚ňó–Ăę%®š‹IqmIăŇ®ÔŮ]L™/»fŐić׬ůL«!]ŽĹĘA’Â-€†Ť[iűổ0ˢ]»IűšâÔÄ„°Şřl$‡¶»L&ą[JMç쓇îFnâüÇ-7U+imćÍ·öˇ1â6_*›%ÚbűňTS a.ŃŰŐîËĐ•ăÉAĺW±vY©ÜłđçťćÜ8 GUłJ9M¸§KŐ‘nNfß¶íŞ_uÇ8H,n’c ĘnenŰüŘ ź!‡E¶|*~9W`Gjś¤–?;{¦çâ÷wťĚđáŠo 7p1 y`&ˇšľk—c…sRő‘T&Óv i^›WŞS–XۡI¶$ĹĂ›«yŮô|jKu€Ę{LR‡©®ä\™‘˙đ›Ĺ|›éÍt1Ú˘'ŃໍF´}Fň´qC‡÷=izH$8…ůÜéoB3/H0Ý8*ť€†:VĚw8 “pĘŤ)ăc`đëfäĄ ăU¨|u¬Á,pĽS’‡[vh鄦ÄĂ‘›MĂoWIŰ(˝ň? ĺo{Ţ.rËIĂSé!—rŘ ›>űŁßĺŃŻů«sr­x‰€YG¬Ş»e[¸”řĹEčRŐ{V1Ă'ĽÜ ÜĆn&yÝÖ̤ˇ­Ě„ Č’8űŹq¸"d©.=\ş ˇ@›ĄĄâÎĂzĂGĘńŮ$'!ď<‹Ů!rˇŁô{ó• ”žő8«ĺgGˇ™pj>ůŹ˝÷vĆUťďŽű{®ĚŻ ˛Ş‘Eů9‘“Aę’z_lÂ×}ěŤqnĆËĽD+M6~Ž·j|îr™zŞĘ˘úýü"ĺź°zšŤ…]üö0Äż/ÎP„Ł8îëíňůĚY"Š%ô9 fZ%)%ÔÚřĂçěĂř´‘ÄuY‹I6ŞqŘV¨TĹfň·—XbŞ*¤|éęő®x°Dłág­â·Ä[Â&z5 żŮ<]xŕóű¸Â‘Cę] vR/ĹMB;CΑgUUyńqtxBµr%¨+*”ąš¶¦1dIŮÉ qŠúĽgۡż€H?·Ł«ëçĂÁČúíˇłő|–3ĚLfjŁ5Ůĺî&´UwFé z˘ÄŃC(:ĂüůrBnÚ$ !éŇË‘“‰Ŕb»¬zA„ž]l#)ˇ$~’yÎ(9†×L4K^pCn%gĘ׎˝ńnEĚ•gŮtÔU[Ó‰ą\‹oM“^}ˇTi— Űîí;ŞbWôD˘‰z_wsGN˛ĘyŽv«2*™SĎ肸yRÓ ZFW:ż“3[J‹“šäď ¸ n`kóÍç™Wň^>äzŃĚ) š­ş%ľ$”źŠAkE@K‚Č˙R3 (BlM]Žşő'ĺrľůŠźżÎ@H;ř „yÔ¬˝ţ)öW‡Ýęý*üüÓó¦RU á’]_ÎßAůU‹o)*HľĽ— 9\„r Zµtč™ë’Ů56XÎ~ÝQü´HZś'5›ăls7g@<…€ši­›°i2¸ĄÔćëĐŤ:>bÝ€mĂşăÇ5_Uż¤Ľ¬X~ńR“ř“p z)1€¬¨ąĎ[«¸ĽÓ­BTiZĹĂ—é,n¶}âwX°2Ö^Eţç3ÂJśĐç!7Ź6Ăĺąů7­DĹFEŠŮMíRS©r–"¶6b ~xŻ.ŢűĆ}Ä˙â>)«pÝQ|<* FŕŃ”úłR:…{pIč?TRQýAjŢ×7@ß*×›(»FF uXFěR;ŕŁŔŻÝč Íkś{jým.‘ćŠěčůZ7â\†¸7VřŽOg˙5R7ó´›™Ňí@=ß8Ő"Ťťżx‰ÄŁjáͦťŰk¤7¨q(—Űö˙ČŇ“x endstream endobj 1264 0 obj << /Type /FontDescriptor /FontName /NGPWFR+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/Q/R/S/T/U/X/a/ampersand/b/bracketleft/bracketright/c/colon/comma/d/e/eight/endash/f/fi/five/four/g/h/hyphen/i/l/m/n/nine/o/one/p/parenleft/parenright/period/q/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1263 0 R >> endobj 1265 0 obj << /Length1 1642 /Length2 11828 /Length3 0 /Length 12677 /Filter /FlateDecode >> stream xÚ­weTśí’-îîNÁÝÝww§qşq·!‚;ÁťŕÜÝ ’ ‚»{Ë÷ť{ćĚ:÷Îź™ůѽާvŐ®Şg×[k˝´TęZ¬’ÖK,ěÁĘÉĆ!Pµw¶ôtׄ8«B•YU@Öö N€7Ś…–VÚ dáa-<@B=5˛pq8QhŇ_7{[;ަ#33Ëż,ą,}˙‰ĽEşŰŰ‚to^ '‹3ěńFńßÔv €Ť˝ ­¦n  *`SŐČŔ ··&Ô=-ťě­ĘöV °;`q8ýă°‚€­í˙jÍťíŤKŇ`pwYŮż…|¬@.A,›ł˝»űŰ3ŔŢ`ëföx»ŔlĺäiýWovČßą¸AŢ<śß°72u»‡»•›˝‹ŕ-«:PöuzŘYxü•ŰÝţ @lŢ<­!Vžµô7öFó†zXŘÝ ŹżrY‚Ööî.NľoąßČ\Üě˙.ĂÓÝlűŻ Xn [ 7k'»űÍ÷_·óŻ>˙©{ 'ßżŁ!{ýG öî '6N®·śVoąmíÁ(ěÍ‹Řŕäř‡ÝÚÓĺźČíď břkfߊ°°†€ť|Ö vUÇ[JĂOe¶˙=‘˙$ţ_řEŢ˙™¸˙®Ńz‰˙§ďóżSËz:9©Z8ż Ŕ?ö ŕmŃX€o»  řkŮx:ţÚ7öV˙O¤…ł˝“ďűďŢz -q˛ţwěü’`Ű7uX9yٸ˙a¶w—µ÷Y«Ű{XŮl,śŢ.îo»Řäćd˝ ü÷Ýľqpü¦mgoĺţK Ţ@ °őż7đ¦ŮßĺłčËëu™˙‹Mű·łúŰDxhűş€˙7“ž Äú?QIIA|ţ¬\oĄ°rsńů‚|<˙ź¬ópţë¬bááfď0â`ăŕŕĽý˙ó÷Ż“ÉżŃČ€­ ÖŤ–‡ŘúmęţĂđlĺéćö&öß‹ŕ­ńž˙žČd…˛ôb%îţ%ĂŁ–0whhÔ×Ă ;ôÁĄ´A»¨ ¤Ňśą!XaţTó­qJčĄŐ÷ǡËó¶"ÓÎH}w*č4ź,†±·ű];?óN(»i)zĆ‘Ţg˙łyĺu8C>Ýťßš¦%OäSíÜnHgwŚ!4^!xďn]0‚¬Ňęăđ;°ˇpj Źč’öďnéF‡‡»/ŕ{·I™sâi…-R©’=|ÍÝ®¬^ŕ˝řÝîn$CPĆA+>} är‰>uqąý;” ¤ĆŞNxąŢČh“Ąh`ëŁ™Ś¬±ÉăX…U ‡™9K±ÄlůŮŞKáŹfä†Ir˙Lnո޴s´ôhďĎÁžzmâ 2D‡ŢďCu{CĆąüe´űľ˝óĆ®BsŹ:YŇ;˝"¤čŽďH|ôšîçľéÜ:őżg}E˝\!{Ő0Ő(R÷ńEÔ•+{ěŰóІĚń ®igßöŞoGE—î§žAĹ5KbîÝć÷6z)«M†®vÝĄń©áżíékΫ§VĂ,é·ˇš»<ś őXëCť(eŻ/3> •HfYJ—] §9oTÝ´©‹«Łř¦-ĺ)R¤a*⤪XIź¸iůBTOšú8Ě]jcćl\["ńî¤%Ç’j!«ŘâtäţŇ$ę+M—š”ÔˇĄ3Ź”ÉšŃŻG6Š‚R“ěĂ/S›w›c^¨Ĺ>ŕK¬µ˛Ä):Ćzi·ÍV炚X¤¬÷%Z#PU‹ĘۇN”2ű`$W;N1fwŢ»®˙FúŞř ł Ő¦ŕáFíŢůş13 GDćî˙ Ε¸o÷A![Ůđ K öţ•`@AĄ¬Ób°bXd<|öřŤÖµOŮŮ6ěé××ÇiŇă°r˙Ěíz´|Źţ•«Qy™iŁŹ6ŕ 8H÷ććSĺIGc·0ÎëíÇH…çůĄj»oÜ ™ÔTt5Ć9ßď)šr,âĘ_ćg˘Ţí;jč™ÂÇĄˇÄλ«JĘäÖ-g^Uˇ4»űĂ9%FłŞ‘s'_d'˙ôwŻ)QNlɆ[í]+" š@˛6/y®jBĹ€[ÜŁn <÷]CÜĂúe+®ˇ›ŽJ´Ŕyˇí™‚ý>›’Ť¬Ü'á&Ĺ?U$E>Ď/ö"}y7(š|ăĆý´=l÷a­l›ß^°B?hŐŃ9@¨ßĂą#ßq5GVKc–‘ö¸[ŇZM˛ë^í˙g|60 ŠEúćÍ<ÝxÄÝaÚnŃ™ BVşJ\/€ôůÇö‡¶çš@mV¤×űźRÂĆÖŕ_M‹żbŚEV–3¬Ja§;žˇOöcůăUżuÇM$Ž4Ąď|/>˙á\Đ)±ĘQĽ(Ĺn9˛‰cSDŢléSęl+Í3Ü›űT•Ri$ń]Ľ,ýü‘nŁKv©°˝ňωüÍ pçń»úŽĽćC%#Ý$!~ŽŮDÍe ´ž˘ÜŮ‹$Ďź;´Tű°Żş_e.ô”âçq[Ş×9ś¦ééÇň…Ǹsř͸q§‘?đ:źié© ŁŠĚĚÂĹmDik:'“hrC>H"6q ĄVĆç÷O7†‡]4ÓΉĹ!4ž»|4ďqîú®şÄb?I/ľ+Dđ’ľŢ# =ىÇŻ€F_áżtĺűlĐ=ăO·ő+l“K’–E•ö—¨^_K69.›5IY W IôgvUO›;ęŔQĘR¨‡Ľ_ˇ2Ě]1tôÝä]¤çuŘɰʨf Ň…Ŕp7Ó¸łă‰®"Z[žň—URď ٲľCvˇp…ĄţďÜ|ŁŠ,QÖv·Áú?Ň·DřŇÇ®„‡Ý:'ĐňŰÁŕ .‘ňFŻÇłęIss2C‚ęŃä/ż"Â@¶†–ÂŰK=júS¶¤źÉ¶„ß÷łĄX¦ů˙Őśuç|ÁÍ®ýNş“[ĄńÇzxď))ßQ}­ŘsK»Ëť«í‹OVµĘeäÁÝ"lvŚü\ş€u0o“ńÔ¨D€`ĚÇ;ľm`}Ä{O,á˘íUÂYĂó *ľH[ćž4$R7éł$8ř‰%x(ŽÎ!­¤ťJĘtZ Ó–ôăµŇ·‚ř™´©F‹?NBşŃOŚxBtCÖ»łŞn®FŁŮtŰçŤ6¬2hwuż¨jÚ­ĎŘŠD(— ţ”âű9ţ¬ÁýÂ×Ë9~”HŰTŐ=[Ďľ‚ÍLvutĹ”-".Ô]bö)U ëĐĂőPôE*×ţ˙$Š‘Ľ,6¨!ý«“¤»ž!uTÚ3îđ1Ű@1µţł_ťpt•¨ÝÄťüˇEČ›Ż|꣜ŻÔq]?÷\µÍĐ•fÝXZA—¬ĂŹßI 8{á› x6Ö%ŹDđű:G %9$É2űžŤą‡FËXPϲ@3ÓÍĎZÂ,CŮm^§ăÂŰ\?›_LĚ=´„· a–ś9ÉJ•>«Ű™ůɱ‹ć‹zđŹ¸•=¶@Ѧ—xQ†×ˇĄÂ=Ř_i5A”łiť…ą¤ßŃE51)ć îăuÄ—ńâ…⎡‰O(ńrő§ęţ|8-PÇ Ý:–Őz÷«‘Yźę:ÝĚ»ź;ź~_uŢĺ ß·řŃNÍ!pňˆĘé6M›“ě͡?h_`.˘úż|đŰÚ3ßZx MŹÓAËžfř#"?Śí†ĎžZI M<b®Î“ !)XdíUFŘ’PńĘą›¶|RV1üˇ÷kHéôłš {ýMßó|™%ł_”YvS°¤>+Ú{s Ňľ=¤“¶$Ó~˛˙ąăN ‘KÔ=lÄF7@¤ş7ůÄŽůǢu±źÂťm/˙Ąü&hź1şÔç…{úǰ^bQťŘ8žźśKŠ8Î8…›`MGc[}ň„Ę=@-sČ ą0ÔVd͡ë ÚŞkŹ $yďöÁ ł„ŐÔí˛Ż6Ď,›—Â+W=ëÜĹȬs†ˇÎţ;<´Î'ţf<˘Şç íź ä/łüՅƲÂ͛١şfIűŔTwčJ#Üţ(ű6__‘ĘŹfÂř…1Ó• uĎČ5çôˇ(1› %fóß\ŘŞ¸cš»Ăç0˛cŢJW ¬äkg<ĺĐřÉźÖh!ř“B¶ĘŢg9ÉpŢaĚy`ËČß ™ČŻŘÄĐ óť\΋L¤'ĺ’˝Łcsµ_ú÷wđގbw>sćTü(O­ŕÜ,ĆLóoE(0‡sź Íƶ×N>ďČ}řˇ M»6é˘$†! ďkłşXŰܧÜÚ¨!€ öұ\Á ńąA‹B» Ëpeu—S:ĂĂ~E?čÁŮĹj Ç ăGÜÎ1î]4 ÔĄŁxé6Ĺ!˙!S‡’a>ÚŞř¸‰Ł5#VLpą˙č8cś˘{·;ů“í[g»¸Pů;>śfTsňeśţŁÇŰú®×ŹŽŚ˝Ëzě¨Čyµ¤c+t]ĹXNý20ť4nÚRiŐ…ĽÉťnqäËLG2ŔĺŮýş&”‰Żě¸=źYˇŘ*ŇÝ÷g˛ĘkŐ$řjŃ“%źF˘ ňY%™»Z›ˇ0d"Y,ő”hEuÓDcĄmWd:âđĎ3š‘ˇiÄ:p·5qˇ±ůńÁČ<9Ní±=c^u«9˝ŹĐÔ )ĺ«%ĆŮx­»Ôgţ 60¦Ă.×Dlô%ů3Üc=|ĆEef‰!_ôH2ŤŃ(†h„6ů,Ú|Yý.ĺľDóRęőoSŠ&_:ôU G‡ť#“¤PŁVkł)b±Ř+mň¤Űíą±˛Ir{v Jň›Ń$ Wc~@Ź?‡Čfůčç®,· 8U‡q”ńeđ~+zsëY7-$O6AlĹfŃ1AW.=§é÷ĺjŮîŠÔÂěDÝź6 _”z.źŃťcMu ĎaąŁôŢ÷ľÇÄaşjöJˬÖ"B‚{˙•jŢů°ů4.m|ě|LýQ÷Y]*dť"AÔRJ$ŃzŘşYx†ü+d ü‹ ę™ăý™ď“óšÓź}N(qęż>ţž~řaTkśmţ[á÷ĹřŻV9ŘźŻM­<•ać „SĐ_o$/ŤňQ‰´ś‡Ęí\ĚśŢű%Ľb~žőÔ$#0‘ĽDőTBÄ t8ć>†s*“ęDČ0¸ü3Cě® bŠ˙S÷SÚjňYh’ęR?DÇir⎜OěŰʸłűa™ZWO6ARßsĂł˛ärVÁŮD{‹§8Εź Î*ŚŤ¦öÔ“x.¦±µ1C}FŤ> qé:·,-śÜUÄĂĘŘv8 «*Aά-”žź-)vÖ3¨Á1CöËĆŤýȢőcúU4â¤FlHŹŞňvg4u4Ѳ oEâŞWĺçá9ŻF@Fý.ÂNŤÉTÓ~“ŠĺbɆĎŽ 014%RM7…I´Ă®¶žĂ&ŔdÖąq‚ k“kÍ}d\y#Í Ä}ś‘/_x{LKÔ!ű÷ ŘřyÍ´Ç F™´|?V6‚ëĆ«Sf2IźŔ+Bĺ—”/Ú–1đ60{‡żşpŔü9Ý‹±ST_JčBWöpŰÚôtxdý¬—\}w}Š+z%ł\ľ&óÎ76N.B%ôŰU=}h‰=—¬Tsă4:Žnš~Úc纊]|ť<ŢĎgÉü˙óKňŇÓézo ăŇK1z|µŞ#­űn_g­łIŰPh¨¨6>(‰ĐĆĘÝ fa6IüĂĆ|­N$´CW“*Ĺx‹ßđC•Äń¬{ ě9Ç1Ę—ž‰ÎÎc”Iűy¨ŞĽY‘gîa(T]çޤcŐ5ňZđďÇ5+čň+1|Ö2ŔňbşV5.t] j!€đbŁŹŚĹ\J¨!áâĹŹ N7ŮĎ2Ew÷l5í•ńúc%f®DQ%çd{…ʇŔ7µgô0ÔČVâęÁ˛[dv§Ë¨+–p–*eöŚ— rŹFf%@VŤíj6ăÚ‹^z¤b>‰,¶ťç5Oü§]úçUMȤ˝¸&ÜÄ,R/ň©çŤč%Ł›ń!‚¨?~d&Ń©hÓ,Ed‚Rş óLN"ý;Óá®,ĹŻ°Ę$}¬® (§Î ń¨UDgüzýÚG˙Ú•¦±-Đí¦Ą:* ňDńŘWL„vłí'Lć?,aď‹4e2|ţŽ…1n€Â:l4‰u-śnC„™­˙]Á;i2 ™*ćTĘ6˛őŮ<łOúĎźą"Í˝%;ďTÚ.,dÁjkIX ĐĚuwésÔě1´;Ěh>j4 rú˘†8k•Ľ•zŔÝ$ńhŇÚöë;¶ľ6f¨{ńŻU ľ®šZÔÄßśżŃďđ“J>üř<Ňö‘ÂTÓGOăh(Gú¤`Â;UŞ;ŃŃG~Ésűçą[:ÍŠ¶í‰ŁÔĽüOííř˙z8Ŕ6äV2ö3”ŁÇŻ´ťTŚĽĎŽ‘đqʆľp~÷æg‚ÄGNşĽř/DĆxN´ň…Đź*urąź}ĘÓýńWÁýőś)ŞĂ"ĹLóĽÎýĺ­Átď §’âĚÝh ´6©{+‚—Áź42h)Â[—cŰ֡ʒý­śý”ĎęŘ– –RőďĐ3vŰ€BQgŤP—ÚË.®meYWÂzÜcăÇu_ˇX}č¶Řę°gd«>^ÚöîäJ1)ćV Św_ďľ6aÖ™SŽÄiJş' 33u€—)*}‰;{Ďż¬©YQť‡\~¨÷ŰN'M4[áP…UŽ÷lyąCŽmVNq+P;Ř\ŃČŹÎG–çHÜĘé{Ö€ŻZ% J»IJٶ¶čÚj°5 ýBqŹß3m~ŢY€ü©§úo)Ćť¶©»˛kÖÍVD} IZ. \ŔšJŢ`©ü$&Łűľ˘X¤*Ş,€>]lH^môOA‡–[­Pą'uQX‘˝iŕ@óÁŠ–`ÂHů©k`Łw«Zĺs¶S`$aq;(ŚŘyÝ·'tťŁ—TLŘ4;Éç›ŘŹ V8Ę1ÖŤö8fÝ0}˙87đÇî©O‰—l˘ëËŮ'ŕoŻ/5´ŚÄ3P¦"Ä&ď€ď.Jlgä4éBͲ9ˇťt _n;*^dś@'&ĽŔiµţ6}n"Ą•ËŚĘŞ‚Fžü%—"ŻNFů×›fśĘ9Xh™5xą,M´"g]K-ű¸bľă(ŠĂLaýUÔ}Ë%@(ĆNý‹c˝:âxĆŃřNÎŤÚ*NQw\;¨´Ř˙+:v–ˇ&EŻT,ÝH`'ýźŢaßIεṢß1‡Xť§±S ~đ^+-0…dpČő9 ČI[úĂZR:µúGÔ.|Q:bţ’č‘q śŰčŤĂĎONGľLňĆW`÷Pŕ•[ÓĚşś$UÎ"Ą”‹ ¸Ú)¦éŠťíâÝăZQ¤C•~/›•]±’SŰ€MNŕRĽů­şMÖŘÚŽë“V¬‹›1'Öé#{ h‘fiß’†ÁŘ8Łř&ďą'¬\e€ÁE"›°Ťîµ6wîłłŃÜ]W ‘X.AĎX N˘jé1*ó—D‚FŁ$QôÂ8’Űm|‹/ÎPf¬`Ńss/[Ďv»ˇ4's˝óG¨Ý3ôÄ W§EüD÷%¸ęŮĚai' ŹŃÁ¬- 9P“'<ŇÍ:NŞUťîQÚĐ5ţ˘rđßÔűĄţ{•¸/†őyxH¨a›ôéčIyęô qŽËL’(c´›$no=eh*ôa2ĺ ɱc  ńŘŮť-Ń­łÜß¶ď°BzÂűö’KĄéN{…é%Ü«WK–e+ă[ă~ăÁJ>Y¤ˇ˝üű_ÚNďúUăđžNř+ˇ?“ĄtTV‹A»4Ë6 Ęj¦xó5ľh”RcŞ{^v>źĐ3»×Q+“,ú®R-_ ЉŃß k€3líÖög6ĄO-˘I<$ý'EO`Śş~0ńDµ }đ.Đ3Şľ[NhXł·÷ěiwléĄ˙ÄŻ}í×J˘b˝(đŇCq±ťZÜ%® Ů”s஝DâŚ)d°n¨žÜź–‚»!™mk•Š)r]Ŕűú–RÄ»šhs+î4¶!‘‹,Őw>N+çZ˝Óů~¸óGx7Ů2?XoC=Í«­Â*ť™·^›Šˇ} †˘ThŹL!ÂČŻW‹şm&—>eX×á ˇ %·+ŞN#–bÍS&@ŠĽîëy/µ™W™xŮm®ĚETŰĐ pćL/a?.ČŮ«7$ÚđúD -Ě–g®ÝřúäNv&{>Qѧę Âś•´*.Î{ÉëH" ë÷űĐçőŁťzťşYZ­<§ňÖAJ(7–®ęŰFţśŚ6—J ă*‰Á)ęzE*e2ůfť)lˇË«˘ĘnpÄ(§XŹw&½POSÄĂÎ§Ź˘µ¦5Öň'FŮÂ-潂Â*ó«ë%Ľ[…oTĘ>‘4­őNr'u§bfmĂbSĹŕĐůři…Z(]KÓ3Ž}Ý=X‹Ě…ť”‰DńźşĂÄýU‚W‰Ł€ž2w OÉŘ\Đ|nW÷óX «MGâś2ÝkămPmQúńĐ'®ď¬ÝwĘáĘĐŹ ¬Wíßµ˙öă9OŮü%$wíďřŽź…‘ná¸{ÚŇď·ö<(8uĂ~í'ĂşúUÔÍŃ]żWşě7]7nb úן»Z‚ÔIU©Ńźý0ÝëS¶CPyF®ö wŐ4Ł,ńę‚y5m™•Ţ]ťť’Íl‰ß(2všëŘ«ň'CĐđłŐö˛‡Kń§U@+´¶¶¤u6el/´@ľ[tWV«Ž ¬Pô Nę×(ĂSń\@O@Ą`$ü‹Wq*:°ę˝]ŹłĘđ—ŤÖ'˙ˇąŤúĺmĚ?˛_»†%ÉŹŢČý€!4:ŔmźňëŇ'Κ×űĽšoľś÷°ĘJĹÉrŃ"aS\#łAOľô«ţś“)BJ ęjÓ„L*ů´řŤÔĹ;¶–™^©®žhF‡ßiH› G›Fi‘N ŻşŃ p¶©wć–ÚŇ9°Tyť9^i靸đCÝËůö¶3 SË€sŰÝçx$äĘŇ®9P*Iµfžů3śěh/.qáoŢ9¤é-Ió>|Í•ęĺFťqÎ'®HQM»‘2ÄRńî@C” tDfůąKÖőţôyĽdâ4Ů…&Ž8ćÄlXśBdĄLVtçQ<`ňŐpbÄ×ň@4ŕ…5¨1’Śűö›mt&NFę ęăěŰ4٤ĺ*ˇĎű怭ÓqMzđ¦&ŹęŚ`÷ŁZčk^bĆ póŁwI]ÄČł€ŔM Ío5ŕDÔ–‘)ëjm›)EvÍ´*>Ž}´­óU ę=“Ť÷%†gŮÝ'ŠáYí3UW.ż©™C·Üö«ĄľĐ/ąĹŘîďń"őčˇÄĘ+ĐÓŘÜC™ ˛+÷‘(]!ö÷DăęŞ}W™IŔ.[UĄŃM«gzŹoۧŻsĆ"żŇPúvÚš$S>*ż,ôh¸ňÉx{ X_-JÁ&âůO¦čŰ·Ŕôp`Ńi°ŮŃĽGHx`|µ/źŃ5ľjq€ÓiĹ!'ő­őřůŘÉEť?ŠVt ŚÔĽ/9ą,-Iëż“`ëvҨ—łţ®ŢłS–FĄ‡hÎńPu2M ĄlH0ăÇĽ ĺő.=…Mž\˛ĹĎßş6 ?S$zÉNgŘâ{•śă”úě卪±‡AUËíJ•Ţ9}‹ă4Â<ĐěçL Ź ě¦E»E®r{VXlŇ-·ň·]Ţ«™ľŮU1Ő7ápÄŘäŠEŐ ÁIâOdŁŃZŹeň–‘AÄĎ«śË É·.2˙j’V‰;í¬;ňřtxÂm—Fx ¸$ťĄGń3OŞOg=h K§evK2*(ŁMË9Á^CJVyá(ŕIzÄS đúę Ĺ—rÁHŰL8ńß…ß‚©ő&ł)ö`€1‘M!j¤:}\0ŠśˇíŰÔ äJE-Y}»ź±›cMçľ1cŤňł*‡ĽW+s×3Âwuť}1Îť›j±^YÁţĚWËXý:±Đ~­Ę`dÍŽ8—ěK}Ă"śŘ—ű¨Śí‚~ř‰ýŔd"¦h‚— HËFˡńjHKmŃűÁŹă>ÉIìV8h»:>qYĺČä<’Ť+Ä^ČřÂńB'}®Eś˛MĚ}6ŠFÍÉiX?"1 ç¬;Ró?kq^/᛿rDý´ă™ŃWEź“ŐÍ×kgŹÁÖĎ.>xĆWw1IyČŇYG–_ăg’–ŞoU#kIßź{ÄłdmĹ6ůMZ "ł÷±±ű(ţôÇ óHŬd‰~¬ć`hĄ˝sµă{ĂhvëĺÖČűwjÎúć*}+řC®·O«­ł u†ýˇ™Y3›0ŽdşO<÷`N‹ŤYA⨕h:XĨ7ëu‘6óť?’ŁĹžĄěĂžnçÂS‹Â×ĚŹţe’ߎ-˛lÇĺ-‡S\?vFW[XO+4‹Î/–^rb¸˘üňnL6? ¨aAdαC&P3ďňÚgÍĎśŤEŰÜLesű}¶ć¬5mÄfűĺ8DÎ.‚łęŞÇ 'K»0~űŰcęKp#8$­Ňę—fÄ*V}†eËY‡¤®‰ÜÎŢ‚9NŮNË,ßSgmžݲâ{é<ęqF]GŐ Üo»Ş5â-Jlđoëň6Ł†ËźĆ+ČcL·¨(ŰBm@Daé+ľđ„qZ†öoĄj<ŕQXĆćG śÖ̤}¶Ăô¤ő6Ls]RÔ&%só¨ŮŘUhŕ‡üŁ»$±®e¤”©ŇßăiĘ NmoWdşçödéíňR»Í”Ů!źßŘBdľâ/P´–!ď2;t‚ůp/™—Öž˘„Slů-°, Qî%ř2/·u÷ݰ3=áČű˛~sťµçžCńÄ8¨ůEö˘çü(épa¦˝ó´öVŞ9ľýGŘŢř&ŤYO€ÉO&™ZzLKK3%<Cô3¤¶x'áI¶"ČQŞ»÷-ě# lKU(¨Č_úËn‡ ąţŐÓ+)bOF*I,n§Ő)OíŁŰçZ;›­hr§©®^2Ń“]rĎŘ…µ<ĹćFs;JŮ‚ľŕ#ÚŐ hş«eq§ŻăÖĄK‚Éîęš°Rg©˙ČÜŠ ő4ÖuH&éĘŰIň´ăć;'4LgXłíĚşDŢű«/čę)ÉÝĎ2‡ĽF˛VęĹĐô;>P«z$pÓĽĚíѡ¦­¶_L$‰~’x"\e`*p‹\dő9É*hVf­ŞČ%ŻK„R _˙}yRbRę—¸ÎBŃ/§žşË±ž— ţ&W™ž)†őł;1M1AˇĺŽÜWxqZś|kYťŰ"WĆ>)ZĐ©ívHÁ-Ľ WţC# 2§7±äăÍkI¬ ŔÔš*\2¸Ă;Ho.ůęKĚÉW‰WÂĺŽ2̵ůŢűUQüXGĂ÷[źWzôÉJVOhnj“ł˝m)A&/ä"E Ţk“¨TYD=Jc8÷şćFHPúFóiU… ÓëŮY:ÁÔť&•¸žq€śbCôęÚ }áNń1ĐĎ\ŢM¸‚řćt€»ÇÁ ÷`[÷Ňzź±Ě%,Źů;„Šs`6`ą:8 E1ʬRő­5†,Ä·#7l(1ˇ9-ëeKűNăsÝMî§PP|› <ŹY v;P†ÉYÇę•1†ĎްűÖ"’I‹cťý‘¶G™Ř^Îł9iŽňř§32?%;vóFó’2vOĹ™JŰć¬×]¸ks€á»1ş!čiɉďH(°•q·9™zĺżQŁş·Gł«;Ńq×±ţMVMÄ‘„꣺OäÁ}áž{mĹk8=OŢC÷/:#ô®ą.°µŽÚ@šźBS9fĺ CM\´rWg×Ňűő 9e¤ÝÇŻł0, ń—/JCP09cF}Ţ>±:§9!çąÂߎEtŕ•Üž2jIF[ײd"‰LYň'@ßďH€ zď__äďCití×>k·čEf…áů‡FxËVtÂ0Şĺ©öŐ¶ă$и†ă)­Ű‘—/ÓŚx×jX©Ď߸|ŹÍݬđś€"MZN ^%h®Ë ©äO´ĘńQ“H›ć9RyÚ?Ía6†}Š-:7ödců‘ü}Ś—XEŢŻl•\OGeŚ4PĆűâm’»Ňl­ÚĽwŃ^6Đ?iL/3áĐ ČŰ7—Ő;ÉľŰÎM6ÄZĎ‚˝ňľ­ĺĘ„ÚTnNă 4ž#¨ÚÉIź†fzŢů6‹Ą˝ę…±]ű/MpŔ Emuce˛ ÂZB˛×gđEßED‚TŕWfeŞfť+Ä-ÂeJz¦Rţ*J_`±ÝŤ÷°8Ŕ˘µ/ő`M\Ąb‚ď¶ĚAG82\W)ŕ#ţÜ6í>ö€Ś—MźAś¨ŕ]"1€Yš @<âS?Ú'aá ňQŁEö_¸• 6«8žČŔ‚>íu❍±WşÁ¤źé ‹űń2Ü/śý®·Řm5ĹđŹş+ťĚ'C€čźó7ăń9x‰ŚŢSĎąČO6î–ÚĹXŐś;ÉŰGxž›Ź†Čg li4V㍼{®VŰšţs˘$a=Z1—÷9éź~?@€|aíF_•żKŘ ®J˛÷n|Uj’]’”kkb9Ŕ:Đh$9R˝iŢޤóOľN×9Ä»BÉxqŻDqđţx¦{8öŔ9ÚHyń9€ő>vŰ 2©ąę\ł« |ŚvY5ĽžÜř»Ĺw-éź(Ë K?懮ło±sëüQF˛dŘ9#— ůyEJ˘H†ť„"ÁPť~V¸ó®Ké Âąĺ”l¤=:ôĂĐźłdĆđYĚĂÄüfX.n­Ű†-*µPżkcfś*OĐđTWu7ˇÍ„H˙ ,ń7 endstream endobj 1266 0 obj << /Type /FontDescriptor /FontName /YXHWDV+NimbusRomNo9L-MediItal /Flags 4 /FontBBox [-200 -324 996 964] /Ascent 688 /CapHeight 688 /Descent -209 /ItalicAngle -15 /StemV 120 /XHeight 462 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/c/comma/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/underscore/v/x) /FontFile 1265 0 R >> endobj 1267 0 obj << /Length1 1630 /Length2 19291 /Length3 0 /Length 20138 /Filter /FlateDecode >> stream xÚ¬·ct¦]·%Űvî°b۶mwl۶*¬Ř¶mŰI%UśTüŐóľ}úô8_÷źîóăăÚ sa®˝ĆŘ$JŞôÂf&ć@Wzf&€‚µ˝‰›‹Š˝‚·˝ŠąĄ௜Ž‚BÔŮÜŘŐÚ(fějÎĐ47™›XXĚÜÜÜpQG/gkK+W•şŠ&5--ÝJţ1xý‡ćݧ‹µ%@ů÷ÇÝÜÎÁŃŢčúâ˙ÚQŐÜŕje°°¶3**iK+H¨$Ô’ć@sgc;€’›‰ťµ)@ÎÚÔčbN °ppŘýű0ušY˙Sš Ă_,a€1ŔĹŃÜÔúݛ৩ąă?*:€Łął˝µ‹Ë߀µ ŔŇŮčú·®k ©ť›Ů? ü•[8ü+!Gg‡żöuÁ”\\]Lť­]Ł*‰Iü;OW+c×b»X˙U,ţZš9şýSŇżtaţj]Ť­.WsO×b™̬]팽ţĆţ ćčlýŻ4Ü\¬–˙™ŔŮÜŇŘŮĚÎÜĹĺ/Ě_ěşóźuţ—ęŤíĽţĺíđ/«˙™µ«‹ąť3Ëߦ®c[Zá˙™i …€™éßr37Ç˙Đą›;˙«AT˙Ě őß$ŚÍ€v^3s 8F׿!T˙w,3ü÷‘üß@ń Á˙-ôţż‘ű_9ú_.ń˙ë}ţŻĐnvv Ćöŕß;đwÉ÷ @đϢ±3vţ˙ůŰ[ŰyýźĽţ«µ¦ůżÓý?€I»˙m‹0Đň/5L L˙Z»HX{š›)Y»šZ,Śíţöě_ru ™ąłť5Đü/·˙j+€ž™‰éżčÔ¬¬Mm˙Ŕţo•9ĐěżVđ—®ĺĎ("ˇ)%*EűżY°˙2Tú;®j^ŽsűŐČ;ýĎĂ?0""žzf.= óßű÷7!n6ż˙MČ1˙çYŢŘŐŮÚ ű·n&ćU˙?ľ˙<é˙q ©Ů?ŁŁęj 4ű;m˙SđŹÚÔÍŮů/É˙Z«ţŹóżćŢÜÜÓÜncŐÁ”7Ô&3'˵;tZLw°ź|4̱¬I­¤(°Öˇ/ 3rź»Ęč˝.ڎy–çłĂkĺÜńăX†ćçx?–Ý·ľtóß…~dÔE¨;”]ś´? Ęł.4c}®—ĺö t84~L+«”ľCÎv±:Ă\?S’ąb?9"ů›f4&`vŁ4 Őź_P¦üz~ú6<16:Ňw 9pŚOű=–‚×Ű?íś$ŐŐËČůˇÉôňŐťÓĄz%·Mł5EÝĂ˙mŐŤü1~ť9늕ČňKôIhŐ$AÖăwD8|&!!m›pš‹Ř'čW• ¶xÁC><°ôťf,‘Ę›ęĹŃ HhÁĚ–řÔ:ŮßG¬Ż¸¨R;öÍÄ<±Ňů÷ľ÷im}ş=˝™âěÁK‚Fs§Í˛Ą0^MŁÚR˝W 岰ń ţli:HË&u#ÍÍtş1żôö«đs;EŇsú˘9Sy sO×lX‡”î‚ę…é“ážŃ¶HKń#őh2 Ź†Ś–Lvg2µZ°ŤŢ.ť]‹Ć?…Ńâö` &ërď3ŰТo``©UŰŽ1”ŽG°ľîî9+‰ů5dG=D+ˇný->i ŘÚ ?ô›˛·çܡr·Ň­JLlÇMk 5Ó!@ŃŐfz”[dđ+<óÝ=Őlwźär•§Ěĺ(4cye}iűj$ÍČŞ´F¤Čĺ‰Ő°ŰŁŘ…—†y6¸h <ą{†8b0?)± (Zą´PÄď…ŻJ4˙Ô˘CFłZš©ŕ†~?T‚3+PŘô‡hŻ»zJV¤/¨y;ţÍdu1zZc±Ä {Ý%lY ŘĐ \*—Ł0},Šj ńA'ôżźÉ…éÝă·˙;‰¸;¬Č_×YVč EZĘîĎ4ŃăbŔޤńr;ś™1“okěÂ.­[ž]ďJ†ě}°ÖË–śĎ\5ť.=÷çičˇU3˝ÇőF’T€ă(ić€Í~ëĹű’—ů»÷k”Ë›˛! ›ÇĹ[ŹaťŻg§e·KÉôß0ćĚŃ5Ť–sŔ?äcG2›ĽąÔ*ËçjZŞ;˙xaE[¨W{ôéí,:uřýYĐž˛‚Š%«ÚÔťŚ,´’‡IŰđh)*HŚ8vJđcW|Ú ŕk1ßšüéK@sŞyWĐ·2N4Ň–iŹ /î|6+Ô&éń:YNyq+ŮłE8 ą;ę4µ7CW-ˇšÎWn%-§D$jĄ µ|Ë p.–HĐ\Ĺ;QŚú" ş¦V¬”ŻĽž­đ,řĎ;˝ŽX Ƕ‹ÖĺiäEáĚ9ßĂ›\ťnÝP¸}›®Z‘Ňç{gAĎô6rü1ôŁ ~-g–}ôýNgJ”·-ľ#óËŚÔčý5Ů\Ź÷ţ8V1ü”¤nů¤Ź9Ä^3aó8ĎÉŇÎăâp>ë Ęim4hĽ_Cď+Çe- @t¸{wkonćlňbĽŁ'öĘť˛ÔC2}®ŃĆË%ëî·Ń†É4r¸hLđb&Gu˙ȸŽqlĘç¸ë3Úů9Ăé#eĘ ]Żł(IłjN·„Ŕ]3k}±ËSÓ0ňľYšţšĂ'`Z6Ľ9}Ô2ĺ͉®¤§łÂ·î7Óäi“”ߤ1M™6Eę&ô㎽żxô^-ŕNĘśH+â32w=‰7ź4wŤ|ŕI—˘GqSŃAŢ ůEĚ_J0»52•nď!ü¶íăOÍ…:­ż?JĄ¦˙ŇŠ6(Üą4ě+±™â϶I6/ílǸŢb[z3äxni ót^_×îX©űól#©_Ć6Ýb–‘ĹăśÁĎ3ßâÚ„L<(°ÁÉmGŚ_ ŚvSÉŻúÔ"“»Íí’‹Ýç?—yHZ~3í¶‚¬–p%§O_ Çź“˝µ -3GŠZPÆNe[«=ižn˘J˛¦^ÔáŘăOţ\‰pĚĆp^BŻwŽX^#X‹P´©ŮqI=z±xp·§BQ5Ŕ Đľ–GÄţí»&šW’ਲ਼ۖĂďz:4Č–daZlěäžS¨ĄPVč:jŐ\čp॥o2ą;Řž+Än—{B@Ëj±€MË\NÉĆăŔ)bľŐÜĹŕ3ÍN%n#ŔYô cÎűŕjz=¬–1Ł:ŕQ–„ľ!f1ďU~>ň ˙‚Ü3p«P€AÖu9ĐĽ~ýöřŕn<€ %ćŢŽ{ńEö°Ů|Ŕ köU'”Ş™GĎÜ\°|ĐFśB±Ń —N5ń Áöââé¬ ôáoŮZîp!ɧ'ÄĺČŚÚq>–¸L;ŕ č {€R şóÝRLÂî%ŹŽÓ1'5Ř.bá‰+ŃČ,ˇşŞ+ "ăN3 ש żĐ寱ânÉŕBj-˘v‹Ż‘ŚĘíŇĂpŰ› W:ý»k|[@ĵŐD™,bń|<¶3L:ëšq§ńj-aČ@nČF\ú±Ź8”[–kńÚ7‘7p,{H¨3-_,ÎřVI.ÁY^!ŠJ“já±óW9„-^$±Zż­Ďwż[„oť‘dţĄ°Îď«ŘÝ·¨ËĘk Ăb‹äÝ`‡Ď™N‰†Ac7|â/nYW°@ŇBŐły!]E©kďő©ÍÜě•~G#oô&á"·Đ±q^[p¶H‡LtőËőţZ‡wŔ™ wŻ?í–Ą“ YDCם9~ÇĽ~Zł.}ŕEÄŘřnu‹>2ęKOÁ%ďó˝‰ĐëpŘČ•„+óŰáëxÄÖM´čŹťnÍ /oâPŃ’3ﵜůžA4HtăR-f ”8¬Ig=ąűSzJÓHKţ)Ľ1 ’8J/őľ":™]÷XtBJę â´¬¸z©A‰/z/q0´†ÉVó.†bTokĺ\»""U¬ĺräëU\ßWro6yď˛čŮ– áy+Ď™Âĺµh-ˇ•¸ĺŹÔ°ĆÚYątE0ť‡’€n>Xţ)¨UцţÁaI¬oo†ôŕ=śm§d˘±h7ş(ŃťU;c´p…OµË&˝°—Éĺ‹Ĺ÷,B—¶9đ7#›  Ô Żëו›ŹqşmHť bÜŇ>R*oQď<ˇ6Őě ·"W¶2eÎĚc ™kž.—pp˝ vÔ¶!ĽJ÷Î5ľPsř‡"űďťK$ŃŇD]Ş,¦EŕéĆá’_A “†…;ĺ»Î%p€PŘŤ÷ÉÄxĹü3tÓÝC~#đyČoŕǪεźĽbëZBě÷}:bÚĄ†…ŽĘvßđťiazČń=±j#=5>ť“±ł"műćKghë“÷mŽ äŤ;N{Teł°PŠú-  /máâ^ěä(¸Ç]˝—4+ćCJŁŽäb‹ŇśM=í=çnŘ|Jľ1©I™÷zµ ű÷Ć^ÉÚ€ô^A~1ćă‘âž„Ä}Os?ľ&±®@ßbpÜ‹ q¶(ň€aőm/`†(ˇ,Bw:˙=ľĘµ4ÇĽ†J1ÇÜw,,;ZčE>ď#oéŽřîH©ŃKJQÎP›X–ü¦€h1‰ cöJ —±7´eU3–ćŃáš N: ŽÍ ýCżâ$ŐX°[ň€ą¦úłzžź!úíÓ)2˙ÔZĽ ą"W.ÖgiaşR·x:҇şg’Un5Ő”4–1ä@‰˘í‚ď{ťÉG]ŽÓ9ÜłÁ§\©Â¦C#ţm‘Ů< ·ă dŤ’rçaoٵ#<ő—˙Ť5ľSyĄ<›=ř…Ćľ“~‚±Ô»Ü°łPH×Bsd}K2ÉűÜ §uąáU-ŃŚQ>A|$JD&ě%Tn1ڏú˛%Ż:–vBK;iŕŃ~˙>Gčs©ĂÍ :ýinBëŽx® nýňuy"®N.¶ĚJu·9/›îU¶`^«241ťŮĚś¶‡ďŹÖOn7¸»FÄúŁj§Ŕd'msh"/‰u°ő_ç<{ú*ŇŐđ"ŹŁ`¶ĆY;GöZU—ať¶e(áCfA¤™IĄQ=ň–gD:«k:ż “ĂQ¸‘$¤ľxŇj3©°.עč3Ń%ŮŐkK˛—A /•^ š=Ož?î7Q8Ţď—˛Sëy3I1$ňÍ ·ś#”M|©Řó,Đ3˘Ůŕii+Z #Ę\˘ ˛9JŤ¦3™śˇ8B’A EĄ•+Ćż8őÚ±gí<[łđZ~\Żí(Ä0;ˇóN‰Ői÷„: +ÍçŁ7sBXC,/]ňÓ$Ω¸U¨Äň™Ô’—"}÷Ă6?ďq›yĎƆ\R(ăye€™ż‘ŠČаÎoGăżĘ€-w«¤ňľľŽŘOˇ ‘Ąć€zÍůť´(™ű&ő1cýöµ8P|’»Şf1ç$v»ÂCł<÷¦üsŽŔ8,,F˙WG>QbřťÓŇ,>źÍ~ŰąÔYF:6›a)ďeÁ׼=‰Łt!MAâěŽdl6©ÖiM„ó•ĘÔŰ’ďé!8ü:+`tY·-đ@ÇŐlÁÁŁY…Ł+÷Š'VÎS©::K™Čăúc¶.úiö†­-Ó伲¤ěŃÂ{ €4r>˙x὿~‰].žZ´Ă„ś,®‘Tł8‚—Ł7;Z}Őüá×Ňř;É•feŚbdGăš/w­lox6y‰“{ÓRúő“Wp'\BöěsŁd9č˝äsh_(FÚšC~c5:´††ÇXV»çE´@ńnţ<Ó˛]CSëPrÝşę!üěYęęçäşvWN ümx)®mÔ{»WUó¦GwěÂÝ‹˛RâÔ“ 'O&ŞZ™ő”–Ł)X¬Ţ!9™Ţözö#w?ať…PÔI󖤤ń Ő>&1ą,†0A$›PJ@®YČRĹ3ˇ"…c#°¬ôä¶î˛'ân3™Çv“Ľj XUzŽ_‹śeř;ě…‹ŠĎ¨¬poŻ_µśťIą!fž™zď¤Ůů”[kòćjv-8očéµ}ĹÁŤGĘ×îe]/ˇoÖa«jôěZ–Žć\űѦPÄ6^§˝˙Ô,0ěś<Hâ 7Ďq0MÚ„ýęČ4µüŐŔy˛>Xw¨.ćÜYăôOŐéűŁ7×QÜS+˘'żF˘ŽľGj˘B‡M9;†’É>iö«łdť°V"Ş7]v–ĄTR›;â5f lMűr­° J$đ+N%´^$-|ËĺťČ—ńQ ÉVtŻ~˝/nCáCň7 ~gC ŰΞn¦ł°¸ľ|¦ YE(7ö ˙;Ś~v’YŰyż}ÍĎë„Ç#Ű3ŚĘđ5~T·*†•/gpx±ŞbÚ ř$çŕÂŐ|&ČúB”X‘s‡ÜĆŤ Í&áwš»çˇ?\ŢŤ‰Ż3~ ÁÍBĆ–D%ń‰Ä¬íĺ}ČĹë~ňA«‡yQ†JęŚS×ô/é|2­'*ďŘ,‰¬“łĚmw^ťÎŇČĐĐAQdĆŽ»úÚĐL™{Úr Iß}¬ +ůV.0e‘ń_iŕłĎřµ±¤–xíȲqöŰŐbn”µ:}±ńĐíćĹĎvľßń÷ýl̶°Ö *÷’žA”Çś˛Ćú˝3:5zócĚty†ť"´Öqˇý¸†^ĹłÄy‘)Ë×|Á®ĺq^ţ¦{n¬ČŁŕ2 ë”­â+Ąé„Ň×`WA74f·Í6B…ü»xڶŢ/'˙¨MČŮvĄEŐX6¤' Fx˝ÇD‡¬A§Öź'«2ľÎśTě—2Y]ÜeµSĂ„`¨8;‹č”ă8}»¬tą g–ę§h‘¨ľ¸G€AN‹;醪‡‹Á<®[ŞÉee99¨Ďăě>!âó;Žř=]EĎ7tVă(%ˇŐĹKŤ»1Ć-R†pŠvNéR™ŻcFc+< „#ü”űĆ‚LMęl’cşŚięGHE˝ą ÎEާťŻ˝ěP\(ôlz‹3GcĚ®7–®FÇZáJ¶{WbˇÝŇÄ,ÓęéĽ|zŇŁ8E™‰Ołţ[ŘQW9<ćfIxpąN/˘źÉoňUޱTŕT–K/VIA1q0Ç鲏Uű›Ě(oóÇÚĄuOŻQU ›ps„rÇ›“ŁśíÉH˛)í[2…W«Ň”ÓC 8çŠLżŹ~x&cŽÝ{ô}¬Ü©`;?ĽýfŠ˝.QĎ0ëëÖŔé ŁŃ5ÍW“=BŕřVuÚŐ«*…Ąüc·”’qEQ„! Mu€â | ·KgLeţ füšE˙yEŤ7 ‡|ďČźÉ gŢ^á·Ë´/¬ďxűfüT·üśŐ8€(zş/ýá‡9qěČÖÁ ś4µqw[÷úr·ZĄ’sŻ—ą+˙M7,ňK&řK‚Đ˝ÖOëŁç#ÁÇšęXkKŇ… jzŞM‚ZtZv‚äŹUrsË%&„őwĘäYŢĚ}ĺš(čOÁ‘€xVąÚrH“%áNşÇôévjŽU&HfŚXä™çčm)Éç÷›Oäa~Ű ú›e‹ŢDÝáőŰ0—OŢ"ÇuĚ,¶!140X"R ~¶'yHşĎj§}8FĂ{±sg¶IMU#r.Y7t ‹Ăô‘+MË!ÔQ;1č_űpö ›Ť}¶˛…ç\ŇłĎY™ýýšó”Ú*sJQętłXkŕÁÇŽĆź¨?=µ™$+uµqÖcöĚŽ®Üµá°Ťo6DďŞÄ]ÍĚá"?}¸óă­Ě3?bTs¶ Vuş>Gš`>VpćQx’ÎŚyÖŞĆúiĹíMx錄ą+2Ďz¨şPeÜÎľ>67\QČ`Ü,Ü™íţjŘÂüÚB[Y Ę*¤Ü̢7"}ű!U͢H‘y‡˛śř#_ŁŕŃń=–ďŽ&ćĽf -m&ĆŰĽSĐ®ń;ŃŤŚôbńťŘ÷ Ŕ}g9]}-‰â±!8c ,Ę–KÉť k‘$Ě?ŞÓá›#ŽM~~-Ś\Ň·Š«¶ buš^ˇçő}°,ś®ĚaȇˇMj0óé!ÄGŔjraż_1pZŰşgôH©Öp ĆT•¦XűmRđç´ŚŘ4$@/Xř×W+ZY>°4 ő —\ĚĄ4ŽwĺÜ‚ŕfZ´µÎiaŮ•b7.ĽëŰO‡Ń:ą!Ő}qďĽĂ×ňuOsąş…— ¬o` OZąt©®›×6(8[F+0ŕRP*î51ö(żvč0ž»é°Iľ(M<´˘ˇáP~_<Đô®u<•ž8MŘ`·†HŚOă5 `áfEĆ›şŹ;‚őř­J°Y¦×uđ`+đö•G±‹ „be¶S8úpÎdu)Đ÷ĂĆÖĆÉZĆM´‰äIľ?™ĘzŁ|óVUŁńh5[×ô3(đÍŠŞR‚§0Q$k<ćŹaN8•x ó‚Ç:w^ÓQ°yb‚řű68[´ˇoş—´ęljŚĆŻŚ ł—µ>ç‹'|IxÔÎÁŚŇ‘8›x´ťń°Ăę(Ťđ.$ËŁY{Dç:˘>辄ѶdĹ"R9KŞ’)3|íÝIŘN]´ 7ĺbmIćZ!żô/Đ§Śžé±NÜ]0Üľ«»ArĎ0€˘§#óuLÁNǢ™0ëđŔĐ·ëęGU¬—|ÂÝ;©b޵ P‘ZNüKźĚŰ<šÖ&Ň`ú tŘB`ćsĆZ‰¦rńésűGÂM‰“ďHŇđ H»đĽ˘¦rů Ó†Ťx!TŢ™ĄxRf†ŚyŁŐ;ŃďôJŰ}÷ËŽtšŁ/îpßęsHę1ŚčĹ;vŔ ,ęv0; „ŻGzj{¶čÎčŁß]v4©ÜĐ™·ź¦ŘţxD×ô6| ˘ŐI†ăQCT÷އ_\#)Řţ81¤Ů«rGk@ŕł $Ę$Ü­z˙™˛Xv_g dŠ`ďrĽí(ôhišML/ąRŃŔ ÓwD´pOĹĺ9—˘ź#Ębř,ŇQŹH-gÝö]¸tËáŰŚIÖ čł¬ˇśĄa;Éę^ß Do¨óR‚ěţNY©ö8i[_ ŽM‹Ş•_L›Ű’’=‚!ąĎ鬿3ÔOXKĹzĹ 9XüšW›YŞ* ť‡\&8!ÁÓ·kË-ÇČŤćr¨·Řʱgśâžţčk]©°=¦•Z/&Ěs‚­$lÂéN5%@Шf ĄîĘvŕšĆýTĽlˇĺOŘÚy°6Ę=y$ř×Äź”ĘYi°©0Śx;eA„/řÔťvÓ›ăa3ÎT[c™ŐéŽݧmu÷Ä™Á |DZNß“"lh"ÚŰrÝA¤˘)kwýeŞxë Ś;Ă9Ú¨Ű@Ößµ Ľ‚yq"š‡‰¤!yw±Z=-BB”©¤~”"^µLŹg,»Ă0`X‚Quť,CŔ·bđ¦;ĎŇ*ž‰IÝ”FăÂ1ĆĎjÍĹnČ[ Ľ lž ,ęĄF•ÍŃfKĆĎoľÎ§Ĺćzžßő#qi3×Ď%ua9z%@©—É^[ń ĄÇkµ‡`8µvZô•ÍĽ"ڇďJPZYjšPľr_'hĺD7Ĺ÷V5o‘N¬áŚŐĂÁȢ°żl“‹E„Î!C’µÖ>Çkş©Yć7nśe÷×cŤGČT–üG çŃľ^+¬Jđ&ŘMľšöż[DŇ˙ :^Ů…âVÄK‰Ş÷𠋤*:Âf—SX|né˙Ô‡rQ=2} ŇĘŮňxÄ ­fľˇ˘ Ôýc÷Ö­ÂĚ˙JúÖ0—‰ÓQŹ ę<Üž-Jfd0ÁáÔ…X­UWň=eäŔMrĎBËbůfa°ŰYě…ÓVöŚ€(gćWôŽű:/NňSG\ ŁPż9Ż?h¤b´˘äĆ ;€›ýĎú>'ĽWśÎ÷qüű§ é–Ţ|Ţnďm:˛mH[ý§ś7ńń đ9knÔ¶]^»ÖüvĽg¶)^hĽ€¨uŔJ8!hčCš˝ô7Ąx05 »ÔXÉooÁĄ±Sý\÷ej Gx](ă DrJÝŽ‚×vlË ä‹Âšâ śÓĺ‡AKž ľý_FńwČlőśŇĘ0;Ţ2M{ŻQV1źÔ9ŕ…LUVř»™¤ˇŽk˘NoŐ '{WĽhk‹§ôŢy·ąź”îý OŔťŇÇďh´›č˛RxßT‹Ž‡K„•“ţ.J_LJĺëPUľ»&eők›ˇ÷ɑ➨çďTL;ş ˇPf]6ßžúś¦HŘT‘N7µĽ*”Č.FŇřŤtÍyM äáěÁŘŻ¤5Ęä®íŞ9ňźń€ŻĂ„¤ }˛„şę©ÜžĄŠÜŤ!|Ć‘nŰŇÜCÂŃ&.ú*‘ż–âÓ0 ŤË††vLCl\Ř(|4tqwá=őwyůŚ»ŁŐÓâbÎIÍlÉúďĆ$tr~Ü;NĘ8ĐÍfX~mV…łý4xL^ H˝ćdÁŠ‘ňnć ĚśÓFĂ´¶ß;¦; $3†aDFzéěŢ2¨y‡qHm!q+!G‘ĽaNü0úÝŮŕ…$F`^¨Ďú:–RČgćó¶`LĚBbéů=t’٨Ť:j+j±.ˇj’zI€HبĂ×2Ě A<«ÖţŞ%‚,ÂśĄ;ľd€mÎP"÷GGë3ěŘ T#ěôĺwŔ/;ě˝U Q©±ňšö7bŻ%¤zîČćz!/Bużb<‰C:ITJ}üíěŤ=°CGú0}‰{ú_bĹÁÔ!e˘ăľĘ!őł´ “Ťd·nÄŤ8só˘śAEÂ4ôÄ•ËËÉߥţŠ;*żwÖ\d?•ýř *¸ĽźĽŢ|¨OU‘č÷ç˘Ýěé}Ż=˘śOdćÄÖXŤYˇÓY0•r0”Ŷ`yCwP—śÎĄ”ą8‡V·ÎU°Gž${CŘHĽç˙'4xÎŹIé&łŚg|Aú±°P„–ŞŽn*‚ďÓfť÷üv‰0Ő±záî *T’w©–ź‹Ńngjë.÷§¶ý*Ivu¬L¨Ď{"6ÜҬ^ą&7žQ¶żb{+˙ĐĐň8vÓúcŞˇ?úę!˛US2÷v˝aňĎcÉÖ?·xę>†¤ŕęLń*˘R© Ô/Ďwúđa“•5Ďrâa'/¨Í09őE«n‘KÇR^Cŕ‰$ţUPó ¨ťż'çLtőžůľ¨řÖDFz{ö@5Á(yĽ“Á‘tG.űöżßć(”í4é¸ŕ?łđθ‚R=]ßN©\xóŔnZ(pצ®±‡ÔąfĂgrg1šü_Y1¶>#×_p¸Cűotig†ą>¨MËͤŻUĎá,"‰'đźnk]5Ń|!ËT—K…3?<˙ăug6'Íry˙ťŹŻmi<ůř«ěLm."W8‚ă`Ń 7žĆ ő’#wűăŐk.ůaŇŕ#jggYéŃŠ¬/ă-DR?š`s=Ţ'9 ”Gć*Q/EôGî®n.?Ź˘ĘuY[bx6żXý¬í#T!-.ů|î=Řa(Ż`5ŐŁúmîóY덤[lăNďőłĆŤFťă2űÖI ÓĽ/€CÚYŮÂűPćÁ†Ě 96-÷ăŢ:c¦6÷7´8¦K¬IWŃh sÁ˛,QţŇŮŻąnşQč‹Nó¬-›ďöţ­ŻćrQpüa›šŁfłś‡ß`|Él? QÜ/y&ă)íQ8µ5â…ą—ö¨mčÁ)ľaŮëš÷¨–ÖÓ{Tă%Hh(ĘĂ6ÇBjö ?|Śđč¤sŐlČ*éŞXsŇ'ńŁĺ!> •k?św;’*ÇĘóddĂ:ůő=&RŽżb‚ď×7mŽžCňÔÜ‹(ť0Ü8Sd1Ö¸^ň\cCŮ N&zź69Ae—$H„jjY˘ˇ’C‹9—;CÂR«_˛ě'Áäő-? z€ď{Tő†śĺ=R×¶OWvµžßČ6á¶“–úžTĂ`˛1Ú=w·äĎG”m¬Ş}<$—|ĘîÓß1+tŹ],` FŇ,A ¤MËeüŽiGŚˇĹšvL—Ȭ“D‡şř\ÝńęHk ŢÔĄ>ô«VIáÝOdş5ÄłxżFÄŢ@ăŔÎ裚žŐ &ĆÄ:’žë—&Ľ(˛Lř>©Ŕ{š€!¶K˝ݶg‹6![tJt·†Q79Ďá¬ń¬ĘÇCrY~„Ěż*Ýt$Ěq⼄ öÚ+Pş±XĹöđ<“w§ËRý`‚z˙ŘÓ$—.e6hIĆ9qšĐÉŽÜÁ”Ô}óŠ‹ é„™ TiG´Zh•˙ ‡Sq6ĂŽJşčJárw€TÎ;FÂÇž_ŠxhBDoÇ 1F»IUĄĎ˙ĽfHőJ 2iR…»ÔI ż9j¦oO˝‰é6jŮĘĂM×sĄŹ`’ÎÄ”(ó¤'Ţ‹|Í`źë—MĘńi-E\ŢůZ*Ž„; …&˛ ˝i5ÝĹŘÂë‹ @H”}sz¦ř’ŽeŞ©Ĺmf˘jć_¶ÝW*‘î#QĘ1·č ˛K_ · ɵţY¶ÚN—!H ňëuŚje â\QýGX˙uAkźn”hJ ‰o÷čéő"nęx‹ =´ĽdcV¬›kîX¨Lőü€‚†el …t¨ëΕ¸mŕŰT5Ú–ű¦¤¦ Jšícq¦MUo’rW_}zśćŢk h2–]Ĺ…Uđ'v×-uŹ‚§ĚĎ-=rŰ:[ŚPM=ś‘»&ÂőéŤr¸#@ÍěŢ)iAé8Wîöl÷çŘcŘ6¶Ý„?Ďôv/ű—Ân¤ţdo‡śHCʏ-ĺDúEŔ!ÇŤ4?ˇ©şţ‚Tđ¸I™ŮS»ó–˝BKÚ#hsÔŽÇ*3ÉËH$™4v˙^ŐxUŃŹ±I"övzbWjĚD®ü9ş‚.˝oŁĚË 9¶ş:«B¤ľ´CÍ ×uĂ2ö¶éµŢŠ2ĺOä’ĐŠŰu˝×{öűS]‹îáĎůŤ‹´/Ĺ©’ĐÁËH{ŹČs/i±Ű±i ˙Ď%´aşĎˇGđŤŘwp˛€t—6‰ŞËŐ|v*îž<*ac ZO ťwđO”đ4Ę.ˇ ß ä©UĎż64M'N˙G‡[Ő3Ë›đo fî»s4ʸ>1Řváz¶)˛ŕhÜÚ4q¸©+Jfˇz(úţáGdIőć)µ'Kż\ó2RÚIv<1s÷R}Us0Ş‘ÂűRhG[Ž‹Ś ť¦©vä„lˇřm¤ Q˝‰#=rĘŰŁĹ‹l“wéôznHečd+%…Ëě“Ç­ł«ăL"ÖĹČ`”Ńëtň·ĺÄ8?4úňžb]ŇąxŃëĚa}ęY"•+—sUďĆt ÍŐëîR†®o†Ŕk‡:M·"†ˇ_h'd $d˘˙Uö¬<ŠźNaŤĂÝ TAÁťÎŰ•Śź$†&Ü)Ů é¨x_@-ô c$JĺsuďŽ1-ĂŰŐÍ®?XÝ™ç%TöDŽ~ÜY7dµ¸Ľ<Ădh\éěD坪ÚăćNzś±m¦küM‰T\Î&·ë29~c%“6RbţĂđPÓŰx|©Ć[ťCĎ•ľč`ľ…j¨şWH*ćböí¤üϡ!azŤőBş°X8vA^ڇ)„ű ß§·źíú@­Ëş´Í珚†RćŚaM±CbSd˘|:耙7`ôd}¶¦¤ňKGfąęóőŔŠ[˙Ű·‹Ŕ_n6 ÖĽüŤŐIY}ÇőiRŘp]·ĂÄ ˛ Ó¶T±˝Ů ďŮÂ}/Ż&d?µVNéŹ|ŕ¶u‘Ş3˝ăXÝG:;Yýďpëă|Ş "ĺÍŢ Ó®pX+GX2Č KŤ`–2±ľ•‚¡Â7ń ź"$ÄŤ'ľĘ3|ÁMŠ7P ˙üţx&m4ąăäžőÜźÜ,–¨‡ ŮUÇ ÄŞZÚbÎŁ“u´™vĐkVJR_Á×;7eŰľŚ­ýqČ0$2rčŮäCű#$ ^ńŁůů ź x€Ź<ü•^.Ę'Iâ"wĽ…űě•ĆA]zńf×”p°ÁbŇO­¶&%Ş16™Ľî¤NGňZuÉŤC»Üó[oŻđŹo±x{~Ú(4=RŃ$ 9Ôů%zăj“™“çţϢ÷0”nŰ;iߤi÷ó&(h^ĂęČÎŚĎJ7k®B>ţ´ ˇ…‹Ý·UąNȲŢç%%×óh&t÷čÂ3đË~jˇG#Ú¬cÔ·v>ŠZ ’,»‰8Bş!y bXßxřÍěń·,¦đćmáklt@8Ë,2mµżzC di¸Ô´<-ŤuޢU6gČń<ąŽ7źÜÖi@Îö˘5ń3’™2˘ťŔ÷‘űÁ;ľ •ĹĆ@Kć&Á•™Ibiv8¦q%fzc«Zzx@řϦ_plâ2kN†Ôżw/Ź9°›Ďpx¬#$ý¤˛EúÓŃěĹůýˇ‡Í ťců9%۱ÔÎ3(ĺë7rMiâmζPÓ,UEźm·Ăř4Z¬K3+Ľ\>GźňI¸j+aHťűÍMCpˇ\!^HL’]¶ü|´§ŹČ‚ˇ„jĚŹ!ś™7ÔŮĺëÖ‡‡6ż‚ąFwťpđIóBčµíę*ź°qS%?•“dţŽË&už^†›cc`»ŇNŕb×1Ôú> ŁNxY°ţHŤM…Ë;ëJLBR9D0ąňmÂAĐşz Ů˝<ń´÷`ĄtVÍâjDV Wâqçĺď| O„}Áîó÷ ,±ő´ăf§GÜ&üß*Dé§1Ĺ ŮüŰy­»ţnéńčvČ­RŐ†oŃ-đʎ|ćČP+uę9Âä57ú®4)Ćľ©Gb¶×48΀Ď…;rDŃ7îŽp~ŠS2›ďç?@aµUH“lőfÎ \DůĽ! öĐEŠ1ż¦Ń9Ű­A*.Ho4Aż»k ĹOW’yt^|Őăcňž÷V˘ËtTňňc5Ý' š/X…+úJM‹Ş˙śk˙&=˙–óš©:K•9řm`\çËEz ţ¸ĚţCDa ţ&ůć’[ÖĘ{®ĐŻMµâ,-™ŹL”Pä5Ř’&»Ň©lE¨Ö.>#ë|mS‡GĚ~ö<1ĐYđ]!b¶?şĎ×’¬#Ó.±w5ĘĂĺ_K ą/Ťă°“ĺL’yąý8Ń”~(9l?HÉĎZ˛·PĄaÖOˇ;঍‰{řiB„ü[ Ic·D4ŇpÎM NÇŕ(áe´Š[řćĚłé×$jŢzäϵ ďs[eÄ4řźŇ‰Ž‘=ň¸ęYĹ÷…CRxÜó7ŮŇ’ž?}ăą‘§MÉ­·şĚŞl\ßâlŽëÇçö›ÍÖÔ©QOnĘ®¨bß0ÉNÎĆ]m<îNó¬ćă V‡Â EW¶łeÜ6 ¨-Ią™î|}{×íś[X^35M¨ÚŹúc'ĐI']­Göü$htţ])+^CÂMfgĽ ҲśŽˇÔ{ĂFN 'Ë<»-NĂ55LJűÓŘk3'ňz)ąâčaę šbM..ťSOć”=Ľ4u~©Q¬kčIß'Q#?Žă«:׎¨ŘJˇő-ŘÝSćě[q Ë1í5ś˘Ąâf[L‰.Ę*×Ënw,/ ˙‘ľťéŔüÝű+(a;×-+uG† hÇĘo0âN.f©–sG4«w—äŮńu“ř˛IÁlbäĄÉßcĐ·ą_ň6Zëy”ĘýŁßbŤ7éŰP(amh ů˝ý/üI8}¦nÉ,ńjDFC–ő»•{aŽç?h›Í‰EĂÔqĚžj0EśřbŹ6ÜŔ瀥6›zE{ç8,ěA^Z–]*<ľöv«ń_ ‹qš™˛ÁoçËĺ ?›[ܧ ń #EŕçĄoé°­Gd±jŤÚď·“Ł{Ë©ŮU¶Ä8˘lň›7PëÖ[¨Č˘ąh‘•ą÷Š;X¤FŰ‹ÝGú”ë†=Ľ2l3˘D±Ťői ¶mŹ4a»é댲‡y=/ ˝‰¦ă¶Ą"îE”íJĽőgŢú>ŮJ…żSřhîhţ%ń~–_¦Ććdď_ŕgŕ&c®í¸i fË6F?ĄW‡đ´*„.@ŻÉmň>Íđ^XŤž(zWbśŻŢĘľÉŘěf»±] %}AAЉ;l•˙´Ó˝«äB’Ý·˛ŮĘĚG3ľ?NŽ˘éžsî‡9ž‡‹c lK*(™HÂFÇ áĘ{žýöč«ÔňT//đŃ)…ł«B˙Ă[ĹP­_ř­2XNÉŐ׌ܟÍ䄝ęűÇř¤•Ť÷e‚f ýŢE6FnS}®…… z ăśY;ľ!®Ök ě#|'EÂ*~¨72Q–‰xźň…7FşĎI+|~ěĄŠŁ ˘Ř@÷ŢÔŘ&®ă Í÷Îő)j÷WÄ©űč ÓÝ.›…ŔÔx „šÓ¨ÔIđźĂďmĎśJź(’X÷ů‚/íH1HŇş]¸Č ú;ÁZ{ßµ_ążŽá$ÍĂK­C_Ď^.ąŹŮŇĎľ©LđLUQňľ¸ţ}„ö{ľéÄMWYř s×óřăj|ŽZ—X°ÓNĚ{x ˙ÉL‘ ľéÉj4ëI=%Ç›‡ĎíÄ÷6q/ź§Ď¶Qic ÎhҵF¤Cđ6Š âK 9b•Ôhr¦ ŤćŔb7ĎsśâÂ.ĺh â€§˛+‹şÎťŃż€ż1”ÓâSúądčbmTp´ŻŹ‚±hxˇ Ô'6žú\÷–gŻ8ó-€‚r.ţ˘ś#aú ó+ŻIâ{F;°Tq˝ L«.]8*9&ú ˛ÓĘ+JŠ śźB•ë7ńk~ůžĘ-[Vá ŠŤ+ Ţ#ر—ćuŽ´?ŘŤ˘ţ<7O­µ$Únt·t¸sžˇáÉĂ yLqv-$Ł„}NÇ!”˝"ľ|ŹUśĄjǢ;:ëۧ÷ŕ2®.z§đLţ+é‰,3W0e‹vN‘°Ŕú:ŻĄ-@Ʊ4~[«+á· TáaâTő"&´-\ä3ů#BDĽ÷őřŃą˝“0â {%‘dA¬ŽĐßy…·Q2Ń·Ł[ŽąĚ2?ěéw›Q †,s–ި•·ćÄčËh7ße4÷tĹČ0qű˛9sdt`ą’çť,“\ŽÇ&€ŻţŘy€L/Gĺ*üzÇý=OI ·ő¬Fç6ÚË·f˛ôpŚäŽI‘ołm\„iÄ&BiÇrlât<¨5N’ÝŻW~gÔćps^ąá»čňŕBëiĂņ8KšśńÎ1y±ÄLí¤Dʶ9Łq°?ř¶°?Ü’văeCÍ—~VĽW€@ŇŞÖđ±)´Ô ü&=úöµhČk'°7Ĺ1·°,ë´{ĺ\ÉaĽ~mĎŞXŢT14ssĄ6VˇÄŤá¦#ź» s}Ěś€Ą—ňn…ŹĆH•ŠŞ/2î§Đt“ôľ5d·yG™7Ł›ŕJ Ú™`ÉŰë8§ –ťş4)pź–M_ŽĆyjŚ˙¤xŢTćEúÂŹűs›%$ŕÖcćt€TjK%·±)Ŕc˝é¨1EťžÂřS>a˛mfŔ6JĄ¬ö–”9­8Ás†ąF|CwEř\Âźľ5˘ě(ă˙HäŞ//*Ą?¤\ń^ đ\§‚TXŘčÇqk*µĐĹź+źÖ•ŠDEŘŚ~¨X.ÔúPW2Ű3-\”÷!˝&á†ÝUźÓRfźýŽ8ĘWĄLuQ09R-#ő‰^đţ©ŞćL?Λ–嫉3ňĽzAînYiŠ#úiň‡'ÜK jd'ÚU7yEÝdČ#ńđĎ“ôŐ;Z.K&üҢT…©3꾀”jąŢ1¦[fôüÇ«~ľî~ű}˘¨ŚÔ‘°/?Ř™]ŠŠH/f¸Äy=ŃývgEí4żŞc˝áďŻĐ˛ůpÖw|1Áę_ópä×'nÇSË#óďŃoż Ľé>(F+‰ «HŤrpÄď 3>ŻŤŃĽvă5Ő)˘´78Čmćq ^ˇHB7ŃxÔô-Ľě4ü_n˛Éš«BW>™ńĄűp̰° Ţgč7Ć-·ď`I›NéîĘŇČĆs]¤h$ţ#S.Ȳ©iŐş/ť\ ;R72:f/±AÂDf«j*Ýěq'ô7h]Ű_pÝHýĘ3o耭§IŞxOdz¶€}¤d µßaâ2wëđs—ÂJţĐzBtÖJ<üňIÓc«˛˘ řť[±ëuéÖ|üŢú˛ `·»Ś~=oÁUş—ůUN×1±ÔÔúżłá~~T/}CaQužĽĺÂŢÉ3^/ĘdÚT 0űÁ;EsŃÖ§"3ŤďdäńĐ€ŹPj•Ú“v-Yľhý«7†;˙RrűŐh€ć—‡P=čTPS)“µcy×Î~·Ü9É˝ó«LGZ﫣G[ÓI.V©›őŰ䌛ŹÇäb$˛H®vtë3۶ (őňw˙ě÷ŠtU˙=)ľĺr+ÚŹvŻşq;Jç3ÁĹUř‰®3ލcľ¤÷J°Ą+‚±Rj=‚ ͦâ‡KDMß=eů(RÚL˘‚Őő˛óű^ćSöL„‹feÁ@ŞĄŮK„©ş#Ç{ca Żčţ‹ô‚˙{«XĽČfŢMwë“ĐÍ϶ ›yęĚV•e_űĎ fX™ďHpësŁÖěQyQ}Éü·K˝˝ëx˘‘źŇé׋ţZá}”ŞbżˇöřA™ĺët N^—_K–Ofy8Ů’ŐŻ5[g±ńQǰş«5o‹›z"ŠŚµňµ+h#Ů2© ˙ś•MÎNĚ•ň/^–}+aßyŢI¬Ń‡Ł·J}ň˝Jl*µ/ł‹ yVŞőú9ÍS¨%_ůÖ3¨ĺ&ß!Żđ©pnÔ„ÎiňÇ/˘±tɰh5w°–cyâËužÇßCźZ©¨6ÖJČŠ=•aˇ3ĺéX Ś…6|Čš¸&ÎT$î*<čLw ™ }iśĄ<+%/Q);a Qpp". . ţ¸KŠ™Î-ÄU%őž,2ćxďĐđcź3ń) kę1Â!ű®§×׋dRžvUËVą·ÝyuÉŮ żRE˙˙˘ ]ňWXč„ßéß§)—hęŃ?®!“qăŘĐ>±¸_đtňvóâ-!OŻFë‹"•\Ëoą ®ď#±u8r!@.3sT$çŽ#®šĚ3JĂč)đ)€—͆Ҫ^ŘW,rą$hGČ,÷ůďBru‚˘]@(+jZSĂgŰšąmąşÔy׸ ç*ŻÔoV Z?<'`Č|‰­›Ë91Ľâ,ôC6Ç5ˇ÷\íç„7Ąuó4Ń˝ęjEAé›%ř=‡!` —ąaŚTqľň2‚é“:űęRÉ€z˝UË5tŤÂPŇj+KN(o¦&–“—´k¤pŁâwHUŘĐp˛!Ĺü˘îpËôa’Ŕ°z™ÎEQöčżý@ŻÔa±xř(!…ěŤĎ Ţî·Űw2pŠ ŁŻDę¬0c°FôĄoeŤ"v#@@tËQ8<ş‘ő ˙5rgÇ5MÍşq1 ŠHßy‡ËËĺťŃ*ŕ-°şć¨‡JŔţV5ä˙®P9'S "O=®;R8(TTI2Ăü*=ˇnŻ´)ĚŮT°Qú‚˙éÔ%Ţo‰'Â^ŮI`I›NńOźć\/×÷rĽĂ’Úˇ¨$‚ŕ‰ ÖŔäŹXⲫ…*+^Ź‘Îň3ŕrͱď]Ĺ.47®LĘ_Ákp™ç_¨é.Í5"Ëp‹ĐIJ±6,fő„«Ďň IdžBe“˘ŕ’ĺ ´Ź‘ĺ!ęŠ!Ch.˙ßś­Á‚¸’ –Ęcô“Îź%>2w·CŞů®]ĚÍŰüôd*eęo÷¶ĹďˇR_“Ě^{¶ý‰vřEÚşÎ)Töâ0qľ«bŐƆ¨ÄË#8' ÂX~˛±ŠF‹ÄÓĘu媕ÓCňZÔş‹MiďeÖĄ˝tB˝lwňíăаh7íjd j¨Q PjpňÖĽ$NçW®Ă/ë“ŃËŰA=\Q\\é‘ŇąćŰŃôŐÉÍXš–Ľ+Ü’"}Éy÷اa–ÎĄ9ŔĺÖ ˙ěŕ{ĚŁ›ŕ˙yá;ţŘ~/ŃÇ} A/ʍd?TkĘďć¶Š›€NERţ#”4¬ŁkeGŹŚ‰-ăEÁú­V|„ŠÚřÉ—ŕús ź2ź “•ţ Ŕ¬9*/w*< ÚĺU… ¤ĽëA#yâa$>Ëb)ÖťOŇeVâ6»Öć>q‹o$™ŤźU®~űxŻČ5ěs·¤ż^ˇµ\_Š ZîĂö©“)ąX¦«€c/ljçiľÝaÍ^×cŞĎ8O9>ćÖ#ďęűŞ ŕˇIܸĚi)<ĂÚ₩©@ř$?lľL‘˛y~cC"É$ëÇŇzR'ø¸t}ă9äxş–ŚÄśÇpť<÷z™hb˝¸JX,dG "ťg–Eđć. W*Ţ JŐ‹Ńň©gŮ;ý÷•lH]ÓÉlÉę›üX+řÄTOb›E6Çŕ5ŞĆ»N-›şIM°o<”Ď viíž6„€Á…ŮvEĄdwnf"í×;ÎâŢýć—ő —+¦üÚL–r|Ţ~í_„úÁ€xÉďĺEy.!¤Ąr—;Ś®‹y8˛ZĽŢ:p逹ÁnA˘@YŤ-Ń„V4ÝĽ%¶Ótč*łjŔ¦1­ÄLä=‡Wä5éşŘűg±®Ď9×ű"şKÝ(ßŔFf:Ćd=ÍŁ¨)߲ދŞw˘ŮcąŚ~şNC§JM%ËęJ›Útĺ•xEët°2-č1>˝ó˙ y€ÇDrCÔďt%őĆ& CδÝX-IĎ«1ŢŇeŻ AŔŹ‘ł*ľŕ9˛ý‡Ł’~Ąmď^}Ź|ąI®Üíöv˛PÁtDdZE´*<G«DčQ1tůĹA|¸OŰŕá÷&$"çđEůÚ6¨YËga4×ă07N%+ńţĆ&Kň»ý+Bő7rź!čť°7X•°á,› šF÷yn0p];rÎGË#ŕŮy€ňý­ćßWŔëµmDhđFÍ©Xşt` _Í4ĹAőË ťéÄ«ŔŽ3:ąYŢó%ž‘^fk—Ăײ3ąÎ ‰Ź0ŚĎŢwϧĐ\µ3EVŻ˝±‡ęĘ3řyršĎł÷MęńIÉç‡Á¤9ŮŕŁ8JúŘÓň¶Z?t–j>ű}@ŠŻŠç ÷!7[ˇođĘw<^*,ĎűI?ęě‹řĘpýÄd˝=űŮ)tw¦´(›čfY Äéťđ<—qűp‚łĹůAŰץE¤IkVHŞĘ¶5l˙×/âĎŃ ¸ŠW§UÎčšeҵŁ"űě@VóÔöČ ńó)ÜźŤÝŢa&QI€‡<ś2¤±©é`‰ÂŃŮ›—®Ę"jxrÖúmÁyu{1Ň®eb[íp•ęč íÍÍ@ÎzÄ—0†`‰!čgy¨\†Áuťř(Cßą^a@JÖ%¨)őÇçßÖ —Ř5űÍ%ę´(˙°ox}Đ Ó(AA&łľÁkŹQµ8 ­} EŮĚKCă>âH­t`CĎŇăĘa1bÁ˙P5ł’[H|údŚŐšŰ c,7Ů„ÓAMďŘęi"Ď4°×Ń) ÄŁqË »čtss^śz ů‰fU©BŐVh‰¨‚ tQú'˘ŢG LŇ•^PÂÜŤ H|ÓJnľm¤äĐQLŁAťtÖüŠÚ–8y˘/Öâ—qűSýő›đRŘÜń“«KoSKĘ"›R EWkl‘1ÖdÄxé’Űoú#ôµ‘®E+Öćäšľú4ŐY”cĆvř5źč kÓŽ«Ě45ýĚbX­Oj:Ţüő~.@€‚Ě‚Í'g6)X€eb˛»t/-ĎD0ëo”V+sńtŁp ĂL®Äm˛Ňš0`ĐĽâĚcőćDl‡ ™HŞyfsŢÓ‚lŮÍWŃÄ BP•ŞpÓÔ»^× ë€_=0˙nŻ—÷úy?ŔsőfI‹#žşđ“R˘ěÚÍ­Qś¨~…’mMT1&– ÷N=ČŁďÂ:_Ľ{˛&đ*ÜźşmP*ŻŮ¨L˛ˇ‡`­Žł8d+śj%€+ôŐĄ‹˛°‚}»=×”şĄuŽńˇKŔ ň{‘dBߣ]@ ÔĆÓKxyŃĎÁĘů <ŹcÝ–»†Ľ>ܢČlGŚmŚRt\6w‘m ů€!´Đ:šŰTEÇ3ţÖď6&“mĄ7 $·açPčŹ[BDwŽŁ|í?4ZÓŚ˛Í•–u<›˙óÚSŰ.Qkgq—Ý>ňéiĂY¬ńn°%ishłSFMZZş‡’iäÍŔ9ë"×e1ް܀Šç}’šKN3x…Ęl_n@;wG-šĄą¦“gáż+•šKż~uęÜôň’•»ďË’ćÎĂh ČMŐv‡ţתO7ĺjĹëhŮĚŐ‰`Ą#żňˇv;ŹÉxŚ 7g¸b‚Ź•îÉOQ H» nuÇ˝" uăA„ű_‡lѶŰr”XLšö­—ÇO[ĆÉ:;rű¸˝ŞĘ Tá`‡ŃóúoúµO†""’[.صµôŹ%Ő|zc30ěţ#2+ęęLd)SŇěýM´]ÔÂN›_é-ŮVgźęTŹŞt>Ó"¸#±@|Gçú·‰˘EÄw endstream endobj 1268 0 obj << /Type /FontDescriptor /FontName /BFWHCH+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 /CapHeight 651 /Descent -216 /ItalicAngle 0 /StemV 85 /XHeight 450 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/adieresis/ampersand/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) /FontFile 1267 0 R >> endobj 1269 0 obj << /Length1 1647 /Length2 9103 /Length3 0 /Length 9947 /Filter /FlateDecode >> stream xÚ­weX\Ý’5Ü ¬ Ü][ŕ iÜÝ%¸{€ŕîîîî® î‚ yßąsçąß7fîŹsžłkíZUµWízş©Č•TEŚ­ A’ÖFV&>€ŘĘĐŃ^ŮÚJÁš÷Ł2ČÔQĆh xĹ8‘©¨Äě@@°5Dčâh€Śâ #€•——™ fmăj65sШ)kĐŇÓ3üÓňg ŔĐőČ«§=Ř ~ýpYZŰX Ż˙kGŕ`€-A1E%-)Ť”‚@ Ů˝ˇähh 6| ö Z€‰µŔňďŔČb ţSš=Ó+—=°·_Ý@.F ›?Ŕdg¶·ý€í¦v@Ăë8XŔ#KGă? ĽÚM¬˙JČĆÎúu‡Ő+öJ¦dmď`od¶qĽFU—ü;O3 ĂźŘöŕW`mňşÓŘÚČńOIaŻ4ݍ ±8€\ţÄ2ŚÁö6–@××ŘŻd6vŕżŇp´CL˙™Ŕd ´3¶ŮۿҼr˙9ťÖ řoŐml,]˙ň¶ţk×ĺv°Yš0!ł˛˝Ć4rxŤm † 3˙é‰5€•ĺo»±ŁÍ?0'Ý_Dó§gh_“[C,]Ć dfk‡×š˙ťĘL˙>‘˙ ˙[ţ·Čű÷_5úo—ř˙zź˙•ZŇŃŇRhőÚĎŔë BŻłđ đgŘXíŘč˙qZ-]˙'çÝ­ú;ë˙äüWřď"ÓW…Y9™8˙6í%Á. c%°‘ŔhůzxŮŐ Ć ;K0ô*ň_çűęÄÂň/ŞŘČňG Îż!Äř_kxŐíŻ ĵŐµé˙‡iű×fĄ×®pPuµţ3’†Ľµń-ţP‰ŠZ»ÜYąxŚlÜ,Ż—ńő:ň˛qxţÂţEÄúϵ<ĐÁěĐaabaaĽľ˙ńüsőĺ_h$ FÖĆúHĹ1~m˝˙2üŤíě^˙kĽVţŹő_—r!/Í[ń'§Ą8Tâë×éîd…í´)¨QÍÍń)·îđNŮä-1x¬dŞç{nrť;´yÚ•ĄŰěÄłüĐ‘:Í&ö¤ íĘÁZŁná¦ßócÖ+@K9Ňw?›ý´ńF›‹E}okôł˛^ţ#<Éx »âŮ­…SŽĺ­ ş—QRun+f-vĺ÷Ă#ę¸ý»Ű˝Cý}p]»Dô™QHTü@|Ż„CňxW»ëŁg¸'nGg4÷·)OŽľ÷ÉÖbUnÓżŘ|hZ ®üÇuE“ěk–ĚjYÜÎúŻÍÄ)ÁÄŹ©Üľ’•‘FA—ç»Ýü7,Ä ëô˛j©mNš>75‹‰h’Ě4ě©Ç2.—Ŕ,  &‡Yżä2Ťň IŠĘ­¨ăçú}ďw8±Ů ŁýŮ“dŐr]5y‰1űżcás†6đś÷Ąó=äTÇٱ,¨°Ýbľ=Ľż=¶U.W1a:¬ZÉaÉ/1_ żt{¬6ă–öWĆi›ývÚSŻW¦Úcŕ‚ů®µľ$’¤ˇâ péµ@…hëLCý ź«Ű—l»îú¦ZđuÜj@Ľ·«ĽŃóÚfI’ŘÇőb?ŰUŢŤ÷Ě,Íăp±bď¸ĐŮvťĘ⣖ć×X*PIN—kuĆřx•ü‚0Ď×&YŻÜ Kô¬‡Ůdô{Veµ•b.du¸ďä)c:rfy™Âď˛t[xůŠI*HÁ`hŁ:n`ˇEŤÜ^&‡ăZF丧\ń Ź‘Ćs9ŮHŹěĽ¶§9}Eä ;öZÜęc6ü0ްń7WłÚ—é~J5şÚa\ä'nÇË ,mL¬‰ëÝ+•Ö÷ É*諾7Ô囍Ľčz%D°C§5ÂŽ-śn ÔZ1l \]QG´¶ů?·ü’® řUŇî)ě7Ľł[ĎO75ŹuŽ#;néZżvđß<äôO5L Dá:ďĄě Ś´·ĚV ĄŢýčĚ1mW´ń{nQÖXfĘU#‰뉧!ȱÚ\Źśí™c7&ÂSčÓS˘š}{[+Đ(A©=‰rµŁa˘V*Đ‹~HÇŇq °ŁRÉËL Ë c–RéŮ]˝ÍĽ,»?Jť‘ű>m·‘7[g‡•ěsŃť4[ě–jąîŠťżĂŮŚ’ž«J}Ěü‚‡ô®ŕňĘ3v1e›I¨îô)Ó@műMl­˙PîyLŤú ¸Ł+qyĎY[ŢBU· ˇ¸7Y4żk@<ăŚ^׎’÷ě3“MRÖáBE4«Ť–B]Ź* ˙B %â…ŁÍé|ďˇĆ䉽rÇŻ°.ŕ„®Č€ĂůWÖ€/‡îl«GxBĘHXü9ł : Ô´ßeU/Đ8ÁQ¨řŢjô«iő¸á X@ę)[ ź¤źÁ7-Ä^ăÚ"ľ±Ť¤U† ÝŻŁŁ°‡Hvs“nńXőűáKŐĚŚ‚0F˝ÓĎÇFÚßHM缗1"ÄĘדŞ-ײ‘Ő<ČîČhaVŢ>ÂËîemü(h dYXďŘź ŽťUä=6CĆpŐ‚µ}¸PđtíÁ™ú¸^&ÄËđ®Íji–#ÁŇ9¸Ô?« ŃŢ/p°B»wĎ˙'‘‰‡P0 "ÜR*Ǧö\üyĽk%#<áCE†)kÚ YžX{…§ÜL›=Żc¨­­qÉ—‡Ű'‰«ĐŘ&}L [{§¶ś`˙źń):ôrśęSٵ*ÝŠľÁd©G.ô]ŕ_tˇđî™âş(Ł›źüjdEś–¤‚€·>4vˆjěVă'hÍ\ŮM mÓăđbń—ŘŕËëęZjćĚOd•]üÁŃ’8ČöäÚčx7·zVGő"‰­ĽŢOpŤľŞS}ô†(?ě۬ Ť¬$‰˝mâK!ŻŰ5Ĺväă‹»ĺK8ť´šđysI!>V˛+1]C¶˘AęVÔĄŁ Ú}f~áîĎ €ĹĐŘ ęj#ĹÝŇ«%Fš±ÂQŇ$xs™ŕă~í±Ž,î˛Ú}¬žSÉZŔS®ŽŢ Šzt ć¶×A‹l#÷QřÖčŢüë[" ł; _!ű_ß““5~]^L}ŮpĆŠÚăí桍?rGýć$SűöfďŤxÎAŇŠYú>ăí°źGÄCg¬6á’ó#s] E*= LM©%uoÚyä­n«Ť %Y}Ť€yń=4aŤĺ‚& ßxÔVB`6>ŕT©ĺ¨yu›eOG^űś5´ŠŹ·l7!»~>¤Ń›řă„\şn­‚ÁĤiýI·ę‹Őńt÷–.űY\~»Ď“©ř€Đ~™Ąš°Ut7P„e9Ě+›Ją‰ţ‰m;^úPďóđë iEhbˇŐč;m‹»ďç@ľ`RĂVč5xĂblqŇł¸©‘Ú:»/üÉYQ5(°Ko’;–جĽĺÓí+Ăüő“T®^«”{xtĘżVPĚ2¸ľÜmŤ`§Üh»»ŔëĂ8=—RĹĄľMĆ›š(˝ l,{6żÁ§^|ĽÁR^·«#ŁŻW‘t50šÂ”"_ĹŔĐE·f*ͧ\śęé ĺěţއˇř?]H×@ˇâ·ľľFľ~M‡Ţ$8$î ö>·Ĺké¬K$›‰w„ą˙"É-ť 6KúLS$YmBYQ[ţőY’x±xöń›±¦ĹHľ 2nXż–µČě…6b]†ć×Vócd¬çĹhŮnűëŽ(˙—vá=ě«Ňxň\sáď·íD‰‘ÖřJ9ÜÉň”ńő¸ÇDkńâÜí-N?(JžäË8!°Od‡­Ä°ˇ ş6*ŽgéÁ†jSW+1;śi“´¤:ő (ţÉŢy(ëĽd·ł_HÜýżÝPżiTsgz|cÎLčţĹ2¸wÝ–*€˘đ¦ŰŇ7÷ÂĂtó6u5°wŮé­ĐˇÓş2ó§ŽVŹţZł<Í!*hľîRúYÝIpDaŠcM‰NŰeb˛T1ń’ pVÔËŕ>’=ţUŚ|oˇĐ@·©Îé:ËCĄv„(ćř••nëÝJ:Ý’°ĹËvPŹÉÖUpů»!áYUY#syćů»#ĎrŁÔ÷łuý–ónťýžjŚëź;†*ŰLb Ťĺrćd(l5Č3\¤˙”Ŕ•pͲK˘ZŻÉ&Rúo]Kź‰Łi޶Wo_Ü( (hx˘7‰úWlg“ë’#Ťg~ih~eB8÷ ¸1QÔŻČŹZ{_&JޡyëacÚďçčČRá6٬Îb”ťß`|ků„$~%ţĺĘŘĹ-»łčµ{Z-BYOěK‰â‘0=Ç NYj![iĐéţî`ů+2fY0ˇě˘o»R ĽyŽÖB?lŠtJŘ…‹űăŔôŤpŚaOŇV{níNŐT˘#âŹCĘ>QŮÍý‚lM¶dô¬paÝî÷¸ä:QšsčŐúf\‰l Çi{Ú.ĄĂĽ]ň~ Ü\Ű\i¤Ç Q–8ŰžvĘ…*®\Źb”R”đµ°iľl>Ç[+ż °Ö™t OE5ü«žYĄ">i]Eá-xKĆŚŤł;vđ!ĄâŮö­¸¦>żűuţp§UÔé÷Ą·ž×4yFźÔťü‡ńÍč _ź Qş›ˇęőÎ`1Š,{Ű›Q5š!“u<ůqcF¸s.]»2ÂEőŮTîh¨uK$®ź—’–5±Ćä·ÂŐŔ@(׍ĚÄ1#żËH_ŽőŠ űÚ͇®éŞ#Ť+*ŞÎŤßť7/¦Ú đźĺ>·.wą!óř`żM~8˛j­$[IÄD‹ö#¬\7‰ć™Đx9Í®UokߡáąŐĎoK ˘’ČBXÜË*dóńăĹÂ.}äÓS+~ÄŽŚDGSË1ĆţMŁŤ˙ţdóÓ ňfSún™Ůđ±”[žĺĐwă–ń.b^ńĹÝÉq˛Nµ”é>ϸ~vĂžť=úăÄîŇ[—¬±órů"YB>Ý,Y@t}§î_ďä®_.+˛*-„©ŻľąěUoęćD~H|Ë'Ă‹ Mř*4šÎ8´ŕBúč¶“"fĂţsgü÷" •*2(,=;II$ľ‡·7GĎsQ1ÖěpŹ‘K·ŰŰş¨ďxČ`V˛T+ő·¬‹nˇ¶&#lEíKbĽVÚoÖ#D řń’d¨ŽÔş q˙K†¨Ý#ůň’ňó{е……#Ţî%Ź…VńáŕRÍ{Ńi(w8«H"<¬ĹËQ(„¶„–{×ë·íýĂTĺáô˛rę/śÍđűČůí”ďß-Eń– p^dńW!…I]‰=9|D·&2˝-ł›­¦Weű*"Śő=ŃS[ Łźâ@yŐák>‰Ę‹'ä~ă»pyí§č ÜÔĆk[z źř ş…ĂČe  ŮľěG<9ĆŇÜ÷˘¸ŞăÚD+"ú>ąă…LbŠ0J>ľÝ–CHčPg˝łĂ^.¨[(Őů›:m‡=WśűŽ, n>† śűmIľ¦cĎÚ\<ÄĂrú†O˙śH8DVĚë«üŮĎĎ@ö<ńčmŽŠłMęSÝĽęŔkdˇ ”iŁ»]—[ ý`8);©Ö‹Ë( <¨Ýř”HčőýŁwü‡LâŤČc.ŇĎ‘ŤâĎÜM«¬ŻŽýĂzSSCă ™nižď¶~-XdŚ/ÔWţa>Źş»AŞ–Z­Íß0Żľň‰ł\+ľ ±pšŢkHW‹…ăçĘd$¶Ç(w4ó)ľç ř;K“űoYó|ü1ß,—ëř: zí­ub7Ľn)7“.Ü–ËpWU#§µgÔ"RăLő™šXů8Ń‹$Ü:ęA/śýĺ‹ŰĽČáęä{ĺF´mú«››źó“|MŐ­hţ‹E]aˇ~×P’É~ž*KHJvç0gŠ {:~Éáß]‡÷ű.Ý;=LĎ]ĐX j îGŠ]hą×„ }4"] /Ĺj8ë*9ůü$mşˇCőşET«ťĹ—zí=öŕ‰řÖ‘8˛čP®BöÓäŻqľ§Wz§$cÉýbJmĽiö,Ď—jŢű˘0g„¤ÎŞB`ůYî°˛AzpCvK(ý+â¶Ŕ¤đ‘úťšľ˛®ź‘‹}(*˛%'0 "6ĂzĹfP¤¸Täţ®dřťJő¶X^WŻČäĐB|S4Cú»ČŔÇVRoľHĚÝs1yźV“DÎ{؇ ˛9ş1íhž@’ôTŰ1dp,ëŹůy÷ÜéĽ. Mż"Ť˝6VÝäŚÓăv‚‡°=ťiĚ‘…¦B¨Ľd¦ ŚŇĘ®G’5vFĐÓ~ă÷Iâ±%’+.k䏾W%áSÓEÂŞGe31+D“•kśgEM?*[)QÖ“JaxöĚ0Vʦa¸n„§o;ČÇą W““.@O=ßkč"OŃ jďÚ¦H*i›‡‚É…-~es ]ľ“ö-_ôTŃŽřMŚďv˛‚‘ „KËúE(CM“H ŐÓ×L¦}éĺn0ĄCŕéOž•sJl?ň”>ľmčÔ…Ö_@-»uÄ7ĺŽçv] Ĺ)Ň,;nţŢî]58/Á,ú‚¨)ů} ŮĐa°Ŕ|?6OPł?©÷·yu˛“$jě*cţzßQ 5Yí—ă{Ű]ö‹±*Ľ'oˇu°{’z-EYŕ¶1¶ŇŁ"twžŐËʤ±?ćVäxäCJXr˝ŕ€}b‘˝Ć‡á‹ q“ęp´zŃff >tʸŁůěŔ<q +T‘Ŕý#żž¬…ÝĆÜÉg~eáa:jÓ\­đ¬Ç۱ˇźŰ™vý$˘ČoBÍý8iá‹ š–Řüýk÷ý'‡˛Ď"¨wët·űĘđš±;‘ă8óâ°Ś bRy= Ţfďé ž(mX‚ËĐÓ;«ĺL¤A˘8đůŔv?HťĚä–~yČŠN§a4ő˛18#J]ţ©·ęü2Ö'ü„>7` ťĚ9ŕťšÔ8!”8ůhě –҉k÷ő|6…CM°’?‡_4ůú¶—‘A@NF ó|Z¨‚Ěuă÷ŚŹď§ę¬“Pîßr\Ţ‹ýÁRZ&ĘĎŁŞŐ,µ«đ´;,‘?ÇNsyI×üÔćşMŞŢçĘúB˛Ú¨8CFiŚěäM™”°˙ÜW@”3s–ňůi»p‘přpŃJÉ_"WĎĹ,$çć™běś%‹ěWÝ’w‚P,šuúÂŔ˘=2ŔÁ4ô›ľPúâçMy·;}™™ŢZ—ť†b»č˘×‡äÎgLŻűř qł+NŔžĘrzĐŢYŮ8T'bP_ÉÜůŔŁ›”­¸6ü•vv$™?T’™ńŇę{btvŰB–ÔGŽ2'óý­ŽNëb9Ř©°€Ă㏴_pxđQŞH8ŹšöNÔÁhĹňGAnt'ćqB»Ĺń.Ɔ»řł‰îĚÄű@g\ć2dö¬:ĂőÇO!ˇMž‚g›qíśCďAňzmMÔ4^ąĐ%6ôĽl…VE«ämŃ® âN‹ ˘EWšťlö"˝Ż¤al†Î¬Ůç­ă %0úÓÜk±±ĂłU‡Tu=@ă1*´µ»LüÄ3 Ü <ű†“}' 5d‚qĽE|»»/ŁŚµľÔsQ[ňâm´l…Ť¶g$îŻqÁŁUضˇćT¦tZrî  Ó´gzŢěë%ë{EežüŃZÇH®‰ ĚŠËOEUłSÚ沑Ţ^L 3Čl²+p‡řEčdí·;Î[Č1– 3‚Žër?±ę7P\±»žciÂPńŰűîý®$š„µáy2Š?—B,^ p9ş`Éí±Ö‘đcɉ˝ťŰźťÍA ă~†Lw-ţĆ ¶|Á‡.x…Dńë1ácŞ‚÷3&¦4O¨î÷ýÍĎŐ…:`ŞC‘ 2óĎŠÇ”ľ7Ő ů@Y_ě“X]µÝĘ tťS9Ú˝e_çYóťKNšŠ#UbB ľ×,őDQČa«üLŃy:†§Á§F‰i-˝ÂÉ– Éľźkö‰–„BňRZéÓj\Ő”‚cC•.ň¬Ž_ĆE5Ö<;1>ër±XĎ˝­Őđż˝Á˛`O5±#đnHĄ‘Éá~Şár&Ŕ‰ů†·ţ3„Ö= v‘ é3ëýĎeh¨­–Ű]#-mGn.šĚŢť~7éšďh$oh§>ý`łxłsD kÄO˙mŘKéő[Ě/őSÉÜŇŢ=ťfu:?‹ žđ{ď·XQś(óNĆ #@ă!üŲçĚ«ź>Řž~t›ÍĘOą]®I÷r[BW<ÓŘÂą}m®ÁFç™ŢIYŚmľ„ĘDřżW’Ë!E ô™,٦'®Ň˝çL;äřM˝·*ŻU'ęźĘ™"ľşrg»LB˝nHN@Yy`łä˘FL٧R~?ł†Îů.c!Öęj†Lné"-L„5şěëÝÇQ«&cI”ŇLnÂObrź&ÜŮkfăĎHýÜčLÁXy Ş ĎCyß3]ńŇ*,Ú¤¨Ć śłvf˛ I“!#– ÉŚęc8 ÎiŮŇĽ99°cÜ lĎ';Q&~łÂ’E.ĂŇ6*€!vÜłĄ°mX&čÍEMĽ%–ާiŇŢăôgßą›=eÁA6tćúűĹĺ´äᥝ1…ŔĆŰŽŰčŐ‘tâ7ŽM]¨< ’ĆIú%”«lŢĂe‚­~â÷×&ŤQµäń"⨷WţÉÂÖä×äVnˇăn4&JíX·mKŃĺÖVdťo:—Ę…ĘßŰ^s8z5VxóJšŔíض6ĘšĹr©ę1;z“dW‹ 'ˇ®ř/1ę„C9HľD¶˛­«¦Z˝Űh03ő4 $Ä=Q{řEÝĄČ#·yîÜ«%í*\>sÔ¨‚XDäĽýĺ©1T÷˘X§¬?’ĐHżč;ňpś§|tsŠžÉqĐ7ď5ű1őŹSW^á2wDĚđôÔÚ€µÎŁz,“ ÁŽŢbŽŞŮ¬ŐĆśpçęÂĎžO„*i.\vsě@âzUÂSn<ěĚÝ#“8’µ`ť ±s~ÖÍěN5JĐé5#žŃűݵšcůîiéíĂp.Sę1iiJ}…'ÂđvÇÂä›űó“GY1RÇĘ_áy±‡ršő¬Ş–§tЍkjŐM8ły:’bd1_dĹŁ5í| ôVŘ·ĺöä±c:ř2Ó|,?še]O¸×ł¨•u6űk‰9n¬ŻŞ1&#éÁ­Ěľ¸Ž„ťžę›Ň˙ÎČńµ endstream endobj 1270 0 obj << /Type /FontDescriptor /FontName /NDZOVZ+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 668 /CapHeight 668 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/A/C/E/G/O/S/a/b/c/d/e/f/g/h/i/l/m/n/o/p/period/q/r/s/t/u/y) /FontFile 1269 0 R >> endobj 1243 0 obj << /Type /Encoding /Differences [2/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 149/bullet/endash 228/adieresis] >> endobj 673 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AIRNDP+CMMI10 /FontDescriptor 1254 0 R /FirstChar 58 /LastChar 84 /Widths 1249 0 R >> endobj 682 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VYDKHY+CMR10 /FontDescriptor 1256 0 R /FirstChar 48 /LastChar 61 /Widths 1248 0 R >> endobj 726 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NBBWCW+CMSY10 /FontDescriptor 1258 0 R /FirstChar 3 /LastChar 106 /Widths 1247 0 R >> endobj 789 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LAJUWJ+CMSY7 /FontDescriptor 1260 0 R /FirstChar 94 /LastChar 94 /Widths 1246 0 R >> endobj 546 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FIYGZI+NimbusMonL-Regu /FontDescriptor 1262 0 R /FirstChar 33 /LastChar 125 /Widths 1250 0 R /Encoding 1243 0 R >> endobj 400 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NGPWFR+NimbusRomNo9L-Medi /FontDescriptor 1264 0 R /FirstChar 2 /LastChar 150 /Widths 1252 0 R /Encoding 1243 0 R >> endobj 984 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YXHWDV+NimbusRomNo9L-MediItal /FontDescriptor 1266 0 R /FirstChar 44 /LastChar 120 /Widths 1244 0 R /Encoding 1243 0 R >> endobj 401 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BFWHCH+NimbusRomNo9L-Regu /FontDescriptor 1268 0 R /FirstChar 2 /LastChar 228 /Widths 1251 0 R /Encoding 1243 0 R >> endobj 964 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NDZOVZ+NimbusRomNo9L-ReguItal /FontDescriptor 1270 0 R /FirstChar 46 /LastChar 121 /Widths 1245 0 R /Encoding 1243 0 R >> endobj 402 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [394 0 R 405 0 R 436 0 R 475 0 R 513 0 R 516 0 R] >> endobj 525 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [519 0 R 527 0 R 539 0 R 565 0 R 577 0 R 585 0 R] >> endobj 611 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [605 0 R 628 0 R 644 0 R 650 0 R 656 0 R 662 0 R] >> endobj 675 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [668 0 R 678 0 R 694 0 R 701 0 R 707 0 R 711 0 R] >> endobj 731 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [722 0 R 744 0 R 755 0 R 783 0 R 801 0 R 810 0 R] >> endobj 832 0 obj << /Type /Pages /Count 6 /Parent 1271 0 R /Kids [827 0 R 885 0 R 961 0 R 980 0 R 991 0 R 997 0 R] >> endobj 1004 0 obj << /Type /Pages /Count 6 /Parent 1272 0 R /Kids [1001 0 R 1009 0 R 1018 0 R 1027 0 R 1035 0 R 1039 0 R] >> endobj 1107 0 obj << /Type /Pages /Count 3 /Parent 1272 0 R /Kids [1104 0 R 1192 0 R 1240 0 R] >> endobj 1271 0 obj << /Type /Pages /Count 36 /Parent 1273 0 R /Kids [402 0 R 525 0 R 611 0 R 675 0 R 731 0 R 832 0 R] >> endobj 1272 0 obj << /Type /Pages /Count 9 /Parent 1273 0 R /Kids [1004 0 R 1107 0 R] >> endobj 1273 0 obj << /Type /Pages /Count 45 /Kids [1271 0 R 1272 0 R] >> endobj 1274 0 obj << /Type /Outlines /First 3 0 R /Last 319 0 R /Count 7 >> endobj 391 0 obj << /Title 392 0 R /A 389 0 R /Parent 363 0 R /Prev 387 0 R >> endobj 387 0 obj << /Title 388 0 R /A 385 0 R /Parent 363 0 R /Prev 383 0 R /Next 391 0 R >> endobj 383 0 obj << /Title 384 0 R /A 381 0 R /Parent 363 0 R /Prev 379 0 R /Next 387 0 R >> endobj 379 0 obj << /Title 380 0 R /A 377 0 R /Parent 363 0 R /Prev 375 0 R /Next 383 0 R >> endobj 375 0 obj << /Title 376 0 R /A 373 0 R /Parent 363 0 R /Prev 371 0 R /Next 379 0 R >> endobj 371 0 obj << /Title 372 0 R /A 369 0 R /Parent 363 0 R /Prev 367 0 R /Next 375 0 R >> endobj 367 0 obj << /Title 368 0 R /A 365 0 R /Parent 363 0 R /Next 371 0 R >> endobj 363 0 obj << /Title 364 0 R /A 361 0 R /Parent 323 0 R /Prev 339 0 R /First 367 0 R /Last 391 0 R /Count -7 >> endobj 359 0 obj << /Title 360 0 R /A 357 0 R /Parent 339 0 R /Prev 355 0 R >> endobj 355 0 obj << /Title 356 0 R /A 353 0 R /Parent 339 0 R /Prev 351 0 R /Next 359 0 R >> endobj 351 0 obj << /Title 352 0 R /A 349 0 R /Parent 339 0 R /Prev 347 0 R /Next 355 0 R >> endobj 347 0 obj << /Title 348 0 R /A 345 0 R /Parent 339 0 R /Prev 343 0 R /Next 351 0 R >> endobj 343 0 obj << /Title 344 0 R /A 341 0 R /Parent 339 0 R /Next 347 0 R >> endobj 339 0 obj << /Title 340 0 R /A 337 0 R /Parent 323 0 R /Prev 331 0 R /Next 363 0 R /First 343 0 R /Last 359 0 R /Count -5 >> endobj 335 0 obj << /Title 336 0 R /A 333 0 R /Parent 331 0 R >> endobj 331 0 obj << /Title 332 0 R /A 329 0 R /Parent 323 0 R /Prev 327 0 R /Next 339 0 R /First 335 0 R /Last 335 0 R /Count -1 >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R /Parent 323 0 R /Next 331 0 R >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R /Parent 319 0 R /First 327 0 R /Last 363 0 R /Count -4 >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R /Parent 1274 0 R /Prev 139 0 R /First 323 0 R /Last 323 0 R /Count -1 >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R /Parent 303 0 R /Prev 311 0 R >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R /Parent 303 0 R /Prev 307 0 R /Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R /Parent 303 0 R /Next 311 0 R >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R /Parent 295 0 R /Prev 299 0 R /First 307 0 R /Last 315 0 R /Count -3 >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R /Parent 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R /Parent 139 0 R /Prev 239 0 R /First 299 0 R /Last 303 0 R /Count -2 >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R /Parent 247 0 R /Prev 287 0 R >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R /Parent 247 0 R /Prev 283 0 R /Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R /Parent 247 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R /Parent 247 0 R /Prev 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R /Parent 247 0 R /Prev 271 0 R /Next 279 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R /Parent 247 0 R /Prev 267 0 R /Next 275 0 R >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R /Parent 247 0 R /Prev 263 0 R /Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R /Parent 247 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R /Parent 247 0 R /Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R /Parent 247 0 R /Prev 251 0 R /Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R /Parent 247 0 R /Next 255 0 R >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R /Parent 239 0 R /Prev 243 0 R /First 251 0 R /Last 291 0 R /Count -11 >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R /Parent 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 139 0 R /Prev 195 0 R /Next 295 0 R /First 243 0 R /Last 247 0 R /Count -2 >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 203 0 R /Prev 231 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 203 0 R /Prev 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 203 0 R /Prev 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 203 0 R /Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 203 0 R /Prev 215 0 R /Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 203 0 R /Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 203 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 195 0 R /Prev 199 0 R /First 207 0 R /Last 235 0 R /Count -8 >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 139 0 R /Prev 175 0 R /Next 239 0 R /First 199 0 R /Last 203 0 R /Count -2 >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 183 0 R /Prev 187 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 175 0 R /Prev 179 0 R /First 187 0 R /Last 191 0 R /Count -2 >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 139 0 R /Prev 143 0 R /Next 195 0 R /First 179 0 R /Last 183 0 R /Count -2 >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 151 0 R /Prev 167 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 151 0 R /Prev 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 151 0 R /Prev 159 0 R /Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 151 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 143 0 R /Prev 147 0 R /First 155 0 R /Last 171 0 R /Count -5 >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 139 0 R /Next 175 0 R /First 147 0 R /Last 151 0 R /Count -2 >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 1274 0 R /Prev 131 0 R /Next 319 0 R /First 143 0 R /Last 295 0 R /Count -5 >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 131 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 1274 0 R /Prev 123 0 R /Next 139 0 R /First 135 0 R /Last 135 0 R /Count -1 >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 123 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 1274 0 R /Prev 103 0 R /Next 131 0 R /First 127 0 R /Last 127 0 R /Count -1 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 103 0 R /Prev 111 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 111 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 103 0 R /Prev 107 0 R /Next 119 0 R /First 115 0 R /Last 115 0 R /Count -1 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 1274 0 R /Prev 15 0 R /Next 123 0 R /First 107 0 R /Last 119 0 R /Count -3 >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 87 0 R /Prev 95 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 87 0 R /Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 15 0 R /Prev 83 0 R /First 91 0 R /Last 99 0 R /Count -3 >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 15 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 15 0 R /Prev 59 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 59 0 R /Prev 71 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 59 0 R /Prev 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 59 0 R /Prev 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 15 0 R /Prev 55 0 R /Next 79 0 R /First 63 0 R /Last 75 0 R /Count -4 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 15 0 R /Prev 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 15 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 15 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 15 0 R /Prev 31 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 31 0 R /Prev 35 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 15 0 R /Prev 27 0 R /Next 43 0 R /First 35 0 R /Last 39 0 R /Count -2 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 15 0 R /Prev 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 15 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 1274 0 R /Prev 3 0 R /Next 103 0 R /First 19 0 R /Last 87 0 R /Count -12 >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 3 0 R /Prev 7 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 1274 0 R /Next 15 0 R /First 7 0 R /Last 11 0 R /Count -2 >> endobj 1275 0 obj << /Names [(Doc-Start) 399 0 R (ENCODERBEHAVIOUR) 671 0 R (ENCODERBEHAVIOUR_BEHAVIOUR_BANDWIDTH) 672 0 R (ENCODERBEHAVIOUR_BEHAVIOUR_ESTIM_AVG_FRAMESIZES) 681 0 R (ENCODERBEHAVIOUR_BEHAVIOUR_TOOLS) 638 0 R (ENCODERBEHAVIOUR_FRAMESIZES_AND_BIT_RESERVOIR) 674 0 R] /Limits [(Doc-Start) (ENCODERBEHAVIOUR_FRAMESIZES_AND_BIT_RESERVOIR)] >> endobj 1276 0 obj << /Names [(Item.1) 545 0 R (Item.2) 547 0 R (Item.3) 548 0 R (Item.4) 549 0 R (Item.5) 568 0 R (Item.6) 569 0 R] /Limits [(Item.1) (Item.6)] >> endobj 1277 0 obj << /Names [(LIBUSE) 542 0 R (LIBUSE_CallingSequence) 544 0 R (LIBUSE_InterfaceDescription) 543 0 R (LIBUSE_allocIOBufs) 580 0 R (LIBUSE_argLists) 588 0 R (LIBUSE_audiochCfg) 647 0 R] /Limits [(LIBUSE) (LIBUSE_audiochCfg)] >> endobj 1278 0 obj << /Names [(LIBUSE_bufDes) 571 0 R (LIBUSE_cfgMetaData) 608 0 R (LIBUSE_channelMode) 631 0 R (LIBUSE_encELD) 634 0 R (LIBUSE_encMandatory) 610 0 R (LIBUSE_encOpen) 552 0 R] /Limits [(LIBUSE_bufDes) (LIBUSE_encOpen)] >> endobj 1279 0 obj << /Names [(LIBUSE_encParams) 554 0 R (LIBUSE_encQual) 633 0 R (LIBUSE_encReconf) 556 0 R (LIBUSE_feedInBuf) 570 0 R (LIBUSE_reommendedConfig) 654 0 R (LIBUSE_reommendedConfigELD) 665 0 R] /Limits [(LIBUSE_encParams) (LIBUSE_reommendedConfigELD)] >> endobj 1280 0 obj << /Names [(LIBUSE_reommendedConfigLC) 659 0 R (LIBUSE_reommendedConfigLD) 660 0 R (LIBUSE_suppBitrates) 653 0 R (LIBUSE_writeOutData) 572 0 R (aacenc__lib_8h) 550 0 R (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea) 551 0 R] /Limits [(LIBUSE_reommendedConfigLC) (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea)] >> endobj 1281 0 obj << /Names [(aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) 841 0 R (aacenc__lib_8h_a28cbc417258c73ad55d613526df8fad5) 976 0 R (aacenc__lib_8h_a2a5f6ec334fff553f0fd9e36d9408e94) 573 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846) 912 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a08acd30267f5bd8c4047259fbc40fd98) 918 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a82028e22ad9293b97d10ee57abf67bdf) 916 0 R] /Limits [(aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a82028e22ad9293b97d10ee57abf67bdf)] >> endobj 1282 0 obj << /Names [(aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a96d66031cde3d5d89d8457e45036bd94) 914 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846ab97edc65b5ed3be8c11f3ba9bcca22f3) 913 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846abcbfac74b1bcd90099e3cf6b1fcd19f3) 917 0 R (aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846afcd151f12c441417e69746762d34ea33) 915 0 R (aacenc__lib_8h_a5743dca1ec3746f9c5ecb839a132ba7e) 553 0 R (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47) 733 0 R] /Limits [(aacenc__lib_8h_a43cc9e24ab8d23e6f3241a30b502b846a96d66031cde3d5d89d8457e45036bd94) (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47)] >> endobj 1283 0 obj << /Names [(aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a510ae495f7636503ecfe111f75f66d50) 614 0 R (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a51cb08659a6af422761d58090766faa8) 905 0 R (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a6a362853fb508e259718dabe65c7a57e) 904 0 R (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a857575621d11cca83fab4d5c70b55181) 903 0 R (aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47aea749d078297e7079337d6d47171a8b6) 902 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e) 889 0 R] /Limits [(aacenc__lib_8h_a68ca23c646df4d306e2412b926292a47a510ae495f7636503ecfe111f75f66d50) (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483e)] >> endobj 1284 0 obj << /Names [(aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea10b93e7c1f1def31f634b6fb7a894409) 891 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea189c4a7532530a89ab214aba35b1e982) 895 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea1a79b7f1cefc5f89ba7c10cfa020116f) 893 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea3b7906c278268857fa6f8d7e39b2b5c3) 901 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea47979433239c09930ed98e85f5b81971) 894 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea51de868cffa67ffe361085555a6e5ea2) 898 0 R] /Limits [(aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea10b93e7c1f1def31f634b6fb7a894409) (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea51de868cffa67ffe361085555a6e5ea2)] >> endobj 1285 0 obj << /Names [(aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea5a631fa755a8d02a97a8184725da4b57) 900 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea5af1b153eb8f1a28a543419d10562cbf) 896 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea8e8c0fd770036a2bc58fc062f5044454) 899 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea98f5f419028ff1b93551adb910ca0281) 890 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483eae9b8c1b6153a63fbf152a60e422ca433) 897 0 R (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483eaf35935e997b3321eda6d083c9322f347) 892 0 R] /Limits [(aacenc__lib_8h_a692c324a5fe0f8335387264357bd483ea5a631fa755a8d02a97a8184725da4b57) (aacenc__lib_8h_a692c324a5fe0f8335387264357bd483eaf35935e997b3321eda6d083c9322f347)] >> endobj 1286 0 obj << /Names [(aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) 555 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4) 619 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a017e2a6349d3ae944338a6f0ba892947) 969 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a02f49b93eaadb6a903b87670849255a5) 636 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a0ee251ffa58317c7ea29364d344c4660) 612 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a2e2b4d3e563dc169c06d590d8c833243) 922 0 R] /Limits [(aacenc__lib_8h_a6ccf4948de12c1cde8ca22a1216c5d3e) (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a2e2b4d3e563dc169c06d590d8c833243)] >> endobj 1287 0 obj << /Names [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3869e3bae5904258eff0b77d2ebed3b1) 972 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3923cb84146e101030271772fe33ea5a) 973 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a39b30031d8438b4018173388aead5bdf) 970 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a443da990a60343083e72726a65f4509b) 639 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a5e46c726aadf91189ccb4f1ec3e4b52f) 919 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a730a1ba1041f8671a11ca824fcd0455d) 640 0 R] /Limits [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3869e3bae5904258eff0b77d2ebed3b1) (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a730a1ba1041f8671a11ca824fcd0455d)] >> endobj 1288 0 obj << /Names [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a80b535c275f9f60c644d91263f0638a5) 920 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a87c7912a645d479132465e6d8e694b36) 971 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a8a8be3fdebec2693c86e3e63f35ee228) 921 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a955c106558ebb10a74a555a38b45ae1c) 968 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aab4d4c3cfcad7bd7bdebfd947fea8e75) 676 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aaf0644b51fd01b31c73eb2ebc140a1a1) 975 0 R] /Limits [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a80b535c275f9f60c644d91263f0638a5) (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aaf0644b51fd01b31c73eb2ebc140a1a1)] >> endobj 1289 0 obj << /Names [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ab381330bdc59b0213ad3dedcb4f2f0f7) 641 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ad2accfe182077bfe80ba43a3f22cf7bb) 648 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ae6283b321f75b769e9306c6482f2acd5) 974 0 R (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4aef811ce5aab93dcba6584109d266b579) 637 0 R (aacenc__lib_8h_a9b64b2026a1475eb5c7a67fc1364ed94) 557 0 R (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c) 618 0 R] /Limits [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4ab381330bdc59b0213ad3dedcb4f2f0f7) (aacenc__lib_8h_aac28c7c3724b8bc87558bc35a22bf23c)] >> endobj 1290 0 obj << /Names [(aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) 615 0 R (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1a7560bc907e827954b0b55f87751fdbeb) 906 0 R (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1a95efe9f7b6df0a6628ec7e2c61646fe9) 908 0 R (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1aa0dc03a5dc38b25ac1ea9d8ddf892fb5) 911 0 R (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1aa9315468e85d31968b147a4080e352a7) 910 0 R (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af4a650d61726dd5bbbb560042bb0b8a2) 909 0 R] /Limits [(aacenc__lib_8h_aee37ab1a371397d239178df6194911d1) (aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af4a650d61726dd5bbbb560042bb0b8a2)] >> endobj 1291 0 obj << /Names [(aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af88950dea139037d728aefe7722191ec) 907 0 R (chapter*.1) 438 0 R (chapter.1) 2 0 R (chapter.2) 14 0 R (chapter.3) 102 0 R (chapter.4) 122 0 R] /Limits [(aacenc__lib_8h_aee37ab1a371397d239178df6194911d1af88950dea139037d728aefe7722191ec) (chapter.4)] >> endobj 1292 0 obj << /Names [(chapter.5) 130 0 R (chapter.6) 138 0 R (chapter.7) 318 0 R (index) 522 0 R (index_Scope) 523 0 R (index_encBasics) 524 0 R] /Limits [(chapter.5) (index_encBasics)] >> endobj 1293 0 obj << /Names [(page.1) 521 0 R (page.10) 652 0 R (page.11) 658 0 R (page.12) 664 0 R (page.13) 670 0 R (page.14) 680 0 R] /Limits [(page.1) (page.14)] >> endobj 1294 0 obj << /Names [(page.15) 696 0 R (page.16) 703 0 R (page.17) 709 0 R (page.18) 713 0 R (page.19) 724 0 R (page.2) 529 0 R] /Limits [(page.15) (page.2)] >> endobj 1295 0 obj << /Names [(page.20) 746 0 R (page.21) 757 0 R (page.22) 785 0 R (page.23) 803 0 R (page.24) 812 0 R (page.25) 829 0 R] /Limits [(page.20) (page.25)] >> endobj 1296 0 obj << /Names [(page.26) 887 0 R (page.27) 963 0 R (page.28) 982 0 R (page.29) 993 0 R (page.3) 541 0 R (page.30) 999 0 R] /Limits [(page.26) (page.30)] >> endobj 1297 0 obj << /Names [(page.31) 1003 0 R (page.32) 1011 0 R (page.33) 1020 0 R (page.34) 1029 0 R (page.35) 1037 0 R (page.36) 1041 0 R] /Limits [(page.31) (page.36)] >> endobj 1298 0 obj << /Names [(page.37) 1106 0 R (page.38) 1194 0 R (page.39) 1242 0 R (page.4) 567 0 R (page.5) 579 0 R (page.6) 587 0 R] /Limits [(page.37) (page.6)] >> endobj 1299 0 obj << /Names [(page.7) 607 0 R (page.8) 630 0 R (page.9) 646 0 R (section*.10) 965 0 R (section*.2) 725 0 R (section*.3) 747 0 R] /Limits [(page.7) (section*.3)] >> endobj 1300 0 obj << /Names [(section*.4) 758 0 R (section*.5) 786 0 R (section*.6) 813 0 R (section*.7) 830 0 R (section*.8) 831 0 R (section*.9) 888 0 R] /Limits [(section*.4) (section*.9)] >> endobj 1301 0 obj << /Names [(section.1.1) 6 0 R (section.1.2) 10 0 R (section.2.1) 18 0 R (section.2.10) 78 0 R (section.2.11) 82 0 R (section.2.12) 86 0 R] /Limits [(section.1.1) (section.2.12)] >> endobj 1302 0 obj << /Names [(section.2.2) 22 0 R (section.2.3) 26 0 R (section.2.4) 30 0 R (section.2.5) 42 0 R (section.2.6) 46 0 R (section.2.7) 50 0 R] /Limits [(section.2.2) (section.2.7)] >> endobj 1303 0 obj << /Names [(section.2.8) 54 0 R (section.2.9) 58 0 R (section.3.1) 106 0 R (section.3.2) 110 0 R (section.3.3) 118 0 R (section.4.1) 126 0 R] /Limits [(section.2.8) (section.4.1)] >> endobj 1304 0 obj << /Names [(section.5.1) 134 0 R (section.6.1) 142 0 R (section.6.2) 174 0 R (section.6.3) 194 0 R (section.6.4) 238 0 R (section.6.5) 294 0 R] /Limits [(section.5.1) (section.6.5)] >> endobj 1305 0 obj << /Names [(section.7.1) 322 0 R (structAACENC__BufDesc) 581 0 R (structAACENC__BufDesc_a2c09424d3a61cdbdb80c8d9ebb42ce71) 728 0 R (structAACENC__BufDesc_a324387bb8e5f44650c6e17c209bb05a9) 732 0 R (structAACENC__BufDesc_ab13b6a5c10505c3defd8bb1c19eac81d) 729 0 R (structAACENC__BufDesc_ac32946f846b95272038017687a96f2c1) 727 0 R] /Limits [(section.7.1) (structAACENC__BufDesc_ac32946f846b95272038017687a96f2c1)] >> endobj 1306 0 obj << /Names [(structAACENC__BufDesc_ace97d9ab9ad2f7b24041ee253ad7372f) 730 0 R (structAACENC__InArgs) 697 0 R (structAACENC__InArgs_aa33d59e07bbd49bfe4dd6793763c6d48) 748 0 R (structAACENC__InArgs_aefc45c133d4f9775d8d0aadf56302ae4) 749 0 R (structAACENC__InfoStruct) 698 0 R (structAACENC__InfoStruct_a06f045f69acad8125b1fb814d565549c) 766 0 R] /Limits [(structAACENC__BufDesc_ace97d9ab9ad2f7b24041ee253ad7372f) (structAACENC__InfoStruct_a06f045f69acad8125b1fb814d565549c)] >> endobj 1307 0 obj << /Names [(structAACENC__InfoStruct_a3356592232c6536392a58a6c9e185cb6) 760 0 R (structAACENC__InfoStruct_a5187acfd8fb7585377ebf162fbb9db39) 765 0 R (structAACENC__InfoStruct_a5bb3228c5af5584f97c54bdf8ed946e3) 759 0 R (structAACENC__InfoStruct_a993149bc5985d79c40d6e96a2d90a228) 762 0 R (structAACENC__InfoStruct_ab5c902598267b09b625e440b53937c76) 761 0 R (structAACENC__InfoStruct_ab919b721d3ef5d4dd56c46614cdf0047) 763 0 R] /Limits [(structAACENC__InfoStruct_a3356592232c6536392a58a6c9e185cb6) (structAACENC__InfoStruct_ab919b721d3ef5d4dd56c46614cdf0047)] >> endobj 1308 0 obj << /Names [(structAACENC__InfoStruct_ac786a4ebf4dc7f2357cbc142265f5dd8) 764 0 R (structAACENC__MetaData) 613 0 R (structAACENC__MetaData_a06cce4e89d53d956d27fb20892461aa0) 616 0 R (structAACENC__MetaData_a0ad6337da83fa3a43a22f87d4ee8b192) 790 0 R (structAACENC__MetaData_a1e67ac741a9080f11325d0c02223f046) 787 0 R (structAACENC__MetaData_a47e42d88c7abcaaa2fa9a72f6b6eaa24) 794 0 R] /Limits [(structAACENC__InfoStruct_ac786a4ebf4dc7f2357cbc142265f5dd8) (structAACENC__MetaData_a47e42d88c7abcaaa2fa9a72f6b6eaa24)] >> endobj 1309 0 obj << /Names [(structAACENC__MetaData_a77fd2ae629044c75369a51760a00d57f) 791 0 R (structAACENC__MetaData_a9274bda31c82bd154ddb3767b74be6b2) 617 0 R (structAACENC__MetaData_aa2fbd6a3c66ac05e69e42782807e7ba4) 793 0 R (structAACENC__MetaData_ace0f370c1026d179ea122c0820e1d17c) 795 0 R (structAACENC__MetaData_ad2646dc407b31f38dbf71178b6780916) 796 0 R (structAACENC__MetaData_aeb0d2d7748c98809112088d0bd997f61) 792 0 R] /Limits [(structAACENC__MetaData_a77fd2ae629044c75369a51760a00d57f) (structAACENC__MetaData_aeb0d2d7748c98809112088d0bd997f61)] >> endobj 1310 0 obj << /Names [(structAACENC__MetaData_af001f70f58df01e7e65105bf752a44bd) 788 0 R (structAACENC__OutArgs) 699 0 R (structAACENC__OutArgs_a7d481a0e52142dcdbdfa34677b111d7e) 814 0 R (structAACENC__OutArgs_aa08d19137d0dbd54d3d86f88a85eb149) 816 0 R (structAACENC__OutArgs_ad4d8784f4d5504a5f87ef44af1e7b6db) 815 0 R (subsection.2.12.1) 90 0 R] /Limits [(structAACENC__MetaData_af001f70f58df01e7e65105bf752a44bd) (subsection.2.12.1)] >> endobj 1311 0 obj << /Names [(subsection.2.12.2) 94 0 R (subsection.2.12.3) 98 0 R (subsection.2.4.1) 34 0 R (subsection.2.4.2) 38 0 R (subsection.2.9.1) 62 0 R (subsection.2.9.2) 66 0 R] /Limits [(subsection.2.12.2) (subsection.2.9.2)] >> endobj 1312 0 obj << /Names [(subsection.2.9.3) 70 0 R (subsection.2.9.4) 74 0 R (subsection.3.2.1) 114 0 R (subsection.6.1.1) 146 0 R (subsection.6.1.2) 150 0 R (subsection.6.2.1) 178 0 R] /Limits [(subsection.2.9.3) (subsection.6.2.1)] >> endobj 1313 0 obj << /Names [(subsection.6.2.2) 182 0 R (subsection.6.3.1) 198 0 R (subsection.6.3.2) 202 0 R (subsection.6.4.1) 242 0 R (subsection.6.4.2) 246 0 R (subsection.6.5.1) 298 0 R] /Limits [(subsection.6.2.2) (subsection.6.5.1)] >> endobj 1314 0 obj << /Names [(subsection.6.5.2) 302 0 R (subsection.7.1.1) 326 0 R (subsection.7.1.2) 330 0 R (subsection.7.1.3) 338 0 R (subsection.7.1.4) 362 0 R (subsubsection.6.1.2.1) 154 0 R] /Limits [(subsection.6.5.2) (subsubsection.6.1.2.1)] >> endobj 1315 0 obj << /Names [(subsubsection.6.1.2.2) 158 0 R (subsubsection.6.1.2.3) 162 0 R (subsubsection.6.1.2.4) 166 0 R (subsubsection.6.1.2.5) 170 0 R (subsubsection.6.2.2.1) 186 0 R (subsubsection.6.2.2.2) 190 0 R] /Limits [(subsubsection.6.1.2.2) (subsubsection.6.2.2.2)] >> endobj 1316 0 obj << /Names [(subsubsection.6.3.2.1) 206 0 R (subsubsection.6.3.2.2) 210 0 R (subsubsection.6.3.2.3) 214 0 R (subsubsection.6.3.2.4) 218 0 R (subsubsection.6.3.2.5) 222 0 R (subsubsection.6.3.2.6) 226 0 R] /Limits [(subsubsection.6.3.2.1) (subsubsection.6.3.2.6)] >> endobj 1317 0 obj << /Names [(subsubsection.6.3.2.7) 230 0 R (subsubsection.6.3.2.8) 234 0 R (subsubsection.6.4.2.1) 250 0 R (subsubsection.6.4.2.10) 286 0 R (subsubsection.6.4.2.11) 290 0 R (subsubsection.6.4.2.2) 254 0 R] /Limits [(subsubsection.6.3.2.7) (subsubsection.6.4.2.2)] >> endobj 1318 0 obj << /Names [(subsubsection.6.4.2.3) 258 0 R (subsubsection.6.4.2.4) 262 0 R (subsubsection.6.4.2.5) 266 0 R (subsubsection.6.4.2.6) 270 0 R (subsubsection.6.4.2.7) 274 0 R (subsubsection.6.4.2.8) 278 0 R] /Limits [(subsubsection.6.4.2.3) (subsubsection.6.4.2.8)] >> endobj 1319 0 obj << /Names [(subsubsection.6.4.2.9) 282 0 R (subsubsection.6.5.2.1) 306 0 R (subsubsection.6.5.2.2) 310 0 R (subsubsection.6.5.2.3) 314 0 R (subsubsection.7.1.2.1) 334 0 R (subsubsection.7.1.3.1) 342 0 R] /Limits [(subsubsection.6.4.2.9) (subsubsection.7.1.3.1)] >> endobj 1320 0 obj << /Names [(subsubsection.7.1.3.2) 346 0 R (subsubsection.7.1.3.3) 350 0 R (subsubsection.7.1.3.4) 354 0 R (subsubsection.7.1.3.5) 358 0 R (subsubsection.7.1.4.1) 366 0 R (subsubsection.7.1.4.2) 370 0 R] /Limits [(subsubsection.7.1.3.2) (subsubsection.7.1.4.2)] >> endobj 1321 0 obj << /Names [(subsubsection.7.1.4.3) 374 0 R (subsubsection.7.1.4.4) 378 0 R (subsubsection.7.1.4.5) 382 0 R (subsubsection.7.1.4.6) 386 0 R (subsubsection.7.1.4.7) 390 0 R] /Limits [(subsubsection.7.1.4.3) (subsubsection.7.1.4.7)] >> endobj 1322 0 obj << /Kids [1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R] /Limits [(Doc-Start) (aacenc__lib_8h_a04ddaeecd6dc422bb72175b9e0ab3fea)] >> endobj 1323 0 obj << /Kids [1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R] /Limits [(aacenc__lib_8h_a079ac614039555edf1d131e5fb87573b) (aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a2e2b4d3e563dc169c06d590d8c833243)] >> endobj 1324 0 obj << /Kids [1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R] /Limits [(aacenc__lib_8h_a962fbff5778f83a2a1915cbb56adc2a4a3869e3bae5904258eff0b77d2ebed3b1) (index_encBasics)] >> endobj 1325 0 obj << /Kids [1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R] /Limits [(page.1) (page.6)] >> endobj 1326 0 obj << /Kids [1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R] /Limits [(page.7) (section.6.5)] >> endobj 1327 0 obj << /Kids [1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R] /Limits [(section.7.1) (subsection.2.12.1)] >> endobj 1328 0 obj << /Kids [1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R] /Limits [(subsection.2.12.2) (subsubsection.6.3.2.6)] >> endobj 1329 0 obj << /Kids [1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R] /Limits [(subsubsection.6.3.2.7) (subsubsection.7.1.4.7)] >> endobj 1330 0 obj << /Kids [1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R] /Limits [(Doc-Start) (subsection.2.12.1)] >> endobj 1331 0 obj << /Kids [1328 0 R 1329 0 R] /Limits [(subsection.2.12.2) (subsubsection.7.1.4.7)] >> endobj 1332 0 obj << /Kids [1330 0 R 1331 0 R] /Limits [(Doc-Start) (subsubsection.7.1.4.7)] >> endobj 1333 0 obj << /Dests 1332 0 R >> endobj 1334 0 obj << /Type /Catalog /Pages 1273 0 R /Outlines 1274 0 R /Names 1333 0 R /PageMode/UseOutlines/PageLabels<>2<>6<>]>> /OpenAction 393 0 R >> endobj 1335 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords() /CreationDate (D:20130902144953+02'00') /ModDate (D:20130902144953+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 1336 0000000000 65535 f 0000000015 00000 n 0000185384 00000 n 0000472226 00000 n 0000000060 00000 n 0000000146 00000 n 0000185553 00000 n 0000472156 00000 n 0000000193 00000 n 0000000244 00000 n 0000185670 00000 n 0000472085 00000 n 0000000291 00000 n 0000000391 00000 n 0000189632 00000 n 0000471958 00000 n 0000000437 00000 n 0000000532 00000 n 0000189802 00000 n 0000471884 00000 n 0000000580 00000 n 0000000655 00000 n 0000189920 00000 n 0000471797 00000 n 0000000703 00000 n 0000000813 00000 n 0000193572 00000 n 0000471710 00000 n 0000000861 00000 n 0000001029 00000 n 0000196426 00000 n 0000471586 00000 n 0000001077 00000 n 0000001217 00000 n 0000196539 00000 n 0000471512 00000 n 0000001270 00000 n 0000001433 00000 n 0000199022 00000 n 0000471438 00000 n 0000001486 00000 n 0000001697 00000 n 0000199135 00000 n 0000471351 00000 n 0000001745 00000 n 0000001863 00000 n 0000199247 00000 n 0000471264 00000 n 0000001911 00000 n 0000002049 00000 n 0000205003 00000 n 0000471177 00000 n 0000002097 00000 n 0000002245 00000 n 0000205116 00000 n 0000471090 00000 n 0000002293 00000 n 0000002438 00000 n 0000205228 00000 n 0000470966 00000 n 0000002486 00000 n 0000002631 00000 n 0000209491 00000 n 0000470892 00000 n 0000002684 00000 n 0000002857 00000 n 0000209604 00000 n 0000470805 00000 n 0000002910 00000 n 0000003073 00000 n 0000209717 00000 n 0000470718 00000 n 0000003126 00000 n 0000003299 00000 n 0000209830 00000 n 0000470644 00000 n 0000003352 00000 n 0000003523 00000 n 0000212481 00000 n 0000470557 00000 n 0000003572 00000 n 0000003740 00000 n 0000215144 00000 n 0000470470 00000 n 0000003789 00000 n 0000003909 00000 n 0000216751 00000 n 0000470359 00000 n 0000003958 00000 n 0000004250 00000 n 0000216869 00000 n 0000470285 00000 n 0000004304 00000 n 0000004579 00000 n 0000216982 00000 n 0000470198 00000 n 0000004633 00000 n 0000004959 00000 n 0000218364 00000 n 0000470123 00000 n 0000005013 00000 n 0000005264 00000 n 0000221258 00000 n 0000469991 00000 n 0000005311 00000 n 0000005427 00000 n 0000221429 00000 n 0000469912 00000 n 0000005476 00000 n 0000005549 00000 n 0000221547 00000 n 0000469780 00000 n 0000005598 00000 n 0000005776 00000 n 0000224654 00000 n 0000469715 00000 n 0000005830 00000 n 0000006017 00000 n 0000224773 00000 n 0000469636 00000 n 0000006066 00000 n 0000006162 00000 n 0000227260 00000 n 0000469503 00000 n 0000006209 00000 n 0000006295 00000 n 0000227317 00000 n 0000469438 00000 n 0000006344 00000 n 0000006425 00000 n 0000228843 00000 n 0000469305 00000 n 0000006472 00000 n 0000006553 00000 n 0000228900 00000 n 0000469240 00000 n 0000006602 00000 n 0000006678 00000 n 0000231931 00000 n 0000469107 00000 n 0000006725 00000 n 0000006851 00000 n 0000232045 00000 n 0000468989 00000 n 0000006900 00000 n 0000007092 00000 n 0000232159 00000 n 0000468910 00000 n 0000007146 00000 n 0000007277 00000 n 0000232216 00000 n 0000468792 00000 n 0000007331 00000 n 0000007490 00000 n 0000232330 00000 n 0000468713 00000 n 0000007549 00000 n 0000007627 00000 n 0000232448 00000 n 0000468620 00000 n 0000007686 00000 n 0000007799 00000 n 0000232567 00000 n 0000468527 00000 n 0000007858 00000 n 0000007906 00000 n 0000234839 00000 n 0000468434 00000 n 0000007965 00000 n 0000008033 00000 n 0000234957 00000 n 0000468355 00000 n 0000008092 00000 n 0000008155 00000 n 0000235071 00000 n 0000468223 00000 n 0000008204 00000 n 0000008391 00000 n 0000235185 00000 n 0000468144 00000 n 0000008445 00000 n 0000008576 00000 n 0000235242 00000 n 0000468026 00000 n 0000008630 00000 n 0000008789 00000 n 0000235356 00000 n 0000467947 00000 n 0000008848 00000 n 0000008931 00000 n 0000235475 00000 n 0000467868 00000 n 0000008990 00000 n 0000009078 00000 n 0000235589 00000 n 0000467736 00000 n 0000009127 00000 n 0000009334 00000 n 0000238873 00000 n 0000467657 00000 n 0000009388 00000 n 0000009519 00000 n 0000238930 00000 n 0000467539 00000 n 0000009573 00000 n 0000009732 00000 n 0000239044 00000 n 0000467460 00000 n 0000009791 00000 n 0000009854 00000 n 0000239163 00000 n 0000467367 00000 n 0000009913 00000 n 0000009981 00000 n 0000239281 00000 n 0000467274 00000 n 0000010040 00000 n 0000010128 00000 n 0000239398 00000 n 0000467181 00000 n 0000010187 00000 n 0000010270 00000 n 0000239517 00000 n 0000467088 00000 n 0000010329 00000 n 0000010427 00000 n 0000239636 00000 n 0000466995 00000 n 0000010486 00000 n 0000010579 00000 n 0000239754 00000 n 0000466902 00000 n 0000010638 00000 n 0000010721 00000 n 0000244504 00000 n 0000466823 00000 n 0000010780 00000 n 0000010878 00000 n 0000244618 00000 n 0000466691 00000 n 0000010927 00000 n 0000011124 00000 n 0000244732 00000 n 0000466612 00000 n 0000011178 00000 n 0000011309 00000 n 0000244789 00000 n 0000466493 00000 n 0000011363 00000 n 0000011522 00000 n 0000244903 00000 n 0000466414 00000 n 0000011581 00000 n 0000011679 00000 n 0000245022 00000 n 0000466321 00000 n 0000011738 00000 n 0000011829 00000 n 0000245140 00000 n 0000466228 00000 n 0000011888 00000 n 0000012014 00000 n 0000247148 00000 n 0000466135 00000 n 0000012073 00000 n 0000012186 00000 n 0000247262 00000 n 0000466042 00000 n 0000012245 00000 n 0000012331 00000 n 0000247381 00000 n 0000465949 00000 n 0000012390 00000 n 0000012511 00000 n 0000247498 00000 n 0000465856 00000 n 0000012570 00000 n 0000012699 00000 n 0000247617 00000 n 0000465763 00000 n 0000012758 00000 n 0000012910 00000 n 0000247736 00000 n 0000465670 00000 n 0000012969 00000 n 0000013073 00000 n 0000247855 00000 n 0000465577 00000 n 0000013133 00000 n 0000013280 00000 n 0000247974 00000 n 0000465498 00000 n 0000013340 00000 n 0000013448 00000 n 0000248088 00000 n 0000465380 00000 n 0000013497 00000 n 0000013689 00000 n 0000250415 00000 n 0000465301 00000 n 0000013743 00000 n 0000013874 00000 n 0000250472 00000 n 0000465183 00000 n 0000013928 00000 n 0000014087 00000 n 0000250586 00000 n 0000465104 00000 n 0000014146 00000 n 0000014229 00000 n 0000250705 00000 n 0000465011 00000 n 0000014288 00000 n 0000014376 00000 n 0000250824 00000 n 0000464932 00000 n 0000014435 00000 n 0000014518 00000 n 0000256838 00000 n 0000464813 00000 n 0000014565 00000 n 0000014686 00000 n 0000256952 00000 n 0000464709 00000 n 0000014735 00000 n 0000014907 00000 n 0000280174 00000 n 0000464630 00000 n 0000014961 00000 n 0000015092 00000 n 0000280231 00000 n 0000464498 00000 n 0000015146 00000 n 0000015282 00000 n 0000280344 00000 n 0000464433 00000 n 0000015341 00000 n 0000015457 00000 n 0000280401 00000 n 0000464301 00000 n 0000015511 00000 n 0000015695 00000 n 0000280515 00000 n 0000464222 00000 n 0000015754 00000 n 0000015900 00000 n 0000280938 00000 n 0000464129 00000 n 0000015959 00000 n 0000016070 00000 n 0000281423 00000 n 0000464036 00000 n 0000016129 00000 n 0000016220 00000 n 0000284893 00000 n 0000463943 00000 n 0000016279 00000 n 0000016451 00000 n 0000285378 00000 n 0000463864 00000 n 0000016510 00000 n 0000016601 00000 n 0000296126 00000 n 0000463746 00000 n 0000016655 00000 n 0000016796 00000 n 0000296242 00000 n 0000463667 00000 n 0000016855 00000 n 0000016938 00000 n 0000299721 00000 n 0000463574 00000 n 0000016997 00000 n 0000017085 00000 n 0000302731 00000 n 0000463481 00000 n 0000017144 00000 n 0000017252 00000 n 0000302847 00000 n 0000463388 00000 n 0000017311 00000 n 0000017389 00000 n 0000302962 00000 n 0000463295 00000 n 0000017448 00000 n 0000017574 00000 n 0000306214 00000 n 0000463202 00000 n 0000017633 00000 n 0000017759 00000 n 0000306330 00000 n 0000463123 00000 n 0000017818 00000 n 0000017896 00000 n 0000018960 00000 n 0000019094 00000 n 0000162417 00000 n 0000162545 00000 n 0000017948 00000 n 0000162488 00000 n 0000461120 00000 n 0000461477 00000 n 0000461834 00000 n 0000130820 00000 n 0000162885 00000 n 0000162766 00000 n 0000162666 00000 n 0000164345 00000 n 0000164496 00000 n 0000164650 00000 n 0000164804 00000 n 0000164955 00000 n 0000165109 00000 n 0000165263 00000 n 0000165417 00000 n 0000165571 00000 n 0000165729 00000 n 0000165888 00000 n 0000166041 00000 n 0000166195 00000 n 0000166348 00000 n 0000166502 00000 n 0000166656 00000 n 0000166815 00000 n 0000166974 00000 n 0000167133 00000 n 0000167291 00000 n 0000167446 00000 n 0000167601 00000 n 0000167756 00000 n 0000167916 00000 n 0000168076 00000 n 0000168236 00000 n 0000168386 00000 n 0000170168 00000 n 0000168595 00000 n 0000163998 00000 n 0000162926 00000 n 0000168538 00000 n 0000170322 00000 n 0000170477 00000 n 0000170631 00000 n 0000170782 00000 n 0000170936 00000 n 0000171087 00000 n 0000171241 00000 n 0000171391 00000 n 0000171544 00000 n 0000171703 00000 n 0000171862 00000 n 0000172025 00000 n 0000172188 00000 n 0000172352 00000 n 0000172516 00000 n 0000172680 00000 n 0000172833 00000 n 0000172992 00000 n 0000173150 00000 n 0000173313 00000 n 0000173477 00000 n 0000173630 00000 n 0000173789 00000 n 0000173948 00000 n 0000174112 00000 n 0000174273 00000 n 0000174437 00000 n 0000174601 00000 n 0000174764 00000 n 0000174928 00000 n 0000175092 00000 n 0000175256 00000 n 0000175410 00000 n 0000175569 00000 n 0000177433 00000 n 0000175727 00000 n 0000169757 00000 n 0000168680 00000 n 0000177597 00000 n 0000177761 00000 n 0000177924 00000 n 0000178085 00000 n 0000178249 00000 n 0000178413 00000 n 0000178576 00000 n 0000178739 00000 n 0000178903 00000 n 0000179066 00000 n 0000179231 00000 n 0000179385 00000 n 0000179543 00000 n 0000179702 00000 n 0000179866 00000 n 0000180030 00000 n 0000180194 00000 n 0000180345 00000 n 0000180499 00000 n 0000180658 00000 n 0000180817 00000 n 0000180981 00000 n 0000181139 00000 n 0000181301 00000 n 0000181465 00000 n 0000181629 00000 n 0000181793 00000 n 0000181957 00000 n 0000182116 00000 n 0000182280 00000 n 0000182444 00000 n 0000182608 00000 n 0000182771 00000 n 0000182935 00000 n 0000183099 00000 n 0000183263 00000 n 0000177014 00000 n 0000175812 00000 n 0000183567 00000 n 0000183448 00000 n 0000183348 00000 n 0000185725 00000 n 0000185209 00000 n 0000183608 00000 n 0000185328 00000 n 0000185439 00000 n 0000185496 00000 n 0000185608 00000 n 0000461952 00000 n 0000186212 00000 n 0000186037 00000 n 0000185810 00000 n 0000186156 00000 n 0000188185 00000 n 0000188341 00000 n 0000188532 00000 n 0000188688 00000 n 0000188879 00000 n 0000189037 00000 n 0000189227 00000 n 0000189386 00000 n 0000190202 00000 n 0000187990 00000 n 0000186284 00000 n 0000189576 00000 n 0000189688 00000 n 0000189745 00000 n 0000189858 00000 n 0000189974 00000 n 0000460946 00000 n 0000190031 00000 n 0000190088 00000 n 0000190145 00000 n 0000256895 00000 n 0000306272 00000 n 0000193515 00000 n 0000303020 00000 n 0000205171 00000 n 0000299663 00000 n 0000205059 00000 n 0000302789 00000 n 0000192302 00000 n 0000192460 00000 n 0000192614 00000 n 0000192802 00000 n 0000192964 00000 n 0000193154 00000 n 0000193627 00000 n 0000192123 00000 n 0000190300 00000 n 0000193345 00000 n 0000193401 00000 n 0000193458 00000 n 0000199078 00000 n 0000196369 00000 n 0000199191 00000 n 0000296184 00000 n 0000195959 00000 n 0000196123 00000 n 0000196595 00000 n 0000195812 00000 n 0000193725 00000 n 0000196313 00000 n 0000196482 00000 n 0000231988 00000 n 0000198528 00000 n 0000198719 00000 n 0000199303 00000 n 0000198381 00000 n 0000196693 00000 n 0000198909 00000 n 0000198965 00000 n 0000201846 00000 n 0000202003 00000 n 0000202227 00000 n 0000202608 00000 n 0000202773 00000 n 0000202937 00000 n 0000203160 00000 n 0000203351 00000 n 0000203550 00000 n 0000203748 00000 n 0000203939 00000 n 0000204129 00000 n 0000204320 00000 n 0000204510 00000 n 0000204700 00000 n 0000205345 00000 n 0000201587 00000 n 0000199401 00000 n 0000204890 00000 n 0000204946 00000 n 0000202418 00000 n 0000205284 00000 n 0000462070 00000 n 0000295938 00000 n 0000244561 00000 n 0000280696 00000 n 0000284836 00000 n 0000247205 00000 n 0000244960 00000 n 0000302904 00000 n 0000285322 00000 n 0000207540 00000 n 0000207764 00000 n 0000207988 00000 n 0000208369 00000 n 0000208543 00000 n 0000208767 00000 n 0000208990 00000 n 0000209886 00000 n 0000207337 00000 n 0000205443 00000 n 0000209435 00000 n 0000209547 00000 n 0000208179 00000 n 0000209660 00000 n 0000209773 00000 n 0000209213 00000 n 0000289118 00000 n 0000289428 00000 n 0000224711 00000 n 0000289613 00000 n 0000289304 00000 n 0000289551 00000 n 0000212146 00000 n 0000212537 00000 n 0000212007 00000 n 0000209984 00000 n 0000212368 00000 n 0000212424 00000 n 0000289490 00000 n 0000215260 00000 n 0000214912 00000 n 0000212635 00000 n 0000215031 00000 n 0000215087 00000 n 0000215199 00000 n 0000217038 00000 n 0000216576 00000 n 0000215358 00000 n 0000216695 00000 n 0000216807 00000 n 0000216925 00000 n 0000218420 00000 n 0000218132 00000 n 0000217136 00000 n 0000218251 00000 n 0000218307 00000 n 0000220978 00000 n 0000221604 00000 n 0000220839 00000 n 0000218505 00000 n 0000221202 00000 n 0000221315 00000 n 0000221372 00000 n 0000460368 00000 n 0000221486 00000 n 0000462188 00000 n 0000289675 00000 n 0000224829 00000 n 0000224417 00000 n 0000221715 00000 n 0000224536 00000 n 0000224592 00000 n 0000460513 00000 n 0000225613 00000 n 0000225777 00000 n 0000225931 00000 n 0000226093 00000 n 0000226247 00000 n 0000226414 00000 n 0000226568 00000 n 0000226733 00000 n 0000226887 00000 n 0000227050 00000 n 0000227374 00000 n 0000225402 00000 n 0000224939 00000 n 0000227204 00000 n 0000235014 00000 n 0000235532 00000 n 0000248031 00000 n 0000227862 00000 n 0000227687 00000 n 0000227459 00000 n 0000227806 00000 n 0000228476 00000 n 0000228633 00000 n 0000228957 00000 n 0000228329 00000 n 0000227934 00000 n 0000228787 00000 n 0000229443 00000 n 0000229268 00000 n 0000229042 00000 n 0000229387 00000 n 0000230506 00000 n 0000230703 00000 n 0000230901 00000 n 0000231099 00000 n 0000231296 00000 n 0000231494 00000 n 0000231684 00000 n 0000232684 00000 n 0000230319 00000 n 0000229515 00000 n 0000231875 00000 n 0000232102 00000 n 0000460657 00000 n 0000232273 00000 n 0000232387 00000 n 0000232505 00000 n 0000232624 00000 n 0000462306 00000 n 0000234896 00000 n 0000280458 00000 n 0000233887 00000 n 0000234042 00000 n 0000234239 00000 n 0000234436 00000 n 0000234627 00000 n 0000237156 00000 n 0000237357 00000 n 0000237558 00000 n 0000237759 00000 n 0000235646 00000 n 0000233716 00000 n 0000232808 00000 n 0000234783 00000 n 0000235128 00000 n 0000235299 00000 n 0000235413 00000 n 0000237960 00000 n 0000238161 00000 n 0000238361 00000 n 0000238560 00000 n 0000239872 00000 n 0000236961 00000 n 0000235770 00000 n 0000238760 00000 n 0000238816 00000 n 0000238987 00000 n 0000239101 00000 n 0000239219 00000 n 0000239338 00000 n 0000239455 00000 n 0000239574 00000 n 0000239693 00000 n 0000239811 00000 n 0000241538 00000 n 0000241694 00000 n 0000241883 00000 n 0000242082 00000 n 0000242271 00000 n 0000242470 00000 n 0000242669 00000 n 0000242868 00000 n 0000243067 00000 n 0000243266 00000 n 0000243464 00000 n 0000243662 00000 n 0000243861 00000 n 0000244059 00000 n 0000244257 00000 n 0000245258 00000 n 0000241287 00000 n 0000239957 00000 n 0000244448 00000 n 0000244675 00000 n 0000244846 00000 n 0000245079 00000 n 0000460802 00000 n 0000245197 00000 n 0000247319 00000 n 0000247793 00000 n 0000247674 00000 n 0000247555 00000 n 0000247437 00000 n 0000247912 00000 n 0000246746 00000 n 0000246937 00000 n 0000249170 00000 n 0000248145 00000 n 0000246599 00000 n 0000245395 00000 n 0000247092 00000 n 0000249368 00000 n 0000249566 00000 n 0000249764 00000 n 0000249955 00000 n 0000250146 00000 n 0000250881 00000 n 0000248991 00000 n 0000248282 00000 n 0000250302 00000 n 0000250358 00000 n 0000250529 00000 n 0000250643 00000 n 0000250762 00000 n 0000251800 00000 n 0000255702 00000 n 0000255769 00000 n 0000255936 00000 n 0000256100 00000 n 0000256263 00000 n 0000256427 00000 n 0000256592 00000 n 0000258549 00000 n 0000257123 00000 n 0000251606 00000 n 0000250967 00000 n 0000256782 00000 n 0000257009 00000 n 0000257066 00000 n 0000462424 00000 n 0000252612 00000 n 0000252742 00000 n 0000252882 00000 n 0000253153 00000 n 0000253539 00000 n 0000253743 00000 n 0000253764 00000 n 0000255680 00000 n 0000280287 00000 n 0000258740 00000 n 0000258963 00000 n 0000259186 00000 n 0000259407 00000 n 0000259630 00000 n 0000259853 00000 n 0000260072 00000 n 0000260295 00000 n 0000260518 00000 n 0000260741 00000 n 0000260964 00000 n 0000261187 00000 n 0000261410 00000 n 0000261601 00000 n 0000261824 00000 n 0000262046 00000 n 0000262269 00000 n 0000262492 00000 n 0000262715 00000 n 0000262906 00000 n 0000263129 00000 n 0000263350 00000 n 0000263573 00000 n 0000263796 00000 n 0000264016 00000 n 0000264239 00000 n 0000264430 00000 n 0000264653 00000 n 0000264876 00000 n 0000265098 00000 n 0000265321 00000 n 0000265544 00000 n 0000265767 00000 n 0000265957 00000 n 0000266180 00000 n 0000266403 00000 n 0000266626 00000 n 0000266849 00000 n 0000267071 00000 n 0000269295 00000 n 0000269518 00000 n 0000269741 00000 n 0000267405 00000 n 0000258098 00000 n 0000257262 00000 n 0000267293 00000 n 0000267349 00000 n 0000281366 00000 n 0000281480 00000 n 0000284155 00000 n 0000284217 00000 n 0000284279 00000 n 0000284341 00000 n 0000284403 00000 n 0000284465 00000 n 0000284527 00000 n 0000284589 00000 n 0000284651 00000 n 0000284713 00000 n 0000284774 00000 n 0000280572 00000 n 0000280634 00000 n 0000280758 00000 n 0000280820 00000 n 0000284950 00000 n 0000285012 00000 n 0000285074 00000 n 0000285136 00000 n 0000285198 00000 n 0000285260 00000 n 0000280882 00000 n 0000280995 00000 n 0000281057 00000 n 0000281119 00000 n 0000281181 00000 n 0000281243 00000 n 0000281305 00000 n 0000285435 00000 n 0000289180 00000 n 0000289242 00000 n 0000289366 00000 n 0000269964 00000 n 0000270187 00000 n 0000270410 00000 n 0000270633 00000 n 0000270856 00000 n 0000271079 00000 n 0000271302 00000 n 0000271525 00000 n 0000271748 00000 n 0000271971 00000 n 0000272194 00000 n 0000272417 00000 n 0000272607 00000 n 0000272798 00000 n 0000272988 00000 n 0000273178 00000 n 0000273369 00000 n 0000273560 00000 n 0000273750 00000 n 0000273941 00000 n 0000274132 00000 n 0000274295 00000 n 0000274459 00000 n 0000274622 00000 n 0000274786 00000 n 0000274976 00000 n 0000275167 00000 n 0000275357 00000 n 0000275690 00000 n 0000275880 00000 n 0000276071 00000 n 0000276260 00000 n 0000276449 00000 n 0000276638 00000 n 0000276826 00000 n 0000277205 00000 n 0000277395 00000 n 0000277699 00000 n 0000268828 00000 n 0000267490 00000 n 0000277586 00000 n 0000461653 00000 n 0000277642 00000 n 0000275524 00000 n 0000277015 00000 n 0000292266 00000 n 0000292329 00000 n 0000292391 00000 n 0000295751 00000 n 0000295814 00000 n 0000295876 00000 n 0000296001 00000 n 0000296063 00000 n 0000299779 00000 n 0000279501 00000 n 0000279896 00000 n 0000281541 00000 n 0000279346 00000 n 0000277810 00000 n 0000280118 00000 n 0000279699 00000 n 0000461296 00000 n 0000283493 00000 n 0000283684 00000 n 0000283875 00000 n 0000288274 00000 n 0000288497 00000 n 0000285497 00000 n 0000283338 00000 n 0000281652 00000 n 0000284099 00000 n 0000288659 00000 n 0000288883 00000 n 0000289737 00000 n 0000288111 00000 n 0000285595 00000 n 0000289062 00000 n 0000292454 00000 n 0000292085 00000 n 0000289835 00000 n 0000292208 00000 n 0000462542 00000 n 0000295172 00000 n 0000295336 00000 n 0000295502 00000 n 0000296300 00000 n 0000295010 00000 n 0000292553 00000 n 0000295693 00000 n 0000298750 00000 n 0000298947 00000 n 0000299112 00000 n 0000299276 00000 n 0000299440 00000 n 0000299836 00000 n 0000298570 00000 n 0000296412 00000 n 0000299605 00000 n 0000301738 00000 n 0000301906 00000 n 0000302097 00000 n 0000302289 00000 n 0000302481 00000 n 0000303077 00000 n 0000301558 00000 n 0000299948 00000 n 0000302673 00000 n 0000305391 00000 n 0000305582 00000 n 0000305774 00000 n 0000305964 00000 n 0000306388 00000 n 0000305220 00000 n 0000303189 00000 n 0000306156 00000 n 0000307052 00000 n 0000306871 00000 n 0000306513 00000 n 0000306994 00000 n 0000308597 00000 n 0000308748 00000 n 0000308898 00000 n 0000309049 00000 n 0000309200 00000 n 0000309351 00000 n 0000309502 00000 n 0000309653 00000 n 0000309804 00000 n 0000309954 00000 n 0000310105 00000 n 0000310256 00000 n 0000310407 00000 n 0000310558 00000 n 0000310709 00000 n 0000310859 00000 n 0000311010 00000 n 0000311161 00000 n 0000311312 00000 n 0000311463 00000 n 0000311614 00000 n 0000311765 00000 n 0000311915 00000 n 0000312065 00000 n 0000312215 00000 n 0000312365 00000 n 0000312516 00000 n 0000312664 00000 n 0000312815 00000 n 0000312966 00000 n 0000313117 00000 n 0000313268 00000 n 0000313419 00000 n 0000313569 00000 n 0000313719 00000 n 0000313868 00000 n 0000314019 00000 n 0000314170 00000 n 0000314319 00000 n 0000314470 00000 n 0000314620 00000 n 0000314771 00000 n 0000314922 00000 n 0000315073 00000 n 0000315224 00000 n 0000315374 00000 n 0000315523 00000 n 0000315674 00000 n 0000315825 00000 n 0000315975 00000 n 0000316126 00000 n 0000316277 00000 n 0000316428 00000 n 0000316579 00000 n 0000316730 00000 n 0000316880 00000 n 0000317031 00000 n 0000317177 00000 n 0000317326 00000 n 0000317477 00000 n 0000319882 00000 n 0000317685 00000 n 0000307922 00000 n 0000307138 00000 n 0000317627 00000 n 0000462667 00000 n 0000320032 00000 n 0000320183 00000 n 0000320334 00000 n 0000320484 00000 n 0000320634 00000 n 0000320784 00000 n 0000320935 00000 n 0000321085 00000 n 0000321235 00000 n 0000321386 00000 n 0000321537 00000 n 0000321688 00000 n 0000321838 00000 n 0000321988 00000 n 0000322138 00000 n 0000322288 00000 n 0000322439 00000 n 0000322590 00000 n 0000322741 00000 n 0000322892 00000 n 0000323043 00000 n 0000323194 00000 n 0000323345 00000 n 0000323496 00000 n 0000323647 00000 n 0000323798 00000 n 0000323949 00000 n 0000324100 00000 n 0000324250 00000 n 0000324400 00000 n 0000324550 00000 n 0000324701 00000 n 0000324851 00000 n 0000325002 00000 n 0000325152 00000 n 0000325302 00000 n 0000325453 00000 n 0000325604 00000 n 0000325754 00000 n 0000325903 00000 n 0000326052 00000 n 0000326202 00000 n 0000326353 00000 n 0000326504 00000 n 0000326654 00000 n 0000326805 00000 n 0000326955 00000 n 0000327106 00000 n 0000327256 00000 n 0000327407 00000 n 0000327557 00000 n 0000327706 00000 n 0000327857 00000 n 0000328007 00000 n 0000328157 00000 n 0000328308 00000 n 0000328459 00000 n 0000328610 00000 n 0000328761 00000 n 0000328912 00000 n 0000329063 00000 n 0000329214 00000 n 0000329364 00000 n 0000329515 00000 n 0000329665 00000 n 0000329815 00000 n 0000329966 00000 n 0000330116 00000 n 0000330266 00000 n 0000330417 00000 n 0000330568 00000 n 0000330719 00000 n 0000330869 00000 n 0000331020 00000 n 0000331171 00000 n 0000331320 00000 n 0000331469 00000 n 0000331619 00000 n 0000331770 00000 n 0000331920 00000 n 0000332070 00000 n 0000332220 00000 n 0000334003 00000 n 0000332428 00000 n 0000319000 00000 n 0000317771 00000 n 0000332370 00000 n 0000334154 00000 n 0000334305 00000 n 0000334456 00000 n 0000334606 00000 n 0000334756 00000 n 0000334906 00000 n 0000335057 00000 n 0000335208 00000 n 0000335359 00000 n 0000335510 00000 n 0000335661 00000 n 0000335812 00000 n 0000335963 00000 n 0000336114 00000 n 0000336265 00000 n 0000336416 00000 n 0000336567 00000 n 0000336717 00000 n 0000336867 00000 n 0000337018 00000 n 0000337169 00000 n 0000337320 00000 n 0000337469 00000 n 0000337619 00000 n 0000337769 00000 n 0000337919 00000 n 0000338068 00000 n 0000338218 00000 n 0000338368 00000 n 0000338519 00000 n 0000338670 00000 n 0000338821 00000 n 0000338972 00000 n 0000339123 00000 n 0000339274 00000 n 0000339422 00000 n 0000339573 00000 n 0000339724 00000 n 0000339875 00000 n 0000340025 00000 n 0000340175 00000 n 0000340326 00000 n 0000340477 00000 n 0000340628 00000 n 0000340837 00000 n 0000333463 00000 n 0000332514 00000 n 0000340779 00000 n 0000459888 00000 n 0000340923 00000 n 0000341251 00000 n 0000341575 00000 n 0000341601 00000 n 0000342202 00000 n 0000342286 00000 n 0000342460 00000 n 0000342852 00000 n 0000343731 00000 n 0000344306 00000 n 0000354516 00000 n 0000354786 00000 n 0000364169 00000 n 0000364439 00000 n 0000371633 00000 n 0000371872 00000 n 0000378901 00000 n 0000379133 00000 n 0000397867 00000 n 0000398437 00000 n 0000415061 00000 n 0000415542 00000 n 0000428341 00000 n 0000428683 00000 n 0000448943 00000 n 0000449522 00000 n 0000459590 00000 n 0000462765 00000 n 0000462885 00000 n 0000462974 00000 n 0000463047 00000 n 0000472335 00000 n 0000472689 00000 n 0000472852 00000 n 0000473095 00000 n 0000473332 00000 n 0000473600 00000 n 0000473938 00000 n 0000474536 00000 n 0000475200 00000 n 0000475897 00000 n 0000476660 00000 n 0000477423 00000 n 0000478087 00000 n 0000478850 00000 n 0000479613 00000 n 0000480277 00000 n 0000480974 00000 n 0000481303 00000 n 0000481500 00000 n 0000481669 00000 n 0000481838 00000 n 0000482009 00000 n 0000482179 00000 n 0000482356 00000 n 0000482526 00000 n 0000482706 00000 n 0000482901 00000 n 0000483101 00000 n 0000483298 00000 n 0000483499 00000 n 0000483702 00000 n 0000484135 00000 n 0000484628 00000 n 0000485207 00000 n 0000485740 00000 n 0000486303 00000 n 0000486749 00000 n 0000486989 00000 n 0000487230 00000 n 0000487473 00000 n 0000487726 00000 n 0000488009 00000 n 0000488292 00000 n 0000488577 00000 n 0000488860 00000 n 0000489143 00000 n 0000489426 00000 n 0000489677 00000 n 0000489836 00000 n 0000490067 00000 n 0000490265 00000 n 0000490379 00000 n 0000490498 00000 n 0000490628 00000 n 0000490768 00000 n 0000490903 00000 n 0000491031 00000 n 0000491135 00000 n 0000491231 00000 n 0000491271 00000 n 0000491452 00000 n trailer << /Size 1336 /Root 1334 0 R /Info 1335 0 R /ID [ ] >> startxref 491779 %%EOF fdk-aac-0.1.3/compile0000755000175000017500000001624512372262356015001 0ustar00tootstoots00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: fdk-aac-0.1.3/config.sub0000755000175000017500000010535412372262356015406 0ustar00tootstoots00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-08-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fdk-aac-0.1.3/libSYS/0000755000175000017500000000000012372262442014554 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSYS/include/0000755000175000017500000000000012372262445016202 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSYS/include/audio.h0000644000175000017500000001214012372261464017452 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author: Manuel Jander ******************************************************************************/ /** \file audio.h * \brief Audio device support. * * This component features audio playback and capture with a common API for * any software/hardware platform. * * If you use Microsoft Visual C++ Version 6 and Ksmedia.h cannot be found, * installing DirectX (e.g. dx9sdk_summer2004.exe) solves it. * */ #ifndef AUDIO_H #define AUDIO_H #endif fdk-aac-0.1.3/libSYS/include/wav_file.h0000644000175000017500000002242312372261464020152 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Eric Allamanche ******************************************************************************/ /** \file wav_file.h * \brief Rudimentary WAVE file read/write support. * * The WAVE file reader/writer is intented to be used in the codec's example * framework for easily getting started with encoding/decoding. Therefore * it serves mainly for helping quickly understand how a codec's API actually * works. * Being a WAVE file reader/writer with very basic functionality, it may not be * able to read WAVE files that come with unusual configurations. * Details on how to use the interface functions can be found in every * (encoder/decoder) example framework. */ #ifndef __WAV_FILE_H__ #define __WAV_FILE_H__ #include "genericStds.h" #ifdef __cplusplus extern "C" { #endif #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 #define SPEAKER_LOW_FREQUENCY 0x8 #define SPEAKER_BACK_LEFT 0x10 #define SPEAKER_BACK_RIGHT 0x20 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 #define SPEAKER_BACK_CENTER 0x100 #define SPEAKER_SIDE_LEFT 0x200 #define SPEAKER_SIDE_RIGHT 0x400 #define SPEAKER_TOP_CENTER 0x800 #define SPEAKER_TOP_FRONT_LEFT 0x1000 #define SPEAKER_TOP_FRONT_CENTER 0x2000 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 #define SPEAKER_TOP_BACK_LEFT 0x8000 #define SPEAKER_TOP_BACK_CENTER 0x10000 #define SPEAKER_TOP_BACK_RIGHT 0x20000 #define SPEAKER_RESERVED 0x80000000 /*! * RIFF WAVE file struct. * For details see WAVE file format documentation (for example at http://www.wotsit.org). */ typedef struct WAV_HEADER { char riffType[4]; UINT riffSize; char waveType[4]; char formatType[4]; UINT formatSize; USHORT compressionCode; USHORT numChannels; UINT sampleRate; UINT bytesPerSecond; USHORT blockAlign; USHORT bitsPerSample; char dataType[4]; UINT dataSize; } WAV_HEADER; struct WAV { WAV_HEADER header; FDKFILE *fp; UINT channelMask; }; typedef struct WAV *HANDLE_WAV; /** * \brief Open a WAV file handle for reading. * * \param pWav Pointer to a memory location, where a WAV handle is returned. * \param filename File name to be opened. * * \return 0 on success and non-zero on failure. */ INT WAV_InputOpen (HANDLE_WAV *pWav, const char *filename); /** * \brief Read samples from a WAVE file. The samples are automatically re-ordered to the * native host endianess and scaled to full scale of the INT_PCM type, from * whatever BPS the WAVE file had specified in its header data. * * \param wav Handle of WAV file. * \param sampleBuffer Pointer to store audio data. * \param numSamples Desired number of samples to read. * \param nBufBits Size in bit of each audio sample of sampleBuffer. * * \return Number of samples actually read. */ INT WAV_InputRead (HANDLE_WAV wav, void *sampleBuffer, UINT numSamples, int nBufBits); /** * \brief Close a WAV file reading handle. * \param pWav Pointer to a WAV file reading handle. * \return void */ void WAV_InputClose(HANDLE_WAV *pWav); /** * \brief Open WAV output/writer handle. * * \param pWav Pointer to WAV handle to be returned. * \param outputFilename File name of the file to be written to. * \param sampleRate Desired samplerate of the resulting WAV file. * \param numChannels Desired number of audio channels of the resulting WAV file. * \param bitsPerSample Desired number of bits per audio sample of the resulting WAV file. * * \return 0: ok; -1: error */ INT WAV_OutputOpen(HANDLE_WAV *pWav, const char *outputFilename, INT sampleRate, INT numChannels, INT bitsPerSample); /** * \brief Write data to WAV file asociated to WAV handle. * * \param wav Handle of WAV file * \param sampleBuffer Pointer to audio samples, right justified integer values. * \param numberOfSamples The number of individual audio sample valuesto be written. * \param nBufBits Size in bits of each audio sample in sampleBuffer. * \param nSigBits Amount of significant bits of each nBufBits in sampleBuffer. * * \return 0: ok; -1: error */ INT WAV_OutputWrite(HANDLE_WAV wav, void *sampleBuffer, UINT numberOfSamples, int nBufBits, int nSigBits); /** * \brief Close WAV output handle. * \param pWav Pointer to WAV handle. *pWav is set to NULL. * \return void */ void WAV_OutputClose(HANDLE_WAV *pWav); #ifdef __cplusplus } #endif #endif /* __WAV_FILE_H__ */ fdk-aac-0.1.3/libSYS/include/genericStds.h0000644000175000017500000004612312372261464020633 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): ******************************************************************************/ /** \file genericStds.h \brief Generic Run-Time Support function wrappers and heap allocation monitoring. */ #if !defined(__GENERICSTDS_H__) #define __GENERICSTDS_H__ #include "machine_type.h" /* Always increase verbosity of memory allocation in case of a debug built. DEBUG is defined globally in that case. */ #if defined(DEBUG) || defined(FDK_DEBUG) //#define MEMORY_MEASUREMENT #endif #ifndef M_PI #define M_PI 3.14159265358979323846 /*! Pi. Only used in example projects. */ #endif /* #define _CRT_SECURE_NO_DEPRECATE */ /** * Identifiers for various memory locations. They are used along with memory allocation * functions like FDKcalloc_L() to specify the requested memory's location. */ typedef enum { /* Internal */ SECT_DATA_L1 = 0x2000, SECT_DATA_L2, SECT_DATA_L1_A, SECT_DATA_L1_B, SECT_CONSTDATA_L1, /* External */ SECT_DATA_EXTERN = 0x4000, SECT_CONSTDATA_EXTERN } MEMORY_SECTION; /** * The H_ prefix indicates header file version, the C_* prefix indicates the corresponding * object version. * * Declaring memory areas requires to specify a unique name and a data type. Use the H_ macro * for this purpose inside a header file. * * For defining a memory area your require additionally one or two sizes, depending if the * memory should be organized into one or two dimensions. * * The macros containing the keyword AALLOC instead of ALLOC also do take care of returning * aligned memory addresses (beyond the natural alignment of its type). The preprocesor macro * ::ALIGNMENT_DEFAULT indicates the aligment to be used (this is hardware specific). * * The _L suffix indicates that the memory will be located in a specific section. This is * useful to allocate critical memory section into fast internal SRAM for example. * */ #define H_ALLOC_MEM(name,type) type * Get ## name(int n=0); void Free ## name(type** p); \ UINT GetRequiredMem ## name(void); /** See #H_ALLOC_MEM for description. */ #define H_ALLOC_MEM_OVERLAY(name,type) type * Get ## name(int n=0); void Free ## name(type** p); \ UINT GetRequiredMem ## name(void); /** See #H_ALLOC_MEM for description. */ #define C_ALLOC_MEM(name,type,num) \ type * Get ## name(int n) { FDK_ASSERT((n) == 0); return ((type*)FDKcalloc(num, sizeof(type))); } \ void Free ## name(type** p) { if (p != NULL) { FDKfree(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((num) * sizeof(type)); } /** See #H_ALLOC_MEM for description. */ #define C_ALLOC_MEM_STATIC(name,type,num) \ static type * Get ## name(int n) { FDK_ASSERT((n) == 0); return ((type*)FDKcalloc(num, sizeof(type))); } \ static void Free ## name(type** p) { if (p != NULL) { FDKfree(*p); *p=NULL; } } \ static UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((num) * sizeof(type)); } /** See #H_ALLOC_MEM for description. */ #define C_ALLOC_MEM2(name,type,n1,n2) \ type * Get ## name (int n) { FDK_ASSERT((n) < (n2)); return ((type*)FDKcalloc(n1, sizeof(type))); } \ void Free ## name(type** p) { if (p != NULL) { FDKfree(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((n1) * sizeof(type)) * (n2); } /** See #H_ALLOC_MEM for description. */ #define C_AALLOC_MEM(name,type,num) \ type * Get ## name(int n) { FDK_ASSERT((n) == 0); return ((type*)FDKaalloc((num)*sizeof(type), ALIGNMENT_DEFAULT)); } \ void Free ## name(type** p) { if (p != NULL) { FDKafree(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((num) * sizeof(type) + ALIGNMENT_DEFAULT + sizeof(void *)); } /** See #H_ALLOC_MEM for description. */ #define C_AALLOC_MEM2(name,type,n1,n2) \ type * Get ## name (int n) { FDK_ASSERT((n) < (n2)); return ((type*)FDKaalloc((n1)*sizeof(type), ALIGNMENT_DEFAULT)); } \ void Free ## name(type** p) { if (p != NULL) { FDKafree(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((n1) * sizeof(type) + ALIGNMENT_DEFAULT + sizeof(void *)) * (n2); } /** See #H_ALLOC_MEM for description. */ #define C_ALLOC_MEM_L(name,type,num,s) \ type * Get ## name(int n) { FDK_ASSERT((n) == 0); return ((type*)FDKcalloc_L(num, sizeof(type), s)); } \ void Free ## name(type** p) { if (p != NULL) { FDKfree_L(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((num) * sizeof(type)); } /** See #H_ALLOC_MEM for description. */ #define C_ALLOC_MEM2_L(name,type,n1,n2,s) \ type * Get ## name (int n) { FDK_ASSERT((n) < (n2)); return (type*)FDKcalloc_L(n1, sizeof(type), s); } \ void Free ## name(type** p) { if (p != NULL) { FDKfree_L(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((n1) * sizeof(type)) * (n2); } /** See #H_ALLOC_MEM for description. */ #define C_AALLOC_MEM_L(name,type,num,s) \ type * Get ## name(int n) { FDK_ASSERT((n) == 0); return ((type*)FDKaalloc_L((num)*sizeof(type), ALIGNMENT_DEFAULT, s)); } \ void Free ## name(type** p) { if (p != NULL) { FDKafree_L(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((num) * sizeof(type) + ALIGNMENT_DEFAULT + sizeof(void *)); } /** See #H_ALLOC_MEM for description. */ #define C_AALLOC_MEM2_L(name,type,n1,n2,s) \ type * Get ## name (int n) { FDK_ASSERT((n) < (n2)); return ((type*)FDKaalloc_L((n1)*sizeof(type), ALIGNMENT_DEFAULT, s)); } \ void Free ## name(type** p) { if (p != NULL) { FDKafree_L(*p); *p=NULL; } } \ UINT GetRequiredMem ## name(void) { return ALGN_SIZE_EXTRES((n1) * sizeof(type) + ALIGNMENT_DEFAULT + sizeof(void *)) * (n2); } /** See #H_ALLOC_MEM_OVERLAY for description. */ #define C_ALLOC_MEM_OVERLAY(name,type,num,sect,tag) C_AALLOC_MEM_L(name,type,num,sect) #define C_AALLOC_SCRATCH_START(name,type,n) \ type _ ## name[(n)+(ALIGNMENT_DEFAULT+sizeof(type)-1)]; \ type * name = (type*)ALIGN_PTR(_ ## name); \ #define C_ALLOC_SCRATCH_START(name,type,n) \ type name[n]; #define C_AALLOC_SCRATCH_END(name,type,n) #define C_ALLOC_SCRATCH_END(name,type,n) /*-------------------------------------------- * Runtime support declarations *---------------------------------------------*/ #ifdef __cplusplus extern "C" { #endif /** printf() using stdout. If ::ARCH_WA_FLUSH_CONSOLE defined, a flush is done additionally after printf(). */ void FDKprintf ( const char* szFmt, ...); /** printf() using stderr. If ::ARCH_WA_FLUSH_CONSOLE defined, a flush is done additionally after printf(). */ void FDKprintfErr ( const char* szFmt, ...); /** Wrapper for 's getchar(). */ int FDKgetchar(void); INT FDKfprintf(void *stream, const char *format, ...); INT FDKsprintf(char *str, const char *format, ...); const char *FDKstrchr(const char *s, INT c); const char *FDKstrstr(const char *haystack, const char *needle); char *FDKstrcpy(char *dest, const char *src); char *FDKstrncpy(char *dest, const char *src, const UINT n); #define FDK_MAX_OVERLAYS 8 /**< Maximum number of memory overlays. */ void *FDKcalloc (const UINT n, const UINT size); void *FDKmalloc (const UINT size); void FDKfree (void *ptr); /** * Allocate and clear an aligned memory area. Use FDKafree() instead of FDKfree() for these memory areas. * * \param size Size of requested memory in bytes. * \param alignment Alignment of requested memory in bytes. * \return Pointer to allocated memory. */ void *FDKaalloc (const UINT size, const UINT alignment); /** * Free an aligned memory area. * * \param ptr Pointer to be freed. * \return void */ void FDKafree (void *ptr); /** * Allocate memory in a specific memory section. * Requests can be made for internal or external memory. If internal memory is * requested, FDKcalloc_L() first tries to use L1 memory, which sizes are defined * by ::DATA_L1_A_SIZE and ::DATA_L1_B_SIZE. If no L1 memory is available, then * FDKcalloc_L() tries to use L2 memory. If that fails as well, the requested * memory is allocated at an extern location using the fallback FDKcalloc(). * * \param n See MSDN documentation on calloc(). * \param size See MSDN documentation on calloc(). * \param s Memory section. * \return See MSDN documentation on calloc(). */ void *FDKcalloc_L(const UINT n, const UINT size, MEMORY_SECTION s); /** * Allocate aligned memory in a specific memory section. * See FDKcalloc_L() description for details - same applies here. */ void *FDKaalloc_L(const UINT size, const UINT alignment, MEMORY_SECTION s); /** * Free memory that was allocated in a specific memory section. */ void FDKfree_L(void *ptr); /** * Free aligned memory that was allocated in a specific memory section. */ void FDKafree_L(void *ptr); /** * Copy memory. Source and destination memory must not overlap. * Either use implementation from a Standard Library, or, if no Standard Library * is available, a generic implementation. * The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to use. * The function arguments correspond to the standard memcpy(). Please see MSDN * documentation for details on how to use it. */ void FDKmemcpy(void *dst, const void *src, const UINT size); /** * Copy memory. Source and destination memory are allowed to overlap. * Either use implementation from a Standard Library, or, if no Standard Library * is available, a generic implementation. * The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to use. * The function arguments correspond to the standard memmove(). Please see MSDN * documentation for details on how to use it. */ void FDKmemmove(void *dst, const void *src, const UINT size); /** * Clear memory. * Either use implementation from a Standard Library, or, if no Standard Library * is available, a generic implementation. * The define ::USE_BUILTIN_MEM_FUNCTIONS in genericStds.cpp controls what to use. * The function arguments correspond to the standard memclear(). Please see MSDN * documentation for details on how to use it. */ void FDKmemclear(void *memPtr, const UINT size); /** * Fill memory with values. * The function arguments correspond to the standard memset(). Please see MSDN * documentation for details on how to use it. */ void FDKmemset(void *memPtr, const INT value, const UINT size); /* Compare function wrappers */ INT FDKmemcmp(const void *s1, const void *s2, const UINT size); INT FDKstrcmp(const char *s1, const char *s2); INT FDKstrncmp(const char *s1, const char *s2, const UINT size); UINT FDKstrlen(const char *s); #define FDKmax(a,b) ( (a) > (b) ? (a):(b)) #define FDKmin(a,b) ( (a) < (b) ? (a):(b)) #define FDK_INT_MAX ((INT)0x7FFFFFFF) #define FDK_INT_MIN ((INT)0x80000000) /* Math function wrappers. Only intended for compatibility, not to be highly optimized. */ /* Used for debugging, dev code .. */ INT FDKabs(INT j); double FDKfabs(double x); double FDKpow(double x, double y); double FDKsqrt(double x); double FDKatan(double x); double FDKlog(double x); double FDKsin(double x); double FDKcos(double x); double FDKexp(double x); #define FDKlog2(a) (FDKlog(a)*1.442695041) /* log(2.0) = 1.442695041 */ #define FDKlog10(a) (FDKlog(a)*0.434294482) /* 1.0/log(10.0) = 0.434294482 */ double FDKatan2(double y, double x); double FDKacos(double x); double FDKtan(double x); double FDKfloor(double x); double FDKceil(double x); INT FDKatoi(const char *nptr); long FDKatol(const char *nptr); float FDKatof(const char *nptr); /* LONG LONG FDKatoll(const char *nptr); */ /* LONG LONG FDKatoq(const char *nptr); */ /* FILE I/O */ /*! * Check platform for endianess. * * \return 1 if platform is little endian, non-1 if platform is big endian. */ #ifdef __cplusplus inline #else static #endif int IS_LITTLE_ENDIAN(void) { int __dummy = 1; return ( *( (UCHAR*)(&(__dummy) ) ) ); } /*! * Convert input value to little endian format. * * \param val Value to be converted. It may be in both big or little endian. * \return Value in little endian format. */ #define TO_LITTLE_ENDIAN(val) \ ( (IS_LITTLE_ENDIAN()) ? \ (val) \ : ( (((val) & 0xff) << 24) || (((val) & 0xff00)<< 8) || (((val) & 0xff0000)>>8) || (((val) & 0xff000000) >> 24) ) ) /*! * \fn FDKFILE *FDKfopen(const char *filename, const char *mode); * Standard fopen() wrapper. * \fn INT FDKfclose(FDKFILE *FP); * Standard fclose() wrapper. * \fn INT FDKfseek(FDKFILE *FP, LONG OFFSET, int WHENCE); * Standard fseek() wrapper. * \fn INT FDKftell(FDKFILE *FP); * Standard ftell() wrapper. * \fn INT FDKfflush(FDKFILE *fp); * Standard fflush() wrapper. * \fn UINT FDKfwrite(void *ptrf, INT size, UINT nmemb, FDKFILE *fp); * Standard fwrite() wrapper. * \fn UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp); * Standard fread() wrapper. */ typedef void FDKFILE; extern const INT FDKSEEK_SET, FDKSEEK_CUR, FDKSEEK_END; FDKFILE *FDKfopen(const char *filename, const char *mode); INT FDKfclose(FDKFILE *FP); INT FDKfseek(FDKFILE *FP, LONG OFFSET, int WHENCE); INT FDKftell(FDKFILE *FP); INT FDKfflush(FDKFILE *fp); UINT FDKfwrite(void *ptrf, INT size, UINT nmemb, FDKFILE *fp); UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp); char* FDKfgets(void *dst, INT size, FDKFILE *fp); void FDKrewind(FDKFILE *fp); INT FDKfeof(FDKFILE *fp); /** * \brief Write each member in little endian order. Convert automatically to host endianess. * \param ptrf Pointer to memory where to read data from. * \param size Size of each item to be written. * \param nmemb Number of items to be written. * \param fp File pointer of type FDKFILE. * \return Number of items read on success and fread() error on failure. */ UINT FDKfwrite_EL(void *ptrf, INT size, UINT nmemb, FDKFILE *fp); /** * \brief Read variable of size "size" as little endian. Convert automatically to host endianess. * 4-byte alignment is enforced for 24 bit data, at 32 bit full scale. * \param dst Pointer to memory where to store data into. * \param size Size of each item to be read. * \param nmemb Number of items to be read. * \param fp File pointer of type FDKFILE. * \return Number of items read on success and fread() error on failure. */ UINT FDKfread_EL(void *dst, INT size, UINT nmemb, FDKFILE *fp); /** * \brief Print FDK software disclaimer. */ void FDKprintDisclaimer(void); #ifdef __cplusplus } #endif #endif /* __GENERICSTDS_H__ */ fdk-aac-0.1.3/libSYS/include/machine_type.h0000644000175000017500000003120312372262205021011 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): ******************************************************************************/ /** \file machine_type.h * \brief Type defines for various processors and compiler tools. */ #if !defined(__MACHINE_TYPE_H__) #define __MACHINE_TYPE_H__ /* Library calling convention spec. __cdecl and friends might be added here as required. */ #define LINKSPEC_H #define LINKSPEC_CPP /** * collate all corresponding compiler specific macros to detect a debug build, and set the DEBUG macro if that is the case. */ #if defined(_DEBUG) #define DEBUG #endif /* for doxygen the following docu parts must be separated */ /** \var SCHAR * Data type representing at least 1 byte signed integer on all supported platforms. */ /** \var UCHAR * Data type representing at least 1 byte unsigned integer on all supported platforms. */ /** \var INT * Data type representing at least 4 byte signed integer on all supported platforms. */ /** \var UINT * Data type representing at least 4 byte unsigned integer on all supported platforms. */ /** \var LONG * Data type representing 4 byte signed integer on all supported platforms. */ /** \var ULONG * Data type representing 4 byte unsigned integer on all supported platforms. */ /** \var SHORT * Data type representing 2 byte signed integer on all supported platforms. */ /** \var USHORT * Data type representing 2 byte unsigned integer on all supported platforms. */ /** \var INT64 * Data type representing 8 byte signed integer on all supported platforms. */ /** \var UINT64 * Data type representing 8 byte unsigned integer on all supported platforms. */ /** \def SHORT_BITS * Number of bits the data type short represents. sizeof() is not suited to get this info, * because a byte is not always defined as 8 bits. */ /** \def CHAR_BITS * Number of bits the data type char represents. sizeof() is not suited to get this info, * because a byte is not always defined as 8 bits. */ /** \var INT_PCM * Data type representing the width of input and output PCM samples. */ typedef signed int INT; typedef unsigned int UINT; #ifdef __LP64__ /* force FDK long-datatypes to 4 byte */ /* jdr: Use defines to avoid type alias problems on 64 bit machines. */ #define LONG INT #define ULONG UINT #else /* __LP64__ */ typedef signed long LONG; typedef unsigned long ULONG; #endif /* __LP64__ */ typedef signed short SHORT; typedef unsigned short USHORT; typedef signed char SCHAR; typedef unsigned char UCHAR; #define SHORT_BITS 16 #define CHAR_BITS 8 /* Define 64 bit base integer type. */ #ifdef _MSC_VER typedef __int64 INT64; typedef unsigned __int64 UINT64; #else typedef long long INT64; typedef unsigned long long UINT64; #endif #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif /* Assert is functional on x86 PC's and also when debugging is turned on. */ #if defined(DEBUG) || defined(__i686__) || defined(__i586__) || defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(FDK_DEBUG) || defined(FDK_ASSERT_ENABLE) #include #define FDK_ASSERT(x) assert(x) #else #define FDK_ASSERT(ignore) #endif typedef SHORT INT_PCM; #define WAV_BITS 16 #define SAMPLE_BITS 16 #define SAMPLE_MAX (((LONG)1<<(SAMPLE_BITS-1))-1) #define SAMPLE_MIN (~SAMPLE_MAX) /*! * \def RAM_ALIGN * Used to align memory as prefix before memory declaration. For example: \code RAM_ALIGN int myArray[16]; \endcode Note, that not all platforms support this mechanism. For example with TI compilers a preprocessor pragma is used, but to do something like \code #define RAM_ALIGN #pragma DATA_ALIGN(x) \encode would require the preprocessor to process this line twice to fully resolve it. Hence, a fully platform-independant way to use alignment is not supported. * \def ALIGNMENT_DEFAULT * Default alignment in bytes. */ #if defined(__GNUC__) /* cppp replaced: elif */ #define ALIGNMENT_DEFAULT 8 #define RAM_ALIGN __attribute__((aligned(ALIGNMENT_DEFAULT))) #else #define ALIGNMENT_DEFAULT 8 #define RAM_ALIGN #endif /*! * \def RESTRICT * The restrict keyword is supported by some platforms and RESTRICT maps to * either the corresponding keyword on each platform or to void if the * compiler does not provide such feature. * * \def WORD_ALIGNED(x) * Tells the compiler that pointer x is WORD aligned. * At the moment only supported by TI compilers. * * \def DWORD_ALIGNED(x) * Tells the compiler that pointer x is DWORD aligned. * At the moment only supported by TI compilers. */ #define RESTRICT #define WORD_ALIGNED(x) #define DWORD_ALIGNED(x) /*----------------------------------------------------------------------------------- * ALIGN_SIZE *-----------------------------------------------------------------------------------*/ /*! * \brief This macro aligns a given value depending on ::ALIGNMENT_DEFAULT. * * For example if #ALIGNMENT_DEFAULT equals 8, then: * - ALIGN_SIZE(3) returns 8 * - ALIGN_SIZE(8) returns 8 * - ALIGN_SIZE(9) returns 16 */ #define ALIGN_SIZE(a) ((a)+ (((INT)ALIGNMENT_DEFAULT - ((INT)(a) & (ALIGNMENT_DEFAULT-1)) ) & (ALIGNMENT_DEFAULT-1))) /*----------------------------------------------------------------------------------- * ALIGN_PTR * cast (a) to width of pointer *-----------------------------------------------------------------------------------*/ /*! * \brief This macro aligns a given address depending on ::ALIGNMENT_DEFAULT. */ #define ALIGN_PTR(a) ( (unsigned char*)(a) + (((INT)ALIGNMENT_DEFAULT - ((INT)(UINT64)(a) & (ALIGNMENT_DEFAULT-1)) ) & (ALIGNMENT_DEFAULT-1)) ) /* Alignment macro for libSYS heap implementation */ #define ALIGNMENT_EXTRES ( ALIGNMENT_DEFAULT ) #define ALGN_SIZE_EXTRES(a) ((a)+ (((INT)ALIGNMENT_EXTRES - ((INT)(a) & (ALIGNMENT_EXTRES-1)) ) & (ALIGNMENT_EXTRES-1))) /*! * \def FORCEINLINE * Sometimes compiler do not do what they are told to do, and in case of inlining some * additional command might be necessary depending on the platform. * * \def FDK_INLINE * Defines how the compiler is told to inline stuff. */ #ifdef DEBUG #undef FORCEINLINE #define FORCEINLINE #else #ifndef FORCEINLINE #if defined(__GNUC__) /* cppp replaced: elif */ #define FORCEINLINE __attribute((always_inline)) #else #define FORCEINLINE #endif #endif #endif /* for all other platforms */ #define FDK_INLINE inline /*! * \def LNK_SECTION_DATA_L1 * The LNK_SECTION_* defines allow memory to be drawn from specific memory * sections. Used as prefix before variable declaration. * * \def LNK_SECTION_DATA_L2 * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_L1_DATA_A * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_L1_DATA_B * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_CONSTDATA_L1 * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_CONSTDATA * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_CODE_L1 * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_CODE_L2 * See ::LNK_SECTION_DATA_L1 * \def LNK_SECTION_INITCODE * See ::LNK_SECTION_DATA_L1 */ /************************************************** * Code Section macros **************************************************/ #define LNK_SECTION_CODE_L1 #define LNK_SECTION_CODE_L2 #define LNK_SECTION_INITCODE /* Memory section macros. */ /* default fall back */ #define LNK_SECTION_DATA_L1 #define LNK_SECTION_DATA_L2 #define LNK_SECTION_CONSTDATA #define LNK_SECTION_CONSTDATA_L1 #define LNK_SECTION_L1_DATA_A #define LNK_SECTION_L1_DATA_B #ifdef _MSC_VER /* * Sometimes certain features are excluded from compilation and therefore the warning 4065 may occur: * "switch statement contains 'default' but no 'case' labels" * We consider this warning irrelevant and disable it. */ #pragma warning( disable : 4065 ) #endif #endif /* __MACHINE_TYPE_H__ */ fdk-aac-0.1.3/libSYS/include/cmdl_parser.h0000644000175000017500000002033712372261464020653 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Description: command line parser ******************************************************************************/ /** \file cmdl_parser.h * \brief Command line parser. * * The command line parser can extract certain data fields out of a character * string and assign values to variables. It has 2 main functions. One to parse * a command line in the form of standard C runtime "argc" and "argv" parameters, * and the other to assemble these parameters reading text lines from a file in * case the C runtime does not provide them. */ #ifndef __PARSER_H #define __PARSER_H #include "machine_type.h" #define CMDL_MAX_STRLEN 255 #define CMDL_MAX_ARGC 30 /* \cond */ /* Type definition for text */ #ifdef WIN32 #include #ifndef _tstof /* For Visual Studio 6 */ #ifdef _UNICODE #include #define _tstof(x) (float) wcstod(x, NULL) /* For Visual Studio 6 */ #else #define _tstof atof #endif #endif #ifndef _tstol /* For Visual Studio 6 */ #ifdef _UNICODE #define _tstol _wtol #else #define _tstol atol #endif #endif #ifndef _tstoi /* For Visual Studio 6 */ #ifdef _UNICODE #define _tstoi _wtoi #else #define _tstoi atoi #endif #endif #ifndef TEXTCHAR #define TEXTCHAR char #endif #ifndef _TEXT #define _TEXT #endif #else /* WIN32 */ #define TEXTCHAR char #define _tcslen(a) FDKstrlen(a) #define _tcscpy strcpy #define _tcscmp FDKstrcmp #define _tcsncmp FDKstrncmp #define _tscanf scanf #define _TEXT(x) x #define _tfopen fopen #define _ftprintf fprintf #define _tcsncpy FDKstrncpy #define _tstof FDKatof #define _tstol FDKatol #define _tstoi FDKatoi #define _tcstol strtol #define _istdigit isdigit #endif /* WIN32 */ /* \endcond */ #ifdef __cplusplus extern "C" { #endif /** * Scans argc, argv and a scanf style format string for parameters and stores the * values in the variable number of pointers passed to the function. For example: \code #define ARG_PARAM "(-a %d) (-v %1)" #define ARG_VALUE &config->aot, &verbose int nFoundArgs = IIS_ScanCmdl(argc, argv, ARG_PARAM, ARG_VALUE); \endcode wheras the wild-cards (\%d, \%1, ..) define the data type of the argument: - \%1 boolean (e. g. -x) - \%d integer (e. g. -x 23) - \%f float (e. g. -x 3.4) - \%y double (e. g. -x 31415926535897932384626433832795028841971693993751) - \%s string (e. g. -x "file.dat") - \%u unsigned character (e. g. -x 3) - \%c signed character (e. g. -x -3) More examples on how to use it are located in every (encoder/decoder) example framework. * \param argc Number of arguments. * \param argv Complete character string of the command line arguments. * \param pReqArgs A list of parameters and a corresponding list of memory addresses to * assign each parameter to. * * \return Number of found arguments. */ INT IIS_ScanCmdl(INT argc, TEXTCHAR* argv[], const TEXTCHAR* pReqArgs, ...); #ifdef __cplusplus } #endif /** * Reads a text file, assembles argc and argv parameters for each text line * and calls the given function for each set of argc, argv parameters. * * \param param_filename Name of text file that should be parsed. * \param pFunction Pointer to function that should be called for every text line found. * * \return 0 on success, 1 on failure. */ INT IIS_ProcessCmdlList(const TEXTCHAR* param_filename, int (*pFunction)(int, TEXTCHAR**)); #endif /* __PARSER_H */ fdk-aac-0.1.3/libSYS/include/conv_string.h0000644000175000017500000001365612372261464020721 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): ******************************************************************************/ /** \file conv_string.h * \brief String conversion functions. */ #ifndef _CONV_STRING_H #define _CONV_STRING_H #include "genericStds.h" #ifdef __cplusplus extern "C" { #endif /** * \brief Convert a bitbuffer to a hex string. * \param string Hex string. * \param charBuf Input buffer that has to be converted. * \param charBufLength Size of the input buffer. * \return Error code. */ INT charBuf2HexString(char *string, UCHAR *charBuf, INT charBufLength); /** * \brief Convert a hex string to bits. * \param string Hex string that has to be converted. * \param charBuf Output buffer holding the bits, will be filled up with zeros. * \param charBufLength Size of the output buffer. * \return Error code. */ INT hexString2CharBuf(const char *string, UCHAR *charBuf, UINT charBufLength); /** * \brief Convert a character representing a hex sign to the appropriate value. * \param c Character that has to be converted. * \return Converted value (value between 0 and 15), if 16, an error has occured. */ UCHAR hexChar2Dec(const char c); #ifdef __cplusplus } #endif #endif /* _CONV_STRING_H */ fdk-aac-0.1.3/libSYS/include/FDK_audio.h0000644000175000017500000007010012372261464020136 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Manuel Jander ******************************************************************************/ /** \file FDK_audio.h * \brief Global audio struct and constant definitions. */ #ifndef FDK_AUDIO_H #define FDK_AUDIO_H #include "machine_type.h" #include "genericStds.h" #ifdef __cplusplus extern "C" { #endif /** * File format identifiers. */ typedef enum { FF_UNKNOWN = -1, /**< Unknown format. */ FF_RAW = 0, /**< No container, bit stream data conveyed "as is". */ FF_MP4_3GPP = 3, /**< 3GPP file format. */ FF_MP4_MP4F = 4, /**< MPEG-4 File format. */ FF_RAWPACKETS = 5, /**< Proprietary raw packet file. */ FF_DRMCT = 12 /**< Digital Radio Mondial (DRM30/DRM+) CT proprietary file format. */ } FILE_FORMAT; /** * Transport type identifiers. */ typedef enum { TT_UNKNOWN = -1, /**< Unknown format. */ TT_MP4_RAW = 0, /**< "as is" access units (packet based since there is obviously no sync layer) */ TT_MP4_ADIF = 1, /**< ADIF bitstream format. */ TT_MP4_ADTS = 2, /**< ADTS bitstream format. */ TT_MP4_LATM_MCP1 = 6, /**< Audio Mux Elements with muxConfigPresent = 1 */ TT_MP4_LATM_MCP0 = 7, /**< Audio Mux Elements with muxConfigPresent = 0, out of band StreamMuxConfig */ TT_MP4_LOAS = 10, /**< Audio Sync Stream. */ TT_DRM = 12, /**< Digital Radio Mondial (DRM30/DRM+) bitstream format. */ TT_MP1_L1 = 16, /**< MPEG 1 Audio Layer 1 audio bitstream. */ TT_MP1_L2 = 17, /**< MPEG 1 Audio Layer 2 audio bitstream. */ TT_MP1_L3 = 18, /**< MPEG 1 Audio Layer 3 audio bitstream. */ TT_RSVD50 = 50 /**< */ } TRANSPORT_TYPE; #define TT_IS_PACKET(x) \ ( ((x) == TT_MP4_RAW) \ || ((x) == TT_DRM) \ || ((x) == TT_MP4_LATM_MCP0) \ || ((x) == TT_MP4_LATM_MCP1) ) /** * Audio Object Type definitions. */ typedef enum { AOT_NONE = -1, AOT_NULL_OBJECT = 0, AOT_AAC_MAIN = 1, /**< Main profile */ AOT_AAC_LC = 2, /**< Low Complexity object */ AOT_AAC_SSR = 3, AOT_AAC_LTP = 4, AOT_SBR = 5, AOT_AAC_SCAL = 6, AOT_TWIN_VQ = 7, AOT_CELP = 8, AOT_HVXC = 9, AOT_RSVD_10 = 10, /**< (reserved) */ AOT_RSVD_11 = 11, /**< (reserved) */ AOT_TTSI = 12, /**< TTSI Object */ AOT_MAIN_SYNTH = 13, /**< Main Synthetic object */ AOT_WAV_TAB_SYNTH = 14, /**< Wavetable Synthesis object */ AOT_GEN_MIDI = 15, /**< General MIDI object */ AOT_ALG_SYNTH_AUD_FX = 16, /**< Algorithmic Synthesis and Audio FX object */ AOT_ER_AAC_LC = 17, /**< Error Resilient(ER) AAC Low Complexity */ AOT_RSVD_18 = 18, /**< (reserved) */ AOT_ER_AAC_LTP = 19, /**< Error Resilient(ER) AAC LTP object */ AOT_ER_AAC_SCAL = 20, /**< Error Resilient(ER) AAC Scalable object */ AOT_ER_TWIN_VQ = 21, /**< Error Resilient(ER) TwinVQ object */ AOT_ER_BSAC = 22, /**< Error Resilient(ER) BSAC object */ AOT_ER_AAC_LD = 23, /**< Error Resilient(ER) AAC LowDelay object */ AOT_ER_CELP = 24, /**< Error Resilient(ER) CELP object */ AOT_ER_HVXC = 25, /**< Error Resilient(ER) HVXC object */ AOT_ER_HILN = 26, /**< Error Resilient(ER) HILN object */ AOT_ER_PARA = 27, /**< Error Resilient(ER) Parametric object */ AOT_RSVD_28 = 28, /**< might become SSC */ AOT_PS = 29, /**< PS, Parametric Stereo (includes SBR) */ AOT_MPEGS = 30, /**< MPEG Surround */ AOT_ESCAPE = 31, /**< Signal AOT uses more than 5 bits */ AOT_MP3ONMP4_L1 = 32, /**< MPEG-Layer1 in mp4 */ AOT_MP3ONMP4_L2 = 33, /**< MPEG-Layer2 in mp4 */ AOT_MP3ONMP4_L3 = 34, /**< MPEG-Layer3 in mp4 */ AOT_RSVD_35 = 35, /**< might become DST */ AOT_RSVD_36 = 36, /**< might become ALS */ AOT_AAC_SLS = 37, /**< AAC + SLS */ AOT_SLS = 38, /**< SLS */ AOT_ER_AAC_ELD = 39, /**< AAC Enhanced Low Delay */ AOT_USAC = 42, /**< USAC */ AOT_SAOC = 43, /**< SAOC */ AOT_LD_MPEGS = 44, /**< Low Delay MPEG Surround */ AOT_RSVD50 = 50, /**< Interim AOT for Rsvd50 */ /* Pseudo AOTs */ AOT_MP2_AAC_MAIN = 128, /**< Virtual AOT MP2 Main profile */ AOT_MP2_AAC_LC = 129, /**< Virtual AOT MP2 Low Complexity profile */ AOT_MP2_AAC_SSR = 130, /**< Virtual AOT MP2 Scalable Sampling Rate profile */ AOT_MP2_SBR = 132, /**< Virtual AOT MP2 Low Complexity Profile with SBR */ AOT_DAB = 134, /**< Virtual AOT for DAB (Layer2 with scalefactor CRC) */ AOT_DABPLUS_AAC_LC = 135, /**< Virtual AOT for DAB plus AAC-LC */ AOT_DABPLUS_SBR = 136, /**< Virtual AOT for DAB plus HE-AAC */ AOT_DABPLUS_PS = 137, /**< Virtual AOT for DAB plus HE-AAC v2 */ AOT_PLAIN_MP1 = 140, /**< Virtual AOT for plain mp1 */ AOT_PLAIN_MP2 = 141, /**< Virtual AOT for plain mp2 */ AOT_PLAIN_MP3 = 142, /**< Virtual AOT for plain mp3 */ AOT_DRM_AAC = 143, /**< Virtual AOT for DRM (ER-AAC-SCAL without SBR) */ AOT_DRM_SBR = 144, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR) */ AOT_DRM_MPEG_PS = 145, /**< Virtual AOT for DRM (ER-AAC-SCAL with SBR and MPEG-PS) */ AOT_DRM_SURROUND = 146, /**< Virtual AOT for DRM Surround (ER-AAC-SCAL (+SBR) +MPS) */ AOT_MP2_PS = 156, /**< Virtual AOT MP2 Low Complexity Profile with SBR and PS */ AOT_MPEGS_RESIDUALS = 256 /**< Virtual AOT for MPEG Surround residuals */ } AUDIO_OBJECT_TYPE; /** Channel Mode ( 1-7 equals MPEG channel configurations, others are arbitrary). */ typedef enum { MODE_INVALID = -1, MODE_UNKNOWN = 0, MODE_1 = 1, /**< C */ MODE_2 = 2, /**< L+R */ MODE_1_2 = 3, /**< C, L+R */ MODE_1_2_1 = 4, /**< C, L+R, Rear */ MODE_1_2_2 = 5, /**< C, L+R, LS+RS */ MODE_1_2_2_1 = 6, /**< C, L+R, LS+RS, LFE */ MODE_1_2_2_2_1 = 7, /**< C, LC+RC, L+R, LS+RS, LFE */ MODE_1_1 = 16, /**< 2 SCEs (dual mono) */ MODE_1_1_1_1 = 17, /**< 4 SCEs */ MODE_1_1_1_1_1_1 = 18, /**< 6 SCEs */ MODE_1_1_1_1_1_1_1_1 = 19, /**< 8 SCEs */ MODE_1_1_1_1_1_1_1_1_1_1_1_1 = 20, /**< 12 SCEs */ MODE_2_2 = 21, /**< 2 CPEs */ MODE_2_2_2 = 22, /**< 3 CPEs */ MODE_2_2_2_2 = 23, /**< 4 CPEs */ MODE_2_2_2_2_2_2 = 24, /**< 6 CPEs */ MODE_2_1 = 30, /**< CPE,SCE (ARIB standard B32) */ MODE_7_1_REAR_SURROUND = 33, /**< C, L+R, LS+RS, Lrear+Rrear, LFE */ MODE_7_1_FRONT_CENTER = 34 /**< C, LC+RC, L+R, LS+RS, LFE */ } CHANNEL_MODE; /** Speaker description tags */ typedef enum { ACT_NONE, ACT_FRONT, ACT_SIDE, ACT_BACK, ACT_LFE, ACT_FRONT_TOP, ACT_SIDE_TOP, ACT_BACK_TOP, ACT_TOP /* Ts */ } AUDIO_CHANNEL_TYPE; typedef enum { SIG_UNKNOWN = -1, SIG_IMPLICIT = 0, SIG_EXPLICIT_BW_COMPATIBLE = 1, SIG_EXPLICIT_HIERARCHICAL = 2 } SBR_PS_SIGNALING; /** * Audio Codec flags. */ #define AC_ER_VCB11 0x000001 /*!< aacSectionDataResilienceFlag flag (from ASC): 1 means use virtual codebooks */ #define AC_ER_RVLC 0x000002 /*!< aacSpectralDataResilienceFlag flag (from ASC): 1 means use huffman codeword reordering */ #define AC_ER_HCR 0x000004 /*!< aacSectionDataResilienceFlag flag (from ASC): 1 means use virtual codebooks */ #define AC_SCALABLE 0x000008 /*!< AAC Scalable*/ #define AC_ELD 0x000010 /*!< AAC-ELD */ #define AC_LD 0x000020 /*!< AAC-LD */ #define AC_ER 0x000040 /*!< ER syntax */ #define AC_BSAC 0x000080 /*!< BSAC */ #define AC_USAC 0x000100 /*!< USAC */ #define AC_USAC_TW 0x000200 /*!< USAC time warped filter bank is active */ #define AC_USAC_NOISE 0x000400 /*!< USAC noise filling is active */ #define AC_USAC_HBE 0x000800 /*!< USAC harmonic bandwidth extension is active */ #define AC_RSVD50 0x001000 /*!< Rsvd50 */ #define AC_SBR_PRESENT 0x002000 /*!< SBR present flag (from ASC) */ #define AC_SBRCRC 0x004000 /*!< SBR CRC present flag. Only relevant for AAC-ELD for now. */ #define AC_PS_PRESENT 0x008000 /*!< PS present flag (from ASC or implicit) */ #define AC_MPS_PRESENT 0x010000 /*!< MPS present flag (from ASC or implicit) */ #define AC_DRM 0x020000 /*!< DRM bit stream syntax */ #define AC_INDEP 0x040000 /*!< Independency flag */ #define AC_MPS_RES 0x080000 /*!< MPS residual individual channel data. */ #define AC_DAB 0x800000 /*!< DAB bit stream syntax */ #define AC_LD_MPS 0x01000000 /*!< Low Delay MPS. */ /* CODER_CONFIG::flags */ #define CC_MPEG_ID 0x00100000 #define CC_IS_BASELAYER 0x00200000 #define CC_PROTECTION 0x00400000 #define CC_SBR 0x00800000 #define CC_SBRCRC 0x00010000 #define CC_RVLC 0x01000000 #define CC_VCB11 0x02000000 #define CC_HCR 0x04000000 #define CC_PSEUDO_SURROUND 0x08000000 #define CC_USAC_NOISE 0x10000000 #define CC_USAC_TW 0x20000000 #define CC_USAC_HBE 0x40000000 /** Generic audio coder configuration structure. */ typedef struct { AUDIO_OBJECT_TYPE aot; /**< Audio Object Type (AOT). */ AUDIO_OBJECT_TYPE extAOT; /**< Extension Audio Object Type (SBR). */ CHANNEL_MODE channelMode; /**< Channel mode. */ INT samplingRate; /**< Sampling rate. */ INT extSamplingRate; /**< Extended samplerate (SBR). */ INT bitRate; /**< Average bitrate. */ int samplesPerFrame; /**< Number of PCM samples per codec frame and audio channel. */ int noChannels; /**< Number of audio channels. */ int bitsFrame; int nSubFrames; /**< Amount of encoder subframes. 1 means no subframing. */ int BSACnumOfSubFrame; /**< The number of the sub-frames which are grouped and transmitted in a super-frame (BSAC). */ int BSAClayerLength; /**< The average length of the large-step layers in bytes (BSAC). */ UINT flags; /**< flags */ UCHAR matrixMixdownA; /**< Matrix mixdown index to put into PCE. Default value 0 means no mixdown coefficient, valid values are 1-4 which correspond to matrix_mixdown_idx 0-3. */ UCHAR headerPeriod; /**< Frame period for sending in band configuration buffers in the transport layer. */ UCHAR stereoConfigIndex; /**< USAC MPS stereo mode */ UCHAR sbrMode; /**< USAC SBR mode */ SBR_PS_SIGNALING sbrSignaling;/**< 0: implicit signaling, 1: backwards compatible explicit signaling, 2: hierarcical explicit signaling */ UCHAR sbrPresent; UCHAR psPresent; } CODER_CONFIG; /** MP4 Element IDs. */ typedef enum { ID_NONE = -1, /**< Invalid Element helper ID. */ ID_SCE = 0, /**< Single Channel Element. */ ID_CPE = 1, /**< Channel Pair Element. */ ID_CCE = 2, /**< Coupling Channel Element. */ ID_LFE = 3, /**< LFE Channel Element. */ ID_DSE = 4, /**< Currently one Data Stream Element for ancillary data is supported. */ ID_PCE = 5, /**< Program Config Element. */ ID_FIL = 6, /**< Fill Element. */ ID_END = 7, /**< Arnie (End Element = Terminator). */ ID_EXT = 8, /**< Extension Payload (ER only). */ ID_SCAL = 9, /**< AAC scalable element (ER only). */ ID_LAST } MP4_ELEMENT_ID; #define IS_CHANNEL_ELEMENT(elementId) \ ((elementId) == ID_SCE \ || (elementId) == ID_CPE \ || (elementId) == ID_LFE) #define EXT_ID_BITS 4 /**< Size in bits of extension payload type tags. */ /** Extension payload types. */ typedef enum { EXT_FIL = 0x00, EXT_FILL_DATA = 0x01, EXT_DATA_ELEMENT = 0x02, EXT_DATA_LENGTH = 0x03, EXT_LDSAC_DATA = 0x09, EXT_SAOC_DATA = 0x0a, EXT_DYNAMIC_RANGE = 0x0b, EXT_SAC_DATA = 0x0c, EXT_SBR_DATA = 0x0d, EXT_SBR_DATA_CRC = 0x0e } EXT_PAYLOAD_TYPE; /** * Proprietary raw packet file configuration data type identifier. */ typedef enum { TC_NOTHING = 0, /* No configuration available -> in-band configuration. */ TC_RAW_ASC, /* Configuration data field is a raw AudioSpecificConfig. */ TC_RAW_SMC, /* Configuration data field is a raw StreamMuxConfig. */ TC_RAW_SDC /* Configuration data field is a raw Drm SDC. */ } TP_CONFIG_TYPE; /* * ############################################################################################## * Library identification and error handling * ############################################################################################## */ /* \cond */ #define MODULE_ID_MASK (0x000000ff) #define MODULE_ID_SHIFT (24) typedef enum { FDK_NONE = 0, FDK_TOOLS = 1, FDK_SYSLIB = 2, FDK_AACDEC = 3, FDK_AACENC = 4, FDK_SBRDEC = 5, FDK_SBRENC = 6, FDK_TPDEC = 7, FDK_TPENC = 8, FDK_MPSDEC = 9, FDK_MPEGFILEREAD = 10, FDK_MPEGFILEWRITE = 11, FDK_MP2DEC = 12, FDK_DABDEC = 13, FDK_DABPARSE = 14, FDK_DRMDEC = 15, FDK_DRMPARSE = 16, FDK_AACLDENC = 17, FDK_MP2ENC = 18, FDK_MP3ENC = 19, FDK_MP3DEC = 20, FDK_MP3HEADPHONE = 21, FDK_MP3SDEC = 22, FDK_MP3SENC = 23, FDK_EAEC = 24, FDK_DABENC = 25, FDK_DMBDEC = 26, FDK_FDREVERB = 27, FDK_DRMENC = 28, FDK_METADATATRANSCODER = 29, FDK_AC3DEC = 30, FDK_PCMDMX = 31, FDK_MODULE_LAST } FDK_MODULE_ID; /* AAC capability flags */ #define CAPF_AAC_LC 0x00000001 /**< Support flag for AAC Low Complexity. */ #define CAPF_ER_AAC_LD 0x00000002 /**< Support flag for AAC Low Delay with Error Resilience tools. */ #define CAPF_ER_AAC_SCAL 0x00000004 /**< Support flag for AAC Scalable. */ #define CAPF_ER_AAC_LC 0x00000008 /**< Support flag for AAC Low Complexity with Error Resilience tools. */ #define CAPF_AAC_480 0x00000010 /**< Support flag for AAC with 480 framelength. */ #define CAPF_AAC_512 0x00000020 /**< Support flag for AAC with 512 framelength. */ #define CAPF_AAC_960 0x00000040 /**< Support flag for AAC with 960 framelength. */ #define CAPF_AAC_1024 0x00000080 /**< Support flag for AAC with 1024 framelength. */ #define CAPF_AAC_HCR 0x00000100 /**< Support flag for AAC with Huffman Codeword Reordering. */ #define CAPF_AAC_VCB11 0x00000200 /**< Support flag for AAC Virtual Codebook 11. */ #define CAPF_AAC_RVLC 0x00000400 /**< Support flag for AAC Reversible Variable Length Coding. */ #define CAPF_AAC_MPEG4 0x00000800 /**< Support flag for MPEG file format. */ #define CAPF_AAC_DRC 0x00001000 /**< Support flag for AAC Dynamic Range Control. */ #define CAPF_AAC_CONCEALMENT 0x00002000 /**< Support flag for AAC concealment. */ #define CAPF_AAC_DRM_BSFORMAT 0x00004000 /**< Support flag for AAC DRM bistream format. */ #define CAPF_ER_AAC_ELD 0x00008000 /**< Support flag for AAC Enhanced Low Delay with Error Resilience tools. */ #define CAPF_ER_AAC_BSAC 0x00010000 /**< Support flag for AAC BSAC. */ #define CAPF_AAC_SUPERFRAMING 0x00020000 /**< Support flag for AAC Superframing. */ /* Transport capability flags */ #define CAPF_ADTS 0x00000001 /**< Support flag for ADTS transport format. */ #define CAPF_ADIF 0x00000002 /**< Support flag for ADIF transport format. */ #define CAPF_LATM 0x00000004 /**< Support flag for LATM transport format. */ #define CAPF_LOAS 0x00000008 /**< Support flag for LOAS transport format. */ #define CAPF_RAWPACKETS 0x00000010 /**< Support flag for RAW PACKETS transport format. */ #define CAPF_DRM 0x00000020 /**< Support flag for DRM/DRM+ transport format. */ #define CAPF_RSVD50 0x00000040 /**< Support flag for RSVD50 transport format */ /* SBR capability flags */ #define CAPF_SBR_LP 0x00000001 /**< Support flag for SBR Low Power mode. */ #define CAPF_SBR_HQ 0x00000002 /**< Support flag for SBR High Quality mode. */ #define CAPF_SBR_DRM_BS 0x00000004 /**< Support flag for */ #define CAPF_SBR_CONCEALMENT 0x00000008 /**< Support flag for SBR concealment. */ #define CAPF_SBR_DRC 0x00000010 /**< Support flag for SBR Dynamic Range Control. */ #define CAPF_SBR_PS_MPEG 0x00000020 /**< Support flag for MPEG Parametric Stereo. */ #define CAPF_SBR_PS_DRM 0x00000040 /**< Support flag for DRM Parametric Stereo. */ /* MP2 encoder capability flags */ #define CAPF_MP2ENC_SS 0x00000001 /**< Support flag for Seamless Switching. */ #define CAPF_MP2ENC_DAB 0x00000002 /**< Support flag for Layer2 DAB. */ /* DAB capability flags */ #define CAPF_DAB_MP2 0x00000001 /**< Support flag for Layer2 DAB. */ #define CAPF_DAB_AAC 0x00000002 /**< Support flag for DAB+ (HE-AAC v2). */ #define CAPF_DAB_PAD 0x00000004 /**< Support flag for PAD extraction. */ #define CAPF_DAB_DRC 0x00000008 /**< Support flag for Dynamic Range Control. */ #define CAPF_DAB_SURROUND 0x00000010 /**< Support flag for DAB Surround (MPS). */ /* DMB capability flags */ #define CAPF_DMB_BSAC 0x00000001 /**< Support flag for ER AAC BSAC. */ #define CAPF_DMB_DRC 0x00000008 /**< Support flag for Dynamic Range Control. */ #define CAPF_DMB_SURROUND 0x00000010 /**< Support flag for DMB Surround (MPS). */ /* PCM up/downmmix capability flags */ #define CAPF_DMX_BLIND 0x00000001 /**< Support flag for blind downmixing. */ #define CAPF_DMX_PCE 0x00000002 /**< Support flag for guided downmix with data from MPEG-2/4 Program Config Elements (PCE). */ #define CAPF_DMX_ARIB 0x00000004 /**< Support flag for PCE guided downmix with slightly different equations and levels to fulfill ARIB standard. */ #define CAPF_DMX_DVB 0x00000008 /**< Support flag for guided downmix with data from DVB ancillary data fields. */ #define CAPF_DMX_CH_EXP 0x00000010 /**< Support flag for simple upmixing by dublicating channels or adding zero channels. */ /* \endcond */ /* * ############################################################################################## * Library versioning * ############################################################################################## */ /** * Convert each member of version numbers to one single numeric version representation. * \param lev0 1st level of version number. * \param lev1 2nd level of version number. * \param lev2 3rd level of version number. */ #define LIB_VERSION(lev0, lev1, lev2) ((lev0<<24 & 0xff000000) | \ (lev1<<16 & 0x00ff0000) | \ (lev2<<8 & 0x0000ff00)) /** * Build text string of version. */ #define LIB_VERSION_STRING(info) FDKsprintf((info)->versionStr, "%d.%d.%d", (((info)->version >> 24) & 0xff), (((info)->version >> 16) & 0xff), (((info)->version >> 8 ) & 0xff)) /** * Library information. */ typedef struct LIB_INFO { const char* title; const char* build_date; const char* build_time; FDK_MODULE_ID module_id; INT version; UINT flags; char versionStr[32]; } LIB_INFO; /** Initialize library info. */ static inline void FDKinitLibInfo( LIB_INFO* info ) { int i; for (i = 0; i < FDK_MODULE_LAST; i++) { info[i].module_id = FDK_NONE; } } /** Aquire supported features of library. */ static inline UINT FDKlibInfo_getCapabilities( const LIB_INFO* info, FDK_MODULE_ID module_id ) { int i; for (i=0; ifp filepointer of type FILE*. * \wavinfo SWavInfo struct where the decoded header info is stored into. * \return 0 on success and non-zero on failure. * */ INT WAV_InputOpen (HANDLE_WAV *pWav, const char *filename) { HANDLE_WAV wav = (HANDLE_WAV)FDKcalloc(1, sizeof(struct WAV)); INT offset; if (wav == NULL) { FDKprintfErr("WAV_InputOpen(): Unable to allocate WAV struct.\n"); goto error; } wav->fp = FDKfopen(filename, "rb"); if (wav->fp == NULL) { FDKprintfErr("WAV_InputOpen(): Unable to open wav file. %s\n", filename); goto error; } /* read RIFF-chunk */ if (FDKfread(&(wav->header.riffType), 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): couldn't read RIFF_ID\n"); goto error; /* bad error "couldn't read RIFF_ID" */ } if (FDKstrncmp("RIFF", wav->header.riffType, 4)) { FDKprintfErr("WAV_InputOpen(): RIFF descriptor not found.\n") ; goto error; } /* Read RIFF size. Ignored. */ FDKfread_EL(&(wav->header.riffSize), 4, 1, wav->fp); /* read WAVE-chunk */ if (FDKfread(&wav->header.waveType, 1, 4, wav->fp) !=4) { FDKprintfErr("WAV_InputOpen(): couldn't read format\n"); goto error; /* bad error "couldn't read format" */ } if (FDKstrncmp("WAVE", wav->header.waveType, 4)) { FDKprintfErr("WAV_InputOpen(): WAVE chunk ID not found.\n") ; goto error; } /* read format-chunk */ if (FDKfread(&(wav->header.formatType), 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): couldn't read format_ID\n"); goto error; /* bad error "couldn't read format_ID" */ } if (FDKstrncmp("fmt", wav->header.formatType, 3)) { FDKprintfErr("WAV_InputOpen(): fmt chunk format not found.\n") ; goto error; } FDKfread_EL(&wav->header.formatSize, 4, 1, wav->fp); /* should be 16 for PCM-format (uncompressed) */ /* read info */ FDKfread_EL(&(wav->header.compressionCode), 2, 1, wav->fp); FDKfread_EL(&(wav->header.numChannels), 2, 1, wav->fp); FDKfread_EL(&(wav->header.sampleRate), 4, 1, wav->fp); FDKfread_EL(&(wav->header.bytesPerSecond), 4, 1, wav->fp); FDKfread_EL(&(wav->header.blockAlign), 2, 1, wav->fp); FDKfread_EL(&(wav->header.bitsPerSample), 2, 1, wav->fp); offset = wav->header.formatSize - 16; /* Wave format extensible */ if (wav->header.compressionCode == 0xFFFE) { static const UCHAR guidPCM[16] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }; USHORT extraFormatBytes, validBitsPerSample; UCHAR guid[16]; INT i; /* read extra bytes */ FDKfread_EL(&(extraFormatBytes), 2, 1, wav->fp); offset -= 2; if (extraFormatBytes >= 22) { FDKfread_EL(&(validBitsPerSample), 2, 1, wav->fp); FDKfread_EL(&(wav->channelMask), 4, 1, wav->fp); FDKfread_EL(&(guid), 16, 1, wav->fp); /* check for PCM GUID */ for (i = 0; i < 16; i++) if (guid[i] != guidPCM[i]) break; if (i == 16) wav->header.compressionCode = 0x01; offset -= 22; } } /* Skip rest of fmt header if any. */ for (;offset > 0; offset--) { FDKfread(&wav->header.formatSize, 1, 1, wav->fp); } do { /* Read data chunk ID */ if (FDKfread(wav->header.dataType, 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): Unable to read data chunk ID.\n"); FDKfree(wav); goto error; } /* Read chunk length. */ FDKfread_EL(&offset, 4, 1, wav->fp); /* Check for data chunk signature. */ if (FDKstrncmp("data", wav->header.dataType, 4) == 0) { wav->header.dataSize = offset; break; } /* Jump over non data chunk. */ for (;offset > 0; offset--) { FDKfread(&(wav->header.dataSize), 1, 1, wav->fp); } } while (!FDKfeof(wav->fp)); /* return success */ *pWav = wav; return 0; /* Error path */ error: if (wav) { if (wav->fp) { FDKfclose(wav->fp); wav->fp = NULL; } FDKfree(wav); } *pWav = NULL; return -1; } /*! * * \brief Read samples from a WAVEfile. The samples are automatically reorder to the native * host endianess and scaled to full scale of the INT_PCM type, from whatever bps the WAVEfile * had specified in its haader data. * * \wav HANDLE_WAV of the wav file. * \buffer Pointer to store read data. * \numSamples Desired number of samples to read. * \nBits sample size in bits to be used for the buffer * * \return Number of samples actually read. * */ INT WAV_InputRead (HANDLE_WAV wav, void *buffer, UINT numSamples, int nBits) { UINT result = 0 ; UINT i; SCHAR *bptr = (SCHAR*)buffer; LONG *lptr = (LONG*)buffer; SHORT *sptr = (SHORT*)buffer; switch (wav->header.compressionCode) { case 0x01: /* PCM uncompressed */ if (nBits == wav->header.bitsPerSample) { result = FDKfread_EL(buffer, wav->header.bitsPerSample >> 3, numSamples, wav->fp) ; } else { result = 0; for (i=0; iheader.bitsPerSample >> 3, 1, wav->fp) ; /* Move read bits to lower bits of LONG. */ if ( !IS_LITTLE_ENDIAN() && wav->header.bitsPerSample != 24 && wav->header.bitsPerSample < 32) { tmp >>= (32-wav->header.bitsPerSample); } /* Full scale */ if (wav->header.bitsPerSample > nBits) tmp >>= (wav->header.bitsPerSample-nBits); else tmp <<= (nBits-wav->header.bitsPerSample); if (nBits == 8) *bptr++ = (SCHAR) tmp; if (nBits == 16) *sptr++ = (SHORT) tmp; if (nBits == 32) *lptr++ = (LONG) tmp; } } break; case 0x07: /* u-Law compression */ for (i=0; ifp) ; sptr[i] = ulaw2pcm(bptr[i<<1]) ; } break ; default: FDKprintf("WAV_InputRead(): unsupported data-compression!!") ; break ; } return result ; } void WAV_InputClose(HANDLE_WAV *pWav) { HANDLE_WAV wav = *pWav; if (wav != NULL) { if (wav->fp != NULL) { FDKfclose(wav->fp); wav->fp = NULL; } if (wav) { FDKfree(wav); } } *pWav = NULL; } /* conversion of u-law to linear coding */ static INT_PCM ulaw2pcm (UCHAR ulawbyte) { static const INT exp_lut[8] = { 0, 132, 396, 924, 1980, 4092, 8316, 16764 } ; INT sign, exponent, mantissa, sample ; ulawbyte = (UCHAR)~ulawbyte ; sign = (ulawbyte & 0x80) ; exponent = (ulawbyte >> 4) & 0x07 ; mantissa = ulawbyte & 0x0F ; sample = exp_lut[exponent] + (mantissa << (exponent + 3)) ; if (sign != 0) sample = -sample ; return (INT_PCM)sample ; } /************** Writer ***********************/ static UINT LittleEndian32(UINT v) { if (IS_LITTLE_ENDIAN()) return v ; else return (v & 0x000000FF) << 24 | (v & 0x0000FF00) << 8 | (v & 0x00FF0000) >> 8 | (v & 0xFF000000) >> 24; } static SHORT LittleEndian16(SHORT v) { if (IS_LITTLE_ENDIAN()) return v; else return (SHORT)(((v << 8) & 0xFF00) | ((v >> 8) & 0x00FF)); } static USHORT Unpack(USHORT v) { if (IS_LITTLE_ENDIAN()) return v; else return (SHORT)(((v << 8) & 0xFF00) | ((v >> 8) & 0x00FF)); } /** * WAV_OutputOpen * \brief Open WAV output/writer handle * \param pWav pointer to WAV handle to be returned * \param sampleRate desired samplerate of the resulting WAV file * \param numChannels desired number of audio channels of the resulting WAV file * \param bitsPerSample desired number of bits per audio sample of the resulting WAV file * * \return value: 0: ok * -1: error */ INT WAV_OutputOpen(HANDLE_WAV *pWav, const char *outputFilename, INT sampleRate, INT numChannels, INT bitsPerSample) { HANDLE_WAV wav = (HANDLE_WAV)FDKcalloc(1, sizeof(struct WAV)); UINT size = 0; if (wav == NULL) { FDKprintfErr("WAV_OutputOpen(): Unable to allocate WAV struct.\n"); goto bail; } if (bitsPerSample != 16 && bitsPerSample != 24 && bitsPerSample != 32) { FDKprintfErr("WAV_OutputOpen(): Invalid argument (bitsPerSample).\n"); goto bail; } wav->fp = FDKfopen(outputFilename, "wb"); if (wav->fp == NULL) { FDKprintfErr("WAV_OutputOpen(): unable to create file %s\n", outputFilename); goto bail; } FDKstrcpy(wav->header.riffType, "RIFF"); wav->header.riffSize = LittleEndian32(0x7fffffff); /* in case fseek() doesn't work later in WAV_OutputClose() */ FDKstrcpy(wav->header.waveType, "WAVE"); FDKstrcpy(wav->header.formatType, "fmt "); wav->header.formatSize = LittleEndian32(16); wav->header.compressionCode = LittleEndian16(0x01); wav->header.bitsPerSample = LittleEndian16((SHORT)bitsPerSample); wav->header.numChannels = LittleEndian16((SHORT)numChannels); wav->header.blockAlign = LittleEndian16((SHORT)(numChannels * (bitsPerSample >> 3))); wav->header.sampleRate = LittleEndian32(sampleRate); wav->header.bytesPerSecond = LittleEndian32(sampleRate * wav->header.blockAlign); FDKstrcpy(wav->header.dataType, "data"); wav->header.dataSize = LittleEndian32(0x7fffffff - 36); size = sizeof(WAV_HEADER); if (FDKfwrite(&wav->header, 1, size, wav->fp) != size) { FDKprintfErr("WAV_OutputOpen(): error writing to output file %s\n", outputFilename); goto bail; } wav->header.dataSize = wav->header.riffSize = 0; *pWav = wav; return 0; bail: if (wav) { if (wav->fp) { FDKfclose(wav->fp); } FDKfree(wav); } pWav = NULL; return -1; } /** * WAV_OutputWrite * \brief Write data to WAV file asociated to WAV handle * * \param wav handle of wave file * \param sampleBuffer pointer to audio samples, right justified integer values * \param nBufBits size in bits of each audio sample in sampleBuffer * \param nSigBits amount of significant bits of each nBufBits in sampleBuffer * * \return value: 0: ok * -1: error */ INT WAV_OutputWrite(HANDLE_WAV wav, void *sampleBuffer, UINT numberOfSamples, int nBufBits, int nSigBits) { SCHAR *bptr = (SCHAR*)sampleBuffer; SHORT *sptr = (SHORT*)sampleBuffer; LONG *lptr = (LONG*)sampleBuffer; LONG tmp; int bps = Unpack(wav->header.bitsPerSample); UINT i; /* Pack samples if required */ if (bps == nBufBits && bps == nSigBits) { if (FDKfwrite_EL(sampleBuffer, (bps>>3), numberOfSamples, wav->fp) != numberOfSamples) { FDKprintfErr("WAV_OutputWrite(): error: unable to write to file %d\n", wav->fp); return -1; } } else { for (i=0; i>= -shift; else tmp <<= shift; /* Write sample */ result=FDKfwrite_EL(&tmp, bps>>3, 1, wav->fp); if (result <= 0) { FDKprintfErr("WAV_OutputWrite(): error: unable to write to file %d\n", wav->fp); return -1; } } } wav->header.dataSize += (numberOfSamples * (bps>>3)); return 0; } /** * WAV_OutputClose * \brief Close WAV Output handle * \param pWav pointer to WAV handle. *pWav is set to NULL. */ void WAV_OutputClose(HANDLE_WAV *pWav) { HANDLE_WAV wav = *pWav; UINT size = 0; if ( wav == NULL ) { return; } wav->header.dataSize = LittleEndian32(wav->header.dataSize); wav->header.riffSize = LittleEndian32(wav->header.dataSize + 36); if (wav->fp != NULL) { if (FDKfseek(wav->fp, 0, FDKSEEK_SET)) { FDKprintf("WAV_OutputClose(): fseek() failed.\n"); } size = sizeof(WAV_HEADER); if (FDKfwrite(&wav->header.riffType, 1, size, wav->fp) != size) { FDKprintfErr("WAV_OutputClose(): unable to write header\n"); } if (FDKfclose(wav->fp)) { FDKprintfErr("WAV_OutputClose(): unable to close wav file\n"); } wav->fp = NULL; } FDKfree(wav); *pWav = NULL; } fdk-aac-0.1.3/libSYS/src/genericStds.cpp0000644000175000017500000003700212372262205020320 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Description: - Generic memory, stdio, string, etc. function wrappers or builtins. - OS dependant function wrappers. ******************************************************************************/ #define _CRT_SECURE_NO_WARNINGS #include #include "genericStds.h" /* library info */ #define SYS_LIB_VL0 1 #define SYS_LIB_VL1 3 #define SYS_LIB_VL2 4 #define SYS_LIB_TITLE "System Integration Library" #define SYS_LIB_BUILD_DATE __DATE__ #define SYS_LIB_BUILD_TIME __TIME__ #include #include #include #include /*************************************************************** * memory allocation monitoring variables ***************************************************************/ /* Include OS/System specific implementations. */ #if defined(__linux__) /* cppp replaced: elif */ #include "linux/genericStds_linux.cpp" #endif #if !(defined(USE_BUILTIN_STRING_FUNCTIONS) || defined(__SYMBIAN32__)) #include #include #include #ifndef FUNCTION_FDKprintf void FDKprintf( const char* szFmt, ...) { va_list ap; va_start(ap, szFmt); vprintf(szFmt, ap); va_end(ap); #ifdef ARCH_WA_FLUSH_CONSOLE fflush(stdout); #endif } #endif #ifndef FUNCTION_FDKprintfErr void FDKprintfErr( const char* szFmt, ...) { va_list ap; va_start(ap, szFmt); #if defined(ARCH_WA_SLOWCON) vprintf(szFmt, ap); #else vfprintf(stderr, szFmt, ap); #endif va_end(ap); #ifdef ARCH_WA_FLUSH_CONSOLE fflush(stderr); #endif } #endif int FDKgetchar(void) { return getchar(); } INT FDKfprintf(FDKFILE *stream, const char *format, ...) { INT chars = 0; va_list ap; va_start(ap, format); chars += vfprintf((FILE*)stream, format, ap); va_end(ap); return chars; } #ifndef FUNCTION_FDKsprintf INT FDKsprintf(char *str, const char *format, ...) { INT chars = 0; va_list ap; va_start(ap, format); chars += vsprintf(str, format, ap); va_end(ap); return chars; } #endif #else void FDKprintf( const char* szFmt, ...) { /* stub! */; } void FDKprintfErr( const char* szFmt, ...) { /* stub! */; } INT FDKfprintf(FILE *stream, const char *format, ...) { /*stub ! */; } INT FDKsprintf(char *str, const char *format, ...) { /* stub! */; } #endif /************************************************************************************************/ const char *FDKstrchr(const char *s, INT c) { return strchr(s, c); } const char *FDKstrstr(const char *haystack, const char *needle) { return strstr(haystack, needle); } #ifndef FUNCTION_FDKstrcpy char *FDKstrcpy(char *dest, const char *src) { return strcpy(dest, src); } #endif char *FDKstrncpy(char *dest, const char *src, UINT n) { return strncpy(dest, src, n); } /************************************************************************* * DYNAMIC MEMORY management (heap) *************************************************************************/ #ifndef FUNCTION_FDKcalloc void *FDKcalloc (const UINT n, const UINT size) { void* ptr; ptr = calloc(n, size); return ptr; } #endif #ifndef FUNCTION_FDKmalloc void *FDKmalloc (const UINT size) { void* ptr; ptr = malloc(size); return ptr; } #endif #ifndef FUNCTION_FDKfree void FDKfree (void *ptr) { /* FDKprintf("f, heapSize: %d\n", heapSizeCurr); */ free((INT*)ptr); } #endif #ifndef FUNCTION_FDKaalloc void *FDKaalloc(const UINT size, const UINT alignment) { void *addr, *result=NULL; addr = FDKcalloc(1, size + alignment + sizeof(void*)); /* Malloc and clear memory. */ if (addr!=NULL) { result = ALIGN_PTR((unsigned char*)addr + sizeof(void*)); /* Get aligned memory base address. */ *(((void**)result) - 1) = addr; /* Save malloc'ed memory pointer. */ } return result; /* Return aligned address. */ } #endif #ifndef FUNCTION_FDKafree void FDKafree (void *ptr) { void *addr; addr = *(((void**)ptr)-1); /* Get pointer to malloc'ed memory. */ FDKfree(addr); /* Free malloc'ed memory area. */ } #endif #ifndef FUNCTION_FDKcalloc_L /*--------------------------------------------------------------------------* * DATA MEMORY L1/L2 (fallback) *--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------* * FDKcalloc_L *--------------------------------------------------------------------------*/ void *FDKcalloc_L(const UINT dim, const UINT size, MEMORY_SECTION s) { int a_size; if (s == SECT_DATA_EXTERN) goto fallback; a_size = ((dim*size+3)&0xfffffffc); /* force 4 byte alignment (1111 .... 1111 1100) */ //printf("Warning, out of internal memory\n"); fallback: return FDKcalloc(dim, size); } #endif /* FUNCTION_FDKcalloc_L */ #ifndef FUNCTION_FDKfree_L void FDKfree_L (void *p) { FDKfree(p); } #endif /* FUNCTION_FDKfree_L */ #ifndef FUNCTION_FDKaalloc_L void *FDKaalloc_L(const UINT size, const UINT alignment, MEMORY_SECTION s) { void *addr, *result=NULL; addr = FDKcalloc_L(1, size + alignment + sizeof(void*), s); /* Malloc and clear memory. */ if (addr!=NULL) { result = ALIGN_PTR((unsigned char *)addr + sizeof(void*)); /* Get aligned memory base address. */ *(((void**)result) - 1) = addr; /* Save malloc'ed memory pointer. */ } return result; /* Return aligned address. */ } #endif #ifndef FUNCTION_FDKafree_L void FDKafree_L (void *ptr) { void *addr; addr = *(((void**)ptr)-1); /* Get pointer to malloc'ed memory. */ FDKfree_L(addr); /* Free malloc'ed memory area. */ } #endif /*--------------------------------------------------------------------------------------- * FUNCTION: FDKmemcpy * DESCRIPTION: - copies memory from "src" to "dst" with length "size" bytes * - compiled with FDK_DEBUG will give you warnings *---------------------------------------------------------------------------------------*/ void FDKmemcpy(void *dst, const void *src, const UINT size) { /* do the copy */ memcpy(dst, src, size); } void FDKmemmove(void *dst, const void *src, const UINT size) { memmove(dst, src, size); } void FDKmemset(void *memPtr, const INT value, const UINT size) { memset(memPtr, value, size); } void FDKmemclear(void *memPtr, const UINT size) { FDKmemset(memPtr,0,size); } UINT FDKstrlen(const char *s) { return (UINT)strlen(s); } /* Compare function wrappers */ INT FDKmemcmp(const void *s1, const void *s2, const UINT size) { return memcmp(s1, s2, size); } INT FDKstrcmp(const char *s1, const char *s2) { return strcmp(s1, s2); } INT FDKstrncmp(const char *s1, const char *s2, const UINT size) { return strncmp(s1, s2, size); } /* Math function wrappers. Only intended for compatibility, not to be highly optimized. */ INT FDKabs(INT j) { return abs(j); } double FDKfabs(double x) { return fabs(x); } double FDKpow(double x, double y) { return pow(x,y); } double FDKsqrt(double x) { return sqrt(x); } double FDKatan(double x) { return atan(x); } double FDKlog(double x) { return log(x); } double FDKsin(double x) { return sin(x); } double FDKcos(double x) { return cos(x); } double FDKexp(double x) { return exp(x); } double FDKatan2(double y, double x) { return atan2(y, x); } double FDKacos(double x) { return acos(x); } double FDKtan(double x) { return tan(x); } double FDKfloor(double x) { return floor(x); } double FDKceil(double x) { return ceil(x); } INT FDKatoi(const char *nptr) { return atoi(nptr); } long FDKatol(const char *nptr) { return atol(nptr); } float FDKatof(const char *nptr) { return (float)atof(nptr); } /* ==================== FILE I/O ====================== */ #if !defined(FUNCTION_FDKfopen) FDKFILE *FDKfopen(const char *filename, const char *mode) { return fopen(filename, mode); } #endif #if !defined(FUNCTION_FDKfclose) INT FDKfclose(FDKFILE *fp) { return fclose((FILE*)fp);} #endif #if !defined(FUNCTION_FDKfseek) INT FDKfseek(FDKFILE *fp, LONG OFFSET, int WHENCE) { return fseek((FILE*)fp, OFFSET, WHENCE);} #endif #if !defined(FUNCTION_FDKftell) INT FDKftell(FDKFILE *fp) { return ftell((FILE*)fp); } #endif #if !defined(FUNCTION_FDKfflush) INT FDKfflush(FDKFILE *fp) { return fflush((FILE*)fp); } #endif const INT FDKSEEK_SET = SEEK_SET; const INT FDKSEEK_CUR = SEEK_CUR; const INT FDKSEEK_END = SEEK_END; #if !defined(FUNCTION_FDKfwrite) UINT FDKfwrite(void *ptrf, INT size, UINT nmemb, FDKFILE *fp) { return fwrite(ptrf, size, nmemb, (FILE*)fp); } #endif #if !defined(FUNCTION_FDKfread) UINT FDKfread(void *dst, INT size, UINT nmemb, FDKFILE *fp) { return fread(dst, size, nmemb, (FILE*)fp); } #endif #if !defined(FUNCTION_FDKfgets) char* FDKfgets(void *dst, INT size, FDKFILE *fp) { return fgets((char *)dst, size, (FILE*)fp); } #endif #if !defined(FUNCTION_FDKrewind) void FDKrewind(FDKFILE *fp) { FDKfseek((FILE*)fp,0,FDKSEEK_SET); } #endif UINT FDKfwrite_EL(void *ptrf, INT size, UINT nmemb, FDKFILE *fp) { if (IS_LITTLE_ENDIAN()) { FDKfwrite(ptrf, size, nmemb, fp); } else { UINT n; INT s; UCHAR *ptr = (UCHAR*) ptrf; for (n=0; n=0; s--) { //FDKprintf("char = %c\n", (char)*(ptr+s)); FDKfwrite(ptr + s, 1, 1, fp); } ptr = ptr + size; } } return nmemb; } UINT FDKfread_EL(void *dst, INT size, UINT nmemb, FDKFILE *fp) { UINT n, s0, s1, err; UCHAR tmp, *ptr; UCHAR tmp24[3]; /* Enforce alignment of 24 bit data. */ if (size == 3) { ptr = (UCHAR*)dst; err = 0; for (n=0; n 1) { ptr = (UCHAR*)dst; for (n=0; n #endif void FDKprintDisclaimer(void) { FDKprintf( "This program is protected by copyright law and international treaties.\n" \ "Any reproduction or distribution of this program, or any portion\n" \ "of it, may result in severe civil and criminal penalties, and will be\n" \ "prosecuted to the maximum extent possible under law.\n\n"); } fdk-aac-0.1.3/libSYS/src/linux/0000755000175000017500000000000012372262445016505 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSYS/src/linux/audio_linux.cpp0000644000175000017500000001142712372261464021536 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author: Manuel Jander Description: Audio support ******************************************************************************/ fdk-aac-0.1.3/libSYS/src/linux/coresup_linux.cpp0000644000175000017500000001144412372261464022114 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Manuel Jander Description: System support routines ******************************************************************************/ fdk-aac-0.1.3/libSYS/src/linux/uart_linux.cpp0000644000175000017500000001142612372261464021407 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author: Manuel Jander Description: UART support ******************************************************************************/ fdk-aac-0.1.3/libSYS/src/linux/genericStds_linux.cpp0000644000175000017500000002203112372261464022700 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Manuel Jander Description: Linux genericStds (mostly kernel SRAM driver bindings) ******************************************************************************/ /* * NOTE: it makes only sense to enable this if you also have the corresponding * GNU/Linux kernel driver to access fast SRAM. */ #if defined(__arm__) /* || defined(__mips__) */ /** * EABI static linking problem workaround * * These function are normally present in libc.a but * apparently can be linked only statically. * While using C++ (iisisoff) that is a problem, * because it wont work (static global constructors * cause problems with static linked programs). * So the workaround is to include those functions here, * because libSYS.a is linked statically, and libc can be * linked dynamically as usual. * * Add more EABI functions here if you get unresolved * symbols of EABI functions. */ #include #ifdef __cplusplus extern "C" { #endif void __aeabi_memcpy(void *dest, void *src, int size) { memcpy(dest, src, size); } void __aeabi_memcpy4(void *dest, void *src, int size) { memcpy(dest, src, size); } void __aeabi_memmove4(void *dest, void *src, int size) { memmove(dest, src, size); } void __aeabi_memclr(void *ptr, int size) { memset(ptr, 0, size); } void __aeabi_memclr4(void *ptr, int size) { memset(ptr, 0, size); } #ifdef __cplusplus } #endif /* Include Linux kernel config, or set ARCH and processor macros directly */ /* #define CONFIG_ARCH_MXC #define CONFIG_ARCH_MX25 */ #if defined(CONFIG_ARCH_OMAP3) #define KERNEL_SRAM_SIZE 65536 #elif defined(CONFIG_ARCH_MX31) #define KERNEL_SRAM_SIZE 16384 #elif defined(CONFIG_ARCH_MX25) #define KERNEL_SRAM_SIZE 131072 #elif defined(CONFIG_ARCH_MX35) #define KERNEL_SRAM_SIZE 131072 #else #define KERNEL_SRAM_SIZE 0 #endif #if (KERNEL_SRAM_SIZE > 0) #define KERNEL_SCRATCH_SIZE (4096) #define FDK_SCRATCHBUF_SIZE (KERNEL_SCRATCH_SIZE/sizeof(INT)) #define DATA_L1_A_SIZE (KERNEL_SRAM_SIZE-KERNEL_SCRATCH_SIZE) #define RESOURCE_scratchBuffer #define FUNCTION_FDKprolog #define FUNCTION_FDKepilog static unsigned char *L1_DATA_A=NULL; static unsigned char *_a=NULL; #ifdef RESOURCE_scratchBuffer static INT *__scratchBuffer; static unsigned char *__pScratchBuffer = NULL; #endif #ifdef __linux__ #include #include #include #include #include #include static int fd; static inline void * getSram(void) { unsigned long *ptr = NULL; /* Open driver */ fd = open("/dev/sram", 0); if (fd < 0) { printf("Unable to open /dev/sram. Fallback to malloc\n"); /* Signal "no sram driver at use". */ fd = -1; /* Return malloced pointer (fallback) */ return FDKaalloc(KERNEL_SRAM_SIZE, 8); } /* Get memory mapped into CPU (virtual) address space */ ptr = (unsigned long *)mmap(NULL, KERNEL_SRAM_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if(ptr == MAP_FAILED) { printf("Unable to mmap(). Fallback to malloc\n"); /* Give up on the sram driver */ close(fd); /* Signal "no sram driver at use". */ fd = -1; /* Return malloced pointer (fallback) */ ptr = (unsigned long *)FDKaalloc(KERNEL_SRAM_SIZE, 8); } /* Return pointer to sram */ return (void*)ptr; } static inline void freeSram(void* ptr) { /* Check if sram driver is being used. */ if (fd == -1) { FDKafree(ptr); return; } /* Unmap memory */ munmap(ptr, KERNEL_SRAM_SIZE); /* Close driver */ close(fd); return; } #else static inline void * getSram(void) { return FDKaalloc(KERNEL_SRAM_SIZE, 8); } static inline void * freeSram(void* ptr) { FDKafree(ptr); } #endif #ifdef FUNCTION_FDKprolog void FDKprolog(void) { unsigned char *addr = (unsigned char*)getSram(); if (addr == NULL) { printf("SRAM allocation failed ! This is fatal.\n"); exit(-1); } #ifdef RESOURCE_scratchBuffer __scratchBuffer = (INT*) ( addr + (KERNEL_SRAM_SIZE-KERNEL_SCRATCH_SIZE) ); __pScratchBuffer = addr + (KERNEL_SRAM_SIZE); #endif printf("SRAM @ 0x%08x\n", (unsigned int) addr); atexit(FDKepilog); FDKprolog_generic(); } #endif #ifdef FUNCTION_FDKepilog void FDKepilog(void) { /* Because of atexit(), make sure to call this only once */ if (L1_DATA_A != NULL) { freeSram(L1_DATA_A); L1_DATA_A = NULL; FDKepilog_generic(); } } #endif #endif /* KERNEL_SRAM > 0 */ #endif /* ifdef __arm__ */ fdk-aac-0.1.3/libSYS/src/linux/FDK_stackload_linux.cpp0000644000175000017500000001146712372261464023072 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Manuel Jander Description: Stack consumption information gathering. ******************************************************************************/ fdk-aac-0.1.3/libSYS/src/mips/0000755000175000017500000000000012372262445016316 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSYS/src/mips/genericStds_mips.cpp0000644000175000017500000002130412372261464022324 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Manuel Jander Description: ******************************************************************************/ #define RESOURCE_scratchBuffer #define FUNCTION_FDKprolog #define FUNCTION_FDKepilog #define MIPS_VIRTUAL_START (0x80000000) /* value below is defined in simulator config (MipsMemIntf-{24KE,4KE}.cfg) */ #define MIPS_SDE_SCRATCHPAD (0x00058000) //#define MIPS_SRAM_SIZE (32768) #define MIPS_SRAM_SIZE (4096) #define MIPS_SCRATCH_SIZE (4096) #define DATA_L1_A_SIZE (MIPS_SRAM_SIZE-MIPS_SCRATCH_SIZE) #ifdef RESOURCE_scratchBuffer #define FDK_SCRATCHBUF_SIZE 1024 static LONG *___scratchBuffer = NULL; static LONG *__scratchBuffer = NULL; static unsigned char *__pScratchBuffer = NULL; #endif #ifdef __linux__ #include #include #include #include #include #include static int fd; static inline void * getSram(void) { unsigned long *ptr = NULL; /* Open driver */ fd = open("/dev/sram", 0); if (fd < 0) { printf("Unable to access sram. Fallback to malloc\n"); /* Signal "no sram driver at use". */ fd = -1; /* Return malloced pointer (fallback) */ return malloc(MIPS_SRAM_SIZE); } /* Get memory mapped into CPU (virtual) address space */ ptr = (unsigned long *)mmap(NULL, MIPS_SRAM_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if(ptr == MAP_FAILED) { printf("Unable to access sram. Fallback to malloc\n"); /* Give up on the sram driver */ close(fd); /* Signal "no sram driver at use". */ fd = -1; /* Return malloced pointer (fallback) */ ptr = (unsigned long *)malloc(MIPS_SRAM_SIZE); } /* Return pointer to sram */ return (void*)ptr; } static inline void freeSram(void* ptr) { /* Check if sram driver is being used. */ if (fd == -1) { free(ptr); return; } /* Unmap memory */ munmap(ptr, MIPS_SRAM_SIZE); /* Close driver */ close(fd); return; } #elif defined(__SDE_MIPS__) #include #include static int hasISPRAM, hasDSPRAM; static inline void * getSram(void) { void *addr; unsigned int Config; Config = mips_getconfig(); hasISPRAM = (Config >> 24) & 1; hasDSPRAM = (Config >> 23) & 1; FDKprintf("Config ISP/DSP: %d/%d\n", hasISPRAM, hasDSPRAM); if (hasDSPRAM) { long paddr, laddr; FDKprintf("wrong\n"); paddr = MIPS_SDE_SCRATCHPAD; /* Fixed mapping of kseg0: 0x80000000-0x9fffffff virtual => 0x00000000-0x1fffffff physical */ laddr = MIPS_VIRTUAL_START + MIPS_SDE_SCRATCHPAD; addr = (void*)(laddr); } else { FDKprintf("ok\n"); addr = malloc(MIPS_SRAM_SIZE); FDKprintf("addr %d\n", (int)addr); } return addr; } static inline void freeSram(void* ptr) { if (!hasDSPRAM) { free(ptr); } } #else static inline void * getSram(void) { return malloc(MIPS_SRAM_SIZE); } static inline void freeSram(void* ptr) { free(ptr); } #endif #ifdef FUNCTION_FDKprolog void FDKprolog(void) { unsigned char *addr; #ifdef _MIPS_ARCH_MIPS32R2 unsigned status; asm volatile("mfc0 %0, $12, 0;\n" : "=r" (status)); status |= (1 << 24); asm volatile("mtc0 %0, $12, 0;\n" :: "r" (status)); #endif addr = (unsigned char*)getSram(); if (addr == NULL) { FDKprintfErr("SRAM allocation failed ! This is fatal.\n"); exit(-1); } else { FDKprintf("SRAM @ 0x%08x, size = 0x%x\n", (unsigned int) addr, MIPS_SRAM_SIZE); } #ifdef RESOURCE_scratchBuffer ___scratchBuffer = (LONG*)(addr + MIPS_SRAM_SIZE - MIPS_SCRATCH_SIZE); #endif atexit(FDKepilog); FDKprolog_generic(); } #endif #ifdef FUNCTION_FDKepilog void FDKepilog(void) { #ifdef _MIPS_ARCH_MIPS32R2 unsigned status; asm volatile("mfc0 %0, $12, 0;\n" : "=r" (status)); status &= ~(1 << 24); asm volatile("mtc0 %0, $12, 0;\n" :: "r" (status)); #endif FDKepilog_generic(); } #endif #if !defined(__linux__) #define FUNCTION_FDKclock #ifndef MIPS_CPU_CLK #define MIPS_CPU_CLK 100000000 #endif INT FDKclock(void) { INT clk; asm volatile ("mfc0 %0,$9 " : "=r" (clk)); return clk; } #endif /* !defined(__linux__) */ fdk-aac-0.1.3/libSYS/src/cmdl_parser.cpp0000644000175000017500000004053512372261464020354 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Description: command line parser ******************************************************************************/ #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include "cmdl_parser.h" #include "genericStds.h" /************************ interface ************************/ static INT GetArgFromString(INT argc, TEXTCHAR* argv[], TEXTCHAR* search_string, TEXTCHAR type, TEXTCHAR* found_string , INT* switches_used); static void RemoveWhiteSpace(const TEXTCHAR* pReqArgs, TEXTCHAR* Removed); static INT CheckArg(TEXTCHAR* arg, TEXTCHAR* str, UINT numArgs, TEXTCHAR type, TEXTCHAR* current_str); static INT CheckForUnusedSwitches(INT argc, /*TEXTCHAR* argv[],*/ INT* switches_used); static INT ParseString(TEXTCHAR* str, INT*, TEXTCHAR*, TEXTCHAR*); static void GetNumberOfArgs(TEXTCHAR* str, INT* nArgs); static void removeQuotes(char *str) { if (str[0] == '"') { FDKstrcpy(str, str+1); str[FDKstrlen(str)-1] = 0; } } /********************** implementation *********************/ INT IIS_ScanCmdl(INT argc, TEXTCHAR* argv[], const TEXTCHAR* str, ...) { INT i = 0; INT found_and_set = 0; INT nArgs = 0; INT* switches_used = 0; INT* b_str_opt = 0; TEXTCHAR* s_str = 0; TEXTCHAR* c_str_type = 0; TEXTCHAR* str_clean = 0; va_list ap; if (argc == 0 || argc == 1) { FDKprintf("No command line arguments\n"); goto bail; } str_clean = (TEXTCHAR*) FDKcalloc((unsigned int)_tcslen(str), sizeof(TEXTCHAR)); if (str_clean == NULL) { FDKprintf("Error allocating memory line %d, file %s\n", __LINE__, __FILE__); return 0; } RemoveWhiteSpace(str, str_clean ); GetNumberOfArgs(str_clean, &nArgs); b_str_opt = (INT*) FDKcalloc(nArgs, sizeof(INT)); s_str = (TEXTCHAR*) FDKcalloc(nArgs*CMDL_MAX_ARGC, sizeof(TEXTCHAR) ); c_str_type = (TEXTCHAR*) FDKcalloc(nArgs, sizeof(TEXTCHAR)); switches_used = (INT*) FDKcalloc(argc, sizeof(INT)); if (b_str_opt == NULL || s_str == NULL || c_str_type == NULL || switches_used == NULL) { FDKprintf("Error allocating memory line %d, file %s\n", __LINE__, __FILE__); goto bail; } if ( ParseString( str_clean, b_str_opt, s_str, c_str_type )) { goto bail; } va_start(ap, str); for ( i = 0; i < nArgs; i++ ) { TEXTCHAR arg[CMDL_MAX_STRLEN] = {L'\0'}; TEXTCHAR* p_arg = arg; TEXTCHAR* current_str = &(s_str[i*CMDL_MAX_ARGC]); if (GetArgFromString(argc, argv, current_str, c_str_type[i], arg, switches_used ) && !b_str_opt[i] ) { #ifdef _UNICODE _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%ls'.\n" ), current_str); #else _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%s'.\n" ), current_str); #endif found_and_set = 0; goto bail; } if (CheckArg(p_arg, s_str, nArgs, c_str_type[i], current_str)) { goto bail; } switch (c_str_type[i] ) { case 's': { TEXTCHAR* tmp; tmp = va_arg(ap, TEXTCHAR*); if ( arg[0] == '\0' ) break; _tcsncpy( tmp, arg, CMDL_MAX_STRLEN ); /* Remove quotes. Windows Mobile Workaround. */ removeQuotes(tmp); found_and_set++; break; } case 'd': { INT* tmp = va_arg(ap, INT*); if ( arg[0] == '\0' ) break; *tmp = _tcstol(arg, NULL, 0); found_and_set++; break; } case 'c': { char* tmp = va_arg(ap, char*); if ( arg[0] == '\0' ) break; *tmp = *arg; found_and_set++; break; } case 'u': { UCHAR* tmp = va_arg(ap, UCHAR*); if ( arg[0] == '\0' ) break; *tmp = _tstoi(arg); found_and_set++; break; } case 'f': { float* tmp = (float*) va_arg( ap,double*); if ( arg[0] == '\0' ) break; *tmp = (float) _tstof(arg); found_and_set++; break; } case 'y': // support 'data type double' { double* tmp = (double*) va_arg( ap,double*); // use sscanf instead _tstof because of gcc //_tstof(arg,"%lf",tmp); // '%lf' reads as double *tmp = _tstof(arg); // '%lf' reads as double found_and_set++; break; } case '1': { INT* tmp = va_arg( ap, INT*); if ( arg[0] == '\0' ) break; *tmp = 1; found_and_set++; break; } default: FDKprintfErr("Bug: unsupported data identifier \"%c\"\n", c_str_type[i]); break; } } va_end(ap); CheckForUnusedSwitches(argc, /*argv,*/ switches_used); bail: if (b_str_opt) FDKfree(b_str_opt); if (s_str) FDKfree(s_str); if (c_str_type) FDKfree(c_str_type); if (str_clean) FDKfree(str_clean); if (switches_used) FDKfree(switches_used); return found_and_set; } void GetNumberOfArgs(TEXTCHAR* str, INT* nArgs) { UINT i = 0; for ( i = 0; i < _tcslen(str); ++i ) { if ( str[i] == '%') *nArgs+= 1; } } INT ParseString(TEXTCHAR* str, INT* b_str_opt, TEXTCHAR* s_str, TEXTCHAR* c_str_type ) { UINT i = 0; INT argCounter = 0; TEXTCHAR* str_start = 0; TEXTCHAR* str_stop = 0; str_start = str; str_stop = str_start; for ( i = 0; i < _tcslen(str) - 1; ++i ) { if ( str[i] == '%' ) /* We have an Argument */ { if ( argCounter ) { if ( b_str_opt[argCounter-1] ) str_start = str_stop + 3; else str_start = str_stop + 2; } /* Save Argument type */ c_str_type[argCounter] = str[i+1]; if ( *str_start == '(' ) /* Optional Argument */ { b_str_opt[argCounter] = 1; str_start++; } /* Save Argument */ str[i] = '\0'; _tcsncpy(&(s_str[argCounter*CMDL_MAX_ARGC]), str_start, CMDL_MAX_ARGC ); str[i] = '%'; str_stop = &(str[i]); if ( b_str_opt[argCounter] ) { if ( i+2 > ( _tcslen(str) -1 )) { _ftprintf(stderr,_TEXT("\n\nInternal Parser Error: Strlen Problem\n") ); return 1; } if ( str[i+2] != ')' ) { _ftprintf(stderr,_TEXT("\n\nInternal Parser Error: Missing bracket ')'\n") ); return 1; } } argCounter++; } } return 0; } void RemoveWhiteSpace(const TEXTCHAR* pReqArgs, TEXTCHAR* pRemoved) { UINT i = 0; INT k = 0; UINT len = (UINT)_tcslen(pReqArgs); for ( i = 0; i < len; ++i ) { if ( pReqArgs[i] != ' ' ) { pRemoved[k] = pReqArgs[i]; k++; } } } INT GetArgFromString(INT argc, TEXTCHAR* argv[], TEXTCHAR* search_string, TEXTCHAR type, TEXTCHAR* found_string, INT* sw_used ) { INT i = 0; for (i = 1; i < argc; ++i ) { if ( !_tcscmp(search_string, argv[i]) ) /* Strings are equal */ { if ( type == '1' ) /* Switch without argument */ { _tcsncpy( found_string, _TEXT("1"), 1); sw_used[i] = 1; return 0; } if ( i == (argc - 1)) /* We have %s or %d but are finished*/ return 1; if ( _tcslen(argv[i+1]) > CMDL_MAX_STRLEN ) { #ifdef _UNICODE _ftprintf (stderr,_TEXT("Warning: Ignoring argument for switch '%ls'. "), search_string ); #else _ftprintf (stderr,_TEXT("Warning: Ignoring argument for switch '%s'. "), search_string ); #endif _ftprintf (stderr,_TEXT("Argument is too LONG.\n") ); return 1; } else { _tcsncpy( found_string, argv[i+1], CMDL_MAX_STRLEN); sw_used[i] = 1; sw_used[i+1] = 1; return 0; } } } return 1; } INT CheckArg(TEXTCHAR* arg, TEXTCHAR* str, UINT numArgs, TEXTCHAR type, TEXTCHAR* cur_str) { UINT i = 0; /* No argument given-> return */ if (arg[0] == '\0') return 0; /* Check if arg is switch */ for ( i = 0; i < numArgs; ++i ) { if (!_tcscmp(arg, &(str[i*CMDL_MAX_ARGC]))) { #ifdef _UNICODE _ftprintf(stderr, _TEXT("\n\nError: Argument '%ls' for switch '%ls' is not valid \n" ), arg, cur_str ); #else _ftprintf(stderr, _TEXT("\n\nError: Argument '%s' for switch '%s' is not valid \n" ), arg, cur_str ); #endif return 1; } } /* Check if type is %d but a string is given */ for ( i = 0; i < _tcslen(arg); ++i ) { if ( (type == 'd') && !_istdigit(arg[i]) && arg[i] != 'x' && arg[i] != '-') { #ifdef _UNICODE _ftprintf(stderr, _TEXT("\n\nError: Argument '%ls' for switch '%ls' is not a valid number.\n" ), arg, cur_str); #else _ftprintf(stderr, _TEXT("\n\nError: Argument '%s' for switch '%s' is not a valid number.\n" ), arg, cur_str); #endif return 1; } } return 0; } INT CheckForUnusedSwitches(INT argc, /*TEXTCHAR* argv[],*/ INT* switches_used) { INT i = 0; for( i = 1; i < argc; ++i ) { if ( !switches_used[i] ) { ++i; } } return 0; } static char line[CMDL_MAX_STRLEN*CMDL_MAX_ARGC]; static char *argv_ptr[CMDL_MAX_ARGC]; #ifdef CMDFILE_PREFIX static char tmp[256]; /* this array is used to store the prefix and the filepath/name */ #endif int IIS_ProcessCmdlList(const char* param_filename, int (*pFunction)(int, TEXTCHAR**)) { /* static to reduce required stack size */ FDKFILE *config_fp; int argc; char *line_ptr; #ifdef CMDFILE_PREFIX FDKstrcpy(tmp, CMDFILE_PREFIX); FDKstrcpy(tmp+FDKstrlen(CMDFILE_PREFIX), param_filename); /* Open the file with command lines */ config_fp = FDKfopen(tmp, "r"); #else /* Open the file with command lines */ config_fp = FDKfopen(param_filename, "r"); #endif if(config_fp == NULL) { #ifdef CMDFILE_PREFIX FDKprintf("\ncould not open config file %s", tmp); #else FDKprintf("\ncould not open config file %s", param_filename); #endif return 1; } /* Obtain a command line from config file */ while (FDKfgets(line, CMDL_MAX_STRLEN*CMDL_MAX_ARGC, config_fp) != NULL) { argc = 1; /* Eat \n */ line_ptr = (char*)FDKstrchr(line, '\n'); if (line_ptr != NULL) *line_ptr = ' '; line_ptr = line; /* Scan the line and put the command line params into argv */ do { /* Skip consecutive blanks. */ while (*line_ptr == ' ' && line_ptr < line+CMDL_MAX_STRLEN) line_ptr++; /* Assign argument. */ argv_ptr[argc] = line_ptr; /* Get pointer to next blank. */ line_ptr = (char*)FDKstrchr(line_ptr, ' '); /* */ if (line_ptr != NULL) { /* Null terminate */ *line_ptr = 0; /* Skip former blank (now null character) */ line_ptr++; /* Advance argument counter */ } argc++; } while ( line_ptr != NULL && argc < CMDL_MAX_ARGC); /* call "would be main()" */ if (argc > 2 && *argv_ptr[1] != '#' && FDKstrlen(argv_ptr[1])>1) { int retval; retval = (*pFunction)(argc, argv_ptr); FDKprintf("main returned %d\n", retval); } } FDKfclose(config_fp); return 0; } fdk-aac-0.1.3/libSYS/src/conv_string.cpp0000644000175000017500000001526212372261464020413 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /************************** Fraunhofer IIS FDK SysLib ********************** Author(s): Description: string conversion functions ******************************************************************************/ #include "genericStds.h" #include "conv_string.h" INT charBuf2HexString(char *string, UCHAR *charBuf, INT charBufLength) { INT i; UCHAR c1, c2; /* sanity checks */ /* check array length */ if (charBufLength == 0) { return -1; } /* define hex string Table */ UCHAR hexSymb[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; /* calculate corresponding hex string from charBuffer */ for (i=0;i>4)&0x0f; /* upper nibble */ c2 = (charBuf[i])&0x0f; /* lower nibble */ string[i*2] = hexSymb[c1]; /* convert to string */ string[i*2+1] = hexSymb[c2]; /* convert to string */ } /* terminate string */ string[charBufLength<<1]='\0'; return 0; } INT hexString2CharBuf(const char *string, UCHAR *charBuf, UINT charBufLength) { UINT i, k = 0; UCHAR hNibble, lNibble; /* sanity checks */ if (string[0] == '\0') { return -1; /* invalid string size */ } if (charBufLength<=0){ return -2; /* invalid buffer size */ } /* convert to hex characters to corresponding 8bit value */ for (i=0;(string[i]!='\0')&&((i>>1)>1; hNibble = hexChar2Dec(string[i]); lNibble = hexChar2Dec(string[i+1]); if ((hNibble == 16) || (lNibble == 16)) { return -3; /* invalid character */ } charBuf[k] = ((hNibble<<4)&0xf0) + lNibble; } /* check if last character was string terminator */ if ((string[i-2]!=0) && (string[i]!=0)) { return -1; /* invalid string size */ } /* fill charBuffer with zeros */ for (i=k+1;i= '0') && (c <= '9')) r = c-'0'; else if ((c >= 'a') && (c <= 'f')) r = c-'a'+10; else if ((c >= 'A') && (c <= 'F')) r = c-'A'+10; else r = 16; /* invalid hex character */ return (UCHAR)r; } fdk-aac-0.1.3/aclocal.m40000644000175000017500000012213412372262352015252 0ustar00tootstoots00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) fdk-aac-0.1.3/fdk-aac.sym0000644000175000017500000000051512144411136015421 0ustar00tootstoots00000000000000aacDecoder_AncDataGet aacDecoder_AncDataInit aacDecoder_Close aacDecoder_ConfigRaw aacDecoder_DecodeFrame aacDecoder_Fill aacDecoder_GetFreeBytes aacDecoder_GetLibInfo aacDecoder_GetStreamInfo aacDecoder_Open aacDecoder_SetParam aacEncClose aacEncEncode aacEncGetLibInfo aacEncInfo aacEncOpen aacEncoder_GetParam aacEncoder_SetParam fdk-aac-0.1.3/libSBRenc/0000755000175000017500000000000012372262442015212 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRenc/include/0000755000175000017500000000000012372262445016640 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRenc/include/sbr_encoder.h0000644000175000017500000004310412372261464021300 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS *********************** Author(s): Description: SBR encoder top level processing prototype ******************************************************************************/ #ifndef __SBR_ENCODER_H #define __SBR_ENCODER_H #include "common_fix.h" #include "FDK_audio.h" #include "FDK_bitstream.h" /* core coder helpers */ #define MAX_TRANS_FAC 8 #define MAX_CODEC_FRAME_RATIO 2 #define MAX_PAYLOAD_SIZE 256 typedef enum codecType { CODEC_AAC=0, CODEC_AACLD=1, CODEC_UNSPECIFIED=99 } CODEC_TYPE; typedef struct { INT bitRate; INT nChannels; INT sampleFreq; INT transFac; INT standardBitrate; } CODEC_PARAM; typedef enum { SBR_MONO, SBR_LEFT_RIGHT, SBR_COUPLING, SBR_SWITCH_LRC } SBR_STEREO_MODE; /* bitstream syntax flags */ enum { SBR_SYNTAX_LOW_DELAY = 0x0001, SBR_SYNTAX_SCALABLE = 0x0002, SBR_SYNTAX_CRC = 0x0004, SBR_SYNTAX_DRM_CRC = 0x0008 }; typedef struct { CODEC_TYPE coreCoder; /*!< LC or ELD */ UINT bitrateFrom; /*!< inclusive */ UINT bitrateTo; /*!< exclusive */ UINT sampleRate; /*!< */ UCHAR numChannels; /*!< */ UCHAR startFreq; /*!< bs_start_freq */ UCHAR startFreqSpeech; /*!< bs_start_freq for speech config flag */ UCHAR stopFreq; /*!< bs_stop_freq */ UCHAR stopFreqSpeech; /*!< bs_stop_freq for speech config flag */ UCHAR numNoiseBands; /*!< */ UCHAR noiseFloorOffset; /*!< */ SCHAR noiseMaxLevel; /*!< */ SBR_STEREO_MODE stereoMode; /*!< */ UCHAR freqScale; /*!< */ } sbrTuningTable_t; typedef struct sbrConfiguration { /* core coder dependent configurations */ CODEC_PARAM codecSettings; /*!< Core coder settings. To be set from core coder. */ INT SendHeaderDataTime; /*!< SBR header send update frequency in ms. */ INT useWaveCoding; /*!< Flag: usage of wavecoding tool. */ INT crcSbr; /*!< Flag: usage of SBR-CRC. */ INT dynBwSupported; /*!< Flag: support for dynamic bandwidth in this combination. */ INT parametricCoding; /*!< Flag: usage of parametric coding tool. */ INT downSampleFactor; /*!< Sampling rate relation between the SBR and the core encoder. */ int freq_res_fixfix[3]; /*!< Frequency resolution of envelopes in frame class FIXFIX 0=1 Env; 1=2 Env; 2=4 Env; */ /* core coder dependent tuning parameters */ INT tran_thr; /*!< SBR transient detector threshold (* 100). */ INT noiseFloorOffset; /*!< Noise floor offset. */ UINT useSpeechConfig; /*!< Flag: adapt tuning parameters according to speech. */ /* core coder independent configurations */ INT sbrFrameSize; /*!< SBR frame size in samples. Will be calculated from core coder settings. */ INT sbr_data_extra; /*!< Flag usage of data extra. */ INT amp_res; /*!< Amplitude resolution. */ INT ana_max_level; /*!< Noise insertion maximum level. */ INT tran_fc; /*!< Transient detector start frequency. */ INT tran_det_mode; /*!< Transient detector mode. */ INT spread; /*!< Flag: usage of SBR spread. */ INT stat; /*!< Flag: usage of static framing. */ INT e; /*!< Number of envelopes when static framing is chosen. */ SBR_STEREO_MODE stereoMode; /*!< SBR stereo mode. */ INT deltaTAcrossFrames; /*!< Flag: allow time-delta coding. */ FIXP_DBL dF_edge_1stEnv; /*!< Extra fraction delta-F coding is allowed to be more expensive. */ FIXP_DBL dF_edge_incr; /*!< Increment dF_edge_1stEnv this much if dT-coding was used this frame. */ INT sbr_invf_mode; /*!< Inverse filtering mode. */ INT sbr_xpos_mode; /*!< Transposer mode. */ INT sbr_xpos_ctrl; /*!< Transposer control. */ INT sbr_xpos_level; /*!< Transposer 3rd order level. */ INT startFreq; /*!< The start frequency table index. */ INT stopFreq; /*!< The stop frequency table index. */ INT useSaPan; /*!< Flag: usage of SAPAN stereo. */ INT dynBwEnabled; /*!< Flag: usage of dynamic bandwidth. */ INT bParametricStereo; /*!< Flag: usage of parametric stereo coding tool. */ /* header_extra1 configuration */ UCHAR freqScale; /*!< Frequency grouping. */ INT alterScale; /*!< Scale resolution. */ INT sbr_noise_bands; /*!< Number of noise bands. */ /* header_extra2 configuration */ INT sbr_limiter_bands; /*!< Number of limiter bands. */ INT sbr_limiter_gains; /*!< Gain of limiter. */ INT sbr_interpol_freq; /*!< Flag: use interpolation in freq. direction. */ INT sbr_smoothing_length; /*!< Flag: choose length 4 or 0 (=on, off). */ UCHAR init_amp_res_FF; } sbrConfiguration, *sbrConfigurationPtr ; typedef struct SBR_CONFIG_DATA { UINT sbrSyntaxFlags; /**< SBR syntax flags derived from AOT. */ INT nChannels; /**< Number of channels. */ INT nSfb[2]; /**< Number of SBR scalefactor bands for LO_RES and HI_RES (?) */ INT num_Master; /**< Number of elements in v_k_master. */ INT sampleFreq; /**< SBR sampling frequency. */ INT frameSize; INT xOverFreq; /**< The SBR start frequency. */ INT dynXOverFreq; /**< Used crossover frequency when dynamic bandwidth is enabled. */ INT noQmfBands; /**< Number of QMF frequency bands. */ INT noQmfSlots; /**< Number of QMF slots. */ UCHAR *freqBandTable[2]; /**< Frequency table for low and hires, only MAX_FREQ_COEFFS/2 +1 coeefs actually needed for lowres. */ UCHAR *v_k_master; /**< Master BandTable where freqBandTable is derived from. */ SBR_STEREO_MODE stereoMode; INT noEnvChannels; /**< Number of envelope channels. */ INT useWaveCoding; /**< Flag indicates whether to use wave coding at all. */ INT useParametricCoding; /**< Flag indicates whether to use para coding at all. */ INT xposCtrlSwitch; /**< Flag indicates whether to switch xpos ctrl on the fly. */ INT switchTransposers; /**< Flag indicates whether to switch xpos on the fly . */ UCHAR initAmpResFF; } SBR_CONFIG_DATA, *HANDLE_SBR_CONFIG_DATA; typedef struct { MP4_ELEMENT_ID elType; INT bitRate; int instanceTag; UCHAR fParametricStereo; UCHAR nChannelsInEl; UCHAR ChannelIndex[2]; } SBR_ELEMENT_INFO; #ifdef __cplusplus extern "C" { #endif typedef struct SBR_ENCODER *HANDLE_SBR_ENCODER; /** * \brief Get the max required input buffer size including delay balancing space * for N audio channels. * \param noChannels Number of audio channels. * \return Max required input buffer size in bytes. */ INT sbrEncoder_GetInBufferSize(int noChannels); INT sbrEncoder_Open( HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, INT nChannels, INT supportPS ); /** * \brief Get closest working bitrate to specified desired * bitrate for a single SBR element. * \param bitRate The desired target bit rate * \param numChannels The amount of audio channels * \param coreSampleRate The sample rate of the core coder * \param aot The current Audio Object Type * \return Closest working bit rate to bitRate value */ UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot); /** * \brief Check whether downsampled SBR single rate is possible * with given audio object type. * \param aot The Audio object type. * \return 0 when downsampled SBR is not possible, * 1 when downsampled SBR is possible. */ UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot); /** * \brief Initialize SBR Encoder instance. * \param phSbrEncoder Pointer to a SBR Encoder instance. * \param elInfo Structure that describes the element/channel arrangement. * \param noElements Amount of elements described in elInfo. * \param inputBuffer Pointer to the encoder audio buffer * \param bandwidth Returns the core audio encoder bandwidth (output) * \param bufferOffset Returns the offset for the audio input data in order to do delay balancing. * \param numChannels Input: Encoder input channels. output: core encoder channels. * \param sampleRate Input: Encoder samplerate. output core encoder samplerate. * \param downSampleFactor Input: Relation between SBR and core coder sampling rate; * \param frameLength Input: Encoder frameLength. output core encoder frameLength. * \param aot Input: Desired AOT. output AOT to be used after parameter checking. * \param delay Input: core encoder delay. Output: total delay because of SBR. * \param transformFactor The core encoder transform factor (blockswitching). * \param headerPeriod Repetition rate of the SBR header: * - (-1) means intern configuration. * - (1-10) corresponds to header repetition rate in frames. * \return 0 on success, and non-zero if failed. */ INT sbrEncoder_Init( HANDLE_SBR_ENCODER hSbrEncoder, SBR_ELEMENT_INFO elInfo[(8)], int noElements, INT_PCM *inputBuffer, INT *coreBandwidth, INT *inputBufferOffset, INT *numChannels, INT *sampleRate, UINT *downSampleFactor, INT *frameLength, AUDIO_OBJECT_TYPE aot, int *delay, int transformFactor, const int headerPeriod, ULONG statesInitFlag ); /** * \brief Do delay line buffers housekeeping. To be called after each encoded audio frame. * \param hEnvEnc SBR Encoder handle. * \param timeBuffer Pointer to the encoder audio buffer. * \return 0 on success, and non-zero if failed. */ INT sbrEncoder_UpdateBuffers(HANDLE_SBR_ENCODER hEnvEnc, INT_PCM *timeBuffer ); /** * \brief Close SBR encoder instance. * \param phEbrEncoder Handle of SBR encoder instance to be closed. * \return void */ void sbrEncoder_Close(HANDLE_SBR_ENCODER *phEbrEncoder); /** * \brief Encode SBR data of one complete audio frame. * \param hEnvEncoder Handle of SBR encoder instance. * \param samples Time samples, always interleaved. * \param timeInStride Channel stride factor of samples buffer. * \param sbrDataBits Size of SBR payload in bits. * \param sbrData SBR payload. * \return 0 on success, and non-zero if failed. */ INT sbrEncoder_EncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, INT_PCM *samples, UINT timeInStride, UINT sbrDataBits[(8)], UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE] ); /** * \brief Write SBR headers of one SBR element. * \param sbrEncoder Handle of the SBR encoder instance. * \param hBs Handle of bit stream handle to write SBR header to. * \param element_index Index of the SBR element which header should be written. * \param fSendHeaders Flag indicating that the SBR encoder should send more headers in the SBR payload or not. * \return void */ void sbrEncoder_GetHeader(HANDLE_SBR_ENCODER sbrEncoder, HANDLE_FDK_BITSTREAM hBs, INT element_index, int fSendHeaders); /** * \brief SBR encoder bitrate estimation. * \param hSbrEncoder SBR encoder handle. * \return Estimated bitrate. */ INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder); /** * \brief Delay between input data and downsampled output data. * \param hSbrEncoder SBR encoder handle. * \return Delay. */ INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder); /** * \brief Get decoder library version info. * \param info Pointer to an allocated LIB_INFO struct, where library info is written to. * \return 0 on sucess. */ INT sbrEncoder_GetLibInfo(LIB_INFO *info); void sbrPrintRAM(void); void sbrPrintROM(void); #ifdef __cplusplus } #endif #endif /* ifndef __SBR_MAIN_H */ fdk-aac-0.1.3/libSBRenc/src/0000755000175000017500000000000012372262445016004 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libSBRenc/src/sbr.h0000644000175000017500000001714612372261464016754 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Main SBR structs definitions */ #ifndef __SBR_H #define __SBR_H #include "fram_gen.h" #include "bit_sbr.h" #include "tran_det.h" #include "code_env.h" #include "env_est.h" #include "cmondata.h" #include "qmf.h" #include "resampler.h" #include "ton_corr.h" /* SBR bitstream delay */ #define DELAY_FRAMES 2 typedef struct SBR_CHANNEL { struct ENV_CHANNEL hEnvChannel; //INT_PCM *pDSOutBuffer; /**< Pointer to downsampled audio output of SBR encoder */ DOWNSAMPLER downSampler; } SBR_CHANNEL; typedef SBR_CHANNEL* HANDLE_SBR_CHANNEL; typedef struct SBR_ELEMENT { HANDLE_SBR_CHANNEL sbrChannel[2]; QMF_FILTER_BANK *hQmfAnalysis[2]; SBR_CONFIG_DATA sbrConfigData; SBR_HEADER_DATA sbrHeaderData; SBR_BITSTREAM_DATA sbrBitstreamData; COMMON_DATA CmonData; INT dynXOverFreqDelay[5]; /**< to delay a frame (I don't like it that much that way - hrc) */ SBR_ELEMENT_INFO elInfo; UCHAR payloadDelayLine[1+DELAY_FRAMES][MAX_PAYLOAD_SIZE]; UINT payloadDelayLineSize[1+DELAY_FRAMES]; /* Sizes in bits */ } SBR_ELEMENT, *HANDLE_SBR_ELEMENT; typedef struct SBR_ENCODER { HANDLE_SBR_ELEMENT sbrElement[(8)]; HANDLE_SBR_CHANNEL pSbrChannel[(8)]; QMF_FILTER_BANK QmfAnalysis[(8)]; DOWNSAMPLER lfeDownSampler; int lfeChIdx; /* -1 default for no lfe, else assign channel index */ int noElements; /* Number of elements */ int nChannels; /* Total channel count across all elements. */ int frameSize; /* SBR framelength. */ int bufferOffset; /* Offset for SBR parameter extraction in time domain input buffer. */ int downsampledOffset; /* Offset of downsampled/mixed output for core encoder. */ int downmixSize; /* Size in samples of downsampled/mixed output for core encoder. */ INT downSampleFactor; /* Sampling rate relation between the SBR and the core encoder. */ int fTimeDomainDownsampling; /* Flag signalling time domain downsampling instead of QMF downsampling. */ int nBitstrDelay; /* Amount of SBR frames to be delayed in bitstream domain. */ INT estimateBitrate; /* estimate bitrate of SBR encoder */ INT inputDataDelay; /* delay caused by downsampler, in/out buffer at sbrEncoder_EncodeFrame */ UCHAR* dynamicRam; UCHAR* pSBRdynamic_RAM; HANDLE_PARAMETRIC_STEREO hParametricStereo; QMF_FILTER_BANK qmfSynthesisPS; /* parameters describing allocation volume of present instance */ INT maxElements; INT maxChannels; INT supportPS; } SBR_ENCODER; #endif /* __SBR_H */ fdk-aac-0.1.3/libSBRenc/src/sbrenc_freq_sca.cpp0000644000175000017500000005276212372261464021643 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief frequency scale \author Tobias Chalupka */ #include "sbrenc_freq_sca.h" #include "sbr_misc.h" #include "genericStds.h" /* StartFreq */ static INT getStartFreq(INT fsCore, const INT start_freq); /* StopFreq */ static INT getStopFreq(INT fsCore, const INT stop_freq); static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor); static void CalcBands(INT * diff, INT start , INT stop , INT num_bands); static INT modifyBands(INT max_band, INT * diff, INT length); static void cumSum(INT start_value, INT* diff, INT length, UCHAR *start_adress); /******************************************************************************* Functionname: FDKsbrEnc_getSbrStartFreqRAW ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ INT FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore) { INT result; if ( startFreq < 0 || startFreq > 15) { return -1; } /* Update startFreq struct */ result = getStartFreq(fsCore, startFreq); result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */ return (result); } /* End FDKsbrEnc_getSbrStartFreqRAW */ /******************************************************************************* Functionname: getSbrStopFreq ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT fsCore) { INT result; if ( stopFreq < 0 || stopFreq > 13) return -1; /* Uppdate stopFreq struct */ result = getStopFreq(fsCore, stopFreq); result = (result*(fsCore>>5)+1)>>1; /* (result*fsSBR/QMFbands+1)>>1; */ return (result); } /* End getSbrStopFreq */ /******************************************************************************* Functionname: getStartFreq ******************************************************************************* Description: Arguments: fsCore - core sampling rate Return: *******************************************************************************/ static INT getStartFreq(INT fsCore, const INT start_freq) { INT k0_min; switch(fsCore){ case 8000: k0_min = 24; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 11025: k0_min = 17; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 12000: k0_min = 16; /* (3000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 16000: k0_min = 16; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 22050: k0_min = 12; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 24000: k0_min = 11; /* (4000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 32000: k0_min = 10; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 44100: k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 48000: k0_min = 7; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ break; case 96000: k0_min = 3; /* (5000 * nQmfChannels / fsSBR ) + 0.5 */ break; default: k0_min=11; /* illegal fs */ } switch (fsCore) { case 8000: { INT v_offset[]= {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; return (k0_min + v_offset[start_freq]); } case 11025: { INT v_offset[]= {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13}; return (k0_min + v_offset[start_freq]); } case 12000: { INT v_offset[]= {-5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; return (k0_min + v_offset[start_freq]); } case 16000: { INT v_offset[]= {-6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16}; return (k0_min + v_offset[start_freq]); } case 22050: case 24000: case 32000: { INT v_offset[]= {-4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20}; return (k0_min + v_offset[start_freq]); } case 44100: case 48000: case 96000: { INT v_offset[]= {-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24}; return (k0_min + v_offset[start_freq]); } default: { INT v_offset[]= {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33}; return (k0_min + v_offset[start_freq]); } } } /* End getStartFreq */ /******************************************************************************* Functionname: getStopFreq ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ static INT getStopFreq(INT fsCore, const INT stop_freq) { INT result,i; INT k1_min; INT v_dstop[13]; INT *v_stop_freq = NULL; INT v_stop_freq_16[14] = {48,49,50,51,52,54,55,56,57,59,60,61,63,64}; INT v_stop_freq_22[14] = {35,37,38,40,42,44,46,48,51,53,56,58,61,64}; INT v_stop_freq_24[14] = {32,34,36,38,40,42,44,46,49,52,55,58,61,64}; INT v_stop_freq_32[14] = {32,34,36,38,40,42,44,46,49,52,55,58,61,64}; INT v_stop_freq_44[14] = {23,25,27,29,32,34,37,40,43,47,51,55,59,64}; INT v_stop_freq_48[14] = {21,23,25,27,30,32,35,38,42,45,49,54,59,64}; INT v_stop_freq_64[14] = {20,22,24,26,29,31,34,37,41,45,49,54,59,64}; INT v_stop_freq_88[14] = {15,17,19,21,23,26,29,33,37,41,46,51,57,64}; INT v_stop_freq_96[14] = {13,15,17,19,21,24,27,31,35,39,44,50,57,64}; INT v_stop_freq_192[14] = {7, 8,10,12,14,16,19,23,27,32,38,46,54,64}; switch(fsCore){ case 8000: k1_min = 48; v_stop_freq =v_stop_freq_16; break; case 11025: k1_min = 35; v_stop_freq =v_stop_freq_22; break; case 12000: k1_min = 32; v_stop_freq =v_stop_freq_24; break; case 16000: k1_min = 32; v_stop_freq =v_stop_freq_32; break; case 22050: k1_min = 23; v_stop_freq =v_stop_freq_44; break; case 24000: k1_min = 21; v_stop_freq =v_stop_freq_48; break; case 32000: k1_min = 20; v_stop_freq =v_stop_freq_64; break; case 44100: k1_min = 15; v_stop_freq =v_stop_freq_88; break; case 48000: k1_min = 13; v_stop_freq =v_stop_freq_96; break; case 96000: k1_min = 7; v_stop_freq =v_stop_freq_192; break; default: k1_min = 21; /* illegal fs */ } /* if no valid core samplingrate is used this loop produces a segfault, because v_stop_freq is not initialized */ /* Ensure increasing bandwidth */ for(i = 0; i <= 12; i++) { v_dstop[i] = v_stop_freq[i+1] - v_stop_freq[i]; } FDKsbrEnc_Shellsort_int(v_dstop, 13); /* Sort bandwidth changes */ result = k1_min; for(i = 0; i < stop_freq; i++) { result = result + v_dstop[i]; } return(result); }/* End getStopFreq */ /******************************************************************************* Functionname: FDKsbrEnc_FindStartAndStopBand ******************************************************************************* Description: Arguments: srSbr SBR sampling freqency srCore AAC core sampling freqency noChannels Number of QMF channels startFreq SBR start frequency in QMF bands stopFreq SBR start frequency in QMF bands *k0 Output parameter *k2 Output parameter Return: Error code (0 is OK) *******************************************************************************/ INT FDKsbrEnc_FindStartAndStopBand( const INT srSbr, const INT srCore, const INT noChannels, const INT startFreq, const INT stopFreq, INT *k0, INT *k2 ) { /* Update startFreq struct */ *k0 = getStartFreq(srCore, startFreq); /* Test if start freq is outside corecoder range */ if( srSbr*noChannels < *k0 * srCore ) { return (1); /* raise the cross-over frequency and/or lower the number of target bands per octave (or lower the sampling frequency) */ } /*Update stopFreq struct */ if ( stopFreq < 14 ) { *k2 = getStopFreq(srCore, stopFreq); } else if( stopFreq == 14 ) { *k2 = 2 * *k0; } else { *k2 = 3 * *k0; } /* limit to Nyqvist */ if (*k2 > noChannels) { *k2 = noChannels; } /* Test for invalid k0 k2 combinations */ if ( (srCore == 22050) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS44100 ) ) return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs=44.1kHz */ if ( (srCore >= 24000) && ( (*k2 - *k0) > MAX_FREQ_COEFFS_FS48000 ) ) return (1); /* Number of bands exceeds valid range of MAX_FREQ_COEFFS for fs>=48kHz */ if ((*k2 - *k0) > MAX_FREQ_COEFFS) return (1);/*Number of bands exceeds valid range of MAX_FREQ_COEFFS */ if ((*k2 - *k0) < 0) return (1);/* Number of bands is negative */ return(0); } /******************************************************************************* Functionname: FDKsbrEnc_UpdateFreqScale ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ INT FDKsbrEnc_UpdateFreqScale( UCHAR *v_k_master, INT *h_num_bands, const INT k0, const INT k2, const INT freqScale, const INT alterScale ) { INT b_p_o = 0; /* bands_per_octave */ FIXP_DBL warp = FL2FXCONST_DBL(0.0f); INT dk = 0; /* Internal variables */ INT k1 = 0, i; INT num_bands0; INT num_bands1; INT diff_tot[MAX_OCTAVE + MAX_SECOND_REGION]; INT *diff0 = diff_tot; INT *diff1 = diff_tot+MAX_OCTAVE; INT k2_achived; INT k2_diff; INT incr = 0; /* Init */ if (freqScale==1) b_p_o = 12; if (freqScale==2) b_p_o = 10; if (freqScale==3) b_p_o = 8; if(freqScale > 0) /*Bark*/ { if(alterScale==0) warp = FL2FXCONST_DBL(0.5f); /* 1.0/(1.0*2.0) */ else warp = FL2FXCONST_DBL(1.0f/2.6f); /* 1.0/(1.3*2.0); */ if(4*k2 >= 9*k0) /*two or more regions (how many times the basis band is copied)*/ { k1=2*k0; num_bands0=numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); num_bands1=numberOfBands(b_p_o, k1, k2, warp); CalcBands(diff0, k0, k1, num_bands0);/*CalcBands1 => diff0 */ FDKsbrEnc_Shellsort_int( diff0, num_bands0);/*SortBands sort diff0 */ if (diff0[0] == 0) /* too wide FB bands for target tuning */ { return (1);/* raise the cross-over frequency and/or lower the number of target bands per octave (or lower the sampling frequency */ } cumSum(k0, diff0, num_bands0, v_k_master); /* cumsum */ CalcBands(diff1, k1, k2, num_bands1); /* CalcBands2 => diff1 */ FDKsbrEnc_Shellsort_int( diff1, num_bands1); /* SortBands sort diff1 */ if(diff0[num_bands0-1] > diff1[0]) /* max(1) > min(2) */ { if(modifyBands(diff0[num_bands0-1],diff1, num_bands1)) return(1); } /* Add 2'nd region */ cumSum(k1, diff1, num_bands1, &v_k_master[num_bands0]); *h_num_bands=num_bands0+num_bands1; /* Output nr of bands */ } else /* one region */ { k1=k2; num_bands0=numberOfBands(b_p_o, k0, k1, FL2FXCONST_DBL(0.5f)); CalcBands(diff0, k0, k1, num_bands0);/* CalcBands1 => diff0 */ FDKsbrEnc_Shellsort_int( diff0, num_bands0); /* SortBands sort diff0 */ if (diff0[0] == 0) /* too wide FB bands for target tuning */ { return (1); /* raise the cross-over frequency and/or lower the number of target bands per octave (or lower the sampling frequency */ } cumSum(k0, diff0, num_bands0, v_k_master);/* cumsum */ *h_num_bands=num_bands0; /* Output nr of bands */ } } else /* Linear mode */ { if (alterScale==0) { dk = 1; num_bands0 = 2 * ((k2 - k0)/2); /* FLOOR to get to few number of bands*/ } else { dk = 2; num_bands0 = 2 * (((k2 - k0)/dk +1)/2); /* ROUND to get closest fit */ } k2_achived = k0 + num_bands0*dk; k2_diff = k2 - k2_achived; for(i=0;i 0) { incr = -1; i = num_bands0-1; } /* Adjust diff vector to get sepc. SBR range */ while (k2_diff != 0) { diff_tot[i] = diff_tot[i] - incr; i = i + incr; k2_diff = k2_diff + incr; } cumSum(k0, diff_tot, num_bands0, v_k_master);/* cumsum */ *h_num_bands=num_bands0; /* Output nr of bands */ } if (*h_num_bands < 1) return(1); /*To small sbr area */ return (0); }/* End FDKsbrEnc_UpdateFreqScale */ static INT numberOfBands(INT b_p_o, INT start, INT stop, FIXP_DBL warp_factor) { INT result=0; /* result = 2* (INT) ( (double)b_p_o * (double)(FDKlog((double)stop/(double)start)/FDKlog((double)2)) * (double)FX_DBL2FL(warp_factor) + 0.5); */ result = ( ( b_p_o * fMult( (CalcLdInt(stop) - CalcLdInt(start)), warp_factor) + (FL2FX_DBL(0.5f)>>LD_DATA_SHIFT) ) >> ((DFRACT_BITS-1)-LD_DATA_SHIFT) ) << 1; /* do not optimize anymore (rounding!!) */ return(result); } static void CalcBands(INT * diff, INT start , INT stop , INT num_bands) { INT i, qb, qe, qtmp; INT previous; INT current; FIXP_DBL base, exp, tmp; previous=start; for(i=1; i<= num_bands; i++) { base = fDivNorm((FIXP_DBL)stop, (FIXP_DBL)start, &qb); exp = fDivNorm((FIXP_DBL)i, (FIXP_DBL)num_bands, &qe); tmp = fPow(base, qb, exp, qe, &qtmp); tmp = fMult(tmp, (FIXP_DBL)(start<<24)); current = (INT)scaleValue(tmp, qtmp-23); current = (current+1) >> 1; /* rounding*/ diff[i-1] = current-previous; previous = current; } }/* End CalcBands */ static void cumSum(INT start_value, INT* diff, INT length, UCHAR *start_adress) { INT i; start_adress[0]=start_value; for(i=1;i<=length;i++) start_adress[i]=start_adress[i-1]+diff[i-1]; } /* End cumSum */ static INT modifyBands(INT max_band_previous, INT * diff, INT length) { INT change=max_band_previous-diff[0]; /* Limit the change so that the last band cannot get narrower than the first one */ if ( change > (diff[length-1] - diff[0]) / 2 ) change = (diff[length-1] - diff[0]) / 2; diff[0] += change; diff[length-1] -= change; FDKsbrEnc_Shellsort_int(diff, length); return(0); }/* End modifyBands */ /******************************************************************************* Functionname: FDKsbrEnc_UpdateHiRes ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ INT FDKsbrEnc_UpdateHiRes( UCHAR *h_hires, INT *num_hires, UCHAR *v_k_master, INT num_master, INT *xover_band ) { INT i; INT max1,max2; if( (v_k_master[*xover_band] > 32 ) || /* v_k_master[*xover_band] > noQMFChannels(dualRate)/divider */ ( *xover_band > num_master ) ) { /* xover_band error, too big for this startFreq. Will be clipped */ /* Calculate maximum value for xover_band */ max1=0; max2=num_master; while( (v_k_master[max1+1] < 32 ) && /* noQMFChannels(dualRate)/divider */ ( (max1+1) < max2) ) { max1++; } *xover_band=max1; } *num_hires = num_master - *xover_band; for(i = *xover_band; i <= num_master; i++) { h_hires[i - *xover_band] = v_k_master[i]; } return (0); }/* End FDKsbrEnc_UpdateHiRes */ /******************************************************************************* Functionname: FDKsbrEnc_UpdateLoRes ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ void FDKsbrEnc_UpdateLoRes(UCHAR * h_lores, INT *num_lores, UCHAR * h_hires, INT num_hires) { INT i; if(num_hires%2 == 0) /* if even number of hires bands */ { *num_lores=num_hires/2; /* Use every second lores=hires[0,2,4...] */ for(i=0;i<=*num_lores;i++) h_lores[i]=h_hires[i*2]; } else /* odd number of hires which means xover is odd */ { *num_lores=(num_hires+1)/2; /* Use lores=hires[0,1,3,5 ...] */ h_lores[0]=h_hires[0]; for(i=1;i<=*num_lores;i++) { h_lores[i]=h_hires[i*2-1]; } } }/* End FDKsbrEnc_UpdateLoRes */ fdk-aac-0.1.3/libSBRenc/src/mh_det.cpp0000644000175000017500000014543212372261464017761 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "mh_det.h" #include "sbr_ram.h" #include "sbr_misc.h" #include "genericStds.h" #define SFM_SHIFT 2 /* Attention: SFM_SCALE depends on SFM_SHIFT */ #define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT) /* 1.0 >> SFM_SHIFT */ /*!< Detector Parameters for AAC core codec. */ static const DETECTOR_PARAMETERS_MH paramsAac = { 9, /*!< deltaTime */ { FL2FXCONST_DBL(20.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldDiffGuide */ FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ FL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ FL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ FL2FXCONST_DBL(0.5f), /*!< decayGuideDiff */ FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ }, 50 /*!< maxComp */ }; /*!< Detector Parameters for AAC LD core codec. */ static const DETECTOR_PARAMETERS_MH paramsAacLd = { 16, /*!< Delta time. */ { FL2FXCONST_DBL(25.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< tresHoldDiffGuide */ FL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ FL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ FL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ FL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ FL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ FL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ FL2FXCONST_DBL(0.2f), /*!< decayGuideDiff */ FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ FL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ FL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ }, 50 /*!< maxComp */ }; /**************************************************************************/ /*! \brief Calculates the difference in tonality between original and SBR for a given time and frequency region. The values for pDiffMapped2Scfb are scaled by RELAXATION \return none. */ /**************************************************************************/ static void diff(FIXP_DBL *RESTRICT pTonalityOrig, FIXP_DBL *pDiffMapped2Scfb, const UCHAR *RESTRICT pFreqBandTable, INT nScfb, SCHAR *indexVector) { UCHAR i, ll, lu, k; FIXP_DBL maxValOrig, maxValSbr, tmp; INT scale; for(i=0; i < nScfb; i++){ ll = pFreqBandTable[i]; lu = pFreqBandTable[i+1]; maxValOrig = FL2FXCONST_DBL(0.0f); maxValSbr = FL2FXCONST_DBL(0.0f); for(k=ll;k= RELAXATION)) { tmp = fDivNorm(maxValOrig, maxValSbr, &scale); pDiffMapped2Scfb[i] = scaleValue(fMult(tmp,RELAXATION_FRACT), fixMax(-(DFRACT_BITS-1),(scale-RELAXATION_SHIFT))); } else { pDiffMapped2Scfb[i] = maxValOrig; } } } /**************************************************************************/ /*! \brief Calculates a flatness measure of the tonality measures. Calculation of the power function and using scalefactor for basis: Using log2: z = (2^k * x)^y; z' = CalcLd(z) = y*CalcLd(x) + y*k; z = CalcInvLd(z'); Using ld64: z = (2^k * x)^y; z' = CalcLd64(z) = y*CalcLd64(x)/64 + y*k/64; z = CalcInvLd64(z'); The values pSfmOrigVec and pSfmSbrVec are scaled by the factor 1/4.0 \return none. */ /**************************************************************************/ static void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, SCHAR *indexVector, FIXP_DBL *pSfmOrigVec, FIXP_DBL *pSfmSbrVec, const UCHAR *pFreqBandTable, INT nSfb) { INT i,j; FIXP_DBL invBands,tmp1,tmp2; INT shiftFac0,shiftFacSum0; INT shiftFac1,shiftFacSum1; FIXP_DBL accu; for(i=0;i>2); pSfmSbrVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); if(lu - ll > 1){ FIXP_DBL amOrig,amTransp,gmOrig,gmTransp,sfmOrig,sfmTransp; invBands = GetInvInt(lu-ll); shiftFacSum0 = 0; shiftFacSum1 = 0; amOrig = amTransp = FL2FXCONST_DBL(0.0f); gmOrig = gmTransp = (FIXP_DBL)MAXVAL_DBL; for(j= ll; j FL2FXCONST_DBL(0.0f)) { tmp1 = CalcLdData(gmOrig); /* CalcLd64(x)/64 */ tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ /* y*k/64 */ accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS-1-8); tmp2 = fMultDiv2(invBands, accu) << (2+1); tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ gmOrig = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ } else { gmOrig = FL2FXCONST_DBL(0.0f); } if (gmTransp > FL2FXCONST_DBL(0.0f)) { tmp1 = CalcLdData(gmTransp); /* CalcLd64(x)/64 */ tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ /* y*k/64 */ accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS-1-8); tmp2 = fMultDiv2(invBands, accu) << (2+1); tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ gmTransp = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ } else { gmTransp = FL2FXCONST_DBL(0.0f); } if ( amOrig != FL2FXCONST_DBL(0.0f) ) pSfmOrigVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmOrig,amOrig,SFM_SCALE); if ( amTransp != FL2FXCONST_DBL(0.0f) ) pSfmSbrVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmTransp,amTransp,SFM_SCALE); } } } /**************************************************************************/ /*! \brief Calculates the input to the missing harmonics detection. \return none. */ /**************************************************************************/ static void calculateDetectorInput(FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Pointer to tonality matrix. */ SCHAR *RESTRICT indexVector, FIXP_DBL **RESTRICT tonalityDiff, FIXP_DBL **RESTRICT pSfmOrig, FIXP_DBL **RESTRICT pSfmSbr, const UCHAR *freqBandTable, INT nSfb, INT noEstPerFrame, INT move) { INT est; /* New estimate. */ for (est=0; est < noEstPerFrame; est++) { diff(pQuotaBuffer[est+move], tonalityDiff[est+move], freqBandTable, nSfb, indexVector); calculateFlatnessMeasure(pQuotaBuffer[est+ move], indexVector, pSfmOrig[est + move], pSfmSbr[est + move], freqBandTable, nSfb); } } /**************************************************************************/ /*! \brief Checks that the detection is not due to a LP filter This function determines if a newly detected missing harmonics is not in fact just a low-pass filtere input signal. If so, the detection is removed. \return none. */ /**************************************************************************/ static void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, UCHAR **RESTRICT pDetectionVectors, INT start, INT stop, INT nSfb, const UCHAR *RESTRICT pFreqBandTable, FIXP_DBL *RESTRICT pNrgVector, THRES_HOLDS mhThresh) { INT i,est; INT maxDerivPos = pFreqBandTable[nSfb]; INT numBands = pFreqBandTable[nSfb]; FIXP_DBL nrgLow,nrgHigh; FIXP_DBL nrgLD64,nrgLowLD64,nrgHighLD64,nrgDiffLD64; FIXP_DBL valLD64,maxValLD64,maxValAboveLD64; INT bLPsignal = 0; maxValLD64 = FL2FXCONST_DBL(-1.0f); for(i = numBands - 1 - 2; i > pFreqBandTable[0];i--){ nrgLow = pNrgVector[i]; nrgHigh = pNrgVector[i + 2]; if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ nrgLowLD64 = CalcLdData(nrgLow>>1); nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); valLD64 = nrgDiffLD64-nrgLowLD64; if(valLD64 > maxValLD64){ maxDerivPos = i; maxValLD64 = valLD64; } if(maxValLD64 > mhThresh.derivThresMaxLD64) { break; } } } /* Find the largest "gradient" above. (should be relatively flat, hence we expect a low value if the signal is LP.*/ maxValAboveLD64 = FL2FXCONST_DBL(-1.0f); for(i = numBands - 1 - 2; i > maxDerivPos + 2;i--){ nrgLow = pNrgVector[i]; nrgHigh = pNrgVector[i + 2]; if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ nrgLowLD64 = CalcLdData(nrgLow>>1); nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); valLD64 = nrgDiffLD64-nrgLowLD64; if(valLD64 > maxValAboveLD64){ maxValAboveLD64 = valLD64; } } else { if(nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow){ nrgHighLD64 = CalcLdData(nrgHigh>>1); nrgDiffLD64 = CalcLdData((nrgHigh>>1)-(nrgLow>>1)); valLD64 = nrgDiffLD64-nrgHighLD64; if(valLD64 > maxValAboveLD64){ maxValAboveLD64 = valLD64; } } } } if(maxValLD64 > mhThresh.derivThresMaxLD64 && maxValAboveLD64 < mhThresh.derivThresAboveLD64){ bLPsignal = 1; for(i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0 ; i--){ if(pNrgVector[i] != FL2FXCONST_DBL(0.0f) && pNrgVector[i] > pNrgVector[maxDerivPos + 2]){ nrgDiffLD64 = CalcLdData((pNrgVector[i]>>1)-(pNrgVector[maxDerivPos + 2]>>1)); nrgLD64 = CalcLdData(pNrgVector[i]>>1); valLD64 = nrgDiffLD64-nrgLD64; if(valLD64 < mhThresh.derivThresBelowLD64) { bLPsignal = 0; break; } } else{ bLPsignal = 0; break; } } } if(bLPsignal){ for(i=0;i= pFreqBandTable[i] && maxDerivPos < pFreqBandTable[i+1]) break; } if(pAddHarmSfb[i]){ pAddHarmSfb[i] = 0; for(est = start; est < stop ; est++){ pDetectionVectors[est][i] = 0; } } } } /**************************************************************************/ /*! \brief Checks if it is allowed to detect a missing tone, that wasn't detected previously. \return newDetectionAllowed flag. */ /**************************************************************************/ static INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, INT *pDetectionStartPos, INT noEstPerFrame, INT prevTransientFrame, INT prevTransientPos, INT prevTransientFlag, INT transientPosOffset, INT transientFlag, INT transientPos, INT deltaTime, HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) { INT transientFrame, newDetectionAllowed; /* Determine if this is a frame where a transient starts... * If the transient flag was set the previous frame but not the * transient frame flag, the transient frame flag is set in the current frame. *****************************************************************************/ transientFrame = 0; if(transientFlag){ if(transientPos + transientPosOffset < pFrameInfo->borders[pFrameInfo->nEnvelopes]) transientFrame = 1; if(noEstPerFrame > 1){ if(transientPos + transientPosOffset > h_sbrMissingHarmonicsDetector->timeSlots >> 1){ *pDetectionStartPos = noEstPerFrame; } else{ *pDetectionStartPos = noEstPerFrame >> 1; } } else{ *pDetectionStartPos = noEstPerFrame; } } else{ if(prevTransientFlag && !prevTransientFrame){ transientFrame = 1; *pDetectionStartPos = 0; } } /* * Determine if detection of new missing harmonics are allowed. * If the frame contains a transient it's ok. If the previous * frame contained a transient it needs to be sufficiently close * to the start of the current frame. ****************************************************************/ newDetectionAllowed = 0; if(transientFrame){ newDetectionAllowed = 1; } else { if(prevTransientFrame && fixp_abs(pFrameInfo->borders[0] - (prevTransientPos + transientPosOffset - h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) newDetectionAllowed = 1; *pDetectionStartPos = 0; } h_sbrMissingHarmonicsDetector->previousTransientFlag = transientFlag; h_sbrMissingHarmonicsDetector->previousTransientFrame = transientFrame; h_sbrMissingHarmonicsDetector->previousTransientPos = transientPos; return (newDetectionAllowed); } /**************************************************************************/ /*! \brief Cleans up the detection after a transient. \return none. */ /**************************************************************************/ static void transientCleanUp(FIXP_DBL **quotaBuffer, INT nSfb, UCHAR **detectionVectors, UCHAR *pAddHarmSfb, UCHAR *pPrevAddHarmSfb, INT ** signBuffer, const UCHAR *pFreqBandTable, INT start, INT stop, INT newDetectionAllowed, FIXP_DBL *pNrgVector, THRES_HOLDS mhThresh) { INT i,j,li, ui,est; for(est=start; est < stop; est++) { for(i=0; i maxVal1){ maxVal1 = quotaBuffer[est][j]; maxPos1 = j; maxPosTime1 = est; } } } li = pFreqBandTable[i+1]; ui = pFreqBandTable[i+2]; /* Find maximum tonality in the the two scf bands.*/ maxPosTime2 = start; maxPos2 = li; maxVal2 = quotaBuffer[start][li]; for(est = start; est < stop; est++){ for(j = li; j maxVal2){ maxVal2 = quotaBuffer[est][j]; maxPos2 = j; maxPosTime2 = est; } } } /* If the maximum values are in adjacent QMF-channels, we need to remove the lowest of the two.*/ if(maxPos2-maxPos1 < 2){ if(pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i+1] == 0){ /* Keep the lower, remove the upper.*/ pAddHarmSfb[i+1] = 0; for(est=start; est maxVal2){ if(signBuffer[maxPosTime1][maxPos2] < 0 && signBuffer[maxPosTime1][maxPos1] > 0){ /* Keep the lower, remove the upper.*/ pAddHarmSfb[i+1] = 0; for(est=start; est 0){ /* Keep the upper, remove the lower.*/ pAddHarmSfb[i] = 0; for(est=start; est 0) pAddHarmSfb[i] = 0; } } } /**************************************************************************/ /*! \brief Do detection for one tonality estimate. \return none. */ /**************************************************************************/ static void detection(FIXP_DBL *quotaBuffer, FIXP_DBL *pDiffVecScfb, INT nSfb, UCHAR *pHarmVec, const UCHAR *pFreqBandTable, FIXP_DBL *sfmOrig, FIXP_DBL *sfmSbr, GUIDE_VECTORS guideVectors, GUIDE_VECTORS newGuideVectors, THRES_HOLDS mhThresh) { INT i,j,ll, lu; FIXP_DBL thresTemp,thresOrig; /* * Do detection on the difference vector, i.e. the difference between * the original and the transposed. *********************************************************************/ for(i=0;i thresTemp){ pHarmVec[i] = 1; newGuideVectors.guideVectorDiff[i] = pDiffVecScfb[i]; } else{ /* If the guide wasn't zero, but the current level is to low, start tracking the decay on the tone in the original rather than the difference.*/ if(guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ guideVectors.guideVectorOrig[i] = mhThresh.thresHoldToneGuide; } } } /* * Trace tones in the original signal that at one point * have been detected because they will be replaced by * multiple tones in the sbr signal. ****************************************************/ for(i=0;i thresOrig){ pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; } } } } /* * Check for multiple sines in the transposed signal, * where there is only one in the original. ****************************************************/ thresOrig = mhThresh.thresHoldTone; for(i=0;i 1){ for(j= ll;j thresOrig && (sfmSbr[i] > mhThresh.sfmThresSbr && sfmOrig[i] < mhThresh.sfmThresOrig)){ pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; } } } else{ if(i < nSfb -1){ ll = pFreqBandTable[i]; if(i>0){ if(quotaBuffer[ll] > mhThresh.thresHoldTone && (pDiffVecScfb[i+1] < mhThresh.invThresHoldTone || pDiffVecScfb[i-1] < mhThresh.invThresHoldTone)){ pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; } } else{ if(quotaBuffer[ll] > mhThresh.thresHoldTone && pDiffVecScfb[i+1] < mhThresh.invThresHoldTone){ pHarmVec[i] = 1; newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; } } } } } } } /**************************************************************************/ /*! \brief Do detection for every tonality estimate, using forward prediction. \return none. */ /**************************************************************************/ static void detectionWithPrediction(FIXP_DBL **quotaBuffer, FIXP_DBL **pDiffVecScfb, INT ** signBuffer, INT nSfb, const UCHAR* pFreqBandTable, FIXP_DBL **sfmOrig, FIXP_DBL **sfmSbr, UCHAR **detectionVectors, UCHAR *pPrevAddHarmSfb, GUIDE_VECTORS *guideVectors, INT noEstPerFrame, INT detectionStart, INT totNoEst, INT newDetectionAllowed, INT *pAddHarmFlag, UCHAR *pAddHarmSfb, FIXP_DBL *pNrgVector, const DETECTOR_PARAMETERS_MH *mhParams) { INT est = 0,i; INT start; FDKmemclear(pAddHarmSfb,nSfb*sizeof(UCHAR)); if(newDetectionAllowed){ if(totNoEst > 1){ start = detectionStart; if (start != 0) { FDKmemcpy(guideVectors[start].guideVectorDiff,guideVectors[0].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); FDKmemcpy(guideVectors[start].guideVectorOrig,guideVectors[0].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); FDKmemclear(guideVectors[start-1].guideVectorDetected,nSfb*sizeof(UCHAR)); } } else{ start = 0; } } else{ start = 0; } for(est = start; est < totNoEst; est++){ /* * Do detection on the current frame using * guide-info from the previous. *******************************************/ if(est > 0){ FDKmemcpy(guideVectors[est].guideVectorDetected,detectionVectors[est-1],nSfb*sizeof(UCHAR)); } FDKmemclear(detectionVectors[est], nSfb*sizeof(UCHAR)); if(est < totNoEst-1){ FDKmemclear(guideVectors[est+1].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); FDKmemclear(guideVectors[est+1].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); FDKmemclear(guideVectors[est+1].guideVectorDetected,nSfb*sizeof(UCHAR)); detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, detectionVectors[est], pFreqBandTable, sfmOrig[est], sfmSbr[est], guideVectors[est], guideVectors[est+1], mhParams->thresHolds); } else{ FDKmemclear(guideVectors[est].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); FDKmemclear(guideVectors[est].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); FDKmemclear(guideVectors[est].guideVectorDetected,nSfb*sizeof(UCHAR)); detection(quotaBuffer[est], pDiffVecScfb[est], nSfb, detectionVectors[est], pFreqBandTable, sfmOrig[est], sfmSbr[est], guideVectors[est], guideVectors[est], mhParams->thresHolds); } } /* Clean up the detection.*/ transientCleanUp(quotaBuffer, nSfb, detectionVectors, pAddHarmSfb, pPrevAddHarmSfb, signBuffer, pFreqBandTable, start, totNoEst, newDetectionAllowed, pNrgVector, mhParams->thresHolds); /* Set flag... */ *pAddHarmFlag = 0; for(i=0; i maxVal){ maxVal = pTonalityMatrix[est][l]; maxPosF = l; maxPosT = est; } } } /* * If the maximum tonality is at the lower border of the * scalefactor band, we check the sign of the adjacent channels * to see if this sine is shared by the lower channel. If so, the * energy of the single sine will be present in two scalefactor bands * in the SBR data, which will cause problems in the decoder, when we * add a sine to just one of the channels. *********************************************************************/ if(maxPosF == ll && scfBand){ if(!pAddHarmSfb[scfBand - 1]) { /* No detection below*/ if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && pSignMatrix[maxPosT][maxPosF] < 0) { /* The comp value is calulated as the tonallity value, i.e we want to reduce the envelope data for this channel with as much as the tonality that is spread from the channel above. (ld64(RELAXATION) = 0.31143075889) */ tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + RELAXATION_LD64); tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ compValue = ((INT)(LONG)tmp) >> 1; /* limit the comp-value*/ if (compValue > maxComp) compValue = maxComp; pEnvComp[scfBand-1] = compValue; } } } /* * Same as above, but for the upper end of the scalefactor-band. ***************************************************************/ if(maxPosF == lu-1 && scfBand+1 < nSfb){ /* Upper border*/ if(!pAddHarmSfb[scfBand + 1]) { if (pSignMatrix[maxPosT][maxPosF] > 0 && pSignMatrix[maxPosT][maxPosF + 1] < 0) { tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + RELAXATION_LD64); tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ compValue = ((INT)(LONG)tmp) >> 1; if (compValue > maxComp) compValue = maxComp; pEnvComp[scfBand+1] = compValue; } } } } } if(newDetectionAllowed == 0){ for(scfBand=0;scfBanddetectionVectors; INT move = h_sbrMHDet->move; INT noEstPerFrame = h_sbrMHDet->noEstPerFrame; INT totNoEst = h_sbrMHDet->totNoEst; INT prevTransientFlag = h_sbrMHDet->previousTransientFlag; INT prevTransientFrame = h_sbrMHDet->previousTransientFrame; INT transientPosOffset = h_sbrMHDet->transientPosOffset; INT prevTransientPos = h_sbrMHDet->previousTransientPos; GUIDE_VECTORS* guideVectors = h_sbrMHDet->guideVectors; INT deltaTime = h_sbrMHDet->mhParams->deltaTime; INT maxComp = h_sbrMHDet->mhParams->maxComp; int est; /* Buffer values. */ FDK_ASSERT(move<=(MAX_NO_OF_ESTIMATES>>1)); FDK_ASSERT(noEstPerFrame<=(MAX_NO_OF_ESTIMATES>>1)); FIXP_DBL *sfmSbr[MAX_NO_OF_ESTIMATES]; FIXP_DBL *sfmOrig[MAX_NO_OF_ESTIMATES]; FIXP_DBL *tonalityDiff[MAX_NO_OF_ESTIMATES]; for (est=0; est < MAX_NO_OF_ESTIMATES/2; est++) { sfmSbr[est] = h_sbrMHDet->sfmSbr[est]; sfmOrig[est] = h_sbrMHDet->sfmOrig[est]; tonalityDiff[est] = h_sbrMHDet->tonalityDiff[est]; } C_ALLOC_SCRATCH_START(scratch_mem, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); FIXP_DBL *scratch = scratch_mem; for (; est < MAX_NO_OF_ESTIMATES; est++) { sfmSbr[est] = scratch; scratch+=MAX_FREQ_COEFFS; sfmOrig[est] = scratch; scratch+=MAX_FREQ_COEFFS; tonalityDiff[est] = scratch; scratch+=MAX_FREQ_COEFFS; } /* Determine if we're allowed to detect "missing harmonics" that wasn't detected before. In order to be allowed to do new detection, there must be a transient in the current frame, or a transient in the previous frame sufficiently close to the current frame. */ newDetectionAllowed = isDetectionOfNewToneAllowed(pFrameInfo, &transientDetStart, noEstPerFrame, prevTransientFrame, prevTransientPos, prevTransientFlag, transientPosOffset, transientFlag, transientPos, deltaTime, h_sbrMHDet); /* Calulate the variables that will be used subsequently for the actual detection */ calculateDetectorInput(pQuotaBuffer, indexVector, tonalityDiff, sfmOrig, sfmSbr, freqBandTable, nSfb, noEstPerFrame, move); /* Do the actual detection using information from previous detections */ detectionWithPrediction(pQuotaBuffer, tonalityDiff, pSignBuffer, nSfb, freqBandTable, sfmOrig, sfmSbr, detectionVectors, h_sbrMHDet->guideScfb, guideVectors, noEstPerFrame, transientDetStart, totNoEst, newDetectionAllowed, pAddHarmonicsFlag, pAddHarmonicsScaleFactorBands, pNrgVector, h_sbrMHDet->mhParams); /* Calculate the comp vector, so that the energy can be compensated for a sine between two QMF-bands. */ calculateCompVector(pAddHarmonicsScaleFactorBands, pQuotaBuffer, pSignBuffer, envelopeCompensation, nSfb, freqBandTable, totNoEst, maxComp, h_sbrMHDet->prevEnvelopeCompensation, newDetectionAllowed); for (est=0; est < move; est++) { FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); } C_ALLOC_SCRATCH_END(scratch, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); } /**************************************************************************/ /*! \brief Initialize an instance of the missing harmonics detector. \return errorCode, noError if OK. */ /**************************************************************************/ INT FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT chan) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; INT i; UCHAR* detectionVectors = GetRam_Sbr_detectionVectors(chan); UCHAR* guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); FIXP_DBL* guideVectorDiff = GetRam_Sbr_guideVectorDiff(chan); FIXP_DBL* guideVectorOrig = GetRam_Sbr_guideVectorOrig(chan); FDKmemclear (hs,sizeof(SBR_MISSING_HARMONICS_DETECTOR)); hs->prevEnvelopeCompensation = GetRam_Sbr_prevEnvelopeCompensation(chan); hs->guideScfb = GetRam_Sbr_guideScfb(chan); for(i=0; iguideVectors[i].guideVectorDiff = guideVectorDiff + (i*MAX_FREQ_COEFFS); hs->guideVectors[i].guideVectorOrig = guideVectorOrig + (i*MAX_FREQ_COEFFS); hs->detectionVectors[i] = detectionVectors + (i*MAX_FREQ_COEFFS); hs->guideVectors[i].guideVectorDetected = guideVectorDetected + (i*MAX_FREQ_COEFFS); } return 0; } /**************************************************************************/ /*! \brief Initialize an instance of the missing harmonics detector. \return errorCode, noError if OK. */ /**************************************************************************/ INT FDKsbrEnc_InitSbrMissingHarmonicsDetector ( HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT sampleFreq, INT frameSize, INT nSfb, INT qmfNoChannels, INT totNoEst, INT move, INT noEstPerFrame, UINT sbrSyntaxFlags ) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; int i; FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { switch(frameSize){ case 1024: case 512: hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; hs->timeSlots = 16; break; case 960: case 480: hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; hs->timeSlots = 15; break; default: return -1; } } else { switch(frameSize){ case 2048: case 1024: hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048; hs->timeSlots = NUMBER_TIME_SLOTS_2048; break; case 1920: case 960: hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920; hs->timeSlots = NUMBER_TIME_SLOTS_1920; break; default: return -1; } } if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { hs->mhParams = ¶msAacLd; } else hs->mhParams = ¶msAac; hs->qmfNoChannels = qmfNoChannels; hs->sampleFreq = sampleFreq; hs->nSfb = nSfb; hs->totNoEst = totNoEst; hs->move = move; hs->noEstPerFrame = noEstPerFrame; for(i=0; iguideVectors[i].guideVectorDiff,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemclear (hs->guideVectors[i].guideVectorOrig,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemclear (hs->detectionVectors[i],sizeof(UCHAR)*MAX_FREQ_COEFFS); FDKmemclear (hs->guideVectors[i].guideVectorDetected,sizeof(UCHAR)*MAX_FREQ_COEFFS); } //for(i=0; itonalityDiff[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemclear (hs->sfmOrig[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); FDKmemclear (hs->sfmSbr[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); } FDKmemclear ( hs->prevEnvelopeCompensation, sizeof(UCHAR)*MAX_FREQ_COEFFS); FDKmemclear ( hs->guideScfb, sizeof(UCHAR)*MAX_FREQ_COEFFS); hs->previousTransientFlag = 0; hs->previousTransientFrame = 0; hs->previousTransientPos = 0; return (0); } /**************************************************************************/ /*! \brief Deletes an instance of the missing harmonics detector. \return none. */ /**************************************************************************/ void FDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) { if (hSbrMHDet) { HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; FreeRam_Sbr_detectionVectors(&hs->detectionVectors[0]); FreeRam_Sbr_guideVectorDetected(&hs->guideVectors[0].guideVectorDetected); FreeRam_Sbr_guideVectorDiff(&hs->guideVectors[0].guideVectorDiff); FreeRam_Sbr_guideVectorOrig(&hs->guideVectors[0].guideVectorOrig); FreeRam_Sbr_prevEnvelopeCompensation(&hs->prevEnvelopeCompensation); FreeRam_Sbr_guideScfb(&hs->guideScfb); } } /**************************************************************************/ /*! \brief Resets an instance of the missing harmonics detector. \return error code, noError if OK. */ /**************************************************************************/ INT FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, INT nSfb) { int i; FIXP_DBL tempGuide[MAX_FREQ_COEFFS]; UCHAR tempGuideInt[MAX_FREQ_COEFFS]; INT nSfbPrev; nSfbPrev = hSbrMissingHarmonicsDetector->nSfb; hSbrMissingHarmonicsDetector->nSfb = nSfb; FDKmemcpy( tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, nSfbPrev * sizeof(UCHAR) ); if ( nSfb > nSfbPrev ) { for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { hSbrMissingHarmonicsDetector->guideScfb[i] = 0; } for ( i = 0; i < nSfbPrev; i++ ) { hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; } } else { for ( i = 0; i < nSfb; i++ ) { hSbrMissingHarmonicsDetector->guideScfb[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; } } FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, nSfbPrev * sizeof(FIXP_DBL) ); if (nSfb > nSfbPrev ) { for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); } for ( i = 0; i < nSfbPrev; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; } } else { for ( i = 0; i < nSfb; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = tempGuide[i + (nSfbPrev-nSfb)]; } } FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, nSfbPrev * sizeof(FIXP_DBL) ); if ( nSfb > nSfbPrev ) { for ( i = 0; i< (nSfb - nSfbPrev); i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); } for ( i = 0; i < nSfbPrev; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; } } else { for ( i = 0; i < nSfb; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = tempGuide[i + (nSfbPrev-nSfb)]; } } FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, nSfbPrev * sizeof(UCHAR) ); if ( nSfb > nSfbPrev ) { for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = 0; } for ( i = 0; i < nSfbPrev; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; } } else { for ( i = 0; i < nSfb; i++ ) { hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; } } FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, nSfbPrev * sizeof(UCHAR) ); if ( nSfb > nSfbPrev ) { for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = 0; } for ( i = 0; i < nSfbPrev; i++ ) { hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; } } else { for ( i = 0; i < nSfb; i++ ) { hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; } } return 0; } fdk-aac-0.1.3/libSBRenc/src/env_est.h0000644000175000017500000002101012372261464017612 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Envelope estimation structs and prototypes */ #ifndef __ENV_EST_H #define __ENV_EST_H #include "sbr_def.h" #include "sbr_encoder.h" /* SBR econfig structs */ #include "ps_main.h" #include "bit_sbr.h" #include "fram_gen.h" #include "tran_det.h" #include "code_env.h" #include "ton_corr.h" typedef struct { FIXP_DBL *rBuffer[QMF_MAX_TIME_SLOTS]; FIXP_DBL *iBuffer[QMF_MAX_TIME_SLOTS]; FIXP_DBL *p_YBuffer; FIXP_DBL *YBuffer[QMF_MAX_TIME_SLOTS]; int YBufferScale[2]; UCHAR envelopeCompensation[MAX_FREQ_COEFFS]; UCHAR pre_transient_info[2]; int YBufferWriteOffset; int YBufferSzShift; int rBufferReadOffset; int no_cols; int no_rows; int start_index; int time_slots; int time_step; } SBR_EXTRACT_ENVELOPE; typedef SBR_EXTRACT_ENVELOPE *HANDLE_SBR_EXTRACT_ENVELOPE; struct ENV_CHANNEL { SBR_TRANSIENT_DETECTOR sbrTransientDetector; SBR_CODE_ENVELOPE sbrCodeEnvelope; SBR_CODE_ENVELOPE sbrCodeNoiseFloor; SBR_EXTRACT_ENVELOPE sbrExtractEnvelope; SBR_ENVELOPE_FRAME SbrEnvFrame; SBR_TON_CORR_EST TonCorr; struct SBR_ENV_DATA encEnvData; int qmfScale; UCHAR fLevelProtect; }; typedef struct ENV_CHANNEL *HANDLE_ENV_CHANNEL; /************ Function Declarations ***************/ INT FDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, INT channel ,INT chInEl ,UCHAR* dynamic_RAM ); INT FDKsbrEnc_InitExtractSbrEnvelope ( HANDLE_SBR_EXTRACT_ENVELOPE hSbr, int no_cols, int no_rows, int start_index, int time_slots, int time_step, int tran_off, ULONG statesInitFlag ,int chInEl ,UCHAR* dynamic_RAM ,UINT sbrSyntaxFlags ); void FDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut); typedef struct { FREQ_RES res[MAX_NUM_NOISE_VALUES]; int maxQuantError; } SBR_FRAME_TEMP_DATA; typedef struct { const SBR_FRAME_INFO *frame_info; FIXP_DBL noiseFloor[MAX_NUM_NOISE_VALUES]; SCHAR sfb_nrg_coupling[MAX_NUM_ENVELOPE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ SCHAR sfb_nrg[MAX_NUM_ENVELOPE_VALUES]; SCHAR noise_level_coupling[MAX_NUM_NOISE_VALUES]; /* only used if stereomode = SWITCH_L_R_C */ SCHAR noise_level[MAX_NUM_NOISE_VALUES]; UCHAR transient_info[3]; UCHAR nEnvelopes; } SBR_ENV_TEMP_DATA; /* * Extract features from QMF data. Afterwards, the QMF data is not required anymore. */ void FDKsbrEnc_extractSbrEnvelope1( HANDLE_SBR_CONFIG_DATA h_con, HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL h_envChan, HANDLE_COMMON_DATA cmonData, SBR_ENV_TEMP_DATA *eData, SBR_FRAME_TEMP_DATA *fData ); /* * Process the previously features extracted by FDKsbrEnc_extractSbrEnvelope1 * and create/encode SBR envelopes. */ void FDKsbrEnc_extractSbrEnvelope2( HANDLE_SBR_CONFIG_DATA h_con, HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL sbrEnvChannel0, HANDLE_ENV_CHANNEL sbrEnvChannel1, HANDLE_COMMON_DATA cmonData, SBR_ENV_TEMP_DATA *eData, SBR_FRAME_TEMP_DATA *fData, int clearOutput ); INT FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr); #endif fdk-aac-0.1.3/libSBRenc/src/fram_gen.cpp0000644000175000017500000020730112372261464020271 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "fram_gen.h" #include "sbr_misc.h" #include "genericStds.h" static const SBR_FRAME_INFO frameInfo1_2048 = { 1, { 0, 16}, {FREQ_RES_HIGH}, 0, 1, {0, 16} }; static const SBR_FRAME_INFO frameInfo2_2048 = { 2, { 0, 8, 16}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 8, 16} }; static const SBR_FRAME_INFO frameInfo4_2048 = { 4, { 0, 4, 8, 12, 16}, {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 8, 16} }; static const SBR_FRAME_INFO frameInfo1_2304 = { 1, { 0, 18}, {FREQ_RES_HIGH}, 0, 1, { 0, 18} }; static const SBR_FRAME_INFO frameInfo2_2304 = { 2, { 0, 9, 18}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 9, 18} }; static const SBR_FRAME_INFO frameInfo4_2304 = { 4, { 0, 5, 9, 14, 18}, {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 9, 18} }; static const SBR_FRAME_INFO frameInfo1_1920 = { 1, { 0, 15}, {FREQ_RES_HIGH}, 0, 1, { 0, 15} }; static const SBR_FRAME_INFO frameInfo2_1920 = { 2, { 0, 8, 15}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 8, 15} }; static const SBR_FRAME_INFO frameInfo4_1920 = { 4, { 0, 4, 8, 12, 15}, {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 8, 15} }; static const SBR_FRAME_INFO frameInfo1_1152 = { 1, { 0, 9}, {FREQ_RES_HIGH}, 0, 1, { 0, 9} }; static const SBR_FRAME_INFO frameInfo2_1152 = { 2, { 0, 5, 9}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 5, 9} }; static const SBR_FRAME_INFO frameInfo4_1152 = { 4, { 0, 2, 5, 7, 9}, {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, { 0, 5, 9} }; /* AACLD frame info */ static const SBR_FRAME_INFO frameInfo1_512LD = { 1, {0, 8}, {FREQ_RES_HIGH}, 0, 1, {0, 8}}; static const SBR_FRAME_INFO frameInfo2_512LD = { 2, {0, 4, 8}, {FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 4, 8}}; static const SBR_FRAME_INFO frameInfo4_512LD = { 4, {0, 2, 4, 6, 8}, {FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}, 0, 2, {0, 4, 8}}; static int calcFillLengthMax (int tranPos, /*!< input : transient position (ref: tran det) */ int numberTimeSlots /*!< input : number of timeslots */ ); static void fillFrameTran (const int *v_tuningSegm, /*!< tuning: desired segment lengths */ const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */ int tran, /*!< input : position of transient */ int *v_bord, /*!< memNew: borders */ int *length_v_bord, /*!< memNew: # borders */ int *v_freq, /*!< memNew: frequency resolutions */ int *length_v_freq, /*!< memNew: # frequency resolutions */ int *bmin, /*!< hlpNew: first mandatory border */ int *bmax /*!< hlpNew: last mandatory border */ ); static void fillFramePre (INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT bmin, INT rest); static void fillFramePost (INT *parts, INT *d, INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT bmax, INT bufferFrameStart, INT numberTimeSlots, INT fmax); static void fillFrameInter (INT *nL, const int *v_tuningSegm, INT *v_bord, INT *length_v_bord, INT bmin, INT *v_freq, INT *length_v_freq, INT *v_bordFollow, INT *length_v_bordFollow, INT *v_freqFollow, INT *length_v_freqFollow, INT i_fillFollow, INT dmin, INT dmax, INT numberTimeSlots); static void calcFrameClass (FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, INT tranFlag, INT *spreadFlag); static void specialCase (INT *spreadFlag, INT allowSpread, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT *parts, INT d); static void calcCmonBorder (INT *i_cmon, INT *i_tran, INT *v_bord, INT *length_v_bord, INT tran, INT bufferFrameStart, INT numberTimeSlots); static void keepForFollowUp (INT *v_bordFollow, INT *length_v_bordFollow, INT *v_freqFollow, INT *length_v_freqFollow, INT *i_tranFollow, INT *i_fillFollow, INT *v_bord, INT *length_v_bord, INT *v_freq, INT i_cmon, INT i_tran, INT parts, INT numberTimeSlots); static void calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass, INT *v_bord, INT length_v_bord, INT *v_freq, INT length_v_freq, INT i_cmon, INT i_tran, INT spreadFlag, INT nL); static void ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid, HANDLE_SBR_FRAME_INFO hFrameInfo, INT freq_res_fixfix); /* table for 8 time slot index */ static const int envelopeTable_8 [8][5] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* borders from left to right side; -1 = not in use */ /*[|T-|------]*/ { 2, 0, 0, 1, -1 }, /*[|-T-|-----]*/ { 2, 0, 0, 2, -1 }, /*[--|T-|----]*/ { 3, 1, 1, 2, 4 }, /*[---|T-|---]*/ { 3, 1, 1, 3, 5 }, /*[----|T-|--]*/ { 3, 1, 1, 4, 6 }, /*[-----|T--|]*/ { 2, 1, 1, 5, -1 }, /*[------|T-|]*/ { 2, 1, 1, 6, -1 }, /*[-------|T|]*/ { 2, 1, 1, 7, -1 }, }; /* table for 16 time slot index */ static const int envelopeTable_16 [16][6] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* length from left to right side; -1 = not in use */ /*[|T---|------------|]*/ { 2, 0, 0, 4, -1, -1}, /*[|-T---|-----------|]*/ { 2, 0, 0, 5, -1, -1}, /*[|--|T---|----------]*/ { 3, 1, 1, 2, 6, -1}, /*[|---|T---|---------]*/ { 3, 1, 1, 3, 7, -1}, /*[|----|T---|--------]*/ { 3, 1, 1, 4, 8, -1}, /*[|-----|T---|-------]*/ { 3, 1, 1, 5, 9, -1}, /*[|------|T---|------]*/ { 3, 1, 1, 6, 10, -1}, /*[|-------|T---|-----]*/ { 3, 1, 1, 7, 11, -1}, /*[|--------|T---|----]*/ { 3, 1, 1, 8, 12, -1}, /*[|---------|T---|---]*/ { 3, 1, 1, 9, 13, -1}, /*[|----------|T---|--]*/ { 3, 1, 1,10, 14, -1}, /*[|-----------|T----|]*/ { 2, 1, 1,11, -1, -1}, /*[|------------|T---|]*/ { 2, 1, 1,12, -1, -1}, /*[|-------------|T--|]*/ { 2, 1, 1,13, -1, -1}, /*[|--------------|T-|]*/ { 2, 1, 1,14, -1, -1}, /*[|---------------|T|]*/ { 2, 1, 1,15, -1, -1}, }; /* table for 15 time slot index */ static const int envelopeTable_15 [15][6] = { /* transientIndex nEnv, tranIdx, shortEnv, border1, border2, ... */ /* length from left to right side; -1 = not in use */ /*[|T---|------------]*/ { 2, 0, 0, 4, -1, -1}, /*[|-T---|-----------]*/ { 2, 0, 0, 5, -1, -1}, /*[|--|T---|---------]*/ { 3, 1, 1, 2, 6, -1}, /*[|---|T---|--------]*/ { 3, 1, 1, 3, 7, -1}, /*[|----|T---|-------]*/ { 3, 1, 1, 4, 8, -1}, /*[|-----|T---|------]*/ { 3, 1, 1, 5, 9, -1}, /*[|------|T---|-----]*/ { 3, 1, 1, 6, 10, -1}, /*[|-------|T---|----]*/ { 3, 1, 1, 7, 11, -1}, /*[|--------|T---|---]*/ { 3, 1, 1, 8, 12, -1}, /*[|---------|T---|--]*/ { 3, 1, 1, 9, 13, -1}, /*[|----------|T----|]*/ { 2, 1, 1,10, -1, -1}, /*[|-----------|T---|]*/ { 2, 1, 1,11, -1, -1}, /*[|------------|T--|]*/ { 2, 1, 1,12, -1, -1}, /*[|-------------|T-|]*/ { 2, 1, 1,13, -1, -1}, /*[|--------------|T|]*/ { 2, 1, 1,14, -1, -1}, }; static const int minFrameTranDistance = 4; static const FREQ_RES freqRes_table_8[] = {FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH}; static const FREQ_RES freqRes_table_16[16] = { /* size of envelope */ /* 0-4 */ FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, FREQ_RES_LOW, /* 5-9 */ FREQ_RES_LOW, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, /* 10-16 */ FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH, FREQ_RES_HIGH }; static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo, HANDLE_SBR_GRID hSbrGrid, int tranPosInternal, int numberTimeSlots ); /*! Functionname: FDKsbrEnc_frameInfoGenerator Description: produces the FRAME_INFO struct for the current frame Arguments: hSbrEnvFrame - pointer to sbr envelope handle v_pre_transient_info - pointer to transient info vector v_transient_info - pointer to previous transient info vector v_tuning - pointer to tuning vector Return: frame_info - pointer to SBR_FRAME_INFO struct *******************************************************************************/ HANDLE_SBR_FRAME_INFO FDKsbrEnc_frameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, UCHAR *v_transient_info, UCHAR *v_transient_info_pre, int ldGrid, const int *v_tuning) { INT numEnv, tranPosInternal=0, bmin=0, bmax=0, parts, d, i_cmon=0, i_tran=0, nL; INT fmax = 0; INT *v_bord = hSbrEnvFrame->v_bord; INT *v_freq = hSbrEnvFrame->v_freq; INT *v_bordFollow = hSbrEnvFrame->v_bordFollow; INT *v_freqFollow = hSbrEnvFrame->v_freqFollow; INT *length_v_bordFollow = &hSbrEnvFrame->length_v_bordFollow; INT *length_v_freqFollow = &hSbrEnvFrame->length_v_freqFollow; INT *length_v_bord = &hSbrEnvFrame->length_v_bord; INT *length_v_freq = &hSbrEnvFrame->length_v_freq; INT *spreadFlag = &hSbrEnvFrame->spreadFlag; INT *i_tranFollow = &hSbrEnvFrame->i_tranFollow; INT *i_fillFollow = &hSbrEnvFrame->i_fillFollow; FRAME_CLASS *frameClassOld = &hSbrEnvFrame->frameClassOld; FRAME_CLASS frameClass = FIXFIX; INT allowSpread = hSbrEnvFrame->allowSpread; INT numEnvStatic = hSbrEnvFrame->numEnvStatic; INT staticFraming = hSbrEnvFrame->staticFraming; INT dmin = hSbrEnvFrame->dmin; INT dmax = hSbrEnvFrame->dmax; INT bufferFrameStart = hSbrEnvFrame->SbrGrid.bufferFrameStart; INT numberTimeSlots = hSbrEnvFrame->SbrGrid.numberTimeSlots; INT frameMiddleSlot = hSbrEnvFrame->frameMiddleSlot; INT tranPos = v_transient_info[0]; INT tranFlag = v_transient_info[1]; const int *v_tuningSegm = v_tuning; const int *v_tuningFreq = v_tuning + 3; hSbrEnvFrame->v_tuningSegm = v_tuningSegm; INT freq_res_fixfix = hSbrEnvFrame->freq_res_fixfix; if (ldGrid) { /* in case there was a transient at the very end of the previous frame, start with a transient envelope */ if(v_transient_info_pre[1] && (numberTimeSlots - v_transient_info_pre[0] < minFrameTranDistance)){ tranFlag = 1; tranPos = 0; } } /* * Synopsis: * * The frame generator creates the time-/frequency-grid for one SBR frame. * Input signals are provided by the transient detector and the frame * splitter (transientDetectNew() & FrameSplitter() in tran_det.c). The * framing is controlled by adjusting tuning parameters stored in * FRAME_GEN_TUNING. The parameter values are dependent on frame lengths * and bitrates, and may in the future be signal dependent. * * The envelope borders are stored for frame generator internal use in * aBorders. The contents of aBorders represent positions along the time * axis given in the figures in fram_gen.h (the "frame-generator" rows). * The unit is "time slot". The figures in fram_gen.h also define the * detection ranges for the transient detector. For every border in * aBorders, there is a corresponding entry in aFreqRes, which defines the * frequency resolution of the envelope following (delimited by) the * border. * * When no transients are present, FIXFIX class frames are used. The * frame splitter decides whether to use one or two envelopes in the * FIXFIX frame. "Sparse transients" (separated by a few frames without * transients) are handeled by [FIXVAR, VARFIX] pairs or (depending on * tuning and transient position relative the nominal frame boundaries) * by [FIXVAR, VARVAR, VARFIX] triples. "Tight transients" (in * consecutive frames) are handeled by [..., VARVAR, VARVAR, ...] * sequences. * * The generator assumes that transients are "sparse", and designs * borders for [FIXVAR, VARFIX] pairs right away, where the first frame * corresponds to the present frame. At the next call of the generator * it is known whether the transient actually is "sparse" or not. If * 'yes', the already calculated VARFIX borders are used. If 'no', new * borders, meeting the requirements of the "tight" transient, are * calculated. * * The generator produces two outputs: A "clear-text bitstream" stored in * SBR_GRID, and a straight-forward representation of the grid stored in * SBR_FRAME_INFO. The former is subsequently converted to the actual * bitstream sbr_grid() (encodeSbrGrid() in bit_sbr.c). The latter is * used by other encoder functions, such as the envelope estimator * (calculateSbrEnvelope() in env_est.c) and the noise floor and missing * harmonics detector (TonCorrParamExtr() in nf_est.c). */ if (staticFraming) { /*-------------------------------------------------------------------------- Ignore transient detector ---------------------------------------------------------------------------*/ frameClass = FIXFIX; numEnv = numEnvStatic; /* {1,2,4,8} */ *frameClassOld = FIXFIX; /* for change to dyn */ hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; hSbrEnvFrame->SbrGrid.frameClass = frameClass; } else { /*-------------------------------------------------------------------------- Calculate frame class to use ---------------------------------------------------------------------------*/ calcFrameClass (&frameClass, frameClassOld, tranFlag, spreadFlag); /* patch for new frame class FIXFIXonly for AAC LD */ if (tranFlag && ldGrid) { frameClass = FIXFIXonly; *frameClassOld = FIXFIX; } /* * every transient is processed below by inserting * * - one border at the onset of the transient * - one or more "decay borders" (after the onset of the transient) * - optionally one "attack border" (before the onset of the transient) * * those borders are referred to as "mandatory borders" and are * defined by the 'segmentLength' array in FRAME_GEN_TUNING * * the frequency resolutions of the corresponding envelopes are * defined by the 'segmentRes' array in FRAME_GEN_TUNING */ /*-------------------------------------------------------------------------- Design frame (or follow-up old design) ---------------------------------------------------------------------------*/ if (tranFlag) { /* Always for FixVar, often but not always for VarVar */ /*-------------------------------------------------------------------------- Design part of T/F-grid around the new transient ---------------------------------------------------------------------------*/ tranPosInternal = frameMiddleSlot + tranPos + bufferFrameStart ; /* FH 00-06-26 */ /* add mandatory borders around transient */ fillFrameTran ( v_tuningSegm, v_tuningFreq, tranPosInternal, v_bord, length_v_bord, v_freq, length_v_freq, &bmin, &bmax ); /* make sure we stay within the maximum SBR frame overlap */ fmax = calcFillLengthMax(tranPos, numberTimeSlots); } switch (frameClass) { case FIXFIXonly: FDK_ASSERT(ldGrid); tranPosInternal = tranPos; generateFixFixOnly ( &(hSbrEnvFrame->SbrFrameInfo), &(hSbrEnvFrame->SbrGrid), tranPosInternal, numberTimeSlots ); return &(hSbrEnvFrame->SbrFrameInfo); case FIXVAR: /*-------------------------------------------------------------------------- Design remaining parts of T/F-grid (assuming next frame is VarFix) ---------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- Fill region before new transient: ---------------------------------------------------------------------------*/ fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, bmin - bufferFrameStart); /* FH 00-06-26 */ /*-------------------------------------------------------------------------- Fill region after new transient: ---------------------------------------------------------------------------*/ fillFramePost (&parts, &d, dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmax, bufferFrameStart, numberTimeSlots, fmax); /*-------------------------------------------------------------------------- Take care of special case: ---------------------------------------------------------------------------*/ if (parts == 1 && d < dmin) /* no fill, short last envelope */ specialCase (spreadFlag, allowSpread, v_bord, length_v_bord, v_freq, length_v_freq, &parts, d); /*-------------------------------------------------------------------------- Calculate common border (split-point) ---------------------------------------------------------------------------*/ calcCmonBorder (&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal, bufferFrameStart, numberTimeSlots); /* FH 00-06-26 */ /*-------------------------------------------------------------------------- Extract data for proper follow-up in next frame ---------------------------------------------------------------------------*/ keepForFollowUp (v_bordFollow, length_v_bordFollow, v_freqFollow, length_v_freqFollow, i_tranFollow, i_fillFollow, v_bord, length_v_bord, v_freq, i_cmon, i_tran, parts, numberTimeSlots); /* FH 00-06-26 */ /*-------------------------------------------------------------------------- Calculate control signal ---------------------------------------------------------------------------*/ calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, v_bord, *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran, *spreadFlag, DC); break; case VARFIX: /*-------------------------------------------------------------------------- Follow-up old transient - calculate control signal ---------------------------------------------------------------------------*/ calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow, *length_v_bordFollow, v_freqFollow, *length_v_freqFollow, DC, *i_tranFollow, *spreadFlag, DC); break; case VARVAR: if (*spreadFlag) { /* spread across three frames */ /*-------------------------------------------------------------------------- Follow-up old transient - calculate control signal ---------------------------------------------------------------------------*/ calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, v_bordFollow, *length_v_bordFollow, v_freqFollow, *length_v_freqFollow, DC, *i_tranFollow, *spreadFlag, DC); *spreadFlag = 0; /*-------------------------------------------------------------------------- Extract data for proper follow-up in next frame ---------------------------------------------------------------------------*/ v_bordFollow[0] = hSbrEnvFrame->SbrGrid.bs_abs_bord_1 - numberTimeSlots; /* FH 00-06-26 */ v_freqFollow[0] = 1; *length_v_bordFollow = 1; *length_v_freqFollow = 1; *i_tranFollow = -DC; *i_fillFollow = -DC; } else { /*-------------------------------------------------------------------------- Design remaining parts of T/F-grid (assuming next frame is VarFix) adapt or fill region before new transient: ---------------------------------------------------------------------------*/ fillFrameInter (&nL, v_tuningSegm, v_bord, length_v_bord, bmin, v_freq, length_v_freq, v_bordFollow, length_v_bordFollow, v_freqFollow, length_v_freqFollow, *i_fillFollow, dmin, dmax, numberTimeSlots); /*-------------------------------------------------------------------------- Fill after transient: ---------------------------------------------------------------------------*/ fillFramePost (&parts, &d, dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmax, bufferFrameStart, numberTimeSlots, fmax); /*-------------------------------------------------------------------------- Take care of special case: ---------------------------------------------------------------------------*/ if (parts == 1 && d < dmin) /*% no fill, short last envelope */ specialCase (spreadFlag, allowSpread, v_bord, length_v_bord, v_freq, length_v_freq, &parts, d); /*-------------------------------------------------------------------------- Calculate common border (split-point) ---------------------------------------------------------------------------*/ calcCmonBorder (&i_cmon, &i_tran, v_bord, length_v_bord, tranPosInternal, bufferFrameStart, numberTimeSlots); /*-------------------------------------------------------------------------- Extract data for proper follow-up in next frame ---------------------------------------------------------------------------*/ keepForFollowUp (v_bordFollow, length_v_bordFollow, v_freqFollow, length_v_freqFollow, i_tranFollow, i_fillFollow, v_bord, length_v_bord, v_freq, i_cmon, i_tran, parts, numberTimeSlots); /*-------------------------------------------------------------------------- Calculate control signal ---------------------------------------------------------------------------*/ calcCtrlSignal (&hSbrEnvFrame->SbrGrid, frameClass, v_bord, *length_v_bord, v_freq, *length_v_freq, i_cmon, i_tran, 0, nL); } break; case FIXFIX: if (tranPos == 0) numEnv = 1; else numEnv = 2; hSbrEnvFrame->SbrGrid.bs_num_env = numEnv; hSbrEnvFrame->SbrGrid.frameClass = frameClass; break; default: FDK_ASSERT(0); } } /*------------------------------------------------------------------------- Convert control signal to frame info struct ---------------------------------------------------------------------------*/ ctrlSignal2FrameInfo (&hSbrEnvFrame->SbrGrid, &hSbrEnvFrame->SbrFrameInfo, freq_res_fixfix); return &hSbrEnvFrame->SbrFrameInfo; } /***************************************************************************/ /*! \brief Gnerates frame info for FIXFIXonly frame class used for low delay version \return nothing ****************************************************************************/ static void generateFixFixOnly ( HANDLE_SBR_FRAME_INFO hSbrFrameInfo, HANDLE_SBR_GRID hSbrGrid, int tranPosInternal, int numberTimeSlots ) { int nEnv, i, k=0, tranIdx; const int *pTable = NULL; const FREQ_RES *freqResTable = NULL; switch (numberTimeSlots) { case 8: pTable = envelopeTable_8[tranPosInternal]; freqResTable = freqRes_table_8; break; case 15: pTable = envelopeTable_15[tranPosInternal]; freqResTable = freqRes_table_16; break; case 16: pTable = envelopeTable_16[tranPosInternal]; freqResTable = freqRes_table_16; break; } /* look number of envolpes in table */ nEnv = pTable[0]; /* look up envolpe distribution in table */ for (i=1; iborders[i] = pTable[i+2]; /* open and close frame border */ hSbrFrameInfo->borders[0] = 0; hSbrFrameInfo->borders[nEnv] = numberTimeSlots; /* adjust segment-frequency-resolution according to the segment-length */ for (i=0; iborders[i+1] - hSbrFrameInfo->borders[i]; hSbrFrameInfo->freqRes[i] = freqResTable[k]; hSbrGrid->v_f[i] = freqResTable[k]; } hSbrFrameInfo->nEnvelopes = nEnv; hSbrFrameInfo->shortEnv = pTable[2]; /* transient idx */ tranIdx = pTable[1]; /* add noise floors */ hSbrFrameInfo->bordersNoise[0] = 0; hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[tranIdx?tranIdx:1]; hSbrFrameInfo->bordersNoise[2] = numberTimeSlots; hSbrFrameInfo->nNoiseEnvelopes = 2; hSbrGrid->frameClass = FIXFIXonly; hSbrGrid->bs_abs_bord = tranPosInternal; hSbrGrid->bs_num_env = nEnv; } /******************************************************************************* Functionname: FDKsbrEnc_initFrameInfoGenerator ******************************************************************************* Description: Arguments: hSbrEnvFrame - pointer to sbr envelope handle allowSpread - commandline parameter numEnvStatic - commandline parameter staticFraming - commandline parameter Return: none *******************************************************************************/ void FDKsbrEnc_initFrameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, INT allowSpread, INT numEnvStatic, INT staticFraming, INT timeSlots, INT freq_res_fixfix ,int ldGrid ) { /* FH 00-06-26 */ FDKmemclear(hSbrEnvFrame,sizeof(SBR_ENVELOPE_FRAME )); /* Initialisation */ hSbrEnvFrame->frameClassOld = FIXFIX; hSbrEnvFrame->spreadFlag = 0; hSbrEnvFrame->allowSpread = allowSpread; hSbrEnvFrame->numEnvStatic = numEnvStatic; hSbrEnvFrame->staticFraming = staticFraming; hSbrEnvFrame->freq_res_fixfix = freq_res_fixfix; hSbrEnvFrame->length_v_bord = 0; hSbrEnvFrame->length_v_bordFollow = 0; hSbrEnvFrame->length_v_freq = 0; hSbrEnvFrame->length_v_freqFollow = 0; hSbrEnvFrame->i_tranFollow = 0; hSbrEnvFrame->i_fillFollow = 0; hSbrEnvFrame->SbrGrid.numberTimeSlots = timeSlots; if (ldGrid) { /*case CODEC_AACLD:*/ hSbrEnvFrame->dmin = 2; hSbrEnvFrame->dmax = 16; hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_512LD; } else switch(timeSlots){ case NUMBER_TIME_SLOTS_1920: hSbrEnvFrame->dmin = 4; hSbrEnvFrame->dmax = 12; hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1920; break; case NUMBER_TIME_SLOTS_2048: hSbrEnvFrame->dmin = 4; hSbrEnvFrame->dmax = 12; hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2048; break; case NUMBER_TIME_SLOTS_1152: hSbrEnvFrame->dmin = 2; hSbrEnvFrame->dmax = 8; hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_1152; break; case NUMBER_TIME_SLOTS_2304: hSbrEnvFrame->dmin = 4; hSbrEnvFrame->dmax = 15; hSbrEnvFrame->SbrGrid.bufferFrameStart = 0; hSbrEnvFrame->frameMiddleSlot = FRAME_MIDDLE_SLOT_2304; break; default: FDK_ASSERT(0); } } /******************************************************************************* Functionname: fillFrameTran ******************************************************************************* Description: Add mandatory borders, as described by the tuning vector and the current transient position Arguments: modified: v_bord - int pointer to v_bord vector length_v_bord - length of v_bord vector v_freq - int pointer to v_freq vector length_v_freq - length of v_freq vector bmin - int pointer to bmin (call by reference) bmax - int pointer to bmax (call by reference) not modified: tran - position of transient v_tuningSegm - int pointer to v_tuningSegm vector v_tuningFreq - int pointer to v_tuningFreq vector Return: none *******************************************************************************/ static void fillFrameTran (const int *v_tuningSegm, /*!< tuning: desired segment lengths */ const int *v_tuningFreq, /*!< tuning: desired frequency resolutions */ int tran, /*!< input : position of transient */ int *v_bord, /*!< memNew: borders */ int *length_v_bord, /*!< memNew: # borders */ int *v_freq, /*!< memNew: frequency resolutions */ int *length_v_freq, /*!< memNew: # frequency resolutions */ int *bmin, /*!< hlpNew: first mandatory border */ int *bmax /*!< hlpNew: last mandatory border */ ) { int bord, i; *length_v_bord = 0; *length_v_freq = 0; /* add attack env leading border (optional) */ if (v_tuningSegm[0]) { /* v_bord = [(Ba)] start of attack env */ FDKsbrEnc_AddRight (v_bord, length_v_bord, (tran - v_tuningSegm[0])); /* v_freq = [(Fa)] res of attack env */ FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[0]); } /* add attack env trailing border/first decay env leading border */ bord = tran; FDKsbrEnc_AddRight (v_bord, length_v_bord, tran); /* v_bord = [(Ba),Bd1] */ /* add first decay env trailing border/2:nd decay env leading border */ if (v_tuningSegm[1]) { bord += v_tuningSegm[1]; /* v_bord = [(Ba),Bd1,Bd2] */ FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); /* v_freq = [(Fa),Fd1] */ FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[1]); } /* add 2:nd decay env trailing border (optional) */ if (v_tuningSegm[2] != 0) { bord += v_tuningSegm[2]; /* v_bord = [(Ba),Bd1, Bd2,(Bd3)] */ FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); /* v_freq = [(Fa),Fd1,(Fd2)] */ FDKsbrEnc_AddRight (v_freq, length_v_freq, v_tuningFreq[2]); } /* v_freq = [(Fa),Fd1,(Fd2),1] */ FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); /* calc min and max values of mandatory borders */ *bmin = v_bord[0]; for (i = 0; i < *length_v_bord; i++) if (v_bord[i] < *bmin) *bmin = v_bord[i]; *bmax = v_bord[0]; for (i = 0; i < *length_v_bord; i++) if (v_bord[i] > *bmax) *bmax = v_bord[i]; } /******************************************************************************* Functionname: fillFramePre ******************************************************************************* Description: Add borders before mandatory borders, if needed Arguments: modified: v_bord - int pointer to v_bord vector length_v_bord - length of v_bord vector v_freq - int pointer to v_freq vector length_v_freq - length of v_freq vector not modified: dmax - int value bmin - int value rest - int value Return: none *******************************************************************************/ static void fillFramePre (INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT bmin, INT rest) { /* input state: v_bord = [(Ba),Bd1, Bd2 ,(Bd3)] v_freq = [(Fa),Fd1,(Fd2),1 ] */ INT parts, d, j, S, s = 0, segm, bord; /* start with one envelope */ parts = 1; d = rest; /* calc # of additional envelopes and corresponding lengths */ while (d > dmax) { parts++; segm = rest / parts; S = (segm - 2)>>1; s = fixMin (8, 2 * S + 2); d = rest - (parts - 1) * s; } /* add borders before mandatory borders */ bord = bmin; for (j = 0; j <= parts - 2; j++) { bord = bord - s; /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] */ FDKsbrEnc_AddLeft (v_bord, length_v_bord, bord); /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 ] */ FDKsbrEnc_AddLeft (v_freq, length_v_freq, 1); } } /***************************************************************************/ /*! \brief Overlap control Calculate max length of trailing fill segments, such that we always get a border within the frame overlap region \return void ****************************************************************************/ static int calcFillLengthMax (int tranPos, /*!< input : transient position (ref: tran det) */ int numberTimeSlots /*!< input : number of timeslots */ ) { int fmax; /* calculate transient position within envelope buffer */ switch (numberTimeSlots) { case NUMBER_TIME_SLOTS_2048: if (tranPos < 4) fmax = 6; else if (tranPos == 4 || tranPos == 5) fmax = 4; else fmax = 8; break; case NUMBER_TIME_SLOTS_1920: if (tranPos < 4) fmax = 5; else if (tranPos == 4 || tranPos == 5) fmax = 3; else fmax = 7; break; default: fmax = 8; break; } return fmax; } /******************************************************************************* Functionname: fillFramePost ******************************************************************************* Description: -Add borders after mandatory borders, if needed Make a preliminary design of next frame, assuming no transient is present there Arguments: modified: parts - int pointer to parts (call by reference) d - int pointer to d (call by reference) v_bord - int pointer to v_bord vector length_v_bord - length of v_bord vector v_freq - int pointer to v_freq vector length_v_freq - length of v_freq vector not modified: bmax - int value dmax - int value Return: none *******************************************************************************/ static void fillFramePost (INT *parts, INT *d, INT dmax, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT bmax, INT bufferFrameStart, INT numberTimeSlots, INT fmax) { INT j, rest, segm, S, s = 0, bord; /* input state: v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3)] v_freq = [...,(1 ),(Fa),Fd1,(Fd2),1 ] */ rest = bufferFrameStart + 2 * numberTimeSlots - bmax; *d = rest; if (*d > 0) { *parts = 1; /* start with one envelope */ /* calc # of additional envelopes and corresponding lengths */ while (*d > dmax) { *parts = *parts + 1; segm = rest / (*parts); S = (segm - 2)>>1; s = fixMin (fmax, 2 * S + 2); *d = rest - (*parts - 1) * s; } /* add borders after mandatory borders */ bord = bmax; for (j = 0; j <= *parts - 2; j++) { bord += s; /* v_bord = [...,(Bf),(Ba),Bd1, Bd2 ,(Bd3),(Bf)] */ FDKsbrEnc_AddRight (v_bord, length_v_bord, bord); /* v_freq = [...,(1 ),(Fa),Fd1,(Fd2), 1 , 1! ,1] */ FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); } } else { *parts = 1; /* remove last element from v_bord and v_freq */ *length_v_bord = *length_v_bord - 1; *length_v_freq = *length_v_freq - 1; } } /******************************************************************************* Functionname: fillFrameInter ******************************************************************************* Description: Arguments: nL - v_tuningSegm - v_bord - length_v_bord - bmin - v_freq - length_v_freq - v_bordFollow - length_v_bordFollow - v_freqFollow - length_v_freqFollow - i_fillFollow - dmin - dmax - Return: none *******************************************************************************/ static void fillFrameInter (INT *nL, const int *v_tuningSegm, INT *v_bord, INT *length_v_bord, INT bmin, INT *v_freq, INT *length_v_freq, INT *v_bordFollow, INT *length_v_bordFollow, INT *v_freqFollow, INT *length_v_freqFollow, INT i_fillFollow, INT dmin, INT dmax, INT numberTimeSlots) { INT middle, b_new, numBordFollow, bordMaxFollow, i; if (numberTimeSlots != NUMBER_TIME_SLOTS_1152) { /* % remove fill borders: */ if (i_fillFollow >= 1) { *length_v_bordFollow = i_fillFollow; *length_v_freqFollow = i_fillFollow; } numBordFollow = *length_v_bordFollow; bordMaxFollow = v_bordFollow[numBordFollow - 1]; /* remove even more borders if needed */ middle = bmin - bordMaxFollow; while (middle < 0) { numBordFollow--; bordMaxFollow = v_bordFollow[numBordFollow - 1]; middle = bmin - bordMaxFollow; } *length_v_bordFollow = numBordFollow; *length_v_freqFollow = numBordFollow; *nL = numBordFollow - 1; b_new = *length_v_bord; if (middle <= dmax) { if (middle >= dmin) { /* concatenate */ FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } else { if (v_tuningSegm[0] != 0) { /* remove one new border and concatenate */ *length_v_bord = b_new - 1; FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); *length_v_freq = b_new - 1; FDKsbrEnc_AddVecLeft (v_freq + 1, length_v_freq, v_freqFollow, *length_v_freqFollow); } else { if (*length_v_bordFollow > 1) { /* remove one old border and concatenate */ FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow - 1); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_bordFollow - 1); *nL = *nL - 1; } else { /* remove new "transient" border and concatenate */ for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1]; for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1]; *length_v_bord = b_new - 1; *length_v_freq = b_new - 1; FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } } } } else { /* middle > dmax */ fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, middle); FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } } else { /* numberTimeSlots==NUMBER_TIME_SLOTS_1152 */ INT l,m; /*------------------------------------------------------------------------ remove fill borders ------------------------------------------------------------------------*/ if (i_fillFollow >= 1) { *length_v_bordFollow = i_fillFollow; *length_v_freqFollow = i_fillFollow; } numBordFollow = *length_v_bordFollow; bordMaxFollow = v_bordFollow[numBordFollow - 1]; /*------------------------------------------------------------------------ remove more borders if necessary to eliminate overlap ------------------------------------------------------------------------*/ /* check for overlap */ middle = bmin - bordMaxFollow; /* intervals: i) middle < 0 : overlap, must remove borders ii) 0 <= middle < dmin : no overlap but too tight, must remove borders iii) dmin <= middle <= dmax : ok, just concatenate iv) dmax <= middle : too wide, must add borders */ /* first remove old non-fill-borders... */ while (middle < 0) { /* ...but don't remove all of them */ if (numBordFollow == 1) break; numBordFollow--; bordMaxFollow = v_bordFollow[numBordFollow - 1]; middle = bmin - bordMaxFollow; } /* if this isn't enough, remove new non-fill borders */ if (middle < 0) { for (l = 0, m = 0 ; l < *length_v_bord ; l++) { if(v_bord[l]> bordMaxFollow) { v_bord[m] = v_bord[l]; v_freq[m] = v_freq[l]; m++; } } *length_v_bord = l; *length_v_freq = l; bmin = v_bord[0]; } /*------------------------------------------------------------------------ update modified follow-up data ------------------------------------------------------------------------*/ *length_v_bordFollow = numBordFollow; *length_v_freqFollow = numBordFollow; /* left relative borders correspond to follow-up */ *nL = numBordFollow - 1; /*------------------------------------------------------------------------ take care of intervals ii through iv ------------------------------------------------------------------------*/ /* now middle should be >= 0 */ middle = bmin - bordMaxFollow; if (middle <= dmin) /* (ii) */ { b_new = *length_v_bord; if (v_tuningSegm[0] != 0) { /* remove new "luxury" border and concatenate */ *length_v_bord = b_new - 1; FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); *length_v_freq = b_new - 1; FDKsbrEnc_AddVecLeft (v_freq + 1, length_v_freq, v_freqFollow, *length_v_freqFollow); } else if (*length_v_bordFollow > 1) { /* remove old border and concatenate */ FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow - 1); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_bordFollow - 1); *nL = *nL - 1; } else { /* remove new border and concatenate */ for (i = 0; i < *length_v_bord - 1; i++) v_bord[i] = v_bord[i + 1]; for (i = 0; i < *length_v_freq - 1; i++) v_freq[i] = v_freq[i + 1]; *length_v_bord = b_new - 1; *length_v_freq = b_new - 1; FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } } else if ((middle >= dmin) && (middle <= dmax)) /* (iii) */ { /* concatenate */ FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } else /* (iv) */ { fillFramePre (dmax, v_bord, length_v_bord, v_freq, length_v_freq, bmin, middle); FDKsbrEnc_AddVecLeft (v_bord, length_v_bord, v_bordFollow, *length_v_bordFollow); FDKsbrEnc_AddVecLeft (v_freq, length_v_freq, v_freqFollow, *length_v_freqFollow); } } } /******************************************************************************* Functionname: calcFrameClass ******************************************************************************* Description: Arguments: INT* frameClass, INT* frameClassOld, INT tranFlag, INT* spreadFlag) Return: none *******************************************************************************/ static void calcFrameClass (FRAME_CLASS *frameClass, FRAME_CLASS *frameClassOld, INT tranFlag, INT *spreadFlag) { switch (*frameClassOld) { case FIXFIXonly: case FIXFIX: if (tranFlag) *frameClass = FIXVAR; else *frameClass = FIXFIX; break; case FIXVAR: if (tranFlag) { *frameClass = VARVAR; *spreadFlag = 0; } else { if (*spreadFlag) *frameClass = VARVAR; else *frameClass = VARFIX; } break; case VARFIX: if (tranFlag) *frameClass = FIXVAR; else *frameClass = FIXFIX; break; case VARVAR: if (tranFlag) { *frameClass = VARVAR; *spreadFlag = 0; } else { if (*spreadFlag) *frameClass = VARVAR; else *frameClass = VARFIX; } break; }; *frameClassOld = *frameClass; } /******************************************************************************* Functionname: specialCase ******************************************************************************* Description: Arguments: spreadFlag allowSpread v_bord length_v_bord v_freq length_v_freq parts d Return: none *******************************************************************************/ static void specialCase (INT *spreadFlag, INT allowSpread, INT *v_bord, INT *length_v_bord, INT *v_freq, INT *length_v_freq, INT *parts, INT d) { INT L; L = *length_v_bord; if (allowSpread) { /* add one "step 8" */ *spreadFlag = 1; FDKsbrEnc_AddRight (v_bord, length_v_bord, v_bord[L - 1] + 8); FDKsbrEnc_AddRight (v_freq, length_v_freq, 1); (*parts)++; } else { if (d == 1) { /* stretch one slot */ *length_v_bord = L - 1; *length_v_freq = L - 1; } else { if ((v_bord[L - 1] - v_bord[L - 2]) > 2) { /* compress one quant step */ v_bord[L - 1] = v_bord[L - 1] - 2; v_freq[*length_v_freq - 1] = 0; /* use low res for short segment */ } } } } /******************************************************************************* Functionname: calcCmonBorder ******************************************************************************* Description: Arguments: i_cmon i_tran v_bord length_v_bord tran Return: none *******************************************************************************/ static void calcCmonBorder (INT *i_cmon, INT *i_tran, INT *v_bord, INT *length_v_bord, INT tran, INT bufferFrameStart, INT numberTimeSlots) { /* FH 00-06-26 */ INT i; for (i = 0; i < *length_v_bord; i++) if (v_bord[i] >= bufferFrameStart + numberTimeSlots) { /* FH 00-06-26 */ *i_cmon = i; break; } /* keep track of transient: */ for (i = 0; i < *length_v_bord; i++) if (v_bord[i] >= tran) { *i_tran = i; break; } else *i_tran = EMPTY; } /******************************************************************************* Functionname: keepForFollowUp ******************************************************************************* Description: Arguments: v_bordFollow length_v_bordFollow v_freqFollow length_v_freqFollow i_tranFollow i_fillFollow v_bord length_v_bord v_freq i_cmon i_tran parts) Return: none *******************************************************************************/ static void keepForFollowUp (INT *v_bordFollow, INT *length_v_bordFollow, INT *v_freqFollow, INT *length_v_freqFollow, INT *i_tranFollow, INT *i_fillFollow, INT *v_bord, INT *length_v_bord, INT *v_freq, INT i_cmon, INT i_tran, INT parts, INT numberTimeSlots) { /* FH 00-06-26 */ INT L, i, j; L = *length_v_bord; (*length_v_bordFollow) = 0; (*length_v_freqFollow) = 0; for (j = 0, i = i_cmon; i < L; i++, j++) { v_bordFollow[j] = v_bord[i] - numberTimeSlots; /* FH 00-06-26 */ v_freqFollow[j] = v_freq[i]; (*length_v_bordFollow)++; (*length_v_freqFollow)++; } if (i_tran != EMPTY) *i_tranFollow = i_tran - i_cmon; else *i_tranFollow = EMPTY; *i_fillFollow = L - (parts - 1) - i_cmon; } /******************************************************************************* Functionname: calcCtrlSignal ******************************************************************************* Description: Arguments: hSbrGrid frameClass v_bord length_v_bord v_freq length_v_freq i_cmon i_tran spreadFlag nL Return: none *******************************************************************************/ static void calcCtrlSignal (HANDLE_SBR_GRID hSbrGrid, FRAME_CLASS frameClass, INT *v_bord, INT length_v_bord, INT *v_freq, INT length_v_freq, INT i_cmon, INT i_tran, INT spreadFlag, INT nL) { INT i, r, a, n, p, b, aL, aR, ntot, nmax, nR; INT *v_f = hSbrGrid->v_f; INT *v_fLR = hSbrGrid->v_fLR; INT *v_r = hSbrGrid->bs_rel_bord; INT *v_rL = hSbrGrid->bs_rel_bord_0; INT *v_rR = hSbrGrid->bs_rel_bord_1; INT length_v_r = 0; INT length_v_rR = 0; INT length_v_rL = 0; switch (frameClass) { case FIXVAR: /* absolute border: */ a = v_bord[i_cmon]; /* relative borders: */ length_v_r = 0; i = i_cmon; while (i >= 1) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_r, &length_v_r, r); i--; } /* number of relative borders: */ n = length_v_r; /* freq res: */ for (i = 0; i < i_cmon; i++) v_f[i] = v_freq[i_cmon - 1 - i]; v_f[i_cmon] = 1; /* pointer: */ p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0) ; hSbrGrid->frameClass = frameClass; hSbrGrid->bs_abs_bord = a; hSbrGrid->n = n; hSbrGrid->p = p; break; case VARFIX: /* absolute border: */ a = v_bord[0]; /* relative borders: */ length_v_r = 0; for (i = 1; i < length_v_bord; i++) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_r, &length_v_r, r); } /* number of relative borders: */ n = length_v_r; /* freq res: */ FDKmemcpy (v_f, v_freq, length_v_freq * sizeof (INT)); /* pointer: */ p = (i_tran >= 0 && i_tran != EMPTY) ? (i_tran + 1) : (0) ; hSbrGrid->frameClass = frameClass; hSbrGrid->bs_abs_bord = a; hSbrGrid->n = n; hSbrGrid->p = p; break; case VARVAR: if (spreadFlag) { /* absolute borders: */ b = length_v_bord; aL = v_bord[0]; aR = v_bord[b - 1]; /* number of relative borders: */ ntot = b - 2; nmax = 2; /* n: {0,1,2} */ if (ntot > nmax) { nL = nmax; nR = ntot - nmax; } else { nL = ntot; nR = 0; } /* relative borders: */ length_v_rL = 0; for (i = 1; i <= nL; i++) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_rL, &length_v_rL, r); } length_v_rR = 0; i = b - 1; while (i >= b - nR) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_rR, &length_v_rR, r); i--; } /* pointer (only one due to constraint in frame info): */ p = (i_tran > 0 && i_tran != EMPTY) ? (b - i_tran) : (0) ; /* freq res: */ for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i]; } else { length_v_bord = i_cmon + 1; length_v_freq = i_cmon + 1; /* absolute borders: */ b = length_v_bord; aL = v_bord[0]; aR = v_bord[b - 1]; /* number of relative borders: */ ntot = b - 2; nR = ntot - nL; /* relative borders: */ length_v_rL = 0; for (i = 1; i <= nL; i++) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_rL, &length_v_rL, r); } length_v_rR = 0; i = b - 1; while (i >= b - nR) { r = v_bord[i] - v_bord[i - 1]; FDKsbrEnc_AddRight (v_rR, &length_v_rR, r); i--; } /* pointer (only one due to constraint in frame info): */ p = (i_cmon >= i_tran && i_tran != EMPTY) ? (i_cmon - i_tran + 1) : (0) ; /* freq res: */ for (i = 0; i < b - 1; i++) v_fLR[i] = v_freq[i]; } hSbrGrid->frameClass = frameClass; hSbrGrid->bs_abs_bord_0 = aL; hSbrGrid->bs_abs_bord_1 = aR; hSbrGrid->bs_num_rel_0 = nL; hSbrGrid->bs_num_rel_1 = nR; hSbrGrid->p = p; break; default: /* do nothing */ break; } } /******************************************************************************* Functionname: createDefFrameInfo ******************************************************************************* Description: Copies the default (static) frameInfo structs to the frameInfo passed by reference; only used for FIXFIX frames Arguments: hFrameInfo - HANLDE_SBR_FRAME_INFO nEnv - INT nTimeSlots - INT Return: none; hSbrFrameInfo contains a copy of the default frameInfo Written: Andreas Schneider Revised: *******************************************************************************/ static void createDefFrameInfo(HANDLE_SBR_FRAME_INFO hSbrFrameInfo, INT nEnv, INT nTimeSlots) { switch (nEnv) { case 1: switch (nTimeSlots) { case NUMBER_TIME_SLOTS_1920: FDKmemcpy (hSbrFrameInfo, &frameInfo1_1920, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2048: FDKmemcpy (hSbrFrameInfo, &frameInfo1_2048, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_1152: FDKmemcpy (hSbrFrameInfo, &frameInfo1_1152, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2304: FDKmemcpy (hSbrFrameInfo, &frameInfo1_2304, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_512LD: FDKmemcpy (hSbrFrameInfo, &frameInfo1_512LD, sizeof (SBR_FRAME_INFO)); break; default: FDK_ASSERT(0); } break; case 2: switch (nTimeSlots) { case NUMBER_TIME_SLOTS_1920: FDKmemcpy (hSbrFrameInfo, &frameInfo2_1920, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2048: FDKmemcpy (hSbrFrameInfo, &frameInfo2_2048, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_1152: FDKmemcpy (hSbrFrameInfo, &frameInfo2_1152, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2304: FDKmemcpy (hSbrFrameInfo, &frameInfo2_2304, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_512LD: FDKmemcpy (hSbrFrameInfo, &frameInfo2_512LD, sizeof (SBR_FRAME_INFO)); break; default: FDK_ASSERT(0); } break; case 4: switch (nTimeSlots) { case NUMBER_TIME_SLOTS_1920: FDKmemcpy (hSbrFrameInfo, &frameInfo4_1920, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2048: FDKmemcpy (hSbrFrameInfo, &frameInfo4_2048, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_1152: FDKmemcpy (hSbrFrameInfo, &frameInfo4_1152, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_2304: FDKmemcpy (hSbrFrameInfo, &frameInfo4_2304, sizeof (SBR_FRAME_INFO)); break; case NUMBER_TIME_SLOTS_512LD: FDKmemcpy (hSbrFrameInfo, &frameInfo4_512LD, sizeof (SBR_FRAME_INFO)); break; default: FDK_ASSERT(0); } break; default: FDK_ASSERT(0); } } /******************************************************************************* Functionname: ctrlSignal2FrameInfo ******************************************************************************* Description: Calculates frame_info struct from control signal. Arguments: hSbrGrid - source hSbrFrameInfo - destination Return: void; hSbrFrameInfo contains the updated FRAME_INFO struct *******************************************************************************/ static void ctrlSignal2FrameInfo (HANDLE_SBR_GRID hSbrGrid, HANDLE_SBR_FRAME_INFO hSbrFrameInfo, INT freq_res_fixfix) { INT nEnv = 0, border = 0, i, k, p /*?*/; INT *v_r = hSbrGrid->bs_rel_bord; INT *v_f = hSbrGrid->v_f; FRAME_CLASS frameClass = hSbrGrid->frameClass; INT bufferFrameStart = hSbrGrid->bufferFrameStart; INT numberTimeSlots = hSbrGrid->numberTimeSlots; switch (frameClass) { case FIXFIX: createDefFrameInfo(hSbrFrameInfo, hSbrGrid->bs_num_env, numberTimeSlots); /* At this point all frequency resolutions are set to FREQ_RES_HIGH, so * only if freq_res_fixfix is set to FREQ_RES_LOW, they all have to be * changed. * snd */ if (freq_res_fixfix == FREQ_RES_LOW) { for (i = 0; i < hSbrFrameInfo->nEnvelopes; i++) { hSbrFrameInfo->freqRes[i] = FREQ_RES_LOW; } } /* ELD: store current frequency resolution */ hSbrGrid->v_f[0] = hSbrFrameInfo->freqRes[0]; break; case FIXVAR: case VARFIX: nEnv = hSbrGrid->n + 1; /* read n [SBR_NUM_BITS bits] */ /*? snd*/ FDK_ASSERT(nEnv <= MAX_ENVELOPES_FIXVAR_VARFIX); hSbrFrameInfo->nEnvelopes = nEnv; border = hSbrGrid->bs_abs_bord; /* read the absolute border */ if (nEnv == 1) hSbrFrameInfo->nNoiseEnvelopes = 1; else hSbrFrameInfo->nNoiseEnvelopes = 2; break; default: /* do nothing */ break; } switch (frameClass) { case FIXVAR: hSbrFrameInfo->borders[0] = bufferFrameStart; /* start-position of 1st envelope */ hSbrFrameInfo->borders[nEnv] = border; for (k = 0, i = nEnv - 1; k < nEnv - 1; k++, i--) { border -= v_r[k]; hSbrFrameInfo->borders[i] = border; } /* make either envelope nr. nEnv + 1 - p short; or don't shorten if p == 0 */ p = hSbrGrid->p; if (p == 0) { hSbrFrameInfo->shortEnv = 0; } else { hSbrFrameInfo->shortEnv = nEnv + 1 - p; } for (k = 0, i = nEnv - 1; k < nEnv; k++, i--) { hSbrFrameInfo->freqRes[i] = (FREQ_RES)v_f[k]; } /* if either there is no short envelope or the last envelope is short... */ if (p == 0 || p == 1) { hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; } else { hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; } break; case VARFIX: /* in this case 'border' indicates the start of the 1st envelope */ hSbrFrameInfo->borders[0] = border; for (k = 0; k < nEnv - 1; k++) { border += v_r[k]; hSbrFrameInfo->borders[k + 1] = border; } hSbrFrameInfo->borders[nEnv] = bufferFrameStart + numberTimeSlots; p = hSbrGrid->p; if (p == 0 || p == 1) { hSbrFrameInfo->shortEnv = 0; } else { hSbrFrameInfo->shortEnv = p - 1; } for (k = 0; k < nEnv; k++) { hSbrFrameInfo->freqRes[k] = (FREQ_RES)v_f[k]; } switch (p) { case 0: hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[1]; break; case 1: hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; break; default: hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; break; } break; case VARVAR: nEnv = hSbrGrid->bs_num_rel_0 + hSbrGrid->bs_num_rel_1 + 1; FDK_ASSERT(nEnv <= MAX_ENVELOPES_VARVAR); /* just to be sure */ hSbrFrameInfo->nEnvelopes = nEnv; hSbrFrameInfo->borders[0] = border = hSbrGrid->bs_abs_bord_0; for (k = 0, i = 1; k < hSbrGrid->bs_num_rel_0; k++, i++) { border += hSbrGrid->bs_rel_bord_0[k]; hSbrFrameInfo->borders[i] = border; } border = hSbrGrid->bs_abs_bord_1; hSbrFrameInfo->borders[nEnv] = border; for (k = 0, i = nEnv - 1; k < hSbrGrid->bs_num_rel_1; k++, i--) { border -= hSbrGrid->bs_rel_bord_1[k]; hSbrFrameInfo->borders[i] = border; } p = hSbrGrid->p; if (p == 0) { hSbrFrameInfo->shortEnv = 0; } else { hSbrFrameInfo->shortEnv = nEnv + 1 - p; } for (k = 0; k < nEnv; k++) { hSbrFrameInfo->freqRes[k] = (FREQ_RES)hSbrGrid->v_fLR[k]; } if (nEnv == 1) { hSbrFrameInfo->nNoiseEnvelopes = 1; hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; hSbrFrameInfo->bordersNoise[1] = hSbrGrid->bs_abs_bord_1; } else { hSbrFrameInfo->nNoiseEnvelopes = 2; hSbrFrameInfo->bordersNoise[0] = hSbrGrid->bs_abs_bord_0; if (p == 0 || p == 1) { hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv - 1]; } else { hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[hSbrFrameInfo->shortEnv]; } hSbrFrameInfo->bordersNoise[2] = hSbrGrid->bs_abs_bord_1; } break; default: /* do nothing */ break; } if (frameClass == VARFIX || frameClass == FIXVAR) { hSbrFrameInfo->bordersNoise[0] = hSbrFrameInfo->borders[0]; if (nEnv == 1) { hSbrFrameInfo->bordersNoise[1] = hSbrFrameInfo->borders[nEnv]; } else { hSbrFrameInfo->bordersNoise[2] = hSbrFrameInfo->borders[nEnv]; } } } fdk-aac-0.1.3/libSBRenc/src/env_bit.h0000644000175000017500000001327312372261464017611 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Remaining SBR Bit Writing Routines */ #ifndef BIT_ENV_H #define BIT_ENV_H #include "sbr_encoder.h" #include "FDK_crc.h" /* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ #define SBR_CRC_POLY (0x0233) #define SBR_CRC_MASK (0x0200) #define SBR_CRC_RANGE (0x03FF) #define SBR_CRC_MAXREGS 1 #define SBR_CRCINIT (0x0) #define SI_SBR_CRC_ENABLE_BITS 0 #define SI_SBR_CRC_BITS 10 #define SI_SBR_DRM_CRC_BITS 8 struct COMMON_DATA; INT FDKsbrEnc_InitSbrBitstream(struct COMMON_DATA *hCmonData, UCHAR *memoryBase, INT memorySize, HANDLE_FDK_CRCINFO hCrcInfo, UINT sbrSyntaxFlags); void FDKsbrEnc_AssembleSbrBitstream (struct COMMON_DATA *hCmonData, HANDLE_FDK_CRCINFO hCrcInfo, INT crcReg, UINT sbrSyntaxFlags); #endif /* #ifndef BIT_ENV_H */ fdk-aac-0.1.3/libSBRenc/src/nf_est.h0000644000175000017500000002102312372261464017431 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Noise floor estimation structs and prototypes */ #ifndef __NF_EST_H #define __NF_EST_H #include "sbr_encoder.h" #include "fram_gen.h" #define NF_SMOOTHING_LENGTH 4 /*!< Smoothing length of the noise floors. */ typedef struct { FIXP_DBL prevNoiseLevels[NF_SMOOTHING_LENGTH][MAX_NUM_NOISE_VALUES]; /*!< The previous noise levels. */ FIXP_DBL noiseFloorOffset[MAX_NUM_NOISE_VALUES]; /*!< Noise floor offset, scaled with NOISE_FLOOR_OFFSET_SCALING */ const FIXP_DBL *smoothFilter; /*!< Smoothing filter to use. */ FIXP_DBL ana_max_level; /*!< Max level allowed. */ FIXP_DBL weightFac; /*!< Weightening factor for the difference between orig and sbr. */ INT freqBandTableQmf[MAX_NUM_NOISE_VALUES + 1]; /*!< Frequncy band table for the noise floor bands.*/ INT noNoiseBands; /*!< Number of noisebands. */ INT noiseBands; /*!< NoiseBands switch 4 bit.*/ INT timeSlots; /*!< Number of timeslots in a frame. */ INVF_MODE diffThres; /*!< Threshold value to control the inverse filtering decision */ } SBR_NOISE_FLOOR_ESTIMATE; typedef SBR_NOISE_FLOOR_ESTIMATE *HANDLE_SBR_NOISE_FLOOR_ESTIMATE; void FDKsbrEnc_sbrNoiseFloorEstimateQmf(HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ const SBR_FRAME_INFO *frame_info, /*!< Time frequency grid of the current frame. */ FIXP_DBL *noiseLevels, /*!< Pointer to vector to store the noise levels in.*/ FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the quota values of the original. */ SCHAR* indexVector, /*!< Index vector to obtain the patched data. */ INT missingHarmonicsFlag, /*!< Flag indicating if a strong tonal component will be missing. */ INT startIndex, /*!< Start index. */ int numberOfEstimatesPerFrame, /*!< The number of tonality estimates per frame. */ INT transientFrame, /*!< A flag indicating if a transient is present. */ INVF_MODE* pInvFiltLevels, /*!< Pointer to the vector holding the inverse filtering levels. */ UINT sbrSyntaxFlags ); INT FDKsbrEnc_InitSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ INT ana_max_level, /*!< Maximum level of the adaptive noise. */ const UCHAR *freqBandTable, /*!< Frequany band table. */ INT nSfb, /*!< Number of frequency bands. */ INT noiseBands, /*!< Number of noise bands per octave. */ INT noiseFloorOffset, /*!< Noise floor offset. */ INT timeSlots, /*!< Number of time slots in a frame. */ UINT useSpeechConfig /*!< Flag: adapt tuning parameters according to speech */ ); INT FDKsbrEnc_resetSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ const UCHAR *freqBandTable, /*!< Frequany band table. */ INT nSfb); /*!< Number of bands in the frequency band table. */ void FDKsbrEnc_deleteSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate); /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ #endif fdk-aac-0.1.3/libSBRenc/src/invf_est.cpp0000644000175000017500000005662612372261464020344 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "invf_est.h" #include "sbr_misc.h" #include "genericStds.h" #define MAX_NUM_REGIONS 10 #define SCALE_FAC_QUO 512.0f #define SCALE_FAC_NRG 256.0f #ifndef min #define min(a,b) ( a < b ? a:b) #endif #ifndef max #define max(a,b) ( a > b ? a:b) #endif static const FIXP_DBL quantStepsSbr[4] = { 0x00400000, 0x02800000, 0x03800000, 0x04c00000 } ; /* table scaled with SCALE_FAC_QUO */ static const FIXP_DBL quantStepsOrig[4] = { 0x00000000, 0x00c00000, 0x01c00000, 0x02800000 } ; /* table scaled with SCALE_FAC_QUO */ static const FIXP_DBL nrgBorders[4] = { 0x0c800000, 0x0f000000, 0x11800000, 0x14000000 } ; /* table scaled with SCALE_FAC_NRG */ static const DETECTOR_PARAMETERS detectorParamsAAC = { quantStepsSbr, quantStepsOrig, nrgBorders, 4, /* Number of borders SBR. */ 4, /* Number of borders orig. */ 4, /* Number of borders Nrg. */ { /* Region space. */ {INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF, INVF_OFF}, /* | */ {INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* regionSbr */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF} /* | */ },/*------------------------ regionOrig ---------------------------------*/ { /* Region space transient. */ {INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* regionSbr */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF} /* | */ },/*------------------------ regionOrig ---------------------------------*/ {-4, -3, -2, -1, 0} /* Reduction factor of the inverse filtering for low energies.*/ }; static const FIXP_DBL hysteresis = 0x00400000 ; /* Delta value for hysteresis. scaled with SCALE_FAC_QUO */ /* * AAC+SBR PARAMETERS for Speech *********************************/ static const DETECTOR_PARAMETERS detectorParamsAACSpeech = { quantStepsSbr, quantStepsOrig, nrgBorders, 4, /* Number of borders SBR. */ 4, /* Number of borders orig. */ 4, /* Number of borders Nrg. */ { /* Region space. */ {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* regionSbr */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF} /* | */ },/*------------------------ regionOrig ---------------------------------*/ { /* Region space transient. */ {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_LOW_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* regionSbr */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF}, /* | */ {INVF_HIGH_LEVEL, INVF_HIGH_LEVEL, INVF_MID_LEVEL, INVF_OFF, INVF_OFF} /* | */ },/*------------------------ regionOrig ---------------------------------*/ {-4, -3, -2, -1, 0} /* Reduction factor of the inverse filtering for low energies.*/ }; /* * Smoothing filters. ************************/ typedef const FIXP_DBL FIR_FILTER[5]; static const FIR_FILTER fir_0 = { 0x7fffffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } ; static const FIR_FILTER fir_1 = { 0x2aaaaa80, 0x555554ff, 0x00000000, 0x00000000, 0x00000000 } ; static const FIR_FILTER fir_2 = { 0x10000000, 0x30000000, 0x40000000, 0x00000000, 0x00000000 } ; static const FIR_FILTER fir_3 = { 0x077f80e8, 0x199999a0, 0x2bb3b240, 0x33333340, 0x00000000 } ; static const FIR_FILTER fir_4 = { 0x04130598, 0x0ebdb000, 0x1becfa60, 0x2697a4c0, 0x2aaaaa80 } ; static const FIR_FILTER *const fir_table[5] = { &fir_0, &fir_1, &fir_2, &fir_3, &fir_4 }; /**************************************************************************/ /*! \brief Calculates the values used for the detector. \return none */ /**************************************************************************/ static void calculateDetectorValues(FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the tonality values of the original. */ SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ FIXP_DBL *nrgVector, /*!< Energy vector. */ DETECTOR_VALUES *detectorValues, /*!< pointer to DETECTOR_VALUES struct. */ INT startChannel, /*!< Start channel. */ INT stopChannel, /*!< Stop channel. */ INT startIndex, /*!< Start index. */ INT stopIndex, /*!< Stop index. */ INT numberOfStrongest /*!< The number of sorted tonal components to be considered. */ ) { INT i,temp, j; const FIXP_DBL* filter = *fir_table[INVF_SMOOTHING_LENGTH]; FIXP_DBL origQuotaMeanStrongest, sbrQuotaMeanStrongest; FIXP_DBL origQuota, sbrQuota; FIXP_DBL invIndex, invChannel, invTemp; FIXP_DBL quotaVecOrig[64], quotaVecSbr[64]; FDKmemclear(quotaVecOrig,64*sizeof(FIXP_DBL)); FDKmemclear(quotaVecSbr,64*sizeof(FIXP_DBL)); invIndex = GetInvInt(stopIndex-startIndex); invChannel = GetInvInt(stopChannel-startChannel); /* Calculate the mean value, over the current time segment, for the original, the HFR and the difference, over all channels in the current frequency range. NOTE: the averaging is done on the values quota/(1 - quota + RELAXATION). */ /* The original, the sbr signal and the total energy */ detectorValues->avgNrg = FL2FXCONST_DBL(0.0f); for(j=startIndex; javgNrg += fMult(nrgVector[j], invIndex); } /* Calculate the mean value, over the current frequency range, for the original, the HFR and the difference. Also calculate the same mean values for the three vectors, but only includeing the x strongest copmponents. */ origQuota = FL2FXCONST_DBL(0.0f); sbrQuota = FL2FXCONST_DBL(0.0f); for(i=startChannel; iorigQuotaMax = quotaVecOrig[stopChannel - 1]; detectorValues->sbrQuotaMax = quotaVecSbr[stopChannel - 1]; /* Buffer values */ FDKmemmove(detectorValues->origQuotaMean, detectorValues->origQuotaMean + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); FDKmemmove(detectorValues->sbrQuotaMean, detectorValues->sbrQuotaMean + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); FDKmemmove(detectorValues->origQuotaMeanStrongest, detectorValues->origQuotaMeanStrongest + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); FDKmemmove(detectorValues->sbrQuotaMeanStrongest, detectorValues->sbrQuotaMeanStrongest + 1, INVF_SMOOTHING_LENGTH*sizeof(FIXP_DBL)); detectorValues->origQuotaMean[INVF_SMOOTHING_LENGTH] = origQuota<<1; detectorValues->sbrQuotaMean[INVF_SMOOTHING_LENGTH] = sbrQuota<<1; detectorValues->origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH] = origQuotaMeanStrongest<<1; detectorValues->sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH] = sbrQuotaMeanStrongest<<1; /* Filter values */ detectorValues->origQuotaMeanFilt = FL2FXCONST_DBL(0.0f); detectorValues->sbrQuotaMeanFilt = FL2FXCONST_DBL(0.0f); detectorValues->origQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); detectorValues->sbrQuotaMeanStrongestFilt = FL2FXCONST_DBL(0.0f); for(i=0;iorigQuotaMeanFilt += fMult(detectorValues->origQuotaMean[i], filter[i]); detectorValues->sbrQuotaMeanFilt += fMult(detectorValues->sbrQuotaMean[i], filter[i]); detectorValues->origQuotaMeanStrongestFilt += fMult(detectorValues->origQuotaMeanStrongest[i], filter[i]); detectorValues->sbrQuotaMeanStrongestFilt += fMult(detectorValues->sbrQuotaMeanStrongest[i], filter[i]); } } /**************************************************************************/ /*! \brief Returns the region in which the input value belongs. \return region. */ /**************************************************************************/ static INT findRegion(FIXP_DBL currVal, /*!< The current value. */ const FIXP_DBL *borders, /*!< The border of the regions. */ const INT numBorders /*!< The number of borders. */ ) { INT i; if(currVal < borders[0]){ return 0; } for(i = 1; i < numBorders; i++){ if( currVal >= borders[i-1] && currVal < borders[i]){ return i; } } if(currVal >= borders[numBorders-1]){ return numBorders; } return 0; /* We never get here, it's just to avoid compiler warnings.*/ } /**************************************************************************/ /*! \brief Makes a clever decision based on the quota vector. \return decision on which invf mode to use */ /**************************************************************************/ static INVF_MODE decisionAlgorithm(const DETECTOR_PARAMETERS *detectorParams, /*!< Struct with the detector parameters. */ DETECTOR_VALUES *detectorValues, /*!< Struct with the detector values. */ INT transientFlag, /*!< Flag indicating if there is a transient present.*/ INT* prevRegionSbr, /*!< The previous region in which the Sbr value was. */ INT* prevRegionOrig /*!< The previous region in which the Orig value was. */ ) { INT invFiltLevel, regionSbr, regionOrig, regionNrg; /* Current thresholds. */ const FIXP_DBL *quantStepsSbr = detectorParams->quantStepsSbr; const FIXP_DBL *quantStepsOrig = detectorParams->quantStepsOrig; const FIXP_DBL *nrgBorders = detectorParams->nrgBorders; const INT numRegionsSbr = detectorParams->numRegionsSbr; const INT numRegionsOrig = detectorParams->numRegionsOrig; const INT numRegionsNrg = detectorParams->numRegionsNrg; FIXP_DBL quantStepsSbrTmp[MAX_NUM_REGIONS]; FIXP_DBL quantStepsOrigTmp[MAX_NUM_REGIONS]; /* Current detector values. */ FIXP_DBL origQuotaMeanFilt; FIXP_DBL sbrQuotaMeanFilt; FIXP_DBL nrg; /* 0.375 = 3.0 / 8.0; 0.31143075889 = log2(RELAXATION)/64.0; 0.625 = log(16)/64.0; 0.6875 = 44/64.0 */ origQuotaMeanFilt = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(max(detectorValues->origQuotaMeanFilt,(FIXP_DBL)1)) + FL2FXCONST_DBL(0.31143075889f)))) << 0; /* scaled by 1/2^9 */ sbrQuotaMeanFilt = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(max(detectorValues->sbrQuotaMeanFilt,(FIXP_DBL)1)) + FL2FXCONST_DBL(0.31143075889f)))) << 0; /* scaled by 1/2^9 */ /* If energy is zero then we will get different results for different word lengths. */ nrg = (fMultDiv2(FL2FXCONST_DBL(2.f*0.375f), (FIXP_DBL)(CalcLdData(detectorValues->avgNrg+(FIXP_DBL)1) + FL2FXCONST_DBL(0.0625f) + FL2FXCONST_DBL(0.6875f)))) << 0; /* scaled by 1/2^8; 2^44 -> qmf energy scale */ FDKmemcpy(quantStepsSbrTmp,quantStepsSbr,numRegionsSbr*sizeof(FIXP_DBL)); FDKmemcpy(quantStepsOrigTmp,quantStepsOrig,numRegionsOrig*sizeof(FIXP_DBL)); if(*prevRegionSbr < numRegionsSbr) quantStepsSbrTmp[*prevRegionSbr] = quantStepsSbr[*prevRegionSbr] + hysteresis; if(*prevRegionSbr > 0) quantStepsSbrTmp[*prevRegionSbr - 1] = quantStepsSbr[*prevRegionSbr - 1] - hysteresis; if(*prevRegionOrig < numRegionsOrig) quantStepsOrigTmp[*prevRegionOrig] = quantStepsOrig[*prevRegionOrig] + hysteresis; if(*prevRegionOrig > 0) quantStepsOrigTmp[*prevRegionOrig - 1] = quantStepsOrig[*prevRegionOrig - 1] - hysteresis; regionSbr = findRegion(sbrQuotaMeanFilt, quantStepsSbrTmp, numRegionsSbr); regionOrig = findRegion(origQuotaMeanFilt, quantStepsOrigTmp, numRegionsOrig); regionNrg = findRegion(nrg,nrgBorders,numRegionsNrg); *prevRegionSbr = regionSbr; *prevRegionOrig = regionOrig; /* Use different settings if a transient is present*/ invFiltLevel = (transientFlag == 1) ? detectorParams->regionSpaceTransient[regionSbr][regionOrig] : detectorParams->regionSpace[regionSbr][regionOrig]; /* Compensate for low energy.*/ invFiltLevel = max(invFiltLevel + detectorParams->EnergyCompFactor[regionNrg],0); return (INVF_MODE) (invFiltLevel); } /**************************************************************************/ /*! \brief Estiamtion of the inverse filtering level required in the decoder. A second order LPC is calculated for every filterbank channel, using the covariance method. THe ratio between the energy of the predicted signal and the energy of the non-predictable signal is calcualted. \return none. */ /**************************************************************************/ void FDKsbrEnc_qmfInverseFilteringDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, /*!< Handle to the SBR_INV_FILT_EST struct. */ FIXP_DBL **quotaMatrix, /*!< The matrix holding the tonality values of the original. */ FIXP_DBL *nrgVector, /*!< The energy vector. */ SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ INT startIndex, /*!< Start index. */ INT stopIndex, /*!< Stop index. */ INT transientFlag, /*!< Flag indicating if a transient is present or not.*/ INVF_MODE* infVec /*!< Vector holding the inverse filtering levels. */ ) { INT band; /* * Do the inverse filtering level estimation. *****************************************************/ for(band = 0 ; band < hInvFilt->noDetectorBands; band++){ INT startChannel = hInvFilt->freqBandTableInvFilt[band]; INT stopChannel = hInvFilt->freqBandTableInvFilt[band+1]; calculateDetectorValues( quotaMatrix, indexVector, nrgVector, &hInvFilt->detectorValues[band], startChannel, stopChannel, startIndex, stopIndex, hInvFilt->numberOfStrongest); infVec[band]= decisionAlgorithm( hInvFilt->detectorParams, &hInvFilt->detectorValues[band], transientFlag, &hInvFilt->prevRegionSbr[band], &hInvFilt->prevRegionOrig[band]); } } /**************************************************************************/ /*! \brief Initialize an instance of the inverse filtering level estimator. \return errorCode, noError if successful. */ /**************************************************************************/ INT FDKsbrEnc_initInvFiltDetector (HANDLE_SBR_INV_FILT_EST hInvFilt, /*!< Pointer to a handle to the SBR_INV_FILT_EST struct. */ INT* freqBandTableDetector, /*!< Frequency band table for the inverse filtering. */ INT numDetectorBands, /*!< Number of inverse filtering bands. */ UINT useSpeechConfig /*!< Flag: adapt tuning parameters according to speech*/ ) { INT i; FDKmemclear( hInvFilt,sizeof(SBR_INV_FILT_EST)); hInvFilt->detectorParams = (useSpeechConfig) ? &detectorParamsAACSpeech : &detectorParamsAAC ; hInvFilt->noDetectorBandsMax = numDetectorBands; /* Memory initialisation */ for(i=0;inoDetectorBandsMax;i++){ FDKmemclear(&hInvFilt->detectorValues[i], sizeof(DETECTOR_VALUES)); hInvFilt->prevInvfMode[i] = INVF_OFF; hInvFilt->prevRegionOrig[i] = 0; hInvFilt->prevRegionSbr[i] = 0; } /* Reset the inverse fltering detector. */ FDKsbrEnc_resetInvFiltDetector(hInvFilt, freqBandTableDetector, hInvFilt->noDetectorBandsMax); return (0); } /**************************************************************************/ /*! \brief resets sbr inverse filtering structure. \return errorCode, noError if successful. */ /**************************************************************************/ INT FDKsbrEnc_resetInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, /*!< Handle to the SBR_INV_FILT_EST struct. */ INT* freqBandTableDetector, /*!< Frequency band table for the inverse filtering. */ INT numDetectorBands) /*!< Number of inverse filtering bands. */ { hInvFilt->numberOfStrongest = 1; FDKmemcpy(hInvFilt->freqBandTableInvFilt,freqBandTableDetector,(numDetectorBands+1)*sizeof(INT)); hInvFilt->noDetectorBands = numDetectorBands; return (0); } fdk-aac-0.1.3/libSBRenc/src/mh_det.h0000644000175000017500000002137412372261464017424 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief missing harmonics detection header file */ #ifndef __MH_DETECT_H #define __MH_DETECT_H #include "sbr_encoder.h" #include "fram_gen.h" typedef struct { FIXP_DBL thresHoldDiff; /*!< threshold for tonality difference */ FIXP_DBL thresHoldDiffGuide; /*!< threshold for tonality difference for the guide */ FIXP_DBL thresHoldTone; /*!< threshold for tonality for a sine */ FIXP_DBL invThresHoldTone; FIXP_DBL thresHoldToneGuide; /*!< threshold for tonality for a sine for the guide */ FIXP_DBL sfmThresSbr; /*!< tonality flatness measure threshold for the SBR signal.*/ FIXP_DBL sfmThresOrig; /*!< tonality flatness measure threshold for the original signal.*/ FIXP_DBL decayGuideOrig; /*!< decay value of the tonality value of the guide for the tone. */ FIXP_DBL decayGuideDiff; /*!< decay value of the tonality value of the guide for the tonality difference. */ FIXP_DBL derivThresMaxLD64; /*!< threshold for detecting LP character in a signal. */ FIXP_DBL derivThresBelowLD64; /*!< threshold for detecting LP character in a signal. */ FIXP_DBL derivThresAboveLD64; /*!< threshold for detecting LP character in a signal. */ }THRES_HOLDS; typedef struct { INT deltaTime; /*!< maximum allowed transient distance (from frame border in number of qmf subband sample) for a frame to be considered a transient frame.*/ THRES_HOLDS thresHolds; /*!< the thresholds used for detection. */ INT maxComp; /*!< maximum alllowed compensation factor for the envelope data. */ }DETECTOR_PARAMETERS_MH; typedef struct { FIXP_DBL *guideVectorDiff; FIXP_DBL *guideVectorOrig; UCHAR* guideVectorDetected; }GUIDE_VECTORS; typedef struct { INT qmfNoChannels; INT nSfb; INT sampleFreq; INT previousTransientFlag; INT previousTransientFrame; INT previousTransientPos; INT noVecPerFrame; INT transientPosOffset; INT move; INT totNoEst; INT noEstPerFrame; INT timeSlots; UCHAR *guideScfb; UCHAR *prevEnvelopeCompensation; UCHAR *detectionVectors[MAX_NO_OF_ESTIMATES]; FIXP_DBL tonalityDiff[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; FIXP_DBL sfmOrig[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; FIXP_DBL sfmSbr[MAX_NO_OF_ESTIMATES/2][MAX_FREQ_COEFFS]; const DETECTOR_PARAMETERS_MH *mhParams; GUIDE_VECTORS guideVectors[MAX_NO_OF_ESTIMATES]; } SBR_MISSING_HARMONICS_DETECTOR; typedef SBR_MISSING_HARMONICS_DETECTOR *HANDLE_SBR_MISSING_HARMONICS_DETECTOR; void FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, FIXP_DBL ** pQuotaBuffer, INT ** pSignBuffer, SCHAR *indexVector, const SBR_FRAME_INFO *pFrameInfo, const UCHAR* pTranInfo, INT* pAddHarmonicsFlag, UCHAR* pAddHarmonicsScaleFactorBands, const UCHAR* freqBandTable, INT nSfb, UCHAR * envelopeCompensation, FIXP_DBL *pNrgVector); INT FDKsbrEnc_CreateSbrMissingHarmonicsDetector ( HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, INT chan); INT FDKsbrEnc_InitSbrMissingHarmonicsDetector( HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector, INT sampleFreq, INT frameSize, INT nSfb, INT qmfNoChannels, INT totNoEst, INT move, INT noEstPerFrame, UINT sbrSyntaxFlags); void FDKsbrEnc_DeleteSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector); INT FDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, INT nSfb); #endif fdk-aac-0.1.3/libSBRenc/src/nf_est.cpp0000644000175000017500000005444712372261464020004 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "nf_est.h" #include "sbr_misc.h" #include "genericStds.h" /* smoothFilter[4] = {0.05857864376269f, 0.2f, 0.34142135623731f, 0.4f}; */ static const FIXP_DBL smoothFilter[4] = { 0x077f813d, 0x19999995, 0x2bb3b1f5, 0x33333335 }; /* static const INT smoothFilterLength = 4; */ static const FIXP_DBL QuantOffset = (INT)0xfc000000; /* ld64(0.25) */ #ifndef min #define min(a,b) ( a < b ? a:b) #endif #ifndef max #define max(a,b) ( a > b ? a:b) #endif #define NOISE_FLOOR_OFFSET_SCALING (4) /**************************************************************************/ /*! \brief The function applies smoothing to the noise levels. \return none */ /**************************************************************************/ static void smoothingOfNoiseLevels(FIXP_DBL *NoiseLevels, /*!< pointer to noise-floor levels.*/ INT nEnvelopes, /*!< Number of noise floor envelopes.*/ INT noNoiseBands, /*!< Number of noise bands for every noise floor envelope. */ FIXP_DBL prevNoiseLevels[NF_SMOOTHING_LENGTH][MAX_NUM_NOISE_VALUES],/*!< Previous noise floor envelopes. */ const FIXP_DBL *smoothFilter, /*!< filter used for smoothing the noise floor levels. */ INT transientFlag) /*!< flag indicating if a transient is present*/ { INT i,band,env; FIXP_DBL accu; for(env = 0; env < nEnvelopes; env++){ if(transientFlag){ for (i = 0; i < NF_SMOOTHING_LENGTH; i++){ FDKmemcpy(prevNoiseLevels[i],NoiseLevels+env*noNoiseBands,noNoiseBands*sizeof(FIXP_DBL)); } } else { for (i = 1; i < NF_SMOOTHING_LENGTH; i++){ FDKmemcpy(prevNoiseLevels[i - 1],prevNoiseLevels[i],noNoiseBands*sizeof(FIXP_DBL)); } FDKmemcpy(prevNoiseLevels[NF_SMOOTHING_LENGTH - 1],NoiseLevels+env*noNoiseBands,noNoiseBands*sizeof(FIXP_DBL)); } for (band = 0; band < noNoiseBands; band++){ accu = FL2FXCONST_DBL(0.0f); for (i = 0; i < NF_SMOOTHING_LENGTH; i++){ accu += fMultDiv2(smoothFilter[i], prevNoiseLevels[i][band]); } FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); NoiseLevels[band+ env*noNoiseBands] = accu<<1; } } } /**************************************************************************/ /*! \brief Does the noise floor level estiamtion. The noiseLevel samples are scaled by the factor 0.25 \return none */ /**************************************************************************/ static void qmfBasedNoiseFloorDetection(FIXP_DBL *noiseLevel, /*!< Pointer to vector to store the noise levels in.*/ FIXP_DBL ** quotaMatrixOrig, /*!< Matrix holding the quota values of the original. */ SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ INT startIndex, /*!< Start index. */ INT stopIndex, /*!< Stop index. */ INT startChannel, /*!< Start channel of the current noise floor band.*/ INT stopChannel, /*!< Stop channel of the current noise floor band. */ FIXP_DBL ana_max_level, /*!< Maximum level of the adaptive noise.*/ FIXP_DBL noiseFloorOffset, /*!< Noise floor offset. */ INT missingHarmonicFlag, /*!< Flag indicating if a strong tonal component is missing.*/ FIXP_DBL weightFac, /*!< Weightening factor for the difference between orig and sbr. */ INVF_MODE diffThres, /*!< Threshold value to control the inverse filtering decision.*/ INVF_MODE inverseFilteringLevel) /*!< Inverse filtering level of the current band.*/ { INT scale, l, k; FIXP_DBL meanOrig=FL2FXCONST_DBL(0.0f), meanSbr=FL2FXCONST_DBL(0.0f), diff; FIXP_DBL invIndex = GetInvInt(stopIndex-startIndex); FIXP_DBL invChannel = GetInvInt(stopChannel-startChannel); FIXP_DBL accu; /* Calculate the mean value, over the current time segment, for the original, the HFR and the difference, over all channels in the current frequency range. */ if(missingHarmonicFlag == 1){ for(l = startChannel; l < stopChannel;l++){ /* tonalityOrig */ accu = FL2FXCONST_DBL(0.0f); for(k = startIndex ; k < stopIndex; k++){ accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); } meanOrig = fixMax(meanOrig,(accu<<1)); /* tonalitySbr */ accu = FL2FXCONST_DBL(0.0f); for(k = startIndex ; k < stopIndex; k++){ accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); } meanSbr = fixMax(meanSbr,(accu<<1)); } } else{ for(l = startChannel; l < stopChannel;l++){ /* tonalityOrig */ accu = FL2FXCONST_DBL(0.0f); for(k = startIndex ; k < stopIndex; k++){ accu += fMultDiv2(quotaMatrixOrig[k][l], invIndex); } meanOrig += fMult((accu<<1), invChannel); /* tonalitySbr */ accu = FL2FXCONST_DBL(0.0f); for(k = startIndex ; k < stopIndex; k++){ accu += fMultDiv2(quotaMatrixOrig[k][indexVector[l]], invIndex); } meanSbr += fMult((accu<<1), invChannel); } } /* Small fix to avoid noise during silent passages.*/ if( meanOrig <= FL2FXCONST_DBL(0.000976562f*RELAXATION_FLOAT) && meanSbr <= FL2FXCONST_DBL(0.000976562f*RELAXATION_FLOAT) ) { meanOrig = FL2FXCONST_DBL(101.5936673f*RELAXATION_FLOAT); meanSbr = FL2FXCONST_DBL(101.5936673f*RELAXATION_FLOAT); } meanOrig = fixMax(meanOrig,RELAXATION); meanSbr = fixMax(meanSbr,RELAXATION); if (missingHarmonicFlag == 1 || inverseFilteringLevel == INVF_MID_LEVEL || inverseFilteringLevel == INVF_LOW_LEVEL || inverseFilteringLevel == INVF_OFF || inverseFilteringLevel <= diffThres) { diff = RELAXATION; } else { accu = fDivNorm(meanSbr, meanOrig, &scale); diff = fixMax( RELAXATION, fMult(RELAXATION_FRACT,fMult(weightFac,accu)) >>( RELAXATION_SHIFT-scale ) ) ; } /* * noise Level is now a positive value, i.e. * the more harmonic the signal is the higher noise level, * this makes no sense so we change the sign. *********************************************************/ accu = fDivNorm(diff, meanOrig, &scale); scale -= 2; if ( (scale>0) && (accu > ((FIXP_DBL)MAXVAL_DBL)>>scale) ) { *noiseLevel = (FIXP_DBL)MAXVAL_DBL; } else { *noiseLevel = scaleValue(accu, scale); } /* * Add a noise floor offset to compensate for bias in the detector *****************************************************************/ if(!missingHarmonicFlag) *noiseLevel = fMult(*noiseLevel, noiseFloorOffset)<<(NOISE_FLOOR_OFFSET_SCALING); /* * check to see that we don't exceed the maximum allowed level **************************************************************/ *noiseLevel = fixMin(*noiseLevel, ana_max_level); /* ana_max_level is scaled with factor 0.25 */ } /**************************************************************************/ /*! \brief Does the noise floor level estiamtion. The function calls the Noisefloor estimation function for the time segments decided based upon the transient information. The block is always divided into one or two segments. \return none */ /**************************************************************************/ void FDKsbrEnc_sbrNoiseFloorEstimateQmf(HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ const SBR_FRAME_INFO *frame_info, /*!< Time frequency grid of the current frame. */ FIXP_DBL *noiseLevels, /*!< Pointer to vector to store the noise levels in.*/ FIXP_DBL **quotaMatrixOrig, /*!< Matrix holding the quota values of the original. */ SCHAR *indexVector, /*!< Index vector to obtain the patched data. */ INT missingHarmonicsFlag, /*!< Flag indicating if a strong tonal component will be missing. */ INT startIndex, /*!< Start index. */ int numberOfEstimatesPerFrame, /*!< The number of tonality estimates per frame. */ int transientFrame, /*!< A flag indicating if a transient is present. */ INVF_MODE* pInvFiltLevels, /*!< Pointer to the vector holding the inverse filtering levels. */ UINT sbrSyntaxFlags ) { INT nNoiseEnvelopes, startPos[2], stopPos[2], env, band; INT noNoiseBands = h_sbrNoiseFloorEstimate->noNoiseBands; INT *freqBandTable = h_sbrNoiseFloorEstimate->freqBandTableQmf; nNoiseEnvelopes = frame_info->nNoiseEnvelopes; if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { nNoiseEnvelopes = 1; startPos[0] = startIndex; stopPos[0] = startIndex + min(numberOfEstimatesPerFrame,2); } else if(nNoiseEnvelopes == 1){ startPos[0] = startIndex; stopPos[0] = startIndex + 2; } else{ startPos[0] = startIndex; stopPos[0] = startIndex + 1; startPos[1] = startIndex + 1; stopPos[1] = startIndex + 2; } /* * Estimate the noise floor. **************************************/ for(env = 0; env < nNoiseEnvelopes; env++){ for(band = 0; band < noNoiseBands; band++){ FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); qmfBasedNoiseFloorDetection(&noiseLevels[band + env*noNoiseBands], quotaMatrixOrig, indexVector, startPos[env], stopPos[env], freqBandTable[band], freqBandTable[band+1], h_sbrNoiseFloorEstimate->ana_max_level, h_sbrNoiseFloorEstimate->noiseFloorOffset[band], missingHarmonicsFlag, h_sbrNoiseFloorEstimate->weightFac, h_sbrNoiseFloorEstimate->diffThres, pInvFiltLevels[band]); } } /* * Smoothing of the values. **************************/ smoothingOfNoiseLevels(noiseLevels, nNoiseEnvelopes, h_sbrNoiseFloorEstimate->noNoiseBands, h_sbrNoiseFloorEstimate->prevNoiseLevels, h_sbrNoiseFloorEstimate->smoothFilter, transientFrame); /* quantisation*/ for(env = 0; env < nNoiseEnvelopes; env++){ for(band = 0; band < noNoiseBands; band++){ FDK_ASSERT( (band + env*noNoiseBands) < MAX_NUM_NOISE_VALUES); noiseLevels[band + env*noNoiseBands] = (FIXP_DBL)NOISE_FLOOR_OFFSET_64 - (FIXP_DBL)CalcLdData(noiseLevels[band + env*noNoiseBands]+(FIXP_DBL)1) + QuantOffset; } } } /**************************************************************************/ /*! \brief \return errorCode, noError if successful */ /**************************************************************************/ static INT downSampleLoRes(INT *v_result, /*!< */ INT num_result, /*!< */ const UCHAR *freqBandTableRef,/*!< */ INT num_Ref) /*!< */ { INT step; INT i,j; INT org_length,result_length; INT v_index[MAX_FREQ_COEFFS/2]; /* init */ org_length=num_Ref; result_length=num_result; v_index[0]=0; /* Always use left border */ i=0; while(org_length > 0) /* Create downsample vector */ { i++; step=org_length/result_length; /* floor; */ org_length=org_length - step; result_length--; v_index[i]=v_index[i-1]+step; } if(i != num_result ) /* Should never happen */ return (1);/* error downsampling */ for(j=0;j<=i;j++) /* Use downsample vector to index LoResolution vector. */ { v_result[j]=freqBandTableRef[v_index[j]]; } return (0); } /**************************************************************************/ /*! \brief Initialize an instance of the noise floor level estimation module. \return errorCode, noError if successful */ /**************************************************************************/ INT FDKsbrEnc_InitSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ INT ana_max_level, /*!< Maximum level of the adaptive noise. */ const UCHAR *freqBandTable, /*!< Frequany band table. */ INT nSfb, /*!< Number of frequency bands. */ INT noiseBands, /*!< Number of noise bands per octave. */ INT noiseFloorOffset, /*!< Noise floor offset. */ INT timeSlots, /*!< Number of time slots in a frame. */ UINT useSpeechConfig /*!< Flag: adapt tuning parameters according to speech */ ) { INT i, qexp, qtmp; FIXP_DBL tmp, exp; FDKmemclear(h_sbrNoiseFloorEstimate,sizeof(SBR_NOISE_FLOOR_ESTIMATE)); h_sbrNoiseFloorEstimate->smoothFilter = smoothFilter; if (useSpeechConfig) { h_sbrNoiseFloorEstimate->weightFac = (FIXP_DBL)MAXVAL_DBL; h_sbrNoiseFloorEstimate->diffThres = INVF_LOW_LEVEL; } else { h_sbrNoiseFloorEstimate->weightFac = FL2FXCONST_DBL(0.25f); h_sbrNoiseFloorEstimate->diffThres = INVF_MID_LEVEL; } h_sbrNoiseFloorEstimate->timeSlots = timeSlots; h_sbrNoiseFloorEstimate->noiseBands = noiseBands; /* h_sbrNoiseFloorEstimate->ana_max_level is scaled by 0.25 */ switch(ana_max_level) { case 6: h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; break; case 3: h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.5); break; case -3: h_sbrNoiseFloorEstimate->ana_max_level = FL2FXCONST_DBL(0.125); break; default: /* Should not enter here */ h_sbrNoiseFloorEstimate->ana_max_level = (FIXP_DBL)MAXVAL_DBL; break; } /* calculate number of noise bands and allocate */ if(FDKsbrEnc_resetSbrNoiseFloorEstimate(h_sbrNoiseFloorEstimate,freqBandTable,nSfb)) return(1); if(noiseFloorOffset == 0) { tmp = ((FIXP_DBL)MAXVAL_DBL)>>NOISE_FLOOR_OFFSET_SCALING; } else { /* noiseFloorOffset has to be smaller than 12, because the result of the calculation below must be smaller than 1: (2^(noiseFloorOffset/3))*2^4<1 */ FDK_ASSERT(noiseFloorOffset<12); /* Assumes the noise floor offset in tuning table are in q31 */ /* Change the qformat here when non-zero values would be filled */ exp = fDivNorm((FIXP_DBL)noiseFloorOffset, 3, &qexp); tmp = fPow(2, DFRACT_BITS-1, exp, qexp, &qtmp); tmp = scaleValue(tmp, qtmp-NOISE_FLOOR_OFFSET_SCALING); } for(i=0;inoNoiseBands;i++) { h_sbrNoiseFloorEstimate->noiseFloorOffset[i] = tmp; } return (0); } /**************************************************************************/ /*! \brief Resets the current instance of the noise floor estiamtion module. \return errorCode, noError if successful */ /**************************************************************************/ INT FDKsbrEnc_resetSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate, /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ const UCHAR *freqBandTable, /*!< Frequany band table. */ INT nSfb) /*!< Number of bands in the frequency band table. */ { INT k2,kx; /* * Calculate number of noise bands ***********************************/ k2=freqBandTable[nSfb]; kx=freqBandTable[0]; if(h_sbrNoiseFloorEstimate->noiseBands == 0){ h_sbrNoiseFloorEstimate->noNoiseBands = 1; } else{ /* * Calculate number of noise bands 1,2 or 3 bands/octave ********************************************************/ FIXP_DBL tmp, ratio, lg2; INT ratio_e, qlg2, nNoiseBands; ratio = fDivNorm(k2, kx, &ratio_e); lg2 = fLog2(ratio, ratio_e, &qlg2); tmp = fMult((FIXP_DBL)(h_sbrNoiseFloorEstimate->noiseBands<<24), lg2); tmp = scaleValue(tmp, qlg2-23); nNoiseBands = (INT)((tmp + (FIXP_DBL)1) >> 1); if (nNoiseBands > MAX_NUM_NOISE_COEFFS ) { nNoiseBands = MAX_NUM_NOISE_COEFFS; } if( nNoiseBands == 0 ) { nNoiseBands = 1; } h_sbrNoiseFloorEstimate->noNoiseBands = nNoiseBands; } return(downSampleLoRes(h_sbrNoiseFloorEstimate->freqBandTableQmf, h_sbrNoiseFloorEstimate->noNoiseBands, freqBandTable,nSfb)); } /**************************************************************************/ /*! \brief Deletes the current instancce of the noise floor level estimation module. \return none */ /**************************************************************************/ void FDKsbrEnc_deleteSbrNoiseFloorEstimate (HANDLE_SBR_NOISE_FLOOR_ESTIMATE h_sbrNoiseFloorEstimate) /*!< Handle to SBR_NOISE_FLOOR_ESTIMATE struct */ { if (h_sbrNoiseFloorEstimate) { /* nothing to do */ } } fdk-aac-0.1.3/libSBRenc/src/ps_encode.cpp0000644000175000017500000010557512372261464020464 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial Authors: M. Neuendorf, N. Rettelbach, M. Multrus Contents/Description: PS parameter extraction, encoding ******************************************************************************/ /*! \file \brief PS parameter extraction, encoding functions */ #include "ps_main.h" #include "sbr_ram.h" #include "ps_encode.h" #include "qmf.h" #include "ps_const.h" #include "sbr_misc.h" #include "genericStds.h" inline void FDKsbrEnc_addFIXP_DBL(const FIXP_DBL *X, const FIXP_DBL *Y, FIXP_DBL *Z, INT n) { for (INT i=0; i>1) + (Y[i]>>1); } #define LOG10_2_10 3.01029995664f /* 10.0f*log10(2.f) */ static const INT iidGroupBordersLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES + 1] = { 0, 1, 2, 3, 4, 5, /* 6 subqmf subbands - 0th qmf subband */ 6, 7, /* 2 subqmf subbands - 1st qmf subband */ 8, 9, /* 2 subqmf subbands - 2nd qmf subband */ 10, 11, 12, 13, 14, 15, 16, 18, 21, 25, 30, 42, 71 }; static const UCHAR iidGroupWidthLdLoRes[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 4, 5 }; static const INT subband2parameter20[QMF_GROUPS_LO_RES + SUBQMF_GROUPS_LO_RES] = { 1, 0, 0, 1, 2, 3, /* 6 subqmf subbands - 0th qmf subband */ 4, 5, /* 2 subqmf subbands - 1st qmf subband */ 6, 7, /* 2 subqmf subbands - 2nd qmf subband */ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; typedef enum { MAX_TIME_DIFF_FRAMES = 20, MAX_PS_NOHEADER_CNT = 10, MAX_NOENV_CNT = 10, DO_NOT_USE_THIS_MODE = 0x7FFFFF } __PS_CONSTANTS; static const FIXP_DBL iidQuant_fx[15] = { 0xce000000, 0xdc000000, 0xe4000000, 0xec000000, 0xf2000000, 0xf8000000, 0xfc000000, 0x00000000, 0x04000000, 0x08000000, 0x0e000000, 0x14000000, 0x1c000000, 0x24000000, 0x32000000 }; static const FIXP_DBL iidQuantFine_fx[31] = { 0x9c000001, 0xa6000001, 0xb0000001, 0xba000001, 0xc4000000, 0xce000000, 0xd4000000, 0xda000000, 0xe0000000, 0xe6000000, 0xec000000, 0xf0000000, 0xf4000000, 0xf8000000, 0xfc000000, 0x00000000, 0x04000000, 0x08000000, 0x0c000000, 0x10000000, 0x14000000, 0x1a000000, 0x20000000, 0x26000000, 0x2c000000, 0x32000000, 0x3c000000, 0x45ffffff, 0x4fffffff, 0x59ffffff, 0x63ffffff }; static const FIXP_DBL iccQuant[8] = { 0x7fffffff, 0x77ef9d7f, 0x6babc97f, 0x4ceaf27f, 0x2f0ed3c0, 0x00000000, 0xb49ba601, 0x80000000 }; static FDK_PSENC_ERROR InitPSData( HANDLE_PS_DATA hPsData ) { FDK_PSENC_ERROR error = PSENC_OK; if(hPsData == NULL) { error = PSENC_INVALID_HANDLE; } else { int i, env; FDKmemclear(hPsData,sizeof(PS_DATA)); for (i=0; iiidIdxLast[i] = 0; hPsData->iccIdxLast[i] = 0; } hPsData->iidEnable = hPsData->iidEnableLast = 0; hPsData->iccEnable = hPsData->iccEnableLast = 0; hPsData->iidQuantMode = hPsData->iidQuantModeLast = PS_IID_RES_COARSE; hPsData->iccQuantMode = hPsData->iccQuantModeLast = PS_ICC_ROT_A; for(env=0; enviccDiffMode[env] = PS_DELTA_FREQ; hPsData->iccDiffMode[env] = PS_DELTA_FREQ; for (i=0; iiidIdx[env][i] = 0; hPsData->iccIdx[env][i] = 0; } } hPsData->nEnvelopesLast = 0; hPsData->headerCnt = MAX_PS_NOHEADER_CNT; hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; hPsData->noEnvCnt = MAX_NOENV_CNT; } return error; } static FIXP_DBL quantizeCoef( const FIXP_DBL *RESTRICT input, const INT nBands, const FIXP_DBL *RESTRICT quantTable, const INT idxOffset, const INT nQuantSteps, INT *RESTRICT quantOut) { INT idx, band; FIXP_DBL quantErr = FL2FXCONST_DBL(0.f); for (band=0; band>1)-(quantTable[idx+1]>>1)) > fixp_abs((input[band]>>1)-(quantTable[idx]>>1)) ) { break; } } quantErr += (fixp_abs(input[band]-quantTable[idx])>>PS_QUANT_SCALE); /* don't scale before subtraction; diff smaller (64-25)/64 */ quantOut[band] = idx - idxOffset; } return quantErr; } static INT getICCMode(const INT nBands, const INT rotType) { INT mode = 0; switch(nBands) { case PS_BANDS_COARSE: mode = PS_RES_COARSE; break; case PS_BANDS_MID: mode = PS_RES_MID; break; default: mode = 0; } if(rotType==PS_ICC_ROT_B){ mode += 3; } return mode; } static INT getIIDMode(const INT nBands, const INT iidRes) { INT mode = 0; switch(nBands) { case PS_BANDS_COARSE: mode = PS_RES_COARSE; break; case PS_BANDS_MID: mode = PS_RES_MID; break; default: mode = 0; break; } if(iidRes == PS_IID_RES_FINE){ mode += 3; } return mode; } static INT envelopeReducible(FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], INT psBands, INT nEnvelopes) { #define THRESH_SCALE 7 INT reducible = 1; /* true */ INT e = 0, b = 0; FIXP_DBL dIid = FL2FXCONST_DBL(0.f); FIXP_DBL dIcc = FL2FXCONST_DBL(0.f); FIXP_DBL iidErrThreshold, iccErrThreshold; FIXP_DBL iidMeanError, iccMeanError; /* square values to prevent sqrt, multiply bands to prevent division; bands shifted DFRACT_BITS instead (DFRACT_BITS-1) because fMultDiv2 used*/ iidErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(6.5f*6.5f/(IID_SCALE_FT*IID_SCALE_FT)), (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); iccErrThreshold = fMultDiv2 ( FL2FXCONST_DBL(0.75f*0.75f), (FIXP_DBL)(psBands<<((DFRACT_BITS)-THRESH_SCALE)) ); if (nEnvelopes <= 1) { reducible = 0; } else { /* mean error criterion */ for (e=0; (e < nEnvelopes/2) && (reducible!=0 ) ; e++) { iidMeanError = iccMeanError = FL2FXCONST_DBL(0.f); for(b=0; b>1) - (iid[2*e+1][b]>>1); /* scale 1 bit; squared -> 2 bit */ dIcc = (icc[2*e][b]>>1) - (icc[2*e+1][b]>>1); iidMeanError += fPow2Div2(dIid)>>(5-1); /* + (bands=20) scale = 5 */ iccMeanError += fPow2Div2(dIcc)>>(5-1); } /* --> scaling = 7 bit = THRESH_SCALE !! */ /* instead sqrt values are squared! instead of division, multiply threshold with psBands scaling necessary!! */ /* quit as soon as threshold is reached */ if ( (iidMeanError > (iidErrThreshold)) || (iccMeanError > (iccErrThreshold)) ) { reducible = 0; } } } /* nEnvelopes != 1 */ return reducible; } static void processIidData(PS_DATA *psData, FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], const INT psBands, const INT nEnvelopes, const FIXP_DBL quantErrorThreshold) { INT iidIdxFine [PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT iidIdxCoarse[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL errIID = FL2FXCONST_DBL(0.f); FIXP_DBL errIIDFine = FL2FXCONST_DBL(0.f); INT bitsIidFreq = 0; INT bitsIidTime = 0; INT bitsFineTot = 0; INT bitsCoarseTot = 0; INT error = 0; INT env, band; INT diffMode[PS_MAX_ENVELOPES], diffModeFine[PS_MAX_ENVELOPES]; INT loudnDiff = 0; INT iidTransmit = 0; bitsIidFreq = bitsIidTime = 0; /* Quantize IID coefficients */ for(env=0;enviidEnable = 0; for(env=0;env fMultI(FL2FXCONST_DBL(0.7f),iidTransmit)){ /* 0.7f empiric value */ psData->iidEnable = 1; } /* if iid not active -> RESET data */ if(psData->iidEnable==0) { psData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; for(env=0;enviidDiffMode[env] = PS_DELTA_FREQ; FDKmemclear(psData->iidIdx[env], sizeof(INT)*psBands); } return; } /* count COARSE quantization bits for first envelope*/ bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], NULL, psBands, PS_IID_RES_COARSE, PS_DELTA_FREQ, &error); if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_FINE) ) { bitsIidTime = DO_NOT_USE_THIS_MODE; } else { bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxCoarse[0], psData->iidIdxLast, psBands, PS_IID_RES_COARSE, PS_DELTA_TIME, &error); } /* decision DELTA_FREQ vs DELTA_TIME */ if(bitsIidTime>bitsIidFreq) { diffMode[0] = PS_DELTA_FREQ; bitsCoarseTot = bitsIidFreq; } else { diffMode[0] = PS_DELTA_TIME; bitsCoarseTot = bitsIidTime; } /* count COARSE quantization bits for following envelopes*/ for(env=1;envbitsIidFreq) { diffMode[env] = PS_DELTA_FREQ; bitsCoarseTot += bitsIidFreq; } else { diffMode[env] = PS_DELTA_TIME; bitsCoarseTot += bitsIidTime; } } /* count FINE quantization bits for first envelope*/ bitsIidFreq = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], NULL, psBands, PS_IID_RES_FINE, PS_DELTA_FREQ, &error); if( (psData->iidTimeCnt>=MAX_TIME_DIFF_FRAMES) || (psData->iidQuantModeLast==PS_IID_RES_COARSE) ) { bitsIidTime = DO_NOT_USE_THIS_MODE; } else { bitsIidTime = FDKsbrEnc_EncodeIid(NULL, iidIdxFine[0], psData->iidIdxLast, psBands, PS_IID_RES_FINE, PS_DELTA_TIME, &error); } /* decision DELTA_FREQ vs DELTA_TIME */ if(bitsIidTime>bitsIidFreq) { diffModeFine[0] = PS_DELTA_FREQ; bitsFineTot = bitsIidFreq; } else { diffModeFine[0] = PS_DELTA_TIME; bitsFineTot = bitsIidTime; } /* count FINE quantization bits for following envelopes*/ for(env=1;envbitsIidFreq) { diffModeFine[env] = PS_DELTA_FREQ; bitsFineTot += bitsIidFreq; } else { diffModeFine[env] = PS_DELTA_TIME; bitsFineTot += bitsIidTime; } } if(bitsFineTot == bitsCoarseTot){ /* if same number of bits is needed, use the quantization with lower error */ if(errIIDFine < errIID){ bitsCoarseTot = DO_NOT_USE_THIS_MODE; } else { bitsFineTot = DO_NOT_USE_THIS_MODE; } } else { /* const FIXP_DBL minThreshold = FL2FXCONST_DBL(0.2f/(IID_SCALE_FT*PS_QUANT_SCALE_FT)*(psBands*nEnvelopes)); */ const FIXP_DBL minThreshold = (FIXP_DBL)((LONG)0x00019999 * (psBands*nEnvelopes)); /* decision RES_FINE vs RES_COARSE */ /* test if errIIDFine*quantErrorThreshold < errIID */ /* shiftVal 2 comes from scaling of quantErrorThreshold */ if(fixMax(((errIIDFine>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIIDFine)) < (errIID>>2) ) { bitsCoarseTot = DO_NOT_USE_THIS_MODE; } else if(fixMax(((errIID>>1)+(minThreshold>>1))>>1, fMult(quantErrorThreshold,errIID)) < (errIIDFine>>2) ) { bitsFineTot = DO_NOT_USE_THIS_MODE; } } /* decision RES_FINE vs RES_COARSE */ if(bitsFineTotiidQuantMode = PS_IID_RES_FINE; for(env=0;enviidDiffMode[env] = diffModeFine[env]; FDKmemcpy(psData->iidIdx[env], iidIdxFine[env], psBands*sizeof(INT)); } } else { psData->iidQuantMode = PS_IID_RES_COARSE; for(env=0;enviidDiffMode[env] = diffMode[env]; FDKmemcpy(psData->iidIdx[env], iidIdxCoarse[env], psBands*sizeof(INT)); } } /* Count DELTA_TIME encoding streaks */ for(env=0;enviidDiffMode[env]==PS_DELTA_TIME) psData->iidTimeCnt++; else psData->iidTimeCnt=0; } } static INT similarIid(PS_DATA *psData, const INT psBands, const INT nEnvelopes) { const INT diffThr = (psData->iidQuantMode == PS_IID_RES_COARSE) ? 2 : 3; const INT sumDiffThr = diffThr * psBands/4; INT similar = 0; INT diff = 0; INT sumDiff = 0; INT env = 0; INT b = 0; if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { similar = 1; for (env=0; enviidIdx[env][b] - psData->iidIdxLast[b]); sumDiff += diff; if ( (diff > diffThr) /* more than x quantization steps in any band */ || (sumDiff > sumDiffThr) ) { /* more than x quantisations steps overall difference */ similar = 0; } b++; } while ((b0)); } } /* nEnvelopes==1 */ return similar; } static INT similarIcc(PS_DATA *psData, const INT psBands, const INT nEnvelopes) { const INT diffThr = 2; const INT sumDiffThr = diffThr * psBands/4; INT similar = 0; INT diff = 0; INT sumDiff = 0; INT env = 0; INT b = 0; if ((nEnvelopes == psData->nEnvelopesLast) && (nEnvelopes==1)) { similar = 1; for (env=0; enviccIdx[env][b] - psData->iccIdxLast[b]); sumDiff += diff; if ( (diff > diffThr) /* more than x quantisation step in any band */ || (sumDiff > sumDiffThr) ) { /* more than x quantisations steps overall difference */ similar = 0; } b++; } while ((b0)); } } /* nEnvelopes==1 */ return similar; } static void processIccData(PS_DATA *psData, FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], /* const input values: unable to declare as const, since it does not poINT to const memory */ const INT psBands, const INT nEnvelopes) { FIXP_DBL errICC = FL2FXCONST_DBL(0.f); INT env, band; INT bitsIccFreq, bitsIccTime; INT error = 0; INT inCoherence=0, iccTransmit=0; INT *iccIdxLast; iccIdxLast = psData->iccIdxLast; /* Quantize ICC coefficients */ for(env=0;enviccIdx[env]); } /* Check if ICC coefficients should be used */ psData->iccEnable = 0; for(env=0;enviccIdx[env][band]; iccTransmit ++; } } if(inCoherence > fMultI(FL2FXCONST_DBL(0.5f),iccTransmit)){ /* 0.5f empiric value */ psData->iccEnable = 1; } if(psData->iccEnable==0) { psData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; for(env=0;enviccDiffMode[env] = PS_DELTA_FREQ; FDKmemclear(psData->iccIdx[env], sizeof(INT)*psBands); } return; } for(env=0;enviccIdx[env], NULL, psBands, PS_DELTA_FREQ, &error); if(psData->iccTimeCnticcIdx[env], iccIdxLast, psBands, PS_DELTA_TIME, &error); } else { bitsIccTime = DO_NOT_USE_THIS_MODE; } if(bitsIccFreq>bitsIccTime) { psData->iccDiffMode[env] = PS_DELTA_TIME; psData->iccTimeCnt++; } else { psData->iccDiffMode[env] = PS_DELTA_FREQ; psData->iccTimeCnt=0; } iccIdxLast = psData->iccIdx[env]; } } static void calculateIID(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL iid[PS_MAX_ENVELOPES][PS_MAX_BANDS], INT nEnvelopes, INT psBands) { INT i=0; INT env=0; for(env=0; env>(LD_DATA_SHIFT+1)) ); IID = fixMax( IID, (FIXP_DBL)(MINVAL_DBL>>(LD_DATA_SHIFT+1)) ); iid[env][i] = IID << (LD_DATA_SHIFT+1); } } } static void calculateICC(FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS], FIXP_DBL icc[PS_MAX_ENVELOPES][PS_MAX_BANDS], INT nEnvelopes, INT psBands) { INT i = 0; INT env = 0; INT border = psBands; switch (psBands) { case PS_BANDS_COARSE: border = 5; break; case PS_BANDS_MID: border = 11; break; default: break; } for(env=0; env>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); INT scale, invScale = CountLeadingBits(invNrg); scale = (DFRACT_BITS-1) - invScale; ICC = fMult(pwrCr[env][i], invNrg<>1)>>1) - (FIXP_DBL)((sc1-1)<<(DFRACT_BITS-1-LD_DATA_SHIFT)) ); FIXP_DBL invNrg = CalcInvLdData ( -((ldPwrL[env][i]>>1) + (ldPwrR[env][i]>>1) + (FIXP_DBL)1) ); sc1 = CountLeadingBits(invNrg); invNrg <<= sc1; sc2 = CountLeadingBits(ICC); ICC = fMult(ICC<>= -sc1; } else { if (ICC >= ((FIXP_DBL)MAXVAL_DBL>>sc1) ) ICC = (FIXP_DBL)MAXVAL_DBL; else ICC <<= sc1; } icc[env][i] = ICC; } } } void FDKsbrEnc_initPsBandNrgScale(HANDLE_PS_ENCODE hPsEncode) { INT group, bin; INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; FDKmemclear(hPsEncode->psBandNrgScale, PS_MAX_BANDS*sizeof(SCHAR)); for (group=0; group < nIidGroups; group++) { /* Translate group to bin */ bin = hPsEncode->subband2parameterIndex[group]; /* Translate from 20 bins to 10 bins */ if (hPsEncode->psEncMode == PS_BANDS_COARSE) { bin = bin>>1; } hPsEncode->psBandNrgScale[bin] = (hPsEncode->psBandNrgScale[bin]==0) ? (hPsEncode->iidGroupWidthLd[group] + 5) : (fixMax(hPsEncode->iidGroupWidthLd[group],hPsEncode->psBandNrgScale[bin]) + 1) ; } } FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode( HANDLE_PS_ENCODE *phPsEncode ) { FDK_PSENC_ERROR error = PSENC_OK; if (phPsEncode==NULL) { error = PSENC_INVALID_HANDLE; } else { HANDLE_PS_ENCODE hPsEncode = NULL; if (NULL==(hPsEncode = GetRam_PsEncode())) { error = PSENC_MEMORY_ERROR; goto bail; } FDKmemclear(hPsEncode,sizeof(PS_ENCODE)); *phPsEncode = hPsEncode; /* return allocated handle */ } bail: return error; } FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode( HANDLE_PS_ENCODE hPsEncode, const PS_BANDS psEncMode, const FIXP_DBL iidQuantErrorThreshold ) { FDK_PSENC_ERROR error = PSENC_OK; if (NULL==hPsEncode) { error = PSENC_INVALID_HANDLE; } else { if (PSENC_OK != (InitPSData(&hPsEncode->psData))) { goto bail; } switch(psEncMode){ case PS_BANDS_COARSE: case PS_BANDS_MID: hPsEncode->nQmfIidGroups = QMF_GROUPS_LO_RES; hPsEncode->nSubQmfIidGroups = SUBQMF_GROUPS_LO_RES; FDKmemcpy(hPsEncode->iidGroupBorders, iidGroupBordersLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups + 1)*sizeof(INT)); FDKmemcpy(hPsEncode->subband2parameterIndex, subband2parameter20, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) *sizeof(INT)); FDKmemcpy(hPsEncode->iidGroupWidthLd, iidGroupWidthLdLoRes, (hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups) *sizeof(UCHAR)); break; default: error = PSENC_INIT_ERROR; goto bail; } hPsEncode->psEncMode = psEncMode; hPsEncode->iidQuantErrorThreshold = iidQuantErrorThreshold; FDKsbrEnc_initPsBandNrgScale(hPsEncode); } bail: return error; } FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode( HANDLE_PS_ENCODE *phPsEncode ) { FDK_PSENC_ERROR error = PSENC_OK; if (NULL !=phPsEncode) { FreeRam_PsEncode(phPsEncode); } return error; } typedef struct { FIXP_DBL pwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL pwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL ldPwrL[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL ldPwrR[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL pwrCr[PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL pwrCi[PS_MAX_ENVELOPES][PS_MAX_BANDS]; } PS_PWR_DATA; FDK_PSENC_ERROR FDKsbrEnc_PSEncode( HANDLE_PS_ENCODE hPsEncode, HANDLE_PS_OUT hPsOut, UCHAR *dynBandScale, UINT maxEnvelopes, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], const INT frameSize, const INT sendHeader ) { FDK_PSENC_ERROR error = PSENC_OK; HANDLE_PS_DATA hPsData = &hPsEncode->psData; FIXP_DBL iid [PS_MAX_ENVELOPES][PS_MAX_BANDS]; FIXP_DBL icc [PS_MAX_ENVELOPES][PS_MAX_BANDS]; int envBorder[PS_MAX_ENVELOPES+1]; int group, bin, col, subband, band; int i = 0; int env = 0; int psBands = (int) hPsEncode->psEncMode; int nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; int nEnvelopes = fixMin(maxEnvelopes, (UINT)PS_MAX_ENVELOPES); C_ALLOC_SCRATCH_START(pwrData, PS_PWR_DATA, 1); for(env=0; envpwrL[env][band] = pwrData->pwrR[env][band] = pwrData->pwrCr[env][band] = pwrData->pwrCi[env][band] = FIXP_DBL(1); } /**** calculate energies and correlation ****/ /* start with hybrid data */ for (group=0; group < nIidGroups; group++) { /* Translate group to bin */ bin = hPsEncode->subband2parameterIndex[group]; /* Translate from 20 bins to 10 bins */ if (hPsEncode->psEncMode == PS_BANDS_COARSE) { bin >>= 1; } /* determine group border */ int bScale = hPsEncode->psBandNrgScale[bin]; FIXP_DBL pwrL_env_bin = pwrData->pwrL[env][bin]; FIXP_DBL pwrR_env_bin = pwrData->pwrR[env][bin]; FIXP_DBL pwrCr_env_bin = pwrData->pwrCr[env][bin]; FIXP_DBL pwrCi_env_bin = pwrData->pwrCi[env][bin]; int scale = (int)dynBandScale[bin]; for (col=envBorder[env]; coliidGroupBorders[group]; subband < hPsEncode->iidGroupBorders[group+1]; subband++) { FIXP_QMF l_real = (hybridData[col][0][0][subband]) << scale; FIXP_QMF l_imag = (hybridData[col][0][1][subband]) << scale; FIXP_QMF r_real = (hybridData[col][1][0][subband]) << scale; FIXP_QMF r_imag = (hybridData[col][1][1][subband]) << scale; pwrL_env_bin += (fPow2Div2(l_real) + fPow2Div2(l_imag)) >> bScale; pwrR_env_bin += (fPow2Div2(r_real) + fPow2Div2(r_imag)) >> bScale; pwrCr_env_bin += (fMultDiv2(l_real, r_real) + fMultDiv2(l_imag, r_imag)) >> bScale; pwrCi_env_bin += (fMultDiv2(r_real, l_imag) - fMultDiv2(l_real, r_imag)) >> bScale; } } /* assure, nrg's of left and right channel are not negative; necessary on 16 bit multiply units */ pwrData->pwrL[env][bin] = fixMax((FIXP_DBL)0,pwrL_env_bin); pwrData->pwrR[env][bin] = fixMax((FIXP_DBL)0,pwrR_env_bin); pwrData->pwrCr[env][bin] = pwrCr_env_bin; pwrData->pwrCi[env][bin] = pwrCi_env_bin; } /* nIidGroups */ /* calc logarithmic energy */ LdDataVector(pwrData->pwrL[env], pwrData->ldPwrL[env], psBands); LdDataVector(pwrData->pwrR[env], pwrData->ldPwrR[env], psBands); } /* nEnvelopes */ /* calculate iid and icc */ calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); /*** Envelope Reduction ***/ while (envelopeReducible(iid,icc,psBands,nEnvelopes)) { int e=0; /* sum energies of two neighboring envelopes */ nEnvelopes >>= 1; for (e=0; epwrL[2*e], pwrData->pwrL[2*e+1], pwrData->pwrL[e], psBands); FDKsbrEnc_addFIXP_DBL(pwrData->pwrR[2*e], pwrData->pwrR[2*e+1], pwrData->pwrR[e], psBands); FDKsbrEnc_addFIXP_DBL(pwrData->pwrCr[2*e],pwrData->pwrCr[2*e+1],pwrData->pwrCr[e],psBands); FDKsbrEnc_addFIXP_DBL(pwrData->pwrCi[2*e],pwrData->pwrCi[2*e+1],pwrData->pwrCi[e],psBands); /* calc logarithmic energy */ LdDataVector(pwrData->pwrL[e], pwrData->ldPwrL[e], psBands); LdDataVector(pwrData->pwrR[e], pwrData->ldPwrR[e], psBands); /* reduce number of envelopes and adjust borders */ envBorder[e] = envBorder[2*e]; } envBorder[nEnvelopes] = envBorder[2*nEnvelopes]; /* re-calculate iid and icc */ calculateIID(pwrData->ldPwrL, pwrData->ldPwrR, iid, nEnvelopes, psBands); calculateICC(pwrData->ldPwrL, pwrData->ldPwrR, pwrData->pwrCr, pwrData->pwrCi, icc, nEnvelopes, psBands); } /* */ if(sendHeader) { hPsData->headerCnt = MAX_PS_NOHEADER_CNT; hPsData->iidTimeCnt = MAX_TIME_DIFF_FRAMES; hPsData->iccTimeCnt = MAX_TIME_DIFF_FRAMES; hPsData->noEnvCnt = MAX_NOENV_CNT; } /*** Parameter processing, quantisation etc ***/ processIidData(hPsData, iid, psBands, nEnvelopes, hPsEncode->iidQuantErrorThreshold); processIccData(hPsData, icc, psBands, nEnvelopes); /*** Initialize output struct ***/ /* PS Header on/off ? */ if( (hPsData->headerCntiidQuantMode == hPsData->iidQuantModeLast) && (hPsData->iccQuantMode == hPsData->iccQuantModeLast) ) && ( (hPsData->iidEnable == hPsData->iidEnableLast) && (hPsData->iccEnable == hPsData->iccEnableLast) ) ) { hPsOut->enablePSHeader = 0; } else { hPsOut->enablePSHeader = 1; hPsData->headerCnt = 0; } /* nEnvelopes = 0 ? */ if ( (hPsData->noEnvCnt < MAX_NOENV_CNT) && (similarIid(hPsData, psBands, nEnvelopes)) && (similarIcc(hPsData, psBands, nEnvelopes)) ) { hPsOut->nEnvelopes = nEnvelopes = 0; hPsData->noEnvCnt++; } else { hPsData->noEnvCnt = 0; } if (nEnvelopes>0) { hPsOut->enableIID = hPsData->iidEnable; hPsOut->iidMode = getIIDMode(psBands, hPsData->iidQuantMode); hPsOut->enableICC = hPsData->iccEnable; hPsOut->iccMode = getICCMode(psBands, hPsData->iccQuantMode); hPsOut->enableIpdOpd = 0; hPsOut->frameClass = 0; hPsOut->nEnvelopes = nEnvelopes; for(env=0; envframeBorder[env] = envBorder[env+1]; } for(env=0; envnEnvelopes; env++) { hPsOut->deltaIID[env] = (PS_DELTA)hPsData->iidDiffMode[env]; for(band=0; bandiid[env][band] = hPsData->iidIdx[env][band]; } } for(env=0; envnEnvelopes; env++) { hPsOut->deltaICC[env] = (PS_DELTA)hPsData->iccDiffMode[env]; for(band=0; bandicc[env][band] = hPsData->iccIdx[env][band]; } } /* IPD OPD not supported right now */ FDKmemclear(hPsOut->ipd, PS_MAX_ENVELOPES*PS_MAX_BANDS*sizeof(PS_DELTA)); for(env=0; envdeltaIPD[env] = PS_DELTA_FREQ; hPsOut->deltaOPD[env] = PS_DELTA_FREQ; } FDKmemclear(hPsOut->ipdLast, PS_MAX_BANDS*sizeof(INT)); FDKmemclear(hPsOut->opdLast, PS_MAX_BANDS*sizeof(INT)); for(band=0; bandiidLast[band] = hPsData->iidIdxLast[band]; hPsOut->iccLast[band] = hPsData->iccIdxLast[band]; } /* save iids and iccs for differential time coding in the next frame */ hPsData->nEnvelopesLast = nEnvelopes; hPsData->iidEnableLast = hPsData->iidEnable; hPsData->iccEnableLast = hPsData->iccEnable; hPsData->iidQuantModeLast = hPsData->iidQuantMode; hPsData->iccQuantModeLast = hPsData->iccQuantMode; for (i=0; iiidIdxLast[i] = hPsData->iidIdx[nEnvelopes-1][i]; hPsData->iccIdxLast[i] = hPsData->iccIdx[nEnvelopes-1][i]; } } /* Envelope > 0 */ C_ALLOC_SCRATCH_END(pwrData, PS_PWR_DATA, 1) return error; } fdk-aac-0.1.3/libSBRenc/src/code_env.h0000644000175000017500000001423412372261464017743 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief DPCM Envelope coding */ #ifndef __CODE_ENV_H #define __CODE_ENV_H #include "sbr_def.h" #include "bit_sbr.h" #include "fram_gen.h" typedef struct { INT offset; INT upDate; INT nSfb[2]; SCHAR sfb_nrg_prev[MAX_FREQ_COEFFS]; INT deltaTAcrossFrames; FIXP_DBL dF_edge_1stEnv; FIXP_DBL dF_edge_incr; INT dF_edge_incr_fac; INT codeBookScfLavTime; INT codeBookScfLavFreq; INT codeBookScfLavLevelTime; INT codeBookScfLavLevelFreq; INT codeBookScfLavBalanceTime; INT codeBookScfLavBalanceFreq; INT start_bits; INT start_bits_balance; const UCHAR *hufftableTimeL; const UCHAR *hufftableFreqL; const UCHAR *hufftableLevelTimeL; const UCHAR *hufftableBalanceTimeL; const UCHAR *hufftableLevelFreqL; const UCHAR *hufftableBalanceFreqL; } SBR_CODE_ENVELOPE; typedef SBR_CODE_ENVELOPE *HANDLE_SBR_CODE_ENVELOPE; void FDKsbrEnc_codeEnvelope (SCHAR *sfb_nrg, const FREQ_RES *freq_res, SBR_CODE_ENVELOPE * h_sbrCodeEnvelope, INT *directionVec, INT coupling, INT nEnvelopes, INT channel, INT headerActive); INT FDKsbrEnc_InitSbrCodeEnvelope (HANDLE_SBR_CODE_ENVELOPE h_sbrCodeEnvelope, INT *nSfb, INT deltaTAcrossFrames, FIXP_DBL dF_edge_1stEnv, FIXP_DBL dF_edge_incr); INT FDKsbrEnc_InitSbrHuffmanTables (struct SBR_ENV_DATA* sbrEnvData, HANDLE_SBR_CODE_ENVELOPE henv, HANDLE_SBR_CODE_ENVELOPE hnoise, AMP_RES amp_res); #endif fdk-aac-0.1.3/libSBRenc/src/env_bit.cpp0000644000175000017500000002155212372261464020143 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Remaining SBR Bit Writing Routines */ #include "env_bit.h" #include "cmondata.h" #ifndef min #define min(a,b) ( a < b ? a:b) #endif #ifndef max #define max(a,b) ( a > b ? a:b) #endif /* ***************************** crcAdvance **********************************/ /** * @fn * @brief updates crc data register * @return none * * This function updates the crc register * */ static void crcAdvance(USHORT crcPoly, USHORT crcMask, USHORT *crc, ULONG bValue, INT bBits ) { INT i; USHORT flag; for (i=bBits-1; i>=0; i--) { flag = ((*crc) & crcMask) ? (1) : (0) ; flag ^= (bValue & (1<sbrBitbuf, BS_WRITER); FDKinitBitStream(&hCmonData->tmpWriteBitbuf, memoryBase, memorySize, 0, BS_WRITER); if (sbrSyntaxFlags & SBR_SYNTAX_CRC) { if (sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC) { /* Init and start CRC region */ FDKwriteBits (&hCmonData->sbrBitbuf, 0x0, SI_SBR_DRM_CRC_BITS); FDKcrcInit( hCrcInfo, 0x001d, 0xFFFF, SI_SBR_DRM_CRC_BITS ); crcRegion = FDKcrcStartReg( hCrcInfo, &hCmonData->sbrBitbuf, 0 ); } else { FDKwriteBits (&hCmonData->sbrBitbuf, 0x0, SI_SBR_CRC_BITS); } } return (crcRegion); } /* ************************** FDKsbrEnc_AssembleSbrBitstream *******************************/ /** * @fn * @brief Formats the SBR payload * @return nothing * * Also the CRC will be calculated here. * */ void FDKsbrEnc_AssembleSbrBitstream( HANDLE_COMMON_DATA hCmonData, HANDLE_FDK_CRCINFO hCrcInfo, INT crcRegion, UINT sbrSyntaxFlags) { USHORT crcReg = SBR_CRCINIT; INT numCrcBits,i; /* check if SBR is present */ if ( hCmonData==NULL ) return; hCmonData->sbrFillBits = 0; /* Fill bits are written only for GA streams */ if ( sbrSyntaxFlags & SBR_SYNTAX_DRM_CRC ) { /* * Calculate and write DRM CRC */ FDKcrcEndReg( hCrcInfo, &hCmonData->sbrBitbuf, crcRegion ); FDKwriteBits( &hCmonData->tmpWriteBitbuf, FDKcrcGetCRC(hCrcInfo)^0xFF, SI_SBR_DRM_CRC_BITS ); } else { if ( !(sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ) { /* Do alignment here, because its defined as part of the sbr_extension_data */ int sbrLoad = hCmonData->sbrHdrBits + hCmonData->sbrDataBits; if ( sbrSyntaxFlags & SBR_SYNTAX_CRC ) { sbrLoad += SI_SBR_CRC_BITS; } sbrLoad += 4; /* Do byte Align with 4 bit offset. ISO/IEC 14496-3:2005(E) page 39. */ hCmonData->sbrFillBits = (8 - (sbrLoad % 8)) % 8; /* append fill bits */ FDKwriteBits(&hCmonData->sbrBitbuf, 0, hCmonData->sbrFillBits ); FDK_ASSERT(FDKgetValidBits(&hCmonData->sbrBitbuf) % 8 == 4); } /* calculate crc */ if ( sbrSyntaxFlags & SBR_SYNTAX_CRC ) { FDK_BITSTREAM tmpCRCBuf = hCmonData->sbrBitbuf; FDKresetBitbuffer( &tmpCRCBuf, BS_READER ); numCrcBits = hCmonData->sbrHdrBits + hCmonData->sbrDataBits + hCmonData->sbrFillBits; for(i=0;itmpWriteBitbuf, crcReg, SI_SBR_CRC_BITS); } } FDKsyncCache(&hCmonData->tmpWriteBitbuf); } fdk-aac-0.1.3/libSBRenc/src/invf_est.h0000644000175000017500000001547412372261464020005 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Inverse Filtering detection prototypes */ #ifndef _INV_FILT_DET_H #define _INV_FILT_DET_H #include "sbr_encoder.h" #include "sbr_def.h" #define INVF_SMOOTHING_LENGTH 2 typedef struct { const FIXP_DBL *quantStepsSbr; const FIXP_DBL *quantStepsOrig; const FIXP_DBL *nrgBorders; INT numRegionsSbr; INT numRegionsOrig; INT numRegionsNrg; INVF_MODE regionSpace[5][5]; INVF_MODE regionSpaceTransient[5][5]; INT EnergyCompFactor[5]; }DETECTOR_PARAMETERS; typedef struct { FIXP_DBL origQuotaMean[INVF_SMOOTHING_LENGTH+1]; FIXP_DBL sbrQuotaMean[INVF_SMOOTHING_LENGTH+1]; FIXP_DBL origQuotaMeanStrongest[INVF_SMOOTHING_LENGTH+1]; FIXP_DBL sbrQuotaMeanStrongest[INVF_SMOOTHING_LENGTH+1]; FIXP_DBL origQuotaMeanFilt; FIXP_DBL sbrQuotaMeanFilt; FIXP_DBL origQuotaMeanStrongestFilt; FIXP_DBL sbrQuotaMeanStrongestFilt; FIXP_DBL origQuotaMax; FIXP_DBL sbrQuotaMax; FIXP_DBL avgNrg; }DETECTOR_VALUES; typedef struct { INT numberOfStrongest; INT prevRegionSbr[MAX_NUM_NOISE_VALUES]; INT prevRegionOrig[MAX_NUM_NOISE_VALUES]; INT freqBandTableInvFilt[MAX_NUM_NOISE_VALUES]; INT noDetectorBands; INT noDetectorBandsMax; const DETECTOR_PARAMETERS *detectorParams; INVF_MODE prevInvfMode[MAX_NUM_NOISE_VALUES]; DETECTOR_VALUES detectorValues[MAX_NUM_NOISE_VALUES]; FIXP_DBL nrgAvg; FIXP_DBL wmQmf[MAX_NUM_NOISE_VALUES]; } SBR_INV_FILT_EST; typedef SBR_INV_FILT_EST *HANDLE_SBR_INV_FILT_EST; void FDKsbrEnc_qmfInverseFilteringDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, FIXP_DBL ** quotaMatrix, FIXP_DBL *nrgVector, SCHAR *indexVector, INT startIndex, INT stopIndex, INT transientFlag, INVF_MODE* infVec); INT FDKsbrEnc_initInvFiltDetector (HANDLE_SBR_INV_FILT_EST hInvFilt, INT* freqBandTableDetector, INT numDetectorBands, UINT useSpeechConfig); INT FDKsbrEnc_resetInvFiltDetector(HANDLE_SBR_INV_FILT_EST hInvFilt, INT* freqBandTableDetector, INT numDetectorBands); #endif /* _QMF_INV_FILT_H */ fdk-aac-0.1.3/libSBRenc/src/sbr_misc.cpp0000644000175000017500000002142712372261464020317 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr miscellaneous helper functions */ #include "sbr_misc.h" void FDKsbrEnc_Shellsort_fract (FIXP_DBL *in, INT n) { FIXP_DBL v; INT i, j; INT inc = 1; do inc = 3 * inc + 1; while (inc <= n); do { inc = inc / 3; for (i = inc + 1; i <= n; i++) { v = in[i-1]; j = i; while (in[j-inc-1] > v) { in[j-1] = in[j-inc-1]; j -= inc; if (j <= inc) break; } in[j-1] = v; } } while (inc > 1); } /* Sorting routine */ void FDKsbrEnc_Shellsort_int (INT *in, INT n) { INT i, j, v; INT inc = 1; do inc = 3 * inc + 1; while (inc <= n); do { inc = inc / 3; for (i = inc + 1; i <= n; i++) { v = in[i-1]; j = i; while (in[j-inc-1] > v) { in[j-1] = in[j-inc-1]; j -= inc; if (j <= inc) break; } in[j-1] = v; } } while (inc > 1); } /******************************************************************************* Functionname: FDKsbrEnc_AddVecLeft ******************************************************************************* Description: Arguments: INT* dst, INT* length_dst, INT* src, INT length_src Return: none *******************************************************************************/ void FDKsbrEnc_AddVecLeft (INT *dst, INT *length_dst, INT *src, INT length_src) { INT i; for (i = length_src - 1; i >= 0; i--) FDKsbrEnc_AddLeft (dst, length_dst, src[i]); } /******************************************************************************* Functionname: FDKsbrEnc_AddLeft ******************************************************************************* Description: Arguments: INT* vector, INT* length_vector, INT value Return: none *******************************************************************************/ void FDKsbrEnc_AddLeft (INT *vector, INT *length_vector, INT value) { INT i; for (i = *length_vector; i > 0; i--) vector[i] = vector[i - 1]; vector[0] = value; (*length_vector)++; } /******************************************************************************* Functionname: FDKsbrEnc_AddRight ******************************************************************************* Description: Arguments: INT* vector, INT* length_vector, INT value Return: none *******************************************************************************/ void FDKsbrEnc_AddRight (INT *vector, INT *length_vector, INT value) { vector[*length_vector] = value; (*length_vector)++; } /******************************************************************************* Functionname: FDKsbrEnc_AddVecRight ******************************************************************************* Description: Arguments: INT* dst, INT* length_dst, INT* src, INT length_src) Return: none *******************************************************************************/ void FDKsbrEnc_AddVecRight (INT *dst, INT *length_dst, INT *src, INT length_src) { INT i; for (i = 0; i < length_src; i++) FDKsbrEnc_AddRight (dst, length_dst, src[i]); } /***************************************************************************** functionname: FDKsbrEnc_LSI_divide_scale_fract description: Calculates division with best precision and scales the result. return: num*scale/denom *****************************************************************************/ FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, FIXP_DBL scale) { FIXP_DBL tmp = FL2FXCONST_DBL(0.0f); if (num != FL2FXCONST_DBL(0.0f)) { INT shiftCommon; INT shiftNum = CountLeadingBits(num); INT shiftDenom = CountLeadingBits(denom); INT shiftScale = CountLeadingBits(scale); num = num << shiftNum; scale = scale << shiftScale; tmp = fMultDiv2(num,scale); if ( denom > (tmp >> fixMin(shiftNum+shiftScale-1,(DFRACT_BITS-1))) ) { denom = denom << shiftDenom; tmp = schur_div(tmp,denom,15); shiftCommon = fixMin((shiftNum-shiftDenom+shiftScale-1),(DFRACT_BITS-1)); if (shiftCommon < 0) tmp <<= -shiftCommon; else tmp >>= shiftCommon; } else { tmp = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL; } } return (tmp); } fdk-aac-0.1.3/libSBRenc/src/resampler.h0000644000175000017500000001613112372261464020151 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #ifndef __RESAMPLER_H #define __RESAMPLER_H /*! \file \brief Fixed Point Resampler Tool Box */ #include "common_fix.h" /**************************************************************************/ /* BIQUAD Filter Structure */ /**************************************************************************/ #define MAXNR_SECTIONS (15) #ifdef RS_BIQUAD_STATES16 typedef FIXP_SGL FIXP_BQS; #else typedef FIXP_DBL FIXP_BQS; #endif typedef struct { FIXP_BQS states[MAXNR_SECTIONS+1][2]; /*! state buffer */ const FIXP_SGL *coeffa; /*! pointer to filter coeffs */ FIXP_DBL gain; /*! overall gain factor */ int Wc; /*! normalized cutoff freq * 1000 */ int noCoeffs; /*! number of filter coeffs sets */ int ptr; /*! index to rinbuffers */ } LP_FILTER; /**************************************************************************/ /* Downsampler Structure */ /**************************************************************************/ typedef struct { LP_FILTER downFilter; /*! filter instance */ int ratio; /*! downsampling ration */ int delay; /*! downsampling delay (source fs) */ int pending; /*! number of pending output samples */ } DOWNSAMPLER; /** * \brief Initialized a given downsampler structure. */ INT FDKaacEnc_InitDownsampler(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ INT Wc, /*!< normalized cutoff freq * 1000 */ INT ratio); /*!< downsampler ratio */ /** * \brief Downsample a set of audio samples. numInSamples must be at least equal to the * downsampler ratio. */ INT FDKaacEnc_Downsample(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ INT_PCM *inSamples, /*!< pointer to input samples */ INT numInSamples, /*!< number of input samples */ INT inStride, /*!< increment of input samples */ INT_PCM *outSamples, /*!< pointer to output samples */ INT *numOutSamples, /*!< pointer tp number of output samples */ INT outstride); /*!< increment of output samples */ #endif /* __RESAMPLER_H */ fdk-aac-0.1.3/libSBRenc/src/sbr_def.h0000644000175000017500000002522512372261464017567 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief SBR main definitions */ #ifndef __SBR_DEF_H #define __SBR_DEF_H #include "common_fix.h" #define noError 0 #define HANDLE_ERROR_INFO INT #define ERROR(a,b) 1 #define handBack /* #define SBR_ENV_STATISTICS_BITRATE */ #undef SBR_ENV_STATISTICS_BITRATE /* #define SBR_ENV_STATISTICS */ #undef SBR_ENV_STATISTICS /* #define SBR_PAYLOAD_MONITOR */ #undef SBR_PAYLOAD_MONITOR #define SWAP(a,b) tempr=a, a=b, b=tempr #define TRUE 1 #define FALSE 0 /* Constants */ #define EPS 1e-12 #define LOG2 0.69314718056f /* natural logarithm of 2 */ #define ILOG2 1.442695041f /* 1/LOG2 */ #define RELAXATION_FLOAT (1e-6f) #define RELAXATION (FL2FXCONST_DBL(RELAXATION_FLOAT)) #define RELAXATION_FRACT (FL2FXCONST_DBL(0.524288f)) /* 0.524288f is fractional part of RELAXATION */ #define RELAXATION_SHIFT (19) #define RELAXATION_LD64 (FL2FXCONST_DBL(0.31143075889f))/* (ld64(RELAXATION) */ /************ Definitions ***************/ #define SBR_COMP_MODE_DELTA 0 #define SBR_COMP_MODE_CTS 1 #define MAX_NUM_CHANNELS 2 #define MAX_NOISE_ENVELOPES 2 #define MAX_NUM_NOISE_COEFFS 5 #define MAX_NUM_NOISE_VALUES (MAX_NUM_NOISE_COEFFS*MAX_NOISE_ENVELOPES) #define MAX_NUM_ENVELOPE_VALUES (MAX_ENVELOPES * MAX_FREQ_COEFFS) #define MAX_ENVELOPES 5 #define MAX_FREQ_COEFFS 48 #define MAX_FREQ_COEFFS_FS44100 35 #define MAX_FREQ_COEFFS_FS48000 32 #define QMF_CHANNELS 64 #define QMF_FILTER_LENGTH 640 #define QMF_MAX_TIME_SLOTS 32 #define NO_OF_ESTIMATES_LC 4 #define NO_OF_ESTIMATES_LD 3 #define MAX_NO_OF_ESTIMATES 4 #define NOISE_FLOOR_OFFSET 6 #define NOISE_FLOOR_OFFSET_64 (FL2FXCONST_DBL(0.09375f)) #define LOW_RES 0 #define HIGH_RES 1 #define LO 0 #define HI 1 #define LENGTH_SBR_FRAME_INFO 35 /* 19 */ #define SBR_NSFB_LOW_RES 9 /* 8 */ #define SBR_NSFB_HIGH_RES 18 /* 16 */ #define SBR_XPOS_CTRL_DEFAULT 2 #define SBR_FREQ_SCALE_DEFAULT 2 #define SBR_ALTER_SCALE_DEFAULT 1 #define SBR_NOISE_BANDS_DEFAULT 2 #define SBR_LIMITER_BANDS_DEFAULT 2 #define SBR_LIMITER_GAINS_DEFAULT 2 #define SBR_LIMITER_GAINS_INFINITE 3 #define SBR_INTERPOL_FREQ_DEFAULT 1 #define SBR_SMOOTHING_LENGTH_DEFAULT 0 /* sbr_header */ #define SI_SBR_AMP_RES_BITS 1 #define SI_SBR_COUPLING_BITS 1 #define SI_SBR_START_FREQ_BITS 4 #define SI_SBR_STOP_FREQ_BITS 4 #define SI_SBR_XOVER_BAND_BITS 3 #define SI_SBR_RESERVED_BITS 2 #define SI_SBR_DATA_EXTRA_BITS 1 #define SI_SBR_HEADER_EXTRA_1_BITS 1 #define SI_SBR_HEADER_EXTRA_2_BITS 1 /* sbr_header extra 1 */ #define SI_SBR_FREQ_SCALE_BITS 2 #define SI_SBR_ALTER_SCALE_BITS 1 #define SI_SBR_NOISE_BANDS_BITS 2 /* sbr_header extra 2 */ #define SI_SBR_LIMITER_BANDS_BITS 2 #define SI_SBR_LIMITER_GAINS_BITS 2 #define SI_SBR_INTERPOL_FREQ_BITS 1 #define SI_SBR_SMOOTHING_LENGTH_BITS 1 /* sbr_grid */ #define SBR_CLA_BITS 2 /*!< size of bs_frame_class */ #define SBR_CLA_BITS_LD 1 /*!< size of bs_frame_class */ #define SBR_ENV_BITS 2 /*!< size of bs_num_env_raw */ #define SBR_ABS_BITS 2 /*!< size of bs_abs_bord_raw for HE-AAC */ #define SBR_NUM_BITS 2 /*!< size of bs_num_rel */ #define SBR_REL_BITS 2 /*!< size of bs_rel_bord_raw */ #define SBR_RES_BITS 1 /*!< size of bs_freq_res_flag */ #define SBR_DIR_BITS 1 /*!< size of bs_df_flag */ /* sbr_data */ #define SI_SBR_INVF_MODE_BITS 2 #define SI_SBR_START_ENV_BITS_AMP_RES_3_0 6 #define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0 5 #define SI_SBR_START_NOISE_BITS_AMP_RES_3_0 5 #define SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0 5 #define SI_SBR_START_ENV_BITS_AMP_RES_1_5 7 #define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5 6 #define SI_SBR_EXTENDED_DATA_BITS 1 #define SI_SBR_EXTENSION_SIZE_BITS 4 #define SI_SBR_EXTENSION_ESC_COUNT_BITS 8 #define SI_SBR_EXTENSION_ID_BITS 2 #define SBR_EXTENDED_DATA_MAX_CNT (15+255) #define EXTENSION_ID_PS_CODING 2 /* Envelope coding constants */ #define FREQ 0 #define TIME 1 /* huffman tables */ #define CODE_BOOK_SCF_LAV00 60 #define CODE_BOOK_SCF_LAV01 31 #define CODE_BOOK_SCF_LAV10 60 #define CODE_BOOK_SCF_LAV11 31 #define CODE_BOOK_SCF_LAV_BALANCE11 12 #define CODE_BOOK_SCF_LAV_BALANCE10 24 typedef enum { SBR_AMP_RES_1_5=0, SBR_AMP_RES_3_0 } AMP_RES; typedef enum { XPOS_MDCT, XPOS_MDCT_CROSS, XPOS_LC, XPOS_RESERVED, XPOS_SWITCHED /* not a real choice but used here to control behaviour */ } XPOS_MODE; typedef enum { INVF_OFF = 0, INVF_LOW_LEVEL, INVF_MID_LEVEL, INVF_HIGH_LEVEL, INVF_SWITCHED /* not a real choice but used here to control behaviour */ } INVF_MODE; typedef enum { FREQ_RES_LOW = 0, FREQ_RES_HIGH } FREQ_RES; #endif fdk-aac-0.1.3/libSBRenc/src/sbr_ram.cpp0000644000175000017500000002074412372261464020144 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Memory layout This module declares all static and dynamic memory spaces */ #include "sbr_ram.h" #include "sbr.h" #include "genericStds.h" C_ALLOC_MEM (Ram_SbrDynamic_RAM, FIXP_DBL, ((SBR_ENC_DYN_RAM_SIZE)/sizeof(FIXP_DBL))) /*! \name StaticSbrData Static memory areas, must not be overwritten in other sections of the encoder */ /* @{ */ /*! static sbr encoder instance for one encoder (2 channels) all major static and dynamic memory areas are located in module sbr_ram and sbr rom */ C_ALLOC_MEM (Ram_SbrEncoder, SBR_ENCODER, 1) C_ALLOC_MEM2(Ram_SbrChannel, SBR_CHANNEL, 1, (8)) C_ALLOC_MEM2(Ram_SbrElement, SBR_ELEMENT, 1, (8)) /*! Filter states for QMF-analysis.
Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH */ C_AALLOC_MEM2_L (Ram_Sbr_QmfStatesAnalysis, FIXP_QAS, QMF_FILTER_LENGTH, (8), SECT_DATA_L1) /*! Matrix holding the quota values for all estimates, all channels Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES */ C_ALLOC_MEM2_L (Ram_Sbr_quotaMatrix, FIXP_DBL, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8), SECT_DATA_L1) /*! Matrix holding the sign values for all estimates, all channels Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #MAX_NO_OF_ESTIMATES */ C_ALLOC_MEM2 (Ram_Sbr_signMatrix, INT, (MAX_NO_OF_ESTIMATES*QMF_CHANNELS), (8)) /*! Frequency band table (low res)
Dimension #MAX_FREQ_COEFFS/2+1 */ C_ALLOC_MEM2 (Ram_Sbr_freqBandTableLO, UCHAR, (MAX_FREQ_COEFFS/2+1), (8)) /*! Frequency band table (high res)
Dimension #MAX_FREQ_COEFFS +1 */ C_ALLOC_MEM2 (Ram_Sbr_freqBandTableHI, UCHAR, (MAX_FREQ_COEFFS+1), (8)) /*! vk matser table
Dimension #MAX_FREQ_COEFFS +1 */ C_ALLOC_MEM2 (Ram_Sbr_v_k_master, UCHAR, (MAX_FREQ_COEFFS+1), (8)) /* Missing harmonics detection */ /*! sbr_detectionVectors
Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] */ C_ALLOC_MEM2 (Ram_Sbr_detectionVectors, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) /*! sbr_prevCompVec[
Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] */ C_ALLOC_MEM2 (Ram_Sbr_prevEnvelopeCompensation, UCHAR, MAX_FREQ_COEFFS, (8)) /*! sbr_guideScfb[
Dimension #MAX_NUM_CHANNELS*#MAX_FREQ_COEFFS] */ C_ALLOC_MEM2 (Ram_Sbr_guideScfb, UCHAR, MAX_FREQ_COEFFS, (8)) /*! sbr_guideVectorDetected
Dimension #MAX_NUM_CHANNELS*#MAX_NO_OF_ESTIMATES*#MAX_FREQ_COEFFS] */ C_ALLOC_MEM2 (Ram_Sbr_guideVectorDetected, UCHAR, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) C_ALLOC_MEM2 (Ram_Sbr_guideVectorDiff, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) C_ALLOC_MEM2 (Ram_Sbr_guideVectorOrig, FIXP_DBL, (MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS), (8)) /* Static Parametric Stereo memory */ C_AALLOC_MEM_L(Ram_PsQmfStatesSynthesis, FIXP_DBL, QMF_FILTER_LENGTH/2, SECT_DATA_L1) C_ALLOC_MEM_L (Ram_PsEncode, PS_ENCODE, 1, SECT_DATA_L1) C_ALLOC_MEM (Ram_ParamStereo, PARAMETRIC_STEREO, 1) /* @} */ /*! \name DynamicSbrData Dynamic memory areas, might be reused in other algorithm sections, e.g. the core encoder. */ /* @{ */ /*! Energy buffer for envelope extraction
Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS * #SBR_QMF_CHANNELS */ C_ALLOC_MEM2 (Ram_Sbr_envYBuffer, FIXP_DBL, (QMF_MAX_TIME_SLOTS/2 * QMF_CHANNELS), (8)) FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((FIXP_DBL*) (dynamic_RAM + OFFSET_NRG + (n*Y_2_BUF_BYTE) )); } /* * QMF data */ /* The SBR encoder uses a single channel overlapping buffer set (always n=0), but PS does not. */ FIXP_DBL* GetRam_Sbr_envRBuffer (int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((FIXP_DBL*) (dynamic_RAM + OFFSET_QMF + (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE)) )); } FIXP_DBL* GetRam_Sbr_envIBuffer (int n, UCHAR* dynamic_RAM) { FDK_ASSERT(dynamic_RAM!=0); return ((FIXP_DBL*) (dynamic_RAM + OFFSET_QMF + (ENV_R_BUFF_BYTE) + (n*(ENV_R_BUFF_BYTE+ENV_I_BUFF_BYTE)))); } /* @} */ fdk-aac-0.1.3/libSBRenc/src/ps_bitenc.h0000644000175000017500000001646412372261464020136 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial author: N. Rettelbach contents/description: Parametric Stereo bitstream encoder ******************************************************************************/ #include "ps_main.h" #include "ps_const.h" #include "FDK_bitstream.h" #ifndef PS_BITENC_H #define PS_BITENC_H typedef struct T_PS_OUT { INT enablePSHeader; INT enableIID; INT iidMode; INT enableICC; INT iccMode; INT enableIpdOpd; INT frameClass; INT nEnvelopes; /* ENV data */ INT frameBorder[PS_MAX_ENVELOPES]; /* iid data */ PS_DELTA deltaIID[PS_MAX_ENVELOPES]; INT iid[PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT iidLast[PS_MAX_BANDS]; /* icc data */ PS_DELTA deltaICC[PS_MAX_ENVELOPES]; INT icc[PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT iccLast[PS_MAX_BANDS]; /* ipd data */ PS_DELTA deltaIPD[PS_MAX_ENVELOPES]; INT ipd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT ipdLast[PS_MAX_BANDS]; /* opd data */ PS_DELTA deltaOPD[PS_MAX_ENVELOPES]; INT opd[PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT opdLast[PS_MAX_BANDS]; } PS_OUT, *HANDLE_PS_OUT; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iidVal, const INT *iidValLast, const INT nBands, const PS_IID_RESOLUTION res, const PS_DELTA mode, INT *error); INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iccVal, const INT *iccValLast, const INT nBands, const PS_DELTA mode, INT *error); INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *ipdVal, const INT *ipdValLast, const INT nBands, const PS_DELTA mode, INT *error); INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *opdVal, const INT *opdValLast, const INT nBands, const PS_DELTA mode, INT *error); INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT psOut, HANDLE_FDK_BITSTREAM hBitBuf); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* #ifndef PS_BITENC_H */ fdk-aac-0.1.3/libSBRenc/src/ps_const.h0000644000175000017500000001422612372261464020012 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial author: N. Rettelbach contents/description: Parametric Stereo constants ******************************************************************************/ #ifndef PS_CONST_H #define PS_CONST_H #define MAX_PS_CHANNELS ( 2 ) #define HYBRID_MAX_QMF_BANDS ( 3 ) #define HYBRID_FILTER_LENGTH ( 13 ) #define HYBRID_FILTER_DELAY ( (HYBRID_FILTER_LENGTH-1)/2 ) #define HYBRID_FRAMESIZE ( QMF_MAX_TIME_SLOTS ) #define HYBRID_READ_OFFSET ( 10 ) #define MAX_HYBRID_BANDS ( (QMF_CHANNELS-HYBRID_MAX_QMF_BANDS+10) ) typedef enum { PS_RES_COARSE = 0, PS_RES_MID = 1, PS_RES_FINE = 2 } PS_RESOLUTION; typedef enum { PS_BANDS_COARSE = 10, PS_BANDS_MID = 20, PS_MAX_BANDS = PS_BANDS_MID } PS_BANDS; typedef enum { PS_IID_RES_COARSE=0, PS_IID_RES_FINE } PS_IID_RESOLUTION; typedef enum { PS_ICC_ROT_A=0, PS_ICC_ROT_B } PS_ICC_ROTATION_MODE; typedef enum { PS_DELTA_FREQ, PS_DELTA_TIME } PS_DELTA; typedef enum { PS_MAX_ENVELOPES = 4 } PS_CONSTS; typedef enum { PSENC_OK = 0x0000, /*!< No error happened. All fine. */ PSENC_INVALID_HANDLE = 0x0020, /*!< Handle passed to function call was invalid. */ PSENC_MEMORY_ERROR = 0x0021, /*!< Memory allocation failed. */ PSENC_INIT_ERROR = 0x0040, /*!< General initialization error. */ PSENC_ENCODE_ERROR = 0x0060 /*!< The encoding process was interrupted by an unexpected error. */ } FDK_PSENC_ERROR; #endif fdk-aac-0.1.3/libSBRenc/src/env_est.cpp0000644000175000017500000021047512372261464020164 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "env_est.h" #include "tran_det.h" #include "qmf.h" #include "fram_gen.h" #include "bit_sbr.h" #include "cmondata.h" #include "sbr_ram.h" #include "genericStds.h" #define QUANT_ERROR_THRES 200 #define Y_NRG_SCALE 5 /* noCols = 32 -> shift(5) */ static const UCHAR panTable[2][10] = { { 0, 2, 4, 6, 8,12,16,20,24}, { 0, 2, 4, 8,12, 0, 0, 0, 0 } }; static const UCHAR maxIndex[2] = {9, 5}; /***************************************************************************/ /*! \brief Calculates energy form real and imaginary part of the QMF subsamples \return none ****************************************************************************/ LNK_SECTION_CODE_L1 static void FDKsbrEnc_getEnergyFromCplxQmfData(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ FIXP_DBL **RESTRICT imagValues, /*!< the imaginary part of the QMF subsamples */ INT numberBands, /*!< number of QMF bands */ INT numberCols, /*!< number of QMF subsamples */ INT *qmfScale, /*!< sclefactor of QMF subsamples */ INT *energyScale) /*!< scalefactor of energies */ { int j, k; int scale; FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); /* Get Scratch buffer */ C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); /* Get max possible scaling of QMF data */ scale = DFRACT_BITS; for (k=0; k= DFRACT_BITS-1) { scale = (FRACT_BITS-1-*qmfScale); } /* prevent scaling of QFM values to -1.f */ scale = fixMax(0,scale-1); /* Update QMF scale */ *qmfScale += scale; /* Calculate energy of each time slot pair, max energy and shift QMF values as far as possible to the left. */ { FIXP_DBL *nrgValues = tmpNrg; for (k=0; k> 1; tr1 <<= scale; ti1 <<= scale; energy += fPow2AddDiv2(fPow2Div2(tr1), ti1) >> 1; /* Write timeslot pair energy to scratch */ *nrgValues++ = energy; max_val = fixMax(max_val, energy); /* Write back scaled QMF values */ r0[j] = tr0; r1[j] = tr1; i0[j] = ti0; i1[j] = ti1; } } } /* energyScale: scalefactor energies of current frame */ *energyScale = 2*(*qmfScale)-1; /* if qmfScale > 0: nr of right shifts otherwise nr of left shifts */ /* Scale timeslot pair energies and write to output buffer */ scale = CountLeadingBits(max_val); { FIXP_DBL *nrgValues = tmpNrg; for (k=0; k>1; k++) { scaleValues(energyValues[k], nrgValues, numberBands, scale); nrgValues += numberBands; } *energyScale += scale; } /* Free Scratch buffer */ C_ALLOC_SCRATCH_END(tmpNrg, FIXP_DBL, QMF_CHANNELS*QMF_MAX_TIME_SLOTS/2); } LNK_SECTION_CODE_L1 static void FDKsbrEnc_getEnergyFromCplxQmfDataFull(FIXP_DBL **RESTRICT energyValues,/*!< the result of the operation */ FIXP_DBL **RESTRICT realValues, /*!< the real part of the QMF subsamples */ FIXP_DBL **RESTRICT imagValues, /*!< the imaginary part of the QMF subsamples */ int numberBands, /*!< number of QMF bands */ int numberCols, /*!< number of QMF subsamples */ int *qmfScale, /*!< sclefactor of QMF subsamples */ int *energyScale) /*!< scalefactor of energies */ { int j, k; int scale; FIXP_DBL max_val = FL2FXCONST_DBL(0.0f); /* Get Scratch buffer */ C_ALLOC_SCRATCH_START(tmpNrg, FIXP_DBL, QMF_MAX_TIME_SLOTS*QMF_CHANNELS/2); FDK_ASSERT(numberBands <= QMF_CHANNELS); FDK_ASSERT(numberCols <= QMF_MAX_TIME_SLOTS/2); /* Get max possible scaling of QMF data */ scale = DFRACT_BITS; for (k=0; k= DFRACT_BITS-1) { scale = (FRACT_BITS-1-*qmfScale); } /* prevent scaling of QFM values to -1.f */ scale = fixMax(0,scale-1); /* Update QMF scale */ *qmfScale += scale; /* Calculate energy of each time slot pair, max energy and shift QMF values as far as possible to the left. */ { FIXP_DBL *nrgValues = tmpNrg; for (k=0; k 0: nr of right shifts otherwise nr of left shifts */ /* Scale timeslot pair energies and write to output buffer */ scale = CountLeadingBits(max_val); { FIXP_DBL *nrgValues = tmpNrg; for (k=0; k 0 ? 1 : -1; nrgVal *= sign; min_val = FDK_INT_MAX; panIndex = 0; for (i = 0; i < maxIndex[ampRes]; i++) { val = fixp_abs ((nrgVal - (INT)panTable[ampRes][i])); if (val < min_val) { min_val = val; panIndex = i; } } *quantError=min_val; return panTable[ampRes][maxIndex[ampRes]-1] + sign * panTable[ampRes][panIndex]; } /***************************************************************************/ /*! \brief Quantisation of the noise floor levels \return void ****************************************************************************/ static void sbrNoiseFloorLevelsQuantisation(SCHAR *RESTRICT iNoiseLevels, /*! quantized noise levels */ FIXP_DBL *RESTRICT NoiseLevels, /*! the noise levels */ INT coupling /*! the coupling flag */ ) { INT i; INT tmp, dummy; /* Quantisation, similar to sfb quant... */ for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { /* tmp = NoiseLevels[i] > (PFLOAT)30.0f ? 30: (INT) (NoiseLevels[i] + (PFLOAT)0.5); */ /* 30>>6 = 0.46875 */ if ((FIXP_DBL)NoiseLevels[i] > FL2FXCONST_DBL(0.46875f)) { tmp = 30; } else { /* tmp = (INT)((FIXP_DBL)NoiseLevels[i] + (FL2FXCONST_DBL(0.5f)>>(*/ /* FRACT_BITS+ */ /* 6-1)));*/ /* tmp = tmp >> (DFRACT_BITS-1-6); */ /* conversion to integer happens here */ /* rounding is done by shifting one bit less than necessary to the right, adding '1' and then shifting the final bit */ tmp = ((((INT)NoiseLevels[i])>>(DFRACT_BITS-1-LD_DATA_SHIFT)) ); /* conversion to integer */ if (tmp != 0) tmp += 1; } if (coupling) { tmp = tmp < -30 ? -30 : tmp; tmp = mapPanorama (tmp,1,&dummy); } iNoiseLevels[i] = tmp; } } /***************************************************************************/ /*! \brief Calculation of noise floor for coupling \return void ****************************************************************************/ static void coupleNoiseFloor(FIXP_DBL *RESTRICT noise_level_left, /*! noise level left (modified)*/ FIXP_DBL *RESTRICT noise_level_right /*! noise level right (modified)*/ ) { FIXP_DBL cmpValLeft,cmpValRight; INT i; FIXP_DBL temp1,temp2; for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) { /* Calculation of the power function using ld64: z = x^y; z' = CalcLd64(z) = y*CalcLd64(x)/64; z = CalcInvLd64(z'); */ cmpValLeft = NOISE_FLOOR_OFFSET_64 - noise_level_left[i]; cmpValRight = NOISE_FLOOR_OFFSET_64 - noise_level_right[i]; if (cmpValRight < FL2FXCONST_DBL(0.0f)) { temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); } else { temp1 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_right[i]); temp1 = temp1 << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ } if (cmpValLeft < FL2FXCONST_DBL(0.0f)) { temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); } else { temp2 = CalcInvLdData(NOISE_FLOOR_OFFSET_64 - noise_level_left[i]); temp2 = temp2 << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* INT to fract conversion of result, if input of CalcInvLdData is positiv */ } if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1)))); /* no scaling needed! both values are dfract */ noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); } if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ noise_level_right[i] = CalcLdData(temp2) - CalcLdData(temp1); } if ((cmpValLeft >= FL2FXCONST_DBL(0.0f)) && (cmpValRight < FL2FXCONST_DBL(0.0f))) { noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>(7+1)) + (temp2>>1))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ noise_level_right[i] = (CalcLdData(temp2) + FL2FXCONST_DBL(0.109375f)) - CalcLdData(temp1); } if ((cmpValLeft < FL2FXCONST_DBL(0.0f)) && (cmpValRight >= FL2FXCONST_DBL(0.0f))) { noise_level_left[i] = NOISE_FLOOR_OFFSET_64 - (CalcLdData(((temp1>>1) + (temp2>>(7+1)))) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ noise_level_right[i] = CalcLdData(temp2) - (CalcLdData(temp1) + FL2FXCONST_DBL(0.109375f)); /* scaled with 7/64 */ } } } /***************************************************************************/ /*! \brief Calculation of energy starting in lower band (li) up to upper band (ui) over slots (start_pos) to (stop_pos) \return void ****************************************************************************/ static FIXP_DBL getEnvSfbEnergy(INT li, /*! lower band */ INT ui, /*! upper band */ INT start_pos, /*! start slot */ INT stop_pos, /*! stop slot */ INT border_pos, /*! slots scaling border */ FIXP_DBL **YBuffer, /*! sfb energy buffer */ INT YBufferSzShift, /*! Energy buffer index scale */ INT scaleNrg0, /*! scaling of lower slots */ INT scaleNrg1) /*! scaling of upper slots */ { /* use dynamic scaling for outer energy loop; energies are critical and every bit is important */ int sc0, sc1, k, l; FIXP_DBL nrgSum, nrg1, nrg2, accu1, accu2; INT dynScale, dynScale1, dynScale2; if(ui-li==0) dynScale = DFRACT_BITS-1; else dynScale = CalcLdInt(ui-li)>>(DFRACT_BITS-1-LD_DATA_SHIFT); sc0 = fixMin(scaleNrg0,Y_NRG_SCALE); sc1 = fixMin(scaleNrg1,Y_NRG_SCALE); /* dynScale{1,2} is set such that the right shift below is positive */ dynScale1 = fixMin((scaleNrg0-sc0),dynScale); dynScale2 = fixMin((scaleNrg1-sc1),dynScale); nrgSum = accu1 = accu2 = (FIXP_DBL)0; for (k = li; k < ui; k++) { nrg1 = nrg2 = (FIXP_DBL)0; for (l = start_pos; l < border_pos; l++) { nrg1 += YBuffer[l>>YBufferSzShift][k] >> sc0; } for (; l < stop_pos; l++) { nrg2 += YBuffer[l>>YBufferSzShift][k] >> sc1; } accu1 += (nrg1>>dynScale1); accu2 += (nrg2>>dynScale2); } /* This shift factor is always positive. See comment above. */ nrgSum += ( accu1 >> fixMin((scaleNrg0-sc0-dynScale1),(DFRACT_BITS-1)) ) + ( accu2 >> fixMin((scaleNrg1-sc1-dynScale2),(DFRACT_BITS-1)) ); return nrgSum; } /***************************************************************************/ /*! \brief Energy compensation in missing harmonic mode \return void ****************************************************************************/ static FIXP_DBL mhLoweringEnergy(FIXP_DBL nrg, INT M) { /* Compensating for the fact that we in the decoder map the "average energy to every QMF band, and use this when we calculate the boost-factor. Since the mapped energy isn't the average energy but the maximum energy in case of missing harmonic creation, we will in the boost function calculate that too much limiting has been applied and hence we will boost the signal although it isn't called for. Hence we need to compensate for this by lowering the transmitted energy values for the sines so they will get the correct level after the boost is applied. */ if(M > 2){ INT tmpScale; tmpScale = CountLeadingBits(nrg); nrg <<= tmpScale; nrg = fMult(nrg, FL2FXCONST_DBL(0.398107267f)); /* The maximum boost is 1.584893, so the maximum attenuation should be square(1/1.584893) = 0.398107267 */ nrg >>= tmpScale; } else{ if(M > 1){ nrg >>= 1; } } return nrg; } /***************************************************************************/ /*! \brief Energy compensation in none missing harmonic mode \return void ****************************************************************************/ static FIXP_DBL nmhLoweringEnergy( FIXP_DBL nrg, const FIXP_DBL nrgSum, const INT nrgSum_scale, const INT M ) { if (nrg>FL2FXCONST_DBL(0)) { int sc=0; /* gain = nrgSum / (nrg*(M+1)) */ FIXP_DBL gain = fMult(fDivNorm(nrgSum, nrg, &sc), GetInvInt(M+1)); sc += nrgSum_scale; /* reduce nrg if gain smaller 1.f */ if ( !((sc>=0) && ( gain > ((FIXP_DBL)MAXVAL_DBL>>sc) )) ) { nrg = fMult(scaleValue(gain,sc), nrg); } } return nrg; } /***************************************************************************/ /*! \brief calculates the envelope values from the energies, depending on framing and stereo mode \return void ****************************************************************************/ static void calculateSbrEnvelope (FIXP_DBL **RESTRICT YBufferLeft, /*! energy buffer left */ FIXP_DBL **RESTRICT YBufferRight, /*! energy buffer right */ int *RESTRICT YBufferScaleLeft, /*! scale energy buffer left */ int *RESTRICT YBufferScaleRight, /*! scale energy buffer right */ const SBR_FRAME_INFO *frame_info, /*! frame info vector */ SCHAR *RESTRICT sfb_nrgLeft, /*! sfb energy buffer left */ SCHAR *RESTRICT sfb_nrgRight, /*! sfb energy buffer right */ HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ HANDLE_ENV_CHANNEL h_sbr, /*! envelope channel handle */ SBR_STEREO_MODE stereoMode, /*! stereo coding mode */ INT* maxQuantError, /*! maximum quantization error, for panorama. */ int YBufferSzShift) /*! Energy buffer index scale */ { int i, j, m = 0; INT no_of_bands, start_pos, stop_pos, li, ui; FREQ_RES freq_res; INT ca = 2 - h_sbr->encEnvData.init_sbr_amp_res; INT oneBitLess = 0; if (ca == 2) oneBitLess = 1; /* LD_DATA_SHIFT => ld64 scaling; one bit less for rounding */ INT quantError; INT nEnvelopes = frame_info->nEnvelopes; INT short_env = frame_info->shortEnv - 1; INT timeStep = h_sbr->sbrExtractEnvelope.time_step; INT commonScale,scaleLeft0,scaleLeft1; INT scaleRight0=0,scaleRight1=0; commonScale = fixMin(YBufferScaleLeft[0],YBufferScaleLeft[1]); if (stereoMode == SBR_COUPLING) { commonScale = fixMin(commonScale,YBufferScaleRight[0]); commonScale = fixMin(commonScale,YBufferScaleRight[1]); } commonScale = commonScale - 7; scaleLeft0 = YBufferScaleLeft[0] - commonScale; scaleLeft1 = YBufferScaleLeft[1] - commonScale ; FDK_ASSERT ((scaleLeft0 >= 0) && (scaleLeft1 >= 0)); if (stereoMode == SBR_COUPLING) { scaleRight0 = YBufferScaleRight[0] - commonScale; scaleRight1 = YBufferScaleRight[1] - commonScale; FDK_ASSERT ((scaleRight0 >= 0) && (scaleRight1 >= 0)); *maxQuantError = 0; } for (i = 0; i < nEnvelopes; i++) { FIXP_DBL pNrgLeft[QMF_MAX_TIME_SLOTS]; FIXP_DBL pNrgRight[QMF_MAX_TIME_SLOTS]; int envNrg_scale; FIXP_DBL envNrgLeft = FL2FXCONST_DBL(0.0f); FIXP_DBL envNrgRight = FL2FXCONST_DBL(0.0f); int missingHarmonic[QMF_MAX_TIME_SLOTS]; int count[QMF_MAX_TIME_SLOTS]; start_pos = timeStep * frame_info->borders[i]; stop_pos = timeStep * frame_info->borders[i + 1]; freq_res = frame_info->freqRes[i]; no_of_bands = h_con->nSfb[freq_res]; envNrg_scale = DFRACT_BITS-fNormz((FIXP_DBL)no_of_bands); if (i == short_env) { stop_pos -= fixMax(2, timeStep); /* consider at least 2 QMF slots less for short envelopes (envelopes just before transients) */ } for (j = 0; j < no_of_bands; j++) { FIXP_DBL nrgLeft = FL2FXCONST_DBL(0.0f); FIXP_DBL nrgRight = FL2FXCONST_DBL(0.0f); li = h_con->freqBandTable[freq_res][j]; ui = h_con->freqBandTable[freq_res][j + 1]; if(freq_res == FREQ_RES_HIGH){ if(j == 0 && ui-li > 1){ li++; } } else{ if(j == 0 && ui-li > 2){ li++; } } /* Find out whether a sine will be missing in the scale-factor band that we're currently processing. */ missingHarmonic[j] = 0; if(h_sbr->encEnvData.addHarmonicFlag){ if(freq_res == FREQ_RES_HIGH){ if(h_sbr->encEnvData.addHarmonic[j]){ /*A missing sine in the current band*/ missingHarmonic[j] = 1; } } else{ INT i; INT startBandHigh = 0; INT stopBandHigh = 0; while(h_con->freqBandTable[FREQ_RES_HIGH][startBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j]) startBandHigh++; while(h_con->freqBandTable[FREQ_RES_HIGH][stopBandHigh] < h_con->freqBandTable[FREQ_RES_LOW][j + 1]) stopBandHigh++; for(i = startBandHigh; iencEnvData.addHarmonic[i]){ missingHarmonic[j] = 1; } } } } /* If a sine is missing in a scalefactorband, with more than one qmf channel use the nrg from the channel with the largest nrg rather than the mean. Compensate for the boost calculation in the decdoder. */ int border_pos = fixMin(stop_pos, h_sbr->sbrExtractEnvelope.YBufferWriteOffset<>envNrg_scale); envNrgRight += (nrgRight>>envNrg_scale); } /* j */ for (j = 0; j < no_of_bands; j++) { FIXP_DBL nrgLeft2 = FL2FXCONST_DBL(0.0f); FIXP_DBL nrgLeft = pNrgLeft[j]; FIXP_DBL nrgRight = pNrgRight[j]; /* None missing harmonic Energy lowering compensation */ if(!missingHarmonic[j] && h_sbr->fLevelProtect) { /* in case of missing energy in base band, reduce reference energy to prevent overflows in decoder output */ nrgLeft = nmhLoweringEnergy(nrgLeft, envNrgLeft, envNrg_scale, no_of_bands); if (stereoMode == SBR_COUPLING) { nrgRight = nmhLoweringEnergy(nrgRight, envNrgRight, envNrg_scale, no_of_bands); } } if (stereoMode == SBR_COUPLING) { /* calc operation later with log */ nrgLeft2 = nrgLeft; nrgLeft = (nrgRight + nrgLeft) >> 1; } /* nrgLeft = f20_log2(nrgLeft / (PFLOAT)(count * h_sbr->sbrQmf.no_channels))+(PFLOAT)44; */ /* If nrgLeft == 0 then the Log calculations below do fail. */ if (nrgLeft > FL2FXCONST_DBL(0.0f)) { FIXP_DBL tmp0,tmp1,tmp2,tmp3; INT tmpScale; tmpScale = CountLeadingBits(nrgLeft); nrgLeft = nrgLeft << tmpScale; tmp0 = CalcLdData(nrgLeft); /* scaled by 1/64 */ tmp1 = ((FIXP_DBL) (commonScale+tmpScale)) << (DFRACT_BITS-1-LD_DATA_SHIFT-1); /* scaled by 1/64 */ tmp2 = ((FIXP_DBL)(count[j]*h_con->noQmfBands)) << (DFRACT_BITS-1-14-1); tmp2 = CalcLdData(tmp2); /* scaled by 1/64 */ tmp3 = FL2FXCONST_DBL(0.6875f-0.21875f-0.015625f)>>1; /* scaled by 1/64 */ nrgLeft = ((tmp0-tmp2)>>1) + (tmp3 - tmp1); } else { nrgLeft = FL2FXCONST_DBL(-1.0f); } /* ld64 to integer conversion */ nrgLeft = fixMin(fixMax(nrgLeft,FL2FXCONST_DBL(0.0f)),(FL2FXCONST_DBL(0.5f)>>oneBitLess)); nrgLeft = (FIXP_DBL)(LONG)nrgLeft >> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess-1); sfb_nrgLeft[m] = ((INT)nrgLeft+1)>>1; /* rounding */ if (stereoMode == SBR_COUPLING) { FIXP_DBL scaleFract; int sc0, sc1; nrgLeft2 = fixMax((FIXP_DBL)0x1, nrgLeft2); nrgRight = fixMax((FIXP_DBL)0x1, nrgRight); sc0 = CountLeadingBits(nrgLeft2); sc1 = CountLeadingBits(nrgRight); scaleFract = ((FIXP_DBL)(sc0-sc1)) << (DFRACT_BITS-1-LD_DATA_SHIFT); /* scale value in ld64 representation */ nrgRight = CalcLdData(nrgLeft2<> (DFRACT_BITS-1-LD_DATA_SHIFT-1-oneBitLess); nrgRight = (nrgRight+(FIXP_DBL)1)>>1; /* rounding */ sfb_nrgRight[m] = mapPanorama (nrgRight,h_sbr->encEnvData.init_sbr_amp_res,&quantError); *maxQuantError = fixMax(quantError, *maxQuantError); } m++; } /* j */ /* Do energy compensation for sines that are present in two QMF-bands in the original, but will only occur in one band in the decoder due to the synthetic sine coding.*/ if (h_con->useParametricCoding) { m-=no_of_bands; for (j = 0; j < no_of_bands; j++) { if (freq_res==FREQ_RES_HIGH && h_sbr->sbrExtractEnvelope.envelopeCompensation[j]){ sfb_nrgLeft[m] -= (ca * fixp_abs((INT)h_sbr->sbrExtractEnvelope.envelopeCompensation[j])); } sfb_nrgLeft[m] = fixMax(0, sfb_nrgLeft[m]); m++; } } /* useParametricCoding */ } /* i*/ } /***************************************************************************/ /*! \brief calculates the noise floor and the envelope values from the energies, depending on framing and stereo mode FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the envelope and the noise floor. The function includes the following processes: -Analysis subband filtering. -Encoding SA and pan parameters (if enabled). -Transient detection. ****************************************************************************/ LNK_SECTION_CODE_L1 void FDKsbrEnc_extractSbrEnvelope1 ( HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL hEnvChan, HANDLE_COMMON_DATA hCmonData, SBR_ENV_TEMP_DATA *eData, SBR_FRAME_TEMP_DATA *fData ) { HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; if (sbrExtrEnv->YBufferSzShift == 0) FDKsbrEnc_getEnergyFromCplxQmfDataFull(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, h_con->noQmfBands, sbrExtrEnv->no_cols, &hEnvChan->qmfScale, &sbrExtrEnv->YBufferScale[1]); else FDKsbrEnc_getEnergyFromCplxQmfData(&sbrExtrEnv->YBuffer[sbrExtrEnv->YBufferWriteOffset], sbrExtrEnv->rBuffer + sbrExtrEnv->rBufferReadOffset, sbrExtrEnv->iBuffer + sbrExtrEnv->rBufferReadOffset, h_con->noQmfBands, sbrExtrEnv->no_cols, &hEnvChan->qmfScale, &sbrExtrEnv->YBufferScale[1]); /* Precalculation of Tonality Quotas COEFF Transform OK */ FDKsbrEnc_CalculateTonalityQuotas(&hEnvChan->TonCorr, sbrExtrEnv->rBuffer, sbrExtrEnv->iBuffer, h_con->freqBandTable[HI][h_con->nSfb[HI]], hEnvChan->qmfScale); /* Transient detection COEFF Transform OK */ FDKsbrEnc_transientDetect(&hEnvChan->sbrTransientDetector, sbrExtrEnv->YBuffer, sbrExtrEnv->YBufferScale, eData->transient_info, sbrExtrEnv->YBufferWriteOffset, sbrExtrEnv->YBufferSzShift, sbrExtrEnv->time_step, hEnvChan->SbrEnvFrame.frameMiddleSlot); /* Generate flags for 2 env in a FIXFIX-frame. Remove this function to get always 1 env per FIXFIX-frame. */ /* frame Splitter COEFF Transform OK */ FDKsbrEnc_frameSplitter(sbrExtrEnv->YBuffer, sbrExtrEnv->YBufferScale, &hEnvChan->sbrTransientDetector, h_con->freqBandTable[1], eData->transient_info, sbrExtrEnv->YBufferWriteOffset, sbrExtrEnv->YBufferSzShift, h_con->nSfb[1], sbrExtrEnv->time_step, sbrExtrEnv->no_cols); } /***************************************************************************/ /*! \brief calculates the noise floor and the envelope values from the energies, depending on framing and stereo mode FDKsbrEnc_extractSbrEnvelope is the main function for encoding and writing the envelope and the noise floor. The function includes the following processes: -Determine time/frequency division of current granule. -Sending transient info to bitstream. -Set amp_res to 1.5 dB if the current frame contains only one envelope. -Lock dynamic bandwidth frequency change if the next envelope not starts on a frame boundary. -MDCT transposer (needed to detect where harmonics will be missing). -Spectrum Estimation (used for pulse train and missing harmonics detection). -Pulse train detection. -Inverse Filtering detection. -Waveform Coding. -Missing Harmonics detection. -Extract envelope of current frame. -Noise floor estimation. -Noise floor quantisation and coding. -Encode envelope of current frame. -Send the encoded data to the bitstream. -Write to bitstream. ****************************************************************************/ LNK_SECTION_CODE_L1 void FDKsbrEnc_extractSbrEnvelope2 ( HANDLE_SBR_CONFIG_DATA h_con, /*! handle to config data */ HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_ENV_CHANNEL h_envChan0, HANDLE_ENV_CHANNEL h_envChan1, HANDLE_COMMON_DATA hCmonData, SBR_ENV_TEMP_DATA *eData, SBR_FRAME_TEMP_DATA *fData, int clearOutput ) { HANDLE_ENV_CHANNEL h_envChan[MAX_NUM_CHANNELS] = {h_envChan0, h_envChan1}; int ch, i, j, c, YSzShift = h_envChan[0]->sbrExtractEnvelope.YBufferSzShift; SBR_STEREO_MODE stereoMode = h_con->stereoMode; int nChannels = h_con->nChannels; const int *v_tuning; static const int v_tuningHEAAC[6] = { 0, 2, 4, 0, 0, 0 }; static const int v_tuningELD[6] = { 0, 2, 3, 0, 0, 0 }; if (h_con->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) v_tuning = v_tuningELD; else v_tuning = v_tuningHEAAC; /* Select stereo mode. */ if (stereoMode == SBR_COUPLING) { if (eData[0].transient_info[1] && eData[1].transient_info[1]) { eData[0].transient_info[0] = fixMin(eData[1].transient_info[0], eData[0].transient_info[0]); eData[1].transient_info[0] = eData[0].transient_info[0]; } else { if (eData[0].transient_info[1] && !eData[1].transient_info[1]) { eData[1].transient_info[0] = eData[0].transient_info[0]; } else { if (!eData[0].transient_info[1] && eData[1].transient_info[1]) eData[0].transient_info[0] = eData[1].transient_info[0]; else { eData[0].transient_info[0] = fixMax(eData[1].transient_info[0], eData[0].transient_info[0]); eData[1].transient_info[0] = eData[0].transient_info[0]; } } } } /* Determine time/frequency division of current granule */ eData[0].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[0]->SbrEnvFrame, eData[0].transient_info, h_envChan[0]->sbrExtractEnvelope.pre_transient_info, h_envChan[0]->encEnvData.ldGrid, v_tuning); h_envChan[0]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; /* AAC LD patch for transient prediction */ if (h_envChan[0]->encEnvData.ldGrid && eData[0].transient_info[2]) { /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ h_envChan[0]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[0]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; } switch (stereoMode) { case SBR_LEFT_RIGHT: case SBR_SWITCH_LRC: eData[1].frame_info = FDKsbrEnc_frameInfoGenerator(&h_envChan[1]->SbrEnvFrame, eData[1].transient_info, h_envChan[1]->sbrExtractEnvelope.pre_transient_info, h_envChan[1]->encEnvData.ldGrid, v_tuning); h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[1]->SbrEnvFrame.SbrGrid; if (h_envChan[1]->encEnvData.ldGrid && eData[1].transient_info[2]) { /* if next frame will start with transient, set shortEnv to numEnvelopes(shortend Envelope = shortEnv-1)*/ h_envChan[1]->SbrEnvFrame.SbrFrameInfo.shortEnv = h_envChan[1]->SbrEnvFrame.SbrFrameInfo.nEnvelopes; } /* compare left and right frame_infos */ if (eData[0].frame_info->nEnvelopes != eData[1].frame_info->nEnvelopes) { stereoMode = SBR_LEFT_RIGHT; } else { for (i = 0; i < eData[0].frame_info->nEnvelopes + 1; i++) { if (eData[0].frame_info->borders[i] != eData[1].frame_info->borders[i]) { stereoMode = SBR_LEFT_RIGHT; break; } } for (i = 0; i < eData[0].frame_info->nEnvelopes; i++) { if (eData[0].frame_info->freqRes[i] != eData[1].frame_info->freqRes[i]) { stereoMode = SBR_LEFT_RIGHT; break; } } if (eData[0].frame_info->shortEnv != eData[1].frame_info->shortEnv) { stereoMode = SBR_LEFT_RIGHT; } } break; case SBR_COUPLING: eData[1].frame_info = eData[0].frame_info; h_envChan[1]->encEnvData.hSbrBSGrid = &h_envChan[0]->SbrEnvFrame.SbrGrid; break; case SBR_MONO: /* nothing to do */ break; default: FDK_ASSERT (0); } for (ch = 0; ch < nChannels;ch++) { HANDLE_ENV_CHANNEL hEnvChan = h_envChan[ch]; HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &hEnvChan->sbrExtractEnvelope; SBR_ENV_TEMP_DATA *ed = &eData[ch]; /* Send transient info to bitstream and store for next call */ sbrExtrEnv->pre_transient_info[0] = ed->transient_info[0];/* tran_pos */ sbrExtrEnv->pre_transient_info[1] = ed->transient_info[1];/* tran_flag */ hEnvChan->encEnvData.noOfEnvelopes = ed->nEnvelopes = ed->frame_info->nEnvelopes; /* number of envelopes of current frame */ /* Check if the current frame is divided into one envelope only. If so, set the amplitude resolution to 1.5 dB, otherwise may set back to chosen value */ if( ( hEnvChan->encEnvData.hSbrBSGrid->frameClass == FIXFIX ) && ( ed->nEnvelopes == 1 ) ) { if (hEnvChan->encEnvData.ldGrid) hEnvChan->encEnvData.currentAmpResFF = (AMP_RES)h_con->initAmpResFF; else hEnvChan->encEnvData.currentAmpResFF = SBR_AMP_RES_1_5; if ( hEnvChan->encEnvData.currentAmpResFF != hEnvChan->encEnvData.init_sbr_amp_res) { FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, &hEnvChan->sbrCodeEnvelope, &hEnvChan->sbrCodeNoiseFloor, hEnvChan->encEnvData.currentAmpResFF); } } else { if(sbrHeaderData->sbr_amp_res != hEnvChan->encEnvData.init_sbr_amp_res ) { FDKsbrEnc_InitSbrHuffmanTables(&hEnvChan->encEnvData, &hEnvChan->sbrCodeEnvelope, &hEnvChan->sbrCodeNoiseFloor, sbrHeaderData->sbr_amp_res); } } if (!clearOutput) { /* Tonality correction parameter extraction (inverse filtering level, noise floor additional sines). */ FDKsbrEnc_TonCorrParamExtr(&hEnvChan->TonCorr, hEnvChan->encEnvData.sbr_invf_mode_vec, ed->noiseFloor, &hEnvChan->encEnvData.addHarmonicFlag, hEnvChan->encEnvData.addHarmonic, sbrExtrEnv->envelopeCompensation, ed->frame_info, ed->transient_info, h_con->freqBandTable[HI], h_con->nSfb[HI], hEnvChan->encEnvData.sbr_xpos_mode, h_con->sbrSyntaxFlags); } /* Low energy in low band fix */ if ( hEnvChan->sbrTransientDetector.prevLowBandEnergy < hEnvChan->sbrTransientDetector.prevHighBandEnergy && hEnvChan->sbrTransientDetector.prevHighBandEnergy > FL2FX_DBL(0.03)) { int i; hEnvChan->fLevelProtect = 1; for (i=0; iencEnvData.sbr_invf_mode_vec[i] = INVF_HIGH_LEVEL; } else { hEnvChan->fLevelProtect = 0; } hEnvChan->encEnvData.sbr_invf_mode = hEnvChan->encEnvData.sbr_invf_mode_vec[0]; hEnvChan->encEnvData.noOfnoisebands = hEnvChan->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; } /* ch */ /* Save number of scf bands per envelope */ for (ch = 0; ch < nChannels;ch++) { for (i = 0; i < eData[ch].nEnvelopes; i++){ h_envChan[ch]->encEnvData.noScfBands[i] = (eData[ch].frame_info->freqRes[i] == FREQ_RES_HIGH ? h_con->nSfb[FREQ_RES_HIGH] : h_con->nSfb[FREQ_RES_LOW]); } } /* Extract envelope of current frame. */ switch (stereoMode) { case SBR_MONO: calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); break; case SBR_LEFT_RIGHT: calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, eData[1].frame_info,eData[1].sfb_nrg, NULL, h_con, h_envChan[1], SBR_MONO, NULL, YSzShift); break; case SBR_COUPLING: calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, eData[0].frame_info, eData[0].sfb_nrg, eData[1].sfb_nrg, h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); break; case SBR_SWITCH_LRC: calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, NULL, h_envChan[0]->sbrExtractEnvelope.YBufferScale, NULL, eData[0].frame_info, eData[0].sfb_nrg, NULL, h_con, h_envChan[0], SBR_MONO, NULL, YSzShift); calculateSbrEnvelope (h_envChan[1]->sbrExtractEnvelope.YBuffer, NULL, h_envChan[1]->sbrExtractEnvelope.YBufferScale, NULL, eData[1].frame_info, eData[1].sfb_nrg, NULL, h_con, h_envChan[1], SBR_MONO,NULL, YSzShift); calculateSbrEnvelope (h_envChan[0]->sbrExtractEnvelope.YBuffer, h_envChan[1]->sbrExtractEnvelope.YBuffer, h_envChan[0]->sbrExtractEnvelope.YBufferScale, h_envChan[1]->sbrExtractEnvelope.YBufferScale, eData[0].frame_info, eData[0].sfb_nrg_coupling, eData[1].sfb_nrg_coupling, h_con, h_envChan[0], SBR_COUPLING, &fData->maxQuantError, YSzShift); break; } /* Noise floor quantisation and coding. */ switch (stereoMode) { case SBR_MONO: sbrNoiseFloorLevelsQuantisation(eData[0].noise_level, eData[0].noiseFloor, 0); FDKsbrEnc_codeEnvelope(eData[0].noise_level, fData->res, &h_envChan[0]->sbrCodeNoiseFloor, h_envChan[0]->encEnvData.domain_vec_noise, 0, (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); break; case SBR_LEFT_RIGHT: sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, &h_envChan[0]->sbrCodeNoiseFloor, h_envChan[0]->encEnvData.domain_vec_noise, 0, (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, &h_envChan[1]->sbrCodeNoiseFloor, h_envChan[1]->encEnvData.domain_vec_noise, 0, (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); break; case SBR_COUPLING: coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, &h_envChan[0]->sbrCodeNoiseFloor, h_envChan[0]->encEnvData.domain_vec_noise, 1, (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 1); FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, &h_envChan[1]->sbrCodeNoiseFloor, h_envChan[1]->encEnvData.domain_vec_noise, 1, (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, sbrBitstreamData->HeaderActive); break; case SBR_SWITCH_LRC: sbrNoiseFloorLevelsQuantisation(eData[0].noise_level,eData[0].noiseFloor, 0); sbrNoiseFloorLevelsQuantisation(eData[1].noise_level,eData[1].noiseFloor, 0); coupleNoiseFloor(eData[0].noiseFloor,eData[1].noiseFloor); sbrNoiseFloorLevelsQuantisation(eData[0].noise_level_coupling,eData[0].noiseFloor, 0); sbrNoiseFloorLevelsQuantisation(eData[1].noise_level_coupling,eData[1].noiseFloor, 1); break; } /* Encode envelope of current frame. */ switch (stereoMode) { case SBR_MONO: sbrHeaderData->coupling = 0; h_envChan[0]->encEnvData.balance = 0; FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); break; case SBR_LEFT_RIGHT: sbrHeaderData->coupling = 0; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 0; FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, sbrHeaderData->coupling, eData[1].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); break; case SBR_COUPLING: sbrHeaderData->coupling = 1; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 1; FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, sbrHeaderData->coupling, eData[0].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, sbrHeaderData->coupling, eData[1].frame_info->nEnvelopes, 1, sbrBitstreamData->HeaderActive); break; case SBR_SWITCH_LRC: { INT payloadbitsLR; INT payloadbitsCOUPLING; SCHAR sfbNrgPrevTemp[MAX_NUM_CHANNELS][MAX_FREQ_COEFFS]; SCHAR noisePrevTemp[MAX_NUM_CHANNELS][MAX_NUM_NOISE_COEFFS]; INT upDateNrgTemp[MAX_NUM_CHANNELS]; INT upDateNoiseTemp[MAX_NUM_CHANNELS]; INT domainVecTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; INT domainVecNoiseTemp[MAX_NUM_CHANNELS][MAX_ENVELOPES]; INT tempFlagRight = 0; INT tempFlagLeft = 0; /* Store previous values, in order to be able to "undo" what is being done. */ for(ch = 0; ch < nChannels;ch++){ FDKmemcpy (sfbNrgPrevTemp[ch], h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof (SCHAR)); FDKmemcpy (noisePrevTemp[ch], h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); upDateNrgTemp[ch] = h_envChan[ch]->sbrCodeEnvelope.upDate; upDateNoiseTemp[ch] = h_envChan[ch]->sbrCodeNoiseFloor.upDate; /* forbid time coding in the first envelope in case of a different previous stereomode */ if(sbrHeaderData->prev_coupling){ h_envChan[ch]->sbrCodeEnvelope.upDate = 0; h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; } } /* ch */ /* Code ordinary Left/Right stereo */ FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg, eData[0].frame_info->freqRes, &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, 0, eData[0].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg, eData[1].frame_info->freqRes, &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, 0, eData[1].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); c = 0; for (i = 0; i < eData[0].nEnvelopes; i++) { for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg[c]; h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg[c]; c++; } } FDKsbrEnc_codeEnvelope (eData[0].noise_level, fData->res, &h_envChan[0]->sbrCodeNoiseFloor, h_envChan[0]->encEnvData.domain_vec_noise, 0, (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level[i]; FDKsbrEnc_codeEnvelope (eData[1].noise_level, fData->res, &h_envChan[1]->sbrCodeNoiseFloor, h_envChan[1]->encEnvData.domain_vec_noise, 0, (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level[i]; sbrHeaderData->coupling = 0; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 0; payloadbitsLR = FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, hParametricStereo, sbrBitstreamData, &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, h_con->sbrSyntaxFlags); /* swap saved stored with current values */ for(ch = 0; ch < nChannels;ch++){ INT itmp; for(i=0;isbrCodeEnvelope.sfb_nrg_prev[i]; h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev[i]=sfbNrgPrevTemp[ch][i]; sfbNrgPrevTemp[ch][i]=itmp; } for(i=0;isbrCodeNoiseFloor.sfb_nrg_prev[i]; h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev[i]=noisePrevTemp[ch][i]; noisePrevTemp[ch][i]=itmp; } /* swap update flags */ itmp = h_envChan[ch]->sbrCodeEnvelope.upDate; h_envChan[ch]->sbrCodeEnvelope.upDate=upDateNrgTemp[ch]; upDateNrgTemp[ch] = itmp; itmp = h_envChan[ch]->sbrCodeNoiseFloor.upDate; h_envChan[ch]->sbrCodeNoiseFloor.upDate=upDateNoiseTemp[ch]; upDateNoiseTemp[ch]=itmp; /* save domain vecs */ FDKmemcpy(domainVecTemp[ch],h_envChan[ch]->encEnvData.domain_vec,sizeof(INT)*MAX_ENVELOPES); FDKmemcpy(domainVecNoiseTemp[ch],h_envChan[ch]->encEnvData.domain_vec_noise,sizeof(INT)*MAX_ENVELOPES); /* forbid time coding in the first envelope in case of a different previous stereomode */ if(!sbrHeaderData->prev_coupling){ h_envChan[ch]->sbrCodeEnvelope.upDate = 0; h_envChan[ch]->sbrCodeNoiseFloor.upDate = 0; } } /* ch */ /* Coupling */ FDKsbrEnc_codeEnvelope (eData[0].sfb_nrg_coupling, eData[0].frame_info->freqRes, &h_envChan[0]->sbrCodeEnvelope, h_envChan[0]->encEnvData.domain_vec, 1, eData[0].frame_info->nEnvelopes, 0, sbrBitstreamData->HeaderActive); FDKsbrEnc_codeEnvelope (eData[1].sfb_nrg_coupling, eData[1].frame_info->freqRes, &h_envChan[1]->sbrCodeEnvelope, h_envChan[1]->encEnvData.domain_vec, 1, eData[1].frame_info->nEnvelopes, 1, sbrBitstreamData->HeaderActive); c = 0; for (i = 0; i < eData[0].nEnvelopes; i++) { for (j = 0; j < h_envChan[0]->encEnvData.noScfBands[i]; j++) { h_envChan[0]->encEnvData.ienvelope[i][j] = eData[0].sfb_nrg_coupling[c]; h_envChan[1]->encEnvData.ienvelope[i][j] = eData[1].sfb_nrg_coupling[c]; c++; } } FDKsbrEnc_codeEnvelope (eData[0].noise_level_coupling, fData->res, &h_envChan[0]->sbrCodeNoiseFloor, h_envChan[0]->encEnvData.domain_vec_noise, 1, (eData[0].frame_info->nEnvelopes > 1 ? 2 : 1), 0, sbrBitstreamData->HeaderActive); for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) h_envChan[0]->encEnvData.sbr_noise_levels[i] = eData[0].noise_level_coupling[i]; FDKsbrEnc_codeEnvelope (eData[1].noise_level_coupling, fData->res, &h_envChan[1]->sbrCodeNoiseFloor, h_envChan[1]->encEnvData.domain_vec_noise, 1, (eData[1].frame_info->nEnvelopes > 1 ? 2 : 1), 1, sbrBitstreamData->HeaderActive); for (i = 0; i < MAX_NUM_NOISE_VALUES; i++) h_envChan[1]->encEnvData.sbr_noise_levels[i] = eData[1].noise_level_coupling[i]; sbrHeaderData->coupling = 1; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 1; tempFlagLeft = h_envChan[0]->encEnvData.addHarmonicFlag; tempFlagRight = h_envChan[1]->encEnvData.addHarmonicFlag; payloadbitsCOUPLING = FDKsbrEnc_CountSbrChannelPairElement (sbrHeaderData, hParametricStereo, sbrBitstreamData, &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, h_con->sbrSyntaxFlags); h_envChan[0]->encEnvData.addHarmonicFlag = tempFlagLeft; h_envChan[1]->encEnvData.addHarmonicFlag = tempFlagRight; if (payloadbitsCOUPLING < payloadbitsLR) { /* copy coded coupling envelope and noise data to l/r */ for(ch = 0; ch < nChannels;ch++){ SBR_ENV_TEMP_DATA *ed = &eData[ch]; FDKmemcpy (ed->sfb_nrg, ed->sfb_nrg_coupling, MAX_NUM_ENVELOPE_VALUES * sizeof (SCHAR)); FDKmemcpy (ed->noise_level, ed->noise_level_coupling, MAX_NUM_NOISE_VALUES * sizeof (SCHAR)); } sbrHeaderData->coupling = 1; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 1; } else{ /* restore saved l/r items */ for(ch = 0; ch < nChannels;ch++){ FDKmemcpy (h_envChan[ch]->sbrCodeEnvelope.sfb_nrg_prev, sfbNrgPrevTemp[ch], MAX_FREQ_COEFFS * sizeof (SCHAR)); h_envChan[ch]->sbrCodeEnvelope.upDate = upDateNrgTemp[ch]; FDKmemcpy (h_envChan[ch]->sbrCodeNoiseFloor.sfb_nrg_prev, noisePrevTemp[ch], MAX_NUM_NOISE_COEFFS * sizeof (SCHAR)); FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec,domainVecTemp[ch],sizeof(INT)*MAX_ENVELOPES); FDKmemcpy (h_envChan[ch]->encEnvData.domain_vec_noise,domainVecNoiseTemp[ch],sizeof(INT)*MAX_ENVELOPES); h_envChan[ch]->sbrCodeNoiseFloor.upDate = upDateNoiseTemp[ch]; } sbrHeaderData->coupling = 0; h_envChan[0]->encEnvData.balance = 0; h_envChan[1]->encEnvData.balance = 0; } } break; } /* switch */ /* tell the envelope encoders how long it has been, since we last sent a frame starting with a dF-coded envelope */ if (stereoMode == SBR_MONO ) { if (h_envChan[0]->encEnvData.domain_vec[0] == TIME) h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; else h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; } else { if (h_envChan[0]->encEnvData.domain_vec[0] == TIME || h_envChan[1]->encEnvData.domain_vec[0] == TIME) { h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac++; h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac++; } else { h_envChan[0]->sbrCodeEnvelope.dF_edge_incr_fac = 0; h_envChan[1]->sbrCodeEnvelope.dF_edge_incr_fac = 0; } } /* Send the encoded data to the bitstream */ for(ch = 0; ch < nChannels;ch++){ SBR_ENV_TEMP_DATA *ed = &eData[ch]; c = 0; for (i = 0; i < ed->nEnvelopes; i++) { for (j = 0; j < h_envChan[ch]->encEnvData.noScfBands[i]; j++) { h_envChan[ch]->encEnvData.ienvelope[i][j] = ed->sfb_nrg[c]; c++; } } for (i = 0; i < MAX_NUM_NOISE_VALUES; i++){ h_envChan[ch]->encEnvData.sbr_noise_levels[i] = ed->noise_level[i]; } }/* ch */ /* Write bitstream */ if (nChannels == 2) { FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData, hParametricStereo, sbrBitstreamData, &h_envChan[0]->encEnvData, &h_envChan[1]->encEnvData, hCmonData, h_con->sbrSyntaxFlags); } else { FDKsbrEnc_WriteEnvSingleChannelElement(sbrHeaderData, hParametricStereo, sbrBitstreamData, &h_envChan[0]->encEnvData, hCmonData, h_con->sbrSyntaxFlags); } /* * Update buffers. */ for (ch=0; chsbrExtractEnvelope.no_cols >> h_envChan[ch]->sbrExtractEnvelope.YBufferSzShift; for (i = 0; i < h_envChan[ch]->sbrExtractEnvelope.YBufferWriteOffset; i++) { FDKmemcpy(h_envChan[ch]->sbrExtractEnvelope.YBuffer[i], h_envChan[ch]->sbrExtractEnvelope.YBuffer[i + YBufferLength], sizeof(FIXP_DBL)*QMF_CHANNELS); } h_envChan[ch]->sbrExtractEnvelope.YBufferScale[0] = h_envChan[ch]->sbrExtractEnvelope.YBufferScale[1]; } sbrHeaderData->prev_coupling = sbrHeaderData->coupling; } /***************************************************************************/ /*! \brief creates an envelope extractor handle \return error status ****************************************************************************/ INT FDKsbrEnc_CreateExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, INT channel ,INT chInEl ,UCHAR* dynamic_RAM ) { INT i; FIXP_DBL* YBuffer = GetRam_Sbr_envYBuffer(channel); FDKmemclear(hSbrCut,sizeof(SBR_EXTRACT_ENVELOPE)); hSbrCut->p_YBuffer = YBuffer; for (i = 0; i < (QMF_MAX_TIME_SLOTS>>1); i++) { hSbrCut->YBuffer[i] = YBuffer + (i*QMF_CHANNELS); } FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); INT n=0; for (; i < QMF_MAX_TIME_SLOTS; i++,n++) { hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); } FIXP_DBL* rBuffer = GetRam_Sbr_envRBuffer(0, dynamic_RAM); FIXP_DBL* iBuffer = GetRam_Sbr_envIBuffer(0, dynamic_RAM); for (i = 0; i < QMF_MAX_TIME_SLOTS; i++) { hSbrCut->rBuffer[i] = rBuffer + (i*QMF_CHANNELS); hSbrCut->iBuffer[i] = iBuffer + (i*QMF_CHANNELS); } return 0; } /***************************************************************************/ /*! \brief Initialize an envelope extractor instance. \return error status ****************************************************************************/ INT FDKsbrEnc_InitExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut, int no_cols, int no_rows, int start_index, int time_slots, int time_step, int tran_off, ULONG statesInitFlag ,int chInEl ,UCHAR* dynamic_RAM ,UINT sbrSyntaxFlags ) { int YBufferLength, rBufferLength; int i; if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { int off = TRANSIENT_OFFSET_LD; #ifndef FULL_DELAY hSbrCut->YBufferWriteOffset = (no_cols>>1)+off*time_step; #else hSbrCut->YBufferWriteOffset = no_cols+off*time_step; #endif } else { hSbrCut->YBufferWriteOffset = tran_off*time_step; } hSbrCut->rBufferReadOffset = 0; YBufferLength = hSbrCut->YBufferWriteOffset + no_cols; rBufferLength = no_cols; hSbrCut->pre_transient_info[0] = 0; hSbrCut->pre_transient_info[1] = 0; hSbrCut->no_cols = no_cols; hSbrCut->no_rows = no_rows; hSbrCut->start_index = start_index; hSbrCut->time_slots = time_slots; hSbrCut->time_step = time_step; FDK_ASSERT(no_rows <= QMF_CHANNELS); /* Use half the Energy values if time step is 2 or greater */ if (time_step >= 2) hSbrCut->YBufferSzShift = 1; else hSbrCut->YBufferSzShift = 0; YBufferLength >>= hSbrCut->YBufferSzShift; hSbrCut->YBufferWriteOffset >>= hSbrCut->YBufferSzShift; FDK_ASSERT(YBufferLength<=QMF_MAX_TIME_SLOTS); FIXP_DBL *YBufferDyn = GetRam_Sbr_envYBuffer(chInEl, dynamic_RAM); INT n=0; for (i=(QMF_MAX_TIME_SLOTS>>1); i < QMF_MAX_TIME_SLOTS; i++,n++) { hSbrCut->YBuffer[i] = YBufferDyn + (n*QMF_CHANNELS); } if(statesInitFlag) { for (i=0; iYBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); } } for (i = 0; i < rBufferLength; i++) { FDKmemclear( hSbrCut->rBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); FDKmemclear( hSbrCut->iBuffer[i],QMF_CHANNELS*sizeof(FIXP_DBL)); } FDKmemclear (hSbrCut->envelopeCompensation,sizeof(UCHAR)*MAX_FREQ_COEFFS); if(statesInitFlag) { hSbrCut->YBufferScale[0] = hSbrCut->YBufferScale[1] = FRACT_BITS-1; } return (0); } /***************************************************************************/ /*! \brief deinitializes an envelope extractor handle \return void ****************************************************************************/ void FDKsbrEnc_deleteExtractSbrEnvelope (HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut) { if (hSbrCut) { FreeRam_Sbr_envYBuffer(&hSbrCut->p_YBuffer); } } INT FDKsbrEnc_GetEnvEstDelay(HANDLE_SBR_EXTRACT_ENVELOPE hSbr) { return hSbr->no_rows*((hSbr->YBufferWriteOffset)*2 /* mult 2 because nrg's are grouped half */ - hSbr->rBufferReadOffset ); /* in reference hold half spec and calc nrg's on overlapped spec */ } fdk-aac-0.1.3/libSBRenc/src/sbr_rom.h0000644000175000017500000001373712372261464017633 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Declaration of constant tables */ #ifndef __SBR_ROM_H #define __SBR_ROM_H #include "sbr_def.h" #include "sbr_encoder.h" #include "ps_main.h" /* huffman tables */ extern const INT v_Huff_envelopeLevelC10T[121]; extern const UCHAR v_Huff_envelopeLevelL10T[121]; extern const INT v_Huff_envelopeLevelC10F[121]; extern const UCHAR v_Huff_envelopeLevelL10F[121]; extern const INT bookSbrEnvBalanceC10T[49]; extern const UCHAR bookSbrEnvBalanceL10T[49]; extern const INT bookSbrEnvBalanceC10F[49]; extern const UCHAR bookSbrEnvBalanceL10F[49]; extern const INT v_Huff_envelopeLevelC11T[63]; extern const UCHAR v_Huff_envelopeLevelL11T[63]; extern const INT v_Huff_envelopeLevelC11F[63]; extern const UCHAR v_Huff_envelopeLevelL11F[63]; extern const INT bookSbrEnvBalanceC11T[25]; extern const UCHAR bookSbrEnvBalanceL11T[25]; extern const INT bookSbrEnvBalanceC11F[25]; extern const UCHAR bookSbrEnvBalanceL11F[25]; extern const INT v_Huff_NoiseLevelC11T[63]; extern const UCHAR v_Huff_NoiseLevelL11T[63]; extern const INT bookSbrNoiseBalanceC11T[25]; extern const UCHAR bookSbrNoiseBalanceL11T[25]; extern const sbrTuningTable_t sbrTuningTable[]; extern const int sbrTuningTableSize; extern const psTuningTable_t psTuningTable[4]; #endif fdk-aac-0.1.3/libSBRenc/src/ton_corr.cpp0000644000175000017500000010451212372261464020340 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "ton_corr.h" #include "sbr_ram.h" #include "sbr_misc.h" #include "genericStds.h" #include "autocorr2nd.h" /*************************************************************************** Send autoCorrSecondOrder to mlfile ****************************************************************************/ /**************************************************************************/ /*! \brief Calculates the tonal to noise ration for different frequency bands and time segments. The ratio between the predicted energy (tonal energy A) and the total energy (A + B) is calculated. This is converted to the ratio between the predicted energy (tonal energy A) and the non-predictable energy (noise energy B). Hence the quota-matrix contains A/B = q/(1-q). The samples in nrgVector are scaled by 1.0/16.0 The samples in pNrgVectorFreq are scaled by 1.0/2.0 The samples in quotaMatrix are scaled by RELAXATION \return none. */ /**************************************************************************/ void FDKsbrEnc_CalculateTonalityQuotas( HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ FIXP_DBL **RESTRICT sourceBufferReal, /*!< The real part of the QMF-matrix. */ FIXP_DBL **RESTRICT sourceBufferImag, /*!< The imaginary part of the QMF-matrix. */ INT usb, /*!< upper side band, highest + 1 QMF band in the SBR range. */ INT qmfScale /*!< sclefactor of QMF subsamples */ ) { INT i, k, r, r2, timeIndex, autoCorrScaling; INT startIndexMatrix = hTonCorr->startIndexMatrix; INT totNoEst = hTonCorr->numberOfEstimates; INT noEstPerFrame = hTonCorr->numberOfEstimatesPerFrame; INT move = hTonCorr->move; INT noQmfChannels = hTonCorr->noQmfChannels; /* Numer of Bands */ INT buffLen = hTonCorr->bufferLength; /* Numer of Slots */ INT stepSize = hTonCorr->stepSize; INT *pBlockLength = hTonCorr->lpcLength; INT** RESTRICT signMatrix = hTonCorr->signMatrix; FIXP_DBL* RESTRICT nrgVector = hTonCorr->nrgVector; FIXP_DBL** RESTRICT quotaMatrix = hTonCorr->quotaMatrix; FIXP_DBL* RESTRICT pNrgVectorFreq = hTonCorr->nrgVectorFreq; #define BAND_V_SIZE QMF_MAX_TIME_SLOTS #define NUM_V_COMBINE 8 /* Must be a divisor of 64 and fulfill the ASSERTs below */ FIXP_DBL *realBuf; FIXP_DBL *imagBuf; FIXP_DBL alphar[2],alphai[2],fac; C_ALLOC_SCRATCH_START(ac, ACORR_COEFS, 1); C_ALLOC_SCRATCH_START(realBufRef, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE); realBuf = realBufRef; imagBuf = realBuf + BAND_V_SIZE*NUM_V_COMBINE; FDK_ASSERT(buffLen <= BAND_V_SIZE); FDK_ASSERT(sizeof(FIXP_DBL)*NUM_V_COMBINE*BAND_V_SIZE*2 < (1024*sizeof(FIXP_DBL)-sizeof(ACORR_COEFS)) ); /* * Buffering of the quotaMatrix and the quotaMatrixTransp. *********************************************************/ for(i = 0 ; i < move; i++){ FDKmemcpy(quotaMatrix[i],quotaMatrix[i + noEstPerFrame],noQmfChannels * sizeof(FIXP_DBL)); FDKmemcpy(signMatrix[i],signMatrix[i + noEstPerFrame],noQmfChannels * sizeof(INT)); } FDKmemmove(nrgVector,nrgVector+noEstPerFrame,move*sizeof(FIXP_DBL)); FDKmemclear(nrgVector+startIndexMatrix,(totNoEst-startIndexMatrix)*sizeof(FIXP_DBL)); FDKmemclear(pNrgVectorFreq,noQmfChannels * sizeof(FIXP_DBL)); /* * Calculate the quotas for the current time steps. **************************************************/ for (r = 0; r < usb; r++) { int blockLength; k = hTonCorr->nextSample; /* startSample */ timeIndex = startIndexMatrix; /* Copy as many as possible Band accross all Slots at once */ if (realBuf != realBufRef) { realBuf -= BAND_V_SIZE; imagBuf -= BAND_V_SIZE; } else { realBuf += BAND_V_SIZE*(NUM_V_COMBINE-1); imagBuf += BAND_V_SIZE*(NUM_V_COMBINE-1); for (i = 0; i < buffLen; i++) { int v; FIXP_DBL *ptr; ptr = realBuf+i; for (v=0; vdet == FL2FXCONST_DBL(0.0f)){ alphar[1] = alphai[1] = FL2FXCONST_DBL(0.0f); alphar[0] = (ac->r01r)>>2; alphai[0] = (ac->r01i)>>2; fac = fMultDiv2(ac->r00r, ac->r11r)>>1; } else{ alphar[1] = (fMultDiv2(ac->r01r, ac->r12r)>>1) - (fMultDiv2(ac->r01i, ac->r12i)>>1) - (fMultDiv2(ac->r02r, ac->r11r)>>1); alphai[1] = (fMultDiv2(ac->r01i, ac->r12r)>>1) + (fMultDiv2(ac->r01r, ac->r12i)>>1) - (fMultDiv2(ac->r02i, ac->r11r)>>1); alphar[0] = (fMultDiv2(ac->r01r, ac->det)>>(ac->det_scale+1)) + fMult(alphar[1], ac->r12r) + fMult(alphai[1], ac->r12i); alphai[0] = (fMultDiv2(ac->r01i, ac->det)>>(ac->det_scale+1)) + fMult(alphai[1], ac->r12r) - fMult(alphar[1], ac->r12i); fac = fMultDiv2(ac->r00r, fMult(ac->det, ac->r11r))>>(ac->det_scale+1); } if(fac == FL2FXCONST_DBL(0.0f)){ quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); signMatrix[timeIndex][r] = 0; } else { /* quotaMatrix is scaled with the factor RELAXATION parse RELAXATION in fractional part and shift factor: 1/(1/0.524288 * 2^RELAXATION_SHIFT) */ FIXP_DBL tmp,num,denom; INT numShift,denomShift,commonShift; INT sign; num = fMultDiv2(alphar[0], ac->r01r) + fMultDiv2(alphai[0], ac->r01i) - fMultDiv2(alphar[1], fMult(ac->r02r, ac->r11r)) - fMultDiv2(alphai[1], fMult(ac->r02i, ac->r11r)); num = fixp_abs(num); denom = (fac>>1) + (fMultDiv2(fac,RELAXATION_FRACT)>>RELAXATION_SHIFT) - num; denom = fixp_abs(denom); num = fMult(num,RELAXATION_FRACT); numShift = CountLeadingBits(num) - 2; num = scaleValue(num, numShift); denomShift = CountLeadingBits(denom); denom = (FIXP_DBL)denom << denomShift; if ((num > FL2FXCONST_DBL(0.0f)) && (denom != FL2FXCONST_DBL(0.0f))) { commonShift = fixMin(numShift - denomShift + RELAXATION_SHIFT, DFRACT_BITS-1); if (commonShift < 0) { commonShift = -commonShift; tmp = schur_div(num,denom,16); commonShift = fixMin(commonShift,CountLeadingBits(tmp)); quotaMatrix[timeIndex][r] = tmp << commonShift; } else { quotaMatrix[timeIndex][r] = schur_div(num,denom,16) >> commonShift; } } else { quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f); } if (ac->r11r != FL2FXCONST_DBL(0.0f)) { if ( ( (ac->r01r >= FL2FXCONST_DBL(0.0f) ) && ( ac->r11r >= FL2FXCONST_DBL(0.0f) ) ) ||( (ac->r01r < FL2FXCONST_DBL(0.0f) ) && ( ac->r11r < FL2FXCONST_DBL(0.0f) ) ) ) { sign = 1; } else { sign = -1; } } else { sign = 1; } if(sign < 0) { r2 = r; /* (INT) pow(-1, band); */ } else { r2 = r + 1; /* (INT) pow(-1, band+1); */ } signMatrix[timeIndex][r] = 1 - 2*(r2 & 0x1); } nrgVector[timeIndex] += ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC))); /* pNrgVectorFreq[r] finally has to be divided by noEstPerFrame, replaced division by shifting with one */ pNrgVectorFreq[r] = pNrgVectorFreq[r] + ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC))); blockLength = pBlockLength[1]; k += stepSize; timeIndex++; } } C_ALLOC_SCRATCH_END(realBuf, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE); C_ALLOC_SCRATCH_END(ac, ACORR_COEFS, 1); } /**************************************************************************/ /*! \brief Extracts the parameters required in the decoder to obtain the correct tonal to noise ratio after SBR. Estimates the tonal to noise ratio of the original signal (using LPC). Predicts the tonal to noise ration of the SBR signal (in the decoder) by patching the tonal to noise ratio values similar to the patching of the lowband in the decoder. Given the tonal to noise ratio of the original and the SBR signal, it estimates the required amount of inverse filtering, additional noise as well as any additional sines. \return none. */ /**************************************************************************/ void FDKsbrEnc_TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr,/*!< Handle to SBR_TON_CORR struct. */ INVF_MODE* infVec, /*!< Vector where the inverse filtering levels will be stored. */ FIXP_DBL * noiseLevels, /*!< Vector where the noise levels will be stored. */ INT* missingHarmonicFlag, /*!< Flag set to one or zero, dependent on if any strong sines are missing.*/ UCHAR * missingHarmonicsIndex, /*!< Vector indicating where sines are missing. */ UCHAR * envelopeCompensation, /*!< Vector to store compensation values for the energies in. */ const SBR_FRAME_INFO *frameInfo, /*!< Frame info struct, contains the time and frequency grid of the current frame.*/ UCHAR* transientInfo, /*!< Transient info.*/ UCHAR* freqBandTable, /*!< Frequency band tables for high-res.*/ INT nSfb, /*!< Number of scalefactor bands for high-res. */ XPOS_MODE xposType, /*!< Type of transposer used in the decoder.*/ UINT sbrSyntaxFlags ) { INT band; INT transientFlag = transientInfo[1] ; /*!< Flag indicating if a transient is present in the current frame. */ INT transientPos = transientInfo[0]; /*!< Position of the transient.*/ INT transientFrame, transientFrameInvfEst; INVF_MODE* infVecPtr; /* Determine if this is a frame where a transient starts... The detection of noise-floor, missing harmonics and invf_est, is not in sync for the non-buf-opt decoder such as AAC. Hence we need to keep track on the transient in the present frame as well as in the next. */ transientFrame = 0; if(hTonCorr->transientNextFrame){ /* The transient was detected in the previous frame, but is actually */ transientFrame = 1; hTonCorr->transientNextFrame = 0; if(transientFlag){ if(transientPos + hTonCorr->transientPosOffset >= frameInfo->borders[frameInfo->nEnvelopes]){ hTonCorr->transientNextFrame = 1; } } } else{ if(transientFlag){ if(transientPos + hTonCorr->transientPosOffset < frameInfo->borders[frameInfo->nEnvelopes]){ transientFrame = 1; hTonCorr->transientNextFrame = 0; } else{ hTonCorr->transientNextFrame = 1; } } } transientFrameInvfEst = transientFrame; /* Estimate the required invese filtereing level. */ if (hTonCorr->switchInverseFilt) FDKsbrEnc_qmfInverseFilteringDetector(&hTonCorr->sbrInvFilt, hTonCorr->quotaMatrix, hTonCorr->nrgVector, hTonCorr->indexVector, hTonCorr->frameStartIndexInvfEst, hTonCorr->numberOfEstimatesPerFrame + hTonCorr->frameStartIndexInvfEst, transientFrameInvfEst, infVec); /* Detect what tones will be missing. */ if (xposType == XPOS_LC ){ FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(&hTonCorr->sbrMissingHarmonicsDetector, hTonCorr->quotaMatrix, hTonCorr->signMatrix, hTonCorr->indexVector, frameInfo, transientInfo, missingHarmonicFlag, missingHarmonicsIndex, freqBandTable, nSfb, envelopeCompensation, hTonCorr->nrgVectorFreq); } else{ *missingHarmonicFlag = 0; FDKmemclear(missingHarmonicsIndex,nSfb*sizeof(UCHAR)); } /* Noise floor estimation */ infVecPtr = hTonCorr->sbrInvFilt.prevInvfMode; FDKsbrEnc_sbrNoiseFloorEstimateQmf(&hTonCorr->sbrNoiseFloorEstimate, frameInfo, noiseLevels, hTonCorr->quotaMatrix, hTonCorr->indexVector, *missingHarmonicFlag, hTonCorr->frameStartIndex, hTonCorr->numberOfEstimatesPerFrame, transientFrame, infVecPtr, sbrSyntaxFlags); /* Store the invfVec data for the next frame...*/ for(band = 0 ; band < hTonCorr->sbrInvFilt.noDetectorBands; band++){ hTonCorr->sbrInvFilt.prevInvfMode[band] = infVec[band]; } } /**************************************************************************/ /*! \brief Searches for the closest match in the frequency master table. \return closest entry. */ /**************************************************************************/ static INT findClosestEntry(INT goalSb, UCHAR *v_k_master, INT numMaster, INT direction) { INT index; if( goalSb <= v_k_master[0] ) return v_k_master[0]; if( goalSb >= v_k_master[numMaster] ) return v_k_master[numMaster]; if(direction) { index = 0; while( v_k_master[index] < goalSb ) { index++; } } else { index = numMaster; while( v_k_master[index] > goalSb ) { index--; } } return v_k_master[index]; } /**************************************************************************/ /*! \brief resets the patch \return errorCode, noError if successful. */ /**************************************************************************/ static INT resetPatch(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ INT xposctrl, /*!< Different patch modes. */ INT highBandStartSb, /*!< Start band of the SBR range. */ UCHAR *v_k_master, /*!< Master frequency table from which all other table are derived.*/ INT numMaster, /*!< Number of elements in the master table. */ INT fs, /*!< Sampling frequency. */ INT noChannels) /*!< Number of QMF-channels. */ { INT patch,k,i; INT targetStopBand; PATCH_PARAM *patchParam = hTonCorr->patchParam; INT sbGuard = hTonCorr->guard; INT sourceStartBand; INT patchDistance; INT numBandsInPatch; INT lsb = v_k_master[0]; /* Lowest subband related to the synthesis filterbank */ INT usb = v_k_master[numMaster]; /* Stop subband related to the synthesis filterbank */ INT xoverOffset = highBandStartSb - v_k_master[0]; /* Calculate distance in subbands between k0 and kx */ INT goalSb; /* * Initialize the patching parameter */ if (xposctrl == 1) { lsb += xoverOffset; xoverOffset = 0; } goalSb = (INT)( (2 * noChannels * 16000 + (fs>>1)) / fs ); /* 16 kHz band */ goalSb = findClosestEntry(goalSb, v_k_master, numMaster, 1); /* Adapt region to master-table */ /* First patch */ sourceStartBand = hTonCorr->shiftStartSb + xoverOffset; targetStopBand = lsb + xoverOffset; /* even (odd) numbered channel must be patched to even (odd) numbered channel */ patch = 0; while(targetStopBand < usb) { /* To many patches */ if (patch >= MAX_NUM_PATCHES) return(1); /*Number of patches to high */ patchParam[patch].guardStartBand = targetStopBand; targetStopBand += sbGuard; patchParam[patch].targetStartBand = targetStopBand; numBandsInPatch = goalSb - targetStopBand; /* get the desired range of the patch */ if ( numBandsInPatch >= lsb - sourceStartBand ) { /* desired number bands are not available -> patch whole source range */ patchDistance = targetStopBand - sourceStartBand; /* get the targetOffset */ patchDistance = patchDistance & ~1; /* rounding off odd numbers and make all even */ numBandsInPatch = lsb - (targetStopBand - patchDistance); numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, v_k_master, numMaster, 0) - targetStopBand; /* Adapt region to master-table */ } /* desired number bands are available -> get the minimal even patching distance */ patchDistance = numBandsInPatch + targetStopBand - lsb; /* get minimal distance */ patchDistance = (patchDistance + 1) & ~1; /* rounding up odd numbers and make all even */ if (numBandsInPatch <= 0) { patch--; } else { patchParam[patch].sourceStartBand = targetStopBand - patchDistance; patchParam[patch].targetBandOffs = patchDistance; patchParam[patch].numBandsInPatch = numBandsInPatch; patchParam[patch].sourceStopBand = patchParam[patch].sourceStartBand + numBandsInPatch; targetStopBand += patchParam[patch].numBandsInPatch; } /* All patches but first */ sourceStartBand = hTonCorr->shiftStartSb; /* Check if we are close to goalSb */ if( fixp_abs(targetStopBand - goalSb) < 3) { goalSb = usb; } patch++; } patch--; /* if highest patch contains less than three subband: skip it */ if ( patchParam[patch].numBandsInPatch < 3 && patch > 0 ) { patch--; targetStopBand = patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch; } hTonCorr->noOfPatches = patch + 1; /* Assign the index-vector, so we know where to look for the high-band. -1 represents a guard-band. */ for(k = 0; k < hTonCorr->patchParam[0].guardStartBand; k++) hTonCorr->indexVector[k] = k; for(i = 0; i < hTonCorr->noOfPatches; i++) { INT sourceStart = hTonCorr->patchParam[i].sourceStartBand; INT targetStart = hTonCorr->patchParam[i].targetStartBand; INT numberOfBands = hTonCorr->patchParam[i].numBandsInPatch; INT startGuardBand = hTonCorr->patchParam[i].guardStartBand; for(k = 0; k < (targetStart- startGuardBand); k++) hTonCorr->indexVector[startGuardBand+k] = -1; for(k = 0; k < numberOfBands; k++) hTonCorr->indexVector[targetStart+k] = sourceStart+k; } return (0); } /**************************************************************************/ /*! \brief Creates an instance of the tonality correction parameter module. The module includes modules for inverse filtering level estimation, missing harmonics detection and noise floor level estimation. \return errorCode, noError if successful. */ /**************************************************************************/ INT FDKsbrEnc_CreateTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ INT chan) /*!< Channel index, needed for mem allocation */ { INT i; FIXP_DBL* quotaMatrix = GetRam_Sbr_quotaMatrix(chan); INT* signMatrix = GetRam_Sbr_signMatrix(chan); FDKmemclear(hTonCorr, sizeof(SBR_TON_CORR_EST)); for (i=0; iquotaMatrix[i] = quotaMatrix + (i*QMF_CHANNELS); hTonCorr->signMatrix[i] = signMatrix + (i*QMF_CHANNELS); } FDKsbrEnc_CreateSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector, chan); return 0; } /**************************************************************************/ /*! \brief Initialize an instance of the tonality correction parameter module. The module includes modules for inverse filtering level estimation, missing harmonics detection and noise floor level estimation. \return errorCode, noError if successful. */ /**************************************************************************/ INT FDKsbrEnc_InitTonCorrParamExtr (INT frameSize, /*!< Current SBR frame size. */ HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ HANDLE_SBR_CONFIG_DATA sbrCfg, /*!< Pointer to SBR configuration parameters. */ INT timeSlots, /*!< Number of time-slots per frame */ INT xposCtrl, /*!< Different patch modes. */ INT ana_max_level, /*!< Maximum level of the adaptive noise. */ INT noiseBands, /*!< Number of noise bands per octave. */ INT noiseFloorOffset, /*!< Noise floor offset. */ UINT useSpeechConfig) /*!< Speech or music tuning. */ { INT nCols = sbrCfg->noQmfSlots; INT fs = sbrCfg->sampleFreq; INT noQmfChannels = sbrCfg->noQmfBands; INT highBandStartSb = sbrCfg->freqBandTable[LOW_RES][0]; UCHAR *v_k_master = sbrCfg->v_k_master; INT numMaster = sbrCfg->num_Master; UCHAR **freqBandTable = sbrCfg->freqBandTable; INT *nSfb = sbrCfg->nSfb; INT i; /* Reset the patching and allocate memory for the quota matrix. Assing parameters for the LPC analysis. */ if (sbrCfg->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { switch (timeSlots) { case NUMBER_TIME_SLOTS_1920: hTonCorr->lpcLength[0] = 8 - LPC_ORDER; hTonCorr->lpcLength[1] = 7 - LPC_ORDER; hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LD; hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 7; hTonCorr->frameStartIndexInvfEst = 0; hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; break; case NUMBER_TIME_SLOTS_2048: hTonCorr->lpcLength[0] = 8 - LPC_ORDER; hTonCorr->lpcLength[1] = 8 - LPC_ORDER; hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LD; hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 8; hTonCorr->frameStartIndexInvfEst = 0; hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; break; } } else switch (timeSlots) { case NUMBER_TIME_SLOTS_2048: hTonCorr->lpcLength[0] = 16 - LPC_ORDER; /* blockLength[0] */ hTonCorr->lpcLength[1] = 16 - LPC_ORDER; /* blockLength[0] */ hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LC; hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 16; hTonCorr->frameStartIndexInvfEst = 0; hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_2048; break; case NUMBER_TIME_SLOTS_1920: hTonCorr->lpcLength[0] = 15 - LPC_ORDER; /* blockLength[0] */ hTonCorr->lpcLength[1] = 15 - LPC_ORDER; /* blockLength[0] */ hTonCorr->numberOfEstimates = NO_OF_ESTIMATES_LC; hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 15; hTonCorr->frameStartIndexInvfEst = 0; hTonCorr->transientPosOffset = FRAME_MIDDLE_SLOT_1920; break; default: return -1; } hTonCorr->bufferLength = nCols; hTonCorr->stepSize = hTonCorr->lpcLength[0] + LPC_ORDER; /* stepSize[0] implicitly 0. */ hTonCorr->nextSample = LPC_ORDER; /* firstSample */ hTonCorr->move = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame; /* Number of estimates to move when buffering.*/ hTonCorr->startIndexMatrix = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame; /* Where to store the latest estimations in the tonality Matrix.*/ hTonCorr->frameStartIndex = 0; /* Where in the tonality matrix the current frame (to be sent to the decoder) starts. */ hTonCorr->prevTransientFlag = 0; hTonCorr->transientNextFrame = 0; hTonCorr->noQmfChannels = noQmfChannels; for (i=0; inumberOfEstimates; i++) { FDKmemclear (hTonCorr->quotaMatrix[i] , sizeof(FIXP_DBL)*noQmfChannels); FDKmemclear (hTonCorr->signMatrix[i] , sizeof(INT)*noQmfChannels); } /* Reset the patch.*/ hTonCorr->guard = 0; hTonCorr->shiftStartSb = 1; if(resetPatch(hTonCorr, xposCtrl, highBandStartSb, v_k_master, numMaster, fs, noQmfChannels)) return(1); if(FDKsbrEnc_InitSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate, ana_max_level, freqBandTable[LO], nSfb[LO], noiseBands, noiseFloorOffset, timeSlots, useSpeechConfig)) return(1); if(FDKsbrEnc_initInvFiltDetector(&hTonCorr->sbrInvFilt, hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, hTonCorr->sbrNoiseFloorEstimate.noNoiseBands, useSpeechConfig)) return(1); if(FDKsbrEnc_InitSbrMissingHarmonicsDetector( &hTonCorr->sbrMissingHarmonicsDetector, fs, frameSize, nSfb[HI], noQmfChannels, hTonCorr->numberOfEstimates, hTonCorr->move, hTonCorr->numberOfEstimatesPerFrame, sbrCfg->sbrSyntaxFlags)) return(1); return (0); } /**************************************************************************/ /*! \brief resets tonality correction parameter module. \return errorCode, noError if successful. */ /**************************************************************************/ INT FDKsbrEnc_ResetTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ INT xposctrl, /*!< Different patch modes. */ INT highBandStartSb, /*!< Start band of the SBR range. */ UCHAR *v_k_master, /*!< Master frequency table from which all other table are derived.*/ INT numMaster, /*!< Number of elements in the master table. */ INT fs, /*!< Sampling frequency (of the SBR part). */ UCHAR ** freqBandTable, /*!< Frequency band table for low-res and high-res. */ INT* nSfb, /*!< Number of frequency bands (hig-res and low-res). */ INT noQmfChannels /*!< Number of QMF channels. */ ) { /* Reset the patch.*/ hTonCorr->guard = 0; hTonCorr->shiftStartSb = 1; if(resetPatch(hTonCorr, xposctrl, highBandStartSb, v_k_master, numMaster, fs, noQmfChannels)) return(1); /* Reset the noise floor estimate.*/ if(FDKsbrEnc_resetSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate, freqBandTable[LO], nSfb[LO])) return(1); /* Reset the inveerse filtereing detector. */ if(FDKsbrEnc_resetInvFiltDetector(&hTonCorr->sbrInvFilt, hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf, hTonCorr->sbrNoiseFloorEstimate.noNoiseBands)) return(1); /* Reset the missing harmonics detector. */ if(FDKsbrEnc_ResetSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector, nSfb[HI])) return(1); return (0); } /**************************************************************************/ /*! \brief Deletes the tonality correction paramtere module. \return none */ /**************************************************************************/ void FDKsbrEnc_DeleteTonCorrParamExtr (HANDLE_SBR_TON_CORR_EST hTonCorr) /*!< Handle to SBR_TON_CORR struct. */ { if (hTonCorr) { FreeRam_Sbr_quotaMatrix(hTonCorr->quotaMatrix); FreeRam_Sbr_signMatrix(hTonCorr->signMatrix); FDKsbrEnc_DeleteSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector); } } fdk-aac-0.1.3/libSBRenc/src/bit_sbr.cpp0000644000175000017500000012230712372261464020141 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief SBR bit writing routines */ #include "bit_sbr.h" #include "code_env.h" #include "cmondata.h" #include "sbr.h" #include "ps_main.h" typedef enum { SBR_ID_SCE = 1, SBR_ID_CPE } SBR_ELEMENT_TYPE; static INT encodeSbrData (HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem, INT coupling, UINT sbrSyntaxFlags); static INT encodeSbrHeader (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_COMMON_DATA cmonData); static INT encodeSbrHeaderData (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_FDK_BITSTREAM hBitStream); static INT encodeSbrSingleChannelElement (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream ,HANDLE_PARAMETRIC_STEREO hParametricStereo ,UINT sbrSyntaxFlags ); static INT encodeSbrChannelPairElement (HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream, INT coupling); static INT encodeSbrGrid (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream); static int encodeLowDelaySbrGrid ( HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, int transmitFreqs); static INT encodeSbrDtdf (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream); static INT writeNoiseLevelData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling); static INT writeEnvelopeData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling); static INT writeSyntheticCodingData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream); static INT encodeExtendedData (HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream); static INT getSbrExtendedDataSize (HANDLE_PARAMETRIC_STEREO hParametricStereo); /***************************************************************************** functionname: FDKsbrEnc_WriteEnvSingleChannelElement description: writes pure SBR single channel data element returns: number of bits written input: output: *****************************************************************************/ INT FDKsbrEnc_WriteEnvSingleChannelElement( HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags ) { INT payloadBits = 0; cmonData->sbrHdrBits = 0; cmonData->sbrDataBits = 0; /* write pure sbr data */ if (sbrEnvData != NULL) { /* write header */ payloadBits += encodeSbrHeader (sbrHeaderData, sbrBitstreamData, cmonData); /* write data */ payloadBits += encodeSbrData (sbrEnvData, NULL, hParametricStereo, cmonData, SBR_ID_SCE, 0, sbrSyntaxFlags); } return payloadBits; } /***************************************************************************** functionname: FDKsbrEnc_WriteEnvChannelPairElement description: writes pure SBR channel pair data element returns: number of bits written input: output: *****************************************************************************/ INT FDKsbrEnc_WriteEnvChannelPairElement (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) { INT payloadBits = 0; cmonData->sbrHdrBits = 0; cmonData->sbrDataBits = 0; /* write pure sbr data */ if ((sbrEnvDataLeft != NULL) && (sbrEnvDataRight != NULL)) { /* write header */ payloadBits += encodeSbrHeader (sbrHeaderData, sbrBitstreamData, cmonData); /* write data */ payloadBits += encodeSbrData (sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo, cmonData, SBR_ID_CPE, sbrHeaderData->coupling, sbrSyntaxFlags); } return payloadBits; } INT FDKsbrEnc_CountSbrChannelPairElement (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_COMMON_DATA cmonData, UINT sbrSyntaxFlags) { INT payloadBits; INT bitPos = FDKgetValidBits(&cmonData->sbrBitbuf); payloadBits = FDKsbrEnc_WriteEnvChannelPairElement(sbrHeaderData, hParametricStereo, sbrBitstreamData, sbrEnvDataLeft, sbrEnvDataRight, cmonData, sbrSyntaxFlags); FDKpushBack(&cmonData->sbrBitbuf, (FDKgetValidBits(&cmonData->sbrBitbuf) - bitPos) ); return payloadBits; } void sbrEncoder_GetHeader(SBR_ENCODER *sbrEncoder, HANDLE_FDK_BITSTREAM hBs, INT element_index, int fSendHeaders) { int bits; bits = encodeSbrHeaderData (&sbrEncoder->sbrElement[element_index]->sbrHeaderData, hBs); if (fSendHeaders == 0) { /* Prevent header being embedded into the SBR payload. */ sbrEncoder->sbrElement[element_index]->sbrBitstreamData.NrSendHeaderData = -1; sbrEncoder->sbrElement[element_index]->sbrBitstreamData.HeaderActive = 0; sbrEncoder->sbrElement[element_index]->sbrBitstreamData.CountSendHeaderData = -1; } } /***************************************************************************** functionname: encodeSbrHeader description: encodes SBR Header information returns: number of bits written input: output: *****************************************************************************/ static INT encodeSbrHeader (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData, HANDLE_COMMON_DATA cmonData) { INT payloadBits = 0; if (sbrBitstreamData->HeaderActive) { payloadBits += FDKwriteBits (&cmonData->sbrBitbuf, 1, 1); payloadBits += encodeSbrHeaderData (sbrHeaderData, &cmonData->sbrBitbuf); } else { payloadBits += FDKwriteBits (&cmonData->sbrBitbuf, 0, 1); } cmonData->sbrHdrBits = payloadBits; return payloadBits; } /***************************************************************************** functionname: encodeSbrHeaderData description: writes sbr_header() bs_protocol_version through bs_header_extra_2 returns: number of bits written input: output: *****************************************************************************/ static INT encodeSbrHeaderData (HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_FDK_BITSTREAM hBitStream) { INT payloadBits = 0; if (sbrHeaderData != NULL) { payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_amp_res, SI_SBR_AMP_RES_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_start_frequency, SI_SBR_START_FREQ_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_stop_frequency, SI_SBR_STOP_FREQ_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_xover_band, SI_SBR_XOVER_BAND_BITS); payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_RESERVED_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->header_extra_1, SI_SBR_HEADER_EXTRA_1_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->header_extra_2, SI_SBR_HEADER_EXTRA_2_BITS); if (sbrHeaderData->header_extra_1) { payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->freqScale, SI_SBR_FREQ_SCALE_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->alterScale, SI_SBR_ALTER_SCALE_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_noise_bands, SI_SBR_NOISE_BANDS_BITS); } /* sbrHeaderData->header_extra_1 */ if (sbrHeaderData->header_extra_2) { payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_limiter_bands, SI_SBR_LIMITER_BANDS_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_limiter_gains, SI_SBR_LIMITER_GAINS_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_interpol_freq, SI_SBR_INTERPOL_FREQ_BITS); payloadBits += FDKwriteBits (hBitStream, sbrHeaderData->sbr_smoothing_length, SI_SBR_SMOOTHING_LENGTH_BITS); } /* sbrHeaderData->header_extra_2 */ } /* sbrHeaderData != NULL */ return payloadBits; } /***************************************************************************** functionname: encodeSbrData description: encodes sbr Data information returns: number of bits written input: output: *****************************************************************************/ static INT encodeSbrData (HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_COMMON_DATA cmonData, SBR_ELEMENT_TYPE sbrElem, INT coupling, UINT sbrSyntaxFlags) { INT payloadBits = 0; switch (sbrElem) { case SBR_ID_SCE: payloadBits += encodeSbrSingleChannelElement (sbrEnvDataLeft, &cmonData->sbrBitbuf, hParametricStereo, sbrSyntaxFlags); break; case SBR_ID_CPE: payloadBits += encodeSbrChannelPairElement (sbrEnvDataLeft, sbrEnvDataRight, hParametricStereo, &cmonData->sbrBitbuf, coupling); break; default: /* we never should apply SBR to any other element type */ FDK_ASSERT (0); } cmonData->sbrDataBits = payloadBits; return payloadBits; } #define MODE_FREQ_TANS 1 #define MODE_NO_FREQ_TRAN 0 #define LD_TRANSMISSION MODE_FREQ_TANS static int encodeFreqs (int mode) { return ((mode & MODE_FREQ_TANS) ? 1 : 0); } /***************************************************************************** functionname: encodeSbrSingleChannelElement description: encodes sbr SCE information returns: number of bits written input: output: *****************************************************************************/ static INT encodeSbrSingleChannelElement (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream ,HANDLE_PARAMETRIC_STEREO hParametricStereo ,UINT sbrSyntaxFlags ) { INT i, payloadBits = 0; payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ if (sbrEnvData->ldGrid) { if ( sbrEnvData->hSbrBSGrid->frameClass != FIXFIXonly ) { /* encode normal SbrGrid */ payloadBits += encodeSbrGrid (sbrEnvData, hBitStream); } else { /* use FIXFIXonly frame Grid */ payloadBits += encodeLowDelaySbrGrid ( sbrEnvData, hBitStream, encodeFreqs(LD_TRANSMISSION)); } } else { if (sbrSyntaxFlags & SBR_SYNTAX_SCALABLE) { payloadBits += FDKwriteBits (hBitStream, 1, SI_SBR_COUPLING_BITS); } payloadBits += encodeSbrGrid (sbrEnvData, hBitStream); } payloadBits += encodeSbrDtdf (sbrEnvData, hBitStream); for (i = 0; i < sbrEnvData->noOfnoisebands; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); } payloadBits += writeEnvelopeData (sbrEnvData, hBitStream, 0); payloadBits += writeNoiseLevelData (sbrEnvData, hBitStream, 0); payloadBits += writeSyntheticCodingData (sbrEnvData,hBitStream); payloadBits += encodeExtendedData(hParametricStereo, hBitStream); return payloadBits; } /***************************************************************************** functionname: encodeSbrChannelPairElement description: encodes sbr CPE information returns: input: output: *****************************************************************************/ static INT encodeSbrChannelPairElement (HANDLE_SBR_ENV_DATA sbrEnvDataLeft, HANDLE_SBR_ENV_DATA sbrEnvDataRight, HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream, INT coupling) { INT payloadBits = 0; INT i = 0; payloadBits += FDKwriteBits (hBitStream, 0, SI_SBR_DATA_EXTRA_BITS); /* no reserved bits */ payloadBits += FDKwriteBits (hBitStream, coupling, SI_SBR_COUPLING_BITS); if (coupling) { if (sbrEnvDataLeft->ldGrid) { if ( sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly ) { /* normal SbrGrid */ payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); } else { /* FIXFIXonly frame Grid */ payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataLeft, hBitStream, encodeFreqs(LD_TRANSMISSION)); } } else payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); payloadBits += encodeSbrDtdf (sbrEnvDataLeft, hBitStream); payloadBits += encodeSbrDtdf (sbrEnvDataRight, hBitStream); for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); } payloadBits += writeEnvelopeData (sbrEnvDataLeft, hBitStream,1); payloadBits += writeNoiseLevelData (sbrEnvDataLeft, hBitStream,1); payloadBits += writeEnvelopeData (sbrEnvDataRight, hBitStream,1); payloadBits += writeNoiseLevelData (sbrEnvDataRight, hBitStream,1); payloadBits += writeSyntheticCodingData (sbrEnvDataLeft,hBitStream); payloadBits += writeSyntheticCodingData (sbrEnvDataRight,hBitStream); } else { /* no coupling */ FDK_ASSERT(sbrEnvDataLeft->ldGrid == sbrEnvDataRight->ldGrid); if (sbrEnvDataLeft->ldGrid || sbrEnvDataRight->ldGrid) { /* sbrEnvDataLeft (left channel) */ if ( sbrEnvDataLeft->hSbrBSGrid->frameClass != FIXFIXonly) { /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ /* normal SbrGrid */ payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); } else { /* FIXFIXonly frame Grid */ payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataLeft, hBitStream, encodeFreqs(LD_TRANSMISSION)); } /* sbrEnvDataRight (right channel) */ if ( sbrEnvDataRight->hSbrBSGrid->frameClass != FIXFIXonly) { /* no FIXFIXonly Frame so we dont need encodeLowDelaySbrGrid */ /* normal SbrGrid */ payloadBits += encodeSbrGrid (sbrEnvDataRight, hBitStream); } else { /* FIXFIXonly frame Grid */ payloadBits += encodeLowDelaySbrGrid ( sbrEnvDataRight, hBitStream, encodeFreqs(LD_TRANSMISSION)); } } else { payloadBits += encodeSbrGrid (sbrEnvDataLeft, hBitStream); payloadBits += encodeSbrGrid (sbrEnvDataRight, hBitStream); } payloadBits += encodeSbrDtdf (sbrEnvDataLeft, hBitStream); payloadBits += encodeSbrDtdf (sbrEnvDataRight, hBitStream); for (i = 0; i < sbrEnvDataLeft->noOfnoisebands; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvDataLeft->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); } for (i = 0; i < sbrEnvDataRight->noOfnoisebands; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvDataRight->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS); } payloadBits += writeEnvelopeData (sbrEnvDataLeft, hBitStream,0); payloadBits += writeEnvelopeData (sbrEnvDataRight, hBitStream,0); payloadBits += writeNoiseLevelData (sbrEnvDataLeft, hBitStream,0); payloadBits += writeNoiseLevelData (sbrEnvDataRight, hBitStream,0); payloadBits += writeSyntheticCodingData (sbrEnvDataLeft,hBitStream); payloadBits += writeSyntheticCodingData (sbrEnvDataRight,hBitStream); } /* coupling */ payloadBits += encodeExtendedData(hParametricStereo, hBitStream); return payloadBits; } static INT ceil_ln2(INT x) { INT tmp=-1; while((1<<++tmp) < x); return(tmp); } /***************************************************************************** functionname: encodeSbrGrid description: if hBitStream != NULL writes bits that describes the time/frequency grouping of a frame; else counts them only returns: number of bits written or counted input: output: *****************************************************************************/ static INT encodeSbrGrid (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream) { INT payloadBits = 0; INT i, temp; INT bufferFrameStart = sbrEnvData->hSbrBSGrid->bufferFrameStart; INT numberTimeSlots = sbrEnvData->hSbrBSGrid->numberTimeSlots; if (sbrEnvData->ldGrid) payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->frameClass, SBR_CLA_BITS_LD); else payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->frameClass, SBR_CLA_BITS); switch (sbrEnvData->hSbrBSGrid->frameClass) { case FIXFIXonly: FDK_ASSERT(0 /* Fatal error in encodeSbrGrid! */); break; case FIXFIX: temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_env); payloadBits += FDKwriteBits (hBitStream, temp, SBR_ENV_BITS); if ((sbrEnvData->ldGrid) && (sbrEnvData->hSbrBSGrid->bs_num_env==1)) payloadBits += FDKwriteBits(hBitStream, sbrEnvData->currentAmpResFF, SI_SBR_AMP_RES_BITS); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[0], SBR_RES_BITS); break; case FIXVAR: case VARFIX: if (sbrEnvData->hSbrBSGrid->frameClass == FIXVAR) temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - (bufferFrameStart + numberTimeSlots); else temp = sbrEnvData->hSbrBSGrid->bs_abs_bord - bufferFrameStart; payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->n, SBR_NUM_BITS); for (i = 0; i < sbrEnvData->hSbrBSGrid->n; i++) { temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord[i] - 2) >> 1; payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); } temp = ceil_ln2(sbrEnvData->hSbrBSGrid->n + 2); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->p, temp); for (i = 0; i < sbrEnvData->hSbrBSGrid->n + 1; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], SBR_RES_BITS); } break; case VARVAR: temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_0 - bufferFrameStart; payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); temp = sbrEnvData->hSbrBSGrid->bs_abs_bord_1 - (bufferFrameStart + numberTimeSlots); payloadBits += FDKwriteBits (hBitStream, temp, SBR_ABS_BITS); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_0, SBR_NUM_BITS); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->bs_num_rel_1, SBR_NUM_BITS); for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_0; i++) { temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_0[i] - 2) >> 1; payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); } for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_rel_1; i++) { temp = (sbrEnvData->hSbrBSGrid->bs_rel_bord_1[i] - 2) >> 1; payloadBits += FDKwriteBits (hBitStream, temp, SBR_REL_BITS); } temp = ceil_ln2(sbrEnvData->hSbrBSGrid->bs_num_rel_0 + sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 2); payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->p, temp); temp = sbrEnvData->hSbrBSGrid->bs_num_rel_0 + sbrEnvData->hSbrBSGrid->bs_num_rel_1 + 1; for (i = 0; i < temp; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_fLR[i], SBR_RES_BITS); } break; } return payloadBits; } #define SBR_CLA_BITS_LD 1 /***************************************************************************** functionname: encodeLowDelaySbrGrid description: if hBitStream != NULL writes bits that describes the time/frequency grouping of a frame; else counts them only (this function only write the FIXFIXonly Bitstream data) returns: number of bits written or counted input: output: *****************************************************************************/ static int encodeLowDelaySbrGrid ( HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, int transmitFreqs ) { int payloadBits = 0; int i; /* write FIXFIXonly Grid */ /* write frameClass [1 bit] for FIXFIXonly Grid */ payloadBits += FDKwriteBits(hBitStream, 1, SBR_CLA_BITS_LD); /* absolute Borders are fix: 0,X,X,X,nTimeSlots; so we dont have to transmit them */ /* only transmit the transient position! */ /* with this info (b1) we can reconstruct the Frame on Decoder side : */ /* border[0] = 0; border[1] = b1; border[2]=b1+2; border[3] = nrTimeSlots */ /* use 3 or 4bits for transient border (border) */ if (sbrEnvData->hSbrBSGrid->numberTimeSlots == 8) payloadBits += FDKwriteBits ( hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 3); else payloadBits += FDKwriteBits ( hBitStream, sbrEnvData->hSbrBSGrid->bs_abs_bord, 4); if (transmitFreqs) { /* write FreqRes grid */ for (i = 0; i < sbrEnvData->hSbrBSGrid->bs_num_env; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hSbrBSGrid->v_f[i], SBR_RES_BITS); } } return payloadBits; } /***************************************************************************** functionname: encodeSbrDtdf description: writes bits that describes the direction of the envelopes of a frame returns: number of bits written input: output: *****************************************************************************/ static INT encodeSbrDtdf (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream) { INT i, payloadBits = 0, noOfNoiseEnvelopes; noOfNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; for (i = 0; i < sbrEnvData->noOfEnvelopes; ++i) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->domain_vec[i], SBR_DIR_BITS); } for (i = 0; i < noOfNoiseEnvelopes; ++i) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->domain_vec_noise[i], SBR_DIR_BITS); } return payloadBits; } /***************************************************************************** functionname: writeNoiseLevelData description: writes bits corresponding to the noise-floor-level returns: number of bits written input: output: *****************************************************************************/ static INT writeNoiseLevelData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling) { INT j, i, payloadBits = 0; INT nNoiseEnvelopes = sbrEnvData->noOfEnvelopes > 1 ? 2 : 1; for (i = 0; i < nNoiseEnvelopes; i++) { switch (sbrEnvData->domain_vec_noise[i]) { case FREQ: if (coupling && sbrEnvData->balance) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], sbrEnvData->si_sbr_start_noise_bits_balance); } else { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->sbr_noise_levels[i * sbrEnvData->noOfnoisebands], sbrEnvData->si_sbr_start_noise_bits); } for (j = 1 + i * sbrEnvData->noOfnoisebands; j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { if (coupling) { if (sbrEnvData->balance) { /* coupling && balance */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseBalanceFreqC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV_BALANCE11], sbrEnvData->hufftableNoiseBalanceFreqL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV_BALANCE11]); } else { /* coupling && !balance */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseLevelFreqC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], sbrEnvData->hufftableNoiseLevelFreqL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); } } else { /* !coupling */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseFreqC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], sbrEnvData->hufftableNoiseFreqL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); } } break; case TIME: for (j = i * sbrEnvData->noOfnoisebands; j < (sbrEnvData->noOfnoisebands * (1 + i)); j++) { if (coupling) { if (sbrEnvData->balance) { /* coupling && balance */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseBalanceTimeC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV_BALANCE11], sbrEnvData->hufftableNoiseBalanceTimeL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV_BALANCE11]); } else { /* coupling && !balance */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], sbrEnvData->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); } } else { /* !coupling */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableNoiseLevelTimeC[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11], sbrEnvData->hufftableNoiseLevelTimeL[sbrEnvData->sbr_noise_levels[j] + CODE_BOOK_SCF_LAV11]); } } break; } } return payloadBits; } /***************************************************************************** functionname: writeEnvelopeData description: writes bits corresponding to the envelope returns: number of bits written input: output: *****************************************************************************/ static INT writeEnvelopeData (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_FDK_BITSTREAM hBitStream, INT coupling) { INT payloadBits = 0, j, i, delta; for (j = 0; j < sbrEnvData->noOfEnvelopes; j++) { /* loop over all envelopes */ if (sbrEnvData->domain_vec[j] == FREQ) { if (coupling && sbrEnvData->balance) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->ienvelope[j][0], sbrEnvData->si_sbr_start_env_bits_balance); } else { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->ienvelope[j][0], sbrEnvData->si_sbr_start_env_bits); } } for (i = 1 - sbrEnvData->domain_vec[j]; i < sbrEnvData->noScfBands[j]; i++) { delta = sbrEnvData->ienvelope[j][i]; if (coupling && sbrEnvData->balance) { FDK_ASSERT (fixp_abs (delta) <= sbrEnvData->codeBookScfLavBalance); } else { FDK_ASSERT (fixp_abs (delta) <= sbrEnvData->codeBookScfLav); } if (coupling) { if (sbrEnvData->balance) { if (sbrEnvData->domain_vec[j]) { /* coupling && balance && TIME */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableBalanceTimeC[delta + sbrEnvData->codeBookScfLavBalance], sbrEnvData->hufftableBalanceTimeL[delta + sbrEnvData->codeBookScfLavBalance]); } else { /* coupling && balance && FREQ */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableBalanceFreqC[delta + sbrEnvData->codeBookScfLavBalance], sbrEnvData->hufftableBalanceFreqL[delta + sbrEnvData->codeBookScfLavBalance]); } } else { if (sbrEnvData->domain_vec[j]) { /* coupling && !balance && TIME */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableLevelTimeC[delta + sbrEnvData->codeBookScfLav], sbrEnvData->hufftableLevelTimeL[delta + sbrEnvData->codeBookScfLav]); } else { /* coupling && !balance && FREQ */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableLevelFreqC[delta + sbrEnvData->codeBookScfLav], sbrEnvData->hufftableLevelFreqL[delta + sbrEnvData->codeBookScfLav]); } } } else { if (sbrEnvData->domain_vec[j]) { /* !coupling && TIME */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableTimeC[delta + sbrEnvData->codeBookScfLav], sbrEnvData->hufftableTimeL[delta + sbrEnvData->codeBookScfLav]); } else { /* !coupling && FREQ */ payloadBits += FDKwriteBits (hBitStream, sbrEnvData->hufftableFreqC[delta + sbrEnvData->codeBookScfLav], sbrEnvData->hufftableFreqL[delta + sbrEnvData->codeBookScfLav]); } } } } return payloadBits; } /***************************************************************************** functionname: encodeExtendedData description: writes bits corresponding to the extended data returns: number of bits written input: output: *****************************************************************************/ static INT encodeExtendedData (HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitStream) { INT extDataSize; INT payloadBits = 0; extDataSize = getSbrExtendedDataSize(hParametricStereo); if (extDataSize != 0) { INT maxExtSize = (1<addHarmonicFlag, 1); if (sbrEnvData->addHarmonicFlag) { for (i = 0; i < sbrEnvData->noHarmonics; i++) { payloadBits += FDKwriteBits (hBitStream, sbrEnvData->addHarmonic[i], 1); } } return payloadBits; } /***************************************************************************** functionname: getSbrExtendedDataSize description: counts the number of bits needed for encoding the extended data (including extension id) returns: number of bits needed for the extended data input: output: *****************************************************************************/ static INT getSbrExtendedDataSize (HANDLE_PARAMETRIC_STEREO hParametricStereo) { INT extDataBits = 0; /* add your new extended data counting methods here */ /* no extended data */ if(hParametricStereo){ /* PS extended data */ extDataBits += SI_SBR_EXTENSION_ID_BITS; extDataBits += FDKsbrEnc_PSEnc_WritePSData(hParametricStereo, NULL); } return (extDataBits+7) >> 3; } fdk-aac-0.1.3/libSBRenc/src/sbr_ram.h0000644000175000017500000001733212372261464017610 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Memory layout */ #ifndef __SBR_RAM_H #define __SBR_RAM_H #include "sbr_def.h" #include "env_est.h" #include "sbr_encoder.h" #include "sbr.h" #include "ps_main.h" #include "ps_encode.h" #define ENV_TRANSIENTS_BYTE ( (sizeof(FIXP_DBL)*(MAX_NUM_CHANNELS*3*QMF_MAX_TIME_SLOTS)) ) #define ENV_R_BUFF_BYTE ( (sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) #define ENV_I_BUFF_BYTE ( (sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) #define Y_BUF_CH_BYTE ( (2*sizeof(FIXP_DBL)*((QMF_MAX_TIME_SLOTS) * MAX_HYBRID_BANDS)) ) #define ENV_R_BUF_PS_BYTE ( (sizeof(FIXP_DBL)*QMF_MAX_TIME_SLOTS * QMF_CHANNELS / 2) ) #define ENV_I_BUF_PS_BYTE ( (sizeof(FIXP_DBL)*QMF_MAX_TIME_SLOTS * QMF_CHANNELS / 2) ) #define TON_BUF_CH_BYTE ( (sizeof(FIXP_DBL)*(MAX_NO_OF_ESTIMATES*MAX_FREQ_COEFFS)) ) #define Y_2_BUF_BYTE ( Y_BUF_CH_BYTE>>1 ) /* Workbuffer RAM - Allocation */ /* ++++++++++++++++++++++++++++++++++++++++++++++++++++ | OFFSET_QMF | OFFSET_NRG | ++++++++++++++++++++++++++++++++++++++++++++++++++++ ------------------------- ------------------------- | | 0.5 * | | sbr_envRBuffer | sbr_envYBuffer_size | | sbr_envIBuffer | | ------------------------- ------------------------- */ #define BUF_NRG_SIZE ( (MAX_NUM_CHANNELS * Y_2_BUF_BYTE) ) #define BUF_QMF_SIZE (ENV_R_BUFF_BYTE + ENV_I_BUFF_BYTE) /* Size of the shareable memory region than can be reused */ #define SBR_ENC_DYN_RAM_SIZE ( BUF_QMF_SIZE + BUF_NRG_SIZE ) #define OFFSET_QMF ( 0 ) #define OFFSET_NRG ( OFFSET_QMF + BUF_QMF_SIZE ) /* ***************************************************************************************************** */ H_ALLOC_MEM(Ram_SbrDynamic_RAM, FIXP_DBL) H_ALLOC_MEM(Ram_SbrEncoder, SBR_ENCODER) H_ALLOC_MEM(Ram_SbrChannel, SBR_CHANNEL) H_ALLOC_MEM(Ram_SbrElement, SBR_ELEMENT) H_ALLOC_MEM(Ram_Sbr_quotaMatrix, FIXP_DBL) H_ALLOC_MEM(Ram_Sbr_signMatrix, INT) H_ALLOC_MEM(Ram_Sbr_QmfStatesAnalysis, FIXP_QAS) H_ALLOC_MEM(Ram_Sbr_freqBandTableLO, UCHAR) H_ALLOC_MEM(Ram_Sbr_freqBandTableHI, UCHAR) H_ALLOC_MEM(Ram_Sbr_v_k_master, UCHAR) H_ALLOC_MEM(Ram_Sbr_detectionVectors, UCHAR) H_ALLOC_MEM(Ram_Sbr_prevEnvelopeCompensation, UCHAR) H_ALLOC_MEM(Ram_Sbr_guideScfb, UCHAR) H_ALLOC_MEM(Ram_Sbr_guideVectorDetected, UCHAR) /* Dynamic Memory Allocation */ H_ALLOC_MEM(Ram_Sbr_envYBuffer, FIXP_DBL) FIXP_DBL* GetRam_Sbr_envYBuffer (int n, UCHAR* dynamic_RAM); FIXP_DBL* GetRam_Sbr_envRBuffer (int n, UCHAR* dynamic_RAM); FIXP_DBL* GetRam_Sbr_envIBuffer (int n, UCHAR* dynamic_RAM); H_ALLOC_MEM(Ram_Sbr_guideVectorDiff, FIXP_DBL) H_ALLOC_MEM(Ram_Sbr_guideVectorOrig, FIXP_DBL) H_ALLOC_MEM(Ram_PsQmfStatesSynthesis, FIXP_DBL) H_ALLOC_MEM(Ram_PsEncode, PS_ENCODE) FIXP_DBL* FDKsbrEnc_SliceRam_PsRqmf (FIXP_DBL* rQmfData, UCHAR* dynamic_RAM, int n, int i, int qmfSlots); FIXP_DBL* FDKsbrEnc_SliceRam_PsIqmf (FIXP_DBL* iQmfData, UCHAR* dynamic_RAM, int n, int i, int qmfSlots); H_ALLOC_MEM(Ram_ParamStereo, PARAMETRIC_STEREO) #endif fdk-aac-0.1.3/libSBRenc/src/ps_encode.h0000644000175000017500000001665312372261464020127 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial author: M. Neuendorf, N. Rettelbach, M. Multrus contents/description: PS Parameter extraction, encoding ******************************************************************************/ /*! \file \brief PS parameter extraction, encoding functions */ #ifndef __INCLUDED_PS_ENCODE_H #define __INCLUDED_PS_ENCODE_H #include "ps_const.h" #include "ps_bitenc.h" #define IID_SCALE_FT (64.f) /* maxVal in Quant tab is +/- 50 */ #define IID_SCALE 6 /* maxVal in Quant tab is +/- 50 */ #define IID_MAXVAL (1< QuantScale 64 */ #define PS_QUANT_SCALE 6 /* error smaller (64-25)/64 * 20 bands * 4 env -> QuantScale 6 bit */ #define QMF_GROUPS_LO_RES 12 #define SUBQMF_GROUPS_LO_RES 10 #define QMF_GROUPS_HI_RES 18 #define SUBQMF_GROUPS_HI_RES 30 typedef struct T_PS_DATA { INT iidEnable; INT iidEnableLast; INT iidQuantMode; INT iidQuantModeLast; INT iidDiffMode[PS_MAX_ENVELOPES]; INT iidIdx [PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT iidIdxLast [PS_MAX_BANDS]; INT iccEnable; INT iccEnableLast; INT iccQuantMode; INT iccQuantModeLast; INT iccDiffMode[PS_MAX_ENVELOPES]; INT iccIdx [PS_MAX_ENVELOPES][PS_MAX_BANDS]; INT iccIdxLast [PS_MAX_BANDS]; INT nEnvelopesLast; INT headerCnt; INT iidTimeCnt; INT iccTimeCnt; INT noEnvCnt; } PS_DATA, *HANDLE_PS_DATA; typedef struct T_PS_ENCODE{ PS_DATA psData; PS_BANDS psEncMode; INT nQmfIidGroups; INT nSubQmfIidGroups; INT iidGroupBorders[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES + 1]; INT subband2parameterIndex[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; UCHAR iidGroupWidthLd[QMF_GROUPS_HI_RES + SUBQMF_GROUPS_HI_RES]; FIXP_DBL iidQuantErrorThreshold; UCHAR psBandNrgScale [PS_MAX_BANDS]; } PS_ENCODE; typedef struct T_PS_ENCODE *HANDLE_PS_ENCODE; FDK_PSENC_ERROR FDKsbrEnc_CreatePSEncode( HANDLE_PS_ENCODE *phPsEncode ); FDK_PSENC_ERROR FDKsbrEnc_InitPSEncode( HANDLE_PS_ENCODE hPsEncode, const PS_BANDS psEncMode, const FIXP_DBL iidQuantErrorThreshold ); FDK_PSENC_ERROR FDKsbrEnc_DestroyPSEncode( HANDLE_PS_ENCODE *phPsEncode ); FDK_PSENC_ERROR FDKsbrEnc_PSEncode( HANDLE_PS_ENCODE hPsEncode, HANDLE_PS_OUT hPsOut, UCHAR *dynBandScale, UINT maxEnvelopes, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], const INT frameSize, const INT sendHeader ); #endif fdk-aac-0.1.3/libSBRenc/src/tran_det.cpp0000644000175000017500000006520112372261464020314 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "tran_det.h" #include "fram_gen.h" #include "sbr_ram.h" #include "sbr_misc.h" #include "genericStds.h" #define NORM_QMF_ENERGY 5.684341886080801486968994140625e-14 /* 2^-44 */ /* static FIXP_DBL ABS_THRES = fixMax( FL2FXCONST_DBL(1.28e5 * NORM_QMF_ENERGY), (FIXP_DBL)1) Minimum threshold for detecting changes */ #define ABS_THRES ((FIXP_DBL)16) /******************************************************************************* Functionname: spectralChange ******************************************************************************* \brief Calculates a measure for the spectral change within the frame The function says how good it would be to split the frame at the given border position into 2 envelopes. The return value delta_sum is scaled with the factor 1/64 \return calculated value *******************************************************************************/ static FIXP_DBL spectralChange(FIXP_DBL Energies[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS], INT *scaleEnergies, FIXP_DBL EnergyTotal, INT nSfb, INT start, INT border, INT stop) { INT i,j; INT len1,len2; FIXP_DBL delta,tmp0,tmp1,tmp2; FIXP_DBL accu1,accu2,delta_sum,result; FDK_ASSERT(scaleEnergies[0] >= 0); /* equal for aac (would be not equal for mp3) */ len1 = border-start; len2 = stop-border; /* prefer borders near the middle of the frame */ FIXP_DBL pos_weight; pos_weight = FL2FXCONST_DBL(0.5f) - (len1*GetInvInt(len1+len2)); pos_weight = /*FL2FXCONST_DBL(1.0)*/ (FIXP_DBL)MAXVAL_DBL - (fMult(pos_weight, pos_weight)<<2); delta_sum = FL2FXCONST_DBL(0.0f); /* Sum up energies of all QMF-timeslots for both halfs */ for (j=0; j>NRG_SCALE; /* complex init for compare with original version */ accu2 = ((FL2FXCONST_DBL((1.0e6*NORM_QMF_ENERGY*8.0/32))) << fixMin(scaleEnergies[0],25))>>NRG_SCALE; /* can be simplified in dsp implementation */ /* Sum up energies in first half */ for (i=start; i>NRG_SCALE); } /* Sum up energies in second half */ for (i=border; i>NRG_SCALE); } /* Energy change in current band */ tmp0 = CalcLdData(accu2); tmp1 = CalcLdData(accu1); tmp2 = (tmp0 - tmp1 + CalcLdData(len1)-CalcLdData(len2)); delta = fixp_abs(fMult(tmp2, FL2FXCONST_DBL(0.6931471806f))); /* Weighting with amplitude ratio of this band */ result = (EnergyTotal == FL2FXCONST_DBL(0.0f)) ? FL2FXCONST_DBL(0.f) : FDKsbrEnc_LSI_divide_scale_fract( (accu1+accu2), (EnergyTotal>>NRG_SCALE)+(FIXP_DBL)1, (FIXP_DBL)MAXVAL_DBL >> fixMin(scaleEnergies[0],(DFRACT_BITS-1)) ); delta_sum += (FIXP_DBL)(fMult(sqrtFixp(result), delta)); } return fMult(delta_sum, pos_weight); } /******************************************************************************* Functionname: addLowbandEnergies ******************************************************************************* \brief Calculates total lowband energy The return value nrgTotal is scaled by the factor (1/32.0) \return total energy in the lowband *******************************************************************************/ static FIXP_DBL addLowbandEnergies(FIXP_DBL **Energies, int *scaleEnergies, int YBufferWriteOffset, int nrgSzShift, int tran_off, UCHAR *freqBandTable, int slots) { FIXP_DBL nrgTotal; FIXP_DBL accu1 = FL2FXCONST_DBL(0.0f); FIXP_DBL accu2 = FL2FXCONST_DBL(0.0f); int tran_offdiv2 = tran_off>>nrgSzShift; int ts,k; /* Sum up lowband energy from one frame at offset tran_off */ for (ts=tran_offdiv2; ts> 6; } } for (; ts>nrgSzShift); ts++) { for (k = 0; k < freqBandTable[0]; k++) { accu2 += Energies[ts][k] >> 6; } } nrgTotal = ( (accu1 >> fixMin(scaleEnergies[0],(DFRACT_BITS-1))) + (accu2 >> fixMin(scaleEnergies[1],(DFRACT_BITS-1))) ) << (2); return(nrgTotal); } /******************************************************************************* Functionname: addHighbandEnergies ******************************************************************************* \brief Add highband energies Highband energies are mapped to an array with smaller dimension: Its time resolution is only 1 SBR-timeslot and its frequency resolution is 1 SBR-band. Therefore the data to be fed into the spectralChange function is reduced. The values EnergiesM are scaled by the factor (1/32.0) and scaleEnergies[0] The return value nrgTotal is scaled by the factor (1/32.0) \return total energy in the highband *******************************************************************************/ static FIXP_DBL addHighbandEnergies(FIXP_DBL **RESTRICT Energies, /*!< input */ INT *scaleEnergies, FIXP_DBL EnergiesM[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS], /*!< Combined output */ UCHAR *RESTRICT freqBandTable, INT nSfb, INT sbrSlots, INT timeStep) { INT i,j,k,slotIn,slotOut,scale; INT li,ui; FIXP_DBL nrgTotal; FIXP_DBL accu = FL2FXCONST_DBL(0.0f); /* Combine QMF-timeslots to SBR-timeslots, combine QMF-bands to SBR-bands, combine Left and Right channel */ for (slotOut=0; slotOut>1][k] >> 5); } } EnergiesM[slotOut][j] = accu; } } scale = fixMin(8,scaleEnergies[0]); /* scale energies down before add up */ if ((scaleEnergies[0]-1) > (DFRACT_BITS-1) ) nrgTotal = FL2FXCONST_DBL(0.0f); else { /* Now add all energies */ accu = FL2FXCONST_DBL(0.0f); for (slotOut=0; slotOut> scale); } } nrgTotal = accu >> (scaleEnergies[0]-scale); } return(nrgTotal); } /******************************************************************************* Functionname: FDKsbrEnc_frameSplitter ******************************************************************************* \brief Decides if a FIXFIX-frame shall be splitted into 2 envelopes If no transient has been detected before, the frame can still be splitted into 2 envelopes. *******************************************************************************/ void FDKsbrEnc_frameSplitter(FIXP_DBL **Energies, INT *scaleEnergies, HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, UCHAR *freqBandTable, UCHAR *tran_vector, int YBufferWriteOffset, int YBufferSzShift, int nSfb, int timeStep, int no_cols) { if (tran_vector[1]==0) /* no transient was detected */ { FIXP_DBL delta; FIXP_DBL EnergiesM[NUMBER_TIME_SLOTS_2304][MAX_FREQ_COEFFS]; FIXP_DBL EnergyTotal,newLowbandEnergy,newHighbandEnergy; INT border; INT sbrSlots = fMultI(GetInvInt(timeStep),no_cols); FDK_ASSERT( sbrSlots * timeStep == no_cols ); /* Get Lowband-energy over a range of 2 frames (Look half a frame back and ahead). */ newLowbandEnergy = addLowbandEnergies(Energies, scaleEnergies, YBufferWriteOffset, YBufferSzShift, h_sbrTransientDetector->tran_off, freqBandTable, no_cols); newHighbandEnergy = addHighbandEnergies(Energies, scaleEnergies, EnergiesM, freqBandTable, nSfb, sbrSlots, timeStep); if ( h_sbrTransientDetector->frameShift != 0 ) { if (tran_vector[1]==0) tran_vector[0] = 0; } else { /* prevLowBandEnergy: Corresponds to 1 frame, starting with half a frame look-behind newLowbandEnergy: Corresponds to 1 frame, starting in the middle of the current frame */ EnergyTotal = (newLowbandEnergy + h_sbrTransientDetector->prevLowBandEnergy) >> 1; EnergyTotal += newHighbandEnergy; /* The below border should specify the same position as the middle border of a FIXFIX-frame with 2 envelopes. */ border = (sbrSlots+1) >> 1; delta = spectralChange(EnergiesM, scaleEnergies, EnergyTotal, nSfb, 0, border, sbrSlots); if (delta > (h_sbrTransientDetector->split_thr >> LD_DATA_SHIFT)) /* delta scaled by 1/64 */ tran_vector[0] = 1; /* Set flag for splitting */ else tran_vector[0] = 0; } /* Update prevLowBandEnergy */ h_sbrTransientDetector->prevLowBandEnergy = newLowbandEnergy; h_sbrTransientDetector->prevHighBandEnergy = newHighbandEnergy; } } /* * Calculate transient energy threshold for each QMF band */ static void calculateThresholds(FIXP_DBL **RESTRICT Energies, INT *RESTRICT scaleEnergies, FIXP_DBL *RESTRICT thresholds, int YBufferWriteOffset, int YBufferSzShift, int noCols, int noRows, int tran_off) { FIXP_DBL mean_val,std_val,temp; FIXP_DBL i_noCols; FIXP_DBL i_noCols1; FIXP_DBL accu,accu0,accu1; int scaleFactor0,scaleFactor1,commonScale; int i,j; i_noCols = GetInvInt(noCols + tran_off ) << YBufferSzShift; i_noCols1 = GetInvInt(noCols + tran_off - 1) << YBufferSzShift; /* calc minimum scale of energies of previous and current frame */ commonScale = fixMin(scaleEnergies[0],scaleEnergies[1]); /* calc scalefactors to adapt energies to common scale */ scaleFactor0 = fixMin((scaleEnergies[0]-commonScale), (DFRACT_BITS-1)); scaleFactor1 = fixMin((scaleEnergies[1]-commonScale), (DFRACT_BITS-1)); FDK_ASSERT((scaleFactor0 >= 0) && (scaleFactor1 >= 0)); /* calculate standard deviation in every subband */ for (i=0; i>YBufferSzShift); int endEnergy = ((noCols>>YBufferSzShift)+tran_off); int shift; /* calculate mean value over decimated energy values (downsampled by 2). */ accu0 = accu1 = FL2FXCONST_DBL(0.0f); for (j=startEnergy; j> scaleFactor0) + (accu1 >> scaleFactor1); /* average */ shift = fixMax(0,CountLeadingBits(mean_val)-6); /* -6 to keep room for accumulating upto N = 24 values */ /* calculate standard deviation */ accu = FL2FXCONST_DBL(0.0f); /* summe { ((mean_val-nrg)^2) * i_noCols1 } */ for (j=startEnergy; j> scaleFactor0))<> scaleFactor1))<>shift; /* standard deviation */ /* Take new threshold as average of calculated standard deviation ratio and old threshold if greater than absolute threshold */ temp = ( commonScale<=(DFRACT_BITS-1) ) ? fMult(FL2FXCONST_DBL(0.66f), thresholds[i]) + (fMult(FL2FXCONST_DBL(0.34f), std_val) >> commonScale) : (FIXP_DBL) 0; thresholds[i] = fixMax(ABS_THRES,temp); FDK_ASSERT(commonScale >= 0); } } /* * Calculate transient levels for each QMF time slot. */ static void extractTransientCandidates(FIXP_DBL **RESTRICT Energies, INT *RESTRICT scaleEnergies, FIXP_DBL *RESTRICT thresholds, FIXP_DBL *RESTRICT transients, int YBufferWriteOffset, int YBufferSzShift, int noCols, int start_band, int stop_band, int tran_off, int addPrevSamples) { FIXP_DBL i_thres; C_ALLOC_SCRATCH_START(EnergiesTemp, FIXP_DBL, 2*QMF_MAX_TIME_SLOTS); FIXP_DBL *RESTRICT pEnergiesTemp = EnergiesTemp; int tmpScaleEnergies0, tmpScaleEnergies1; int endCond; int startEnerg,endEnerg; int i,j,jIndex,jpBM; tmpScaleEnergies0 = scaleEnergies[0]; tmpScaleEnergies1 = scaleEnergies[1]; /* Scale value for first energies, upto YBufferWriteOffset */ tmpScaleEnergies0 = fixMin(tmpScaleEnergies0, MAX_SHIFT_DBL); /* Scale value for first energies, from YBufferWriteOffset upwards */ tmpScaleEnergies1 = fixMin(tmpScaleEnergies1, MAX_SHIFT_DBL); FDK_ASSERT((tmpScaleEnergies0 >= 0) && (tmpScaleEnergies1 >= 0)); /* Keep addPrevSamples extra previous transient candidates. */ FDKmemmove(transients, transients + noCols - addPrevSamples, (tran_off+addPrevSamples) * sizeof (FIXP_DBL)); FDKmemclear(transients + tran_off + addPrevSamples, noCols * sizeof (FIXP_DBL)); endCond = noCols; /* Amount of new transient values to be calculated. */ startEnerg = (tran_off-3)>>YBufferSzShift; /* >>YBufferSzShift because of amount of energy values. -3 because of neighbors being watched. */ endEnerg = ((noCols+ (YBufferWriteOffset<>YBufferSzShift; /* YBufferSzShift shifts because of half energy values. */ /* Compute differential values with two different weightings in every subband */ for (i=start_band; i=256) i_thres = (LONG)( (LONG)MAXVAL_DBL / ((((LONG)thresholds[i]))+1) )<<(32-24); else i_thres = (LONG)MAXVAL_DBL; /* Copy one timeslot and de-scale and de-squish */ if (YBufferSzShift == 1) { for(j=startEnerg; j>tmpScaleEnergies0; } for(; j<=endEnerg; j++) { FIXP_DBL tmp = Energies[j][i]; EnergiesTemp[(j<<1)+1] = EnergiesTemp[j<<1] = tmp>>tmpScaleEnergies1; } } else { for(j=startEnerg; j>tmpScaleEnergies0; } for(; j<=endEnerg; j++) { FIXP_DBL tmp = Energies[j][i]; EnergiesTemp[j] = tmp>>tmpScaleEnergies1; } } /* Detect peaks in energy values. */ jIndex = tran_off; jpBM = jIndex+addPrevSamples; for (j=endCond; j--; jIndex++, jpBM++) { FIXP_DBL delta, tran; int d; delta = (FIXP_DBL)0; tran = (FIXP_DBL)0; for (d=1; d<4; d++) { delta += pEnergiesTemp[jIndex+d]; /* R */ delta -= pEnergiesTemp[jIndex-d]; /* L */ delta -= thres; if ( delta > (FIXP_DBL)0 ) { tran += fMult(i_thres, delta); } } transients[jpBM] += tran; } } C_ALLOC_SCRATCH_END(EnergiesTemp, FIXP_DBL, 2*QMF_MAX_TIME_SLOTS); } void FDKsbrEnc_transientDetect(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTran, FIXP_DBL **Energies, INT *scaleEnergies, UCHAR *transient_info, int YBufferWriteOffset, int YBufferSzShift, int timeStep, int frameMiddleBorder) { int no_cols = h_sbrTran->no_cols; int qmfStartSample; int addPrevSamples; int timeStepShift=0; int i, cond; /* Where to start looking for transients in the transient candidate buffer */ qmfStartSample = timeStep * frameMiddleBorder; /* We need to look one value backwards in the transients, so we might need one more previous value. */ addPrevSamples = (qmfStartSample > 0) ? 0: 1; switch (timeStep) { case 1: timeStepShift = 0; break; case 2: timeStepShift = 1; break; case 4: timeStepShift = 2; break; } calculateThresholds(Energies, scaleEnergies, h_sbrTran->thresholds, YBufferWriteOffset, YBufferSzShift, h_sbrTran->no_cols, h_sbrTran->no_rows, h_sbrTran->tran_off); extractTransientCandidates(Energies, scaleEnergies, h_sbrTran->thresholds, h_sbrTran->transients, YBufferWriteOffset, YBufferSzShift, h_sbrTran->no_cols, 0, h_sbrTran->no_rows, h_sbrTran->tran_off, addPrevSamples ); transient_info[0] = 0; transient_info[1] = 0; transient_info[2] = 0; /* Offset by the amount of additional previous transient candidates being kept. */ qmfStartSample += addPrevSamples; /* Check for transients in second granule (pick the last value of subsequent values) */ for (i=qmfStartSample; itransients[i] < fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1]) ) && (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); if (cond) { transient_info[0] = (i - qmfStartSample)>>timeStepShift; transient_info[1] = 1; break; } } if ( h_sbrTran->frameShift != 0) { /* transient prediction for LDSBR */ /* Check for transients in first qmf-slots of second frame */ for (i=qmfStartSample+no_cols; iframeShift; i++) { cond = (h_sbrTran->transients[i] < fMult(FL2FXCONST_DBL(0.9f), h_sbrTran->transients[i - 1]) ) && (h_sbrTran->transients[i - 1] > h_sbrTran->tran_thr); if (cond) { int pos = (int) ( (i - qmfStartSample-no_cols) >> timeStepShift ); if ((pos < 3) && (transient_info[1]==0)) { transient_info[2] = 1; } break; } } } } int FDKsbrEnc_InitSbrTransientDetector(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, INT frameSize, INT sampleFreq, sbrConfigurationPtr params, int tran_fc, int no_cols, int no_rows, int YBufferWriteOffset, int YBufferSzShift, int frameShift, int tran_off) { INT totalBitrate = params->codecSettings.standardBitrate * params->codecSettings.nChannels; INT codecBitrate = params->codecSettings.bitRate; FIXP_DBL bitrateFactor_fix, framedur_fix; INT scale_0, scale_1; FDKmemclear(h_sbrTransientDetector,sizeof(SBR_TRANSIENT_DETECTOR)); h_sbrTransientDetector->frameShift = frameShift; h_sbrTransientDetector->tran_off = tran_off; if(codecBitrate) { bitrateFactor_fix = fDivNorm((FIXP_DBL)totalBitrate, (FIXP_DBL)(codecBitrate<<2),&scale_0); } else { bitrateFactor_fix = FL2FXCONST_DBL(1.0/4.0); scale_0 = 0; } framedur_fix = fDivNorm(frameSize, sampleFreq); /* The longer the frames, the more often should the FIXFIX- case transmit 2 envelopes instead of 1. Frame durations below 10 ms produce the highest threshold so that practically always only 1 env is transmitted. */ FIXP_DBL tmp = framedur_fix - FL2FXCONST_DBL(0.010); tmp = fixMax(tmp, FL2FXCONST_DBL(0.0001)); tmp = fDivNorm(FL2FXCONST_DBL(0.000075), fPow2(tmp), &scale_1); scale_1 = -(scale_1 + scale_0 + 2); FDK_ASSERT(no_cols <= QMF_MAX_TIME_SLOTS); FDK_ASSERT(no_rows <= QMF_CHANNELS); h_sbrTransientDetector->no_cols = no_cols; h_sbrTransientDetector->tran_thr = (FIXP_DBL)((params->tran_thr << (32-24-1)) / no_rows); h_sbrTransientDetector->tran_fc = tran_fc; if (scale_1>=0) { h_sbrTransientDetector->split_thr = fMult(tmp, bitrateFactor_fix) >> scale_1; } else { h_sbrTransientDetector->split_thr = fMult(tmp, bitrateFactor_fix) << (-scale_1); } h_sbrTransientDetector->no_rows = no_rows; h_sbrTransientDetector->mode = params->tran_det_mode; h_sbrTransientDetector->prevLowBandEnergy = FL2FXCONST_DBL(0.0f); return (0); } fdk-aac-0.1.3/libSBRenc/src/sbrenc_freq_sca.h0000644000175000017500000001315512372261464021301 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief frequency scale prototypes */ #ifndef __FREQ_SCA2_H #define __FREQ_SCA2_H #include "sbr_encoder.h" #include "sbr_def.h" #define MAX_OCTAVE 29 #define MAX_SECOND_REGION 50 INT FDKsbrEnc_UpdateFreqScale( UCHAR *v_k_master, INT *h_num_bands, const INT k0, const INT k2, const INT freq_scale, const INT alter_scale ); INT FDKsbrEnc_UpdateHiRes( UCHAR *h_hires, INT *num_hires, UCHAR *v_k_master, INT num_master, INT *xover_band ); void FDKsbrEnc_UpdateLoRes( UCHAR *v_lores, INT *num_lores, UCHAR *v_hires, INT num_hires ); INT FDKsbrEnc_FindStartAndStopBand( const INT srSbr, const INT srCore, const INT noChannels, const INT startFreq, const INT stop_freq, INT *k0, INT *k2 ); INT FDKsbrEnc_getSbrStartFreqRAW (INT startFreq, INT fsCore); INT FDKsbrEnc_getSbrStopFreqRAW (INT stopFreq, INT fsCore); #endif fdk-aac-0.1.3/libSBRenc/src/code_env.cpp0000644000175000017500000005622212372261464020301 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #include "code_env.h" #include "sbr_rom.h" /***************************************************************************** functionname: FDKsbrEnc_InitSbrHuffmanTables description: initializes Huffman Tables dependent on chosen amp_res returns: error handle input: output: *****************************************************************************/ INT FDKsbrEnc_InitSbrHuffmanTables (HANDLE_SBR_ENV_DATA sbrEnvData, HANDLE_SBR_CODE_ENVELOPE henv, HANDLE_SBR_CODE_ENVELOPE hnoise, AMP_RES amp_res) { if ( (!henv) || (!hnoise) || (!sbrEnvData) ) return (1); /* not init. */ sbrEnvData->init_sbr_amp_res = amp_res; switch (amp_res) { case SBR_AMP_RES_3_0: /*envelope data*/ /*Level/Pan - coding */ sbrEnvData->hufftableLevelTimeC = v_Huff_envelopeLevelC11T; sbrEnvData->hufftableLevelTimeL = v_Huff_envelopeLevelL11T; sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC11T; sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL11T; sbrEnvData->hufftableLevelFreqC = v_Huff_envelopeLevelC11F; sbrEnvData->hufftableLevelFreqL = v_Huff_envelopeLevelL11F; sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC11F; sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL11F; /*Right/Left - coding */ sbrEnvData->hufftableTimeC = v_Huff_envelopeLevelC11T; sbrEnvData->hufftableTimeL = v_Huff_envelopeLevelL11T; sbrEnvData->hufftableFreqC = v_Huff_envelopeLevelC11F; sbrEnvData->hufftableFreqL = v_Huff_envelopeLevelL11F; sbrEnvData->codeBookScfLavBalance = CODE_BOOK_SCF_LAV_BALANCE11; sbrEnvData->codeBookScfLav = CODE_BOOK_SCF_LAV11; sbrEnvData->si_sbr_start_env_bits = SI_SBR_START_ENV_BITS_AMP_RES_3_0; sbrEnvData->si_sbr_start_env_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0; break; case SBR_AMP_RES_1_5: /*envelope data*/ /*Level/Pan - coding */ sbrEnvData->hufftableLevelTimeC = v_Huff_envelopeLevelC10T; sbrEnvData->hufftableLevelTimeL = v_Huff_envelopeLevelL10T; sbrEnvData->hufftableBalanceTimeC = bookSbrEnvBalanceC10T; sbrEnvData->hufftableBalanceTimeL = bookSbrEnvBalanceL10T; sbrEnvData->hufftableLevelFreqC = v_Huff_envelopeLevelC10F; sbrEnvData->hufftableLevelFreqL = v_Huff_envelopeLevelL10F; sbrEnvData->hufftableBalanceFreqC = bookSbrEnvBalanceC10F; sbrEnvData->hufftableBalanceFreqL = bookSbrEnvBalanceL10F; /*Right/Left - coding */ sbrEnvData->hufftableTimeC = v_Huff_envelopeLevelC10T; sbrEnvData->hufftableTimeL = v_Huff_envelopeLevelL10T; sbrEnvData->hufftableFreqC = v_Huff_envelopeLevelC10F; sbrEnvData->hufftableFreqL = v_Huff_envelopeLevelL10F; sbrEnvData->codeBookScfLavBalance = CODE_BOOK_SCF_LAV_BALANCE10; sbrEnvData->codeBookScfLav = CODE_BOOK_SCF_LAV10; sbrEnvData->si_sbr_start_env_bits = SI_SBR_START_ENV_BITS_AMP_RES_1_5; sbrEnvData->si_sbr_start_env_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5; break; default: return (1); /* undefined amp_res mode */ } /* these are common to both amp_res values */ /*Noise data*/ /*Level/Pan - coding */ sbrEnvData->hufftableNoiseLevelTimeC = v_Huff_NoiseLevelC11T; sbrEnvData->hufftableNoiseLevelTimeL = v_Huff_NoiseLevelL11T; sbrEnvData->hufftableNoiseBalanceTimeC = bookSbrNoiseBalanceC11T; sbrEnvData->hufftableNoiseBalanceTimeL = bookSbrNoiseBalanceL11T; sbrEnvData->hufftableNoiseLevelFreqC = v_Huff_envelopeLevelC11F; sbrEnvData->hufftableNoiseLevelFreqL = v_Huff_envelopeLevelL11F; sbrEnvData->hufftableNoiseBalanceFreqC = bookSbrEnvBalanceC11F; sbrEnvData->hufftableNoiseBalanceFreqL = bookSbrEnvBalanceL11F; /*Right/Left - coding */ sbrEnvData->hufftableNoiseTimeC = v_Huff_NoiseLevelC11T; sbrEnvData->hufftableNoiseTimeL = v_Huff_NoiseLevelL11T; sbrEnvData->hufftableNoiseFreqC = v_Huff_envelopeLevelC11F; sbrEnvData->hufftableNoiseFreqL = v_Huff_envelopeLevelL11F; sbrEnvData->si_sbr_start_noise_bits = SI_SBR_START_NOISE_BITS_AMP_RES_3_0; sbrEnvData->si_sbr_start_noise_bits_balance = SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0; /* init envelope tables and codebooks */ henv->codeBookScfLavBalanceTime = sbrEnvData->codeBookScfLavBalance; henv->codeBookScfLavBalanceFreq = sbrEnvData->codeBookScfLavBalance; henv->codeBookScfLavLevelTime = sbrEnvData->codeBookScfLav; henv->codeBookScfLavLevelFreq = sbrEnvData->codeBookScfLav; henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; henv->hufftableLevelTimeL = sbrEnvData->hufftableLevelTimeL; henv->hufftableBalanceTimeL = sbrEnvData->hufftableBalanceTimeL; henv->hufftableTimeL = sbrEnvData->hufftableTimeL; henv->hufftableLevelFreqL = sbrEnvData->hufftableLevelFreqL; henv->hufftableBalanceFreqL = sbrEnvData->hufftableBalanceFreqL; henv->hufftableFreqL = sbrEnvData->hufftableFreqL; henv->codeBookScfLavFreq = sbrEnvData->codeBookScfLav; henv->codeBookScfLavTime = sbrEnvData->codeBookScfLav; henv->start_bits = sbrEnvData->si_sbr_start_env_bits; henv->start_bits_balance = sbrEnvData->si_sbr_start_env_bits_balance; /* init noise tables and codebooks */ hnoise->codeBookScfLavBalanceTime = CODE_BOOK_SCF_LAV_BALANCE11; hnoise->codeBookScfLavBalanceFreq = CODE_BOOK_SCF_LAV_BALANCE11; hnoise->codeBookScfLavLevelTime = CODE_BOOK_SCF_LAV11; hnoise->codeBookScfLavLevelFreq = CODE_BOOK_SCF_LAV11; hnoise->codeBookScfLavTime = CODE_BOOK_SCF_LAV11; hnoise->codeBookScfLavFreq = CODE_BOOK_SCF_LAV11; hnoise->hufftableLevelTimeL = sbrEnvData->hufftableNoiseLevelTimeL; hnoise->hufftableBalanceTimeL = sbrEnvData->hufftableNoiseBalanceTimeL; hnoise->hufftableTimeL = sbrEnvData->hufftableNoiseTimeL; hnoise->hufftableLevelFreqL = sbrEnvData->hufftableNoiseLevelFreqL; hnoise->hufftableBalanceFreqL = sbrEnvData->hufftableNoiseBalanceFreqL; hnoise->hufftableFreqL = sbrEnvData->hufftableNoiseFreqL; hnoise->start_bits = sbrEnvData->si_sbr_start_noise_bits; hnoise->start_bits_balance = sbrEnvData->si_sbr_start_noise_bits_balance; /* No delta coding in time from the previous frame due to 1.5dB FIx-FIX rule */ henv->upDate = 0; hnoise->upDate = 0; return (0); } /******************************************************************************* Functionname: indexLow2High ******************************************************************************* Description: Nice small patch-functions in order to cope with non-factor-2 ratios between high-res and low-res Arguments: INT offset, INT index, FREQ_RES res Return: INT *******************************************************************************/ static INT indexLow2High(INT offset, INT index, FREQ_RES res) { if(res == FREQ_RES_LOW) { if (offset >= 0) { if (index < offset) return(index); else return(2*index - offset); } else { offset = -offset; if (index < offset) return(2*index+index); else return(2*index + offset); } } else return(index); } /******************************************************************************* Functionname: mapLowResEnergyVal ******************************************************************************* Description: Arguments: INT currVal,INT* prevData, INT offset, INT index, FREQ_RES res Return: none *******************************************************************************/ static void mapLowResEnergyVal(SCHAR currVal, SCHAR* prevData, INT offset, INT index, FREQ_RES res) { if(res == FREQ_RES_LOW) { if (offset >= 0) { if(index < offset) prevData[index] = currVal; else { prevData[2*index - offset] = currVal; prevData[2*index+1 - offset] = currVal; } } else { offset = -offset; if (index < offset) { prevData[3*index] = currVal; prevData[3*index+1] = currVal; prevData[3*index+2] = currVal; } else { prevData[2*index + offset] = currVal; prevData[2*index + 1 + offset] = currVal; } } } else prevData[index] = currVal; } /******************************************************************************* Functionname: computeBits ******************************************************************************* Description: Arguments: INT delta, INT codeBookScfLavLevel, INT codeBookScfLavBalance, const UCHAR * hufftableLevel, const UCHAR * hufftableBalance, INT coupling, INT channel) Return: INT *******************************************************************************/ static INT computeBits (SCHAR *delta, INT codeBookScfLavLevel, INT codeBookScfLavBalance, const UCHAR * hufftableLevel, const UCHAR * hufftableBalance, INT coupling, INT channel) { INT index; INT delta_bits = 0; if (coupling) { if (channel == 1) { if (*delta < 0) index = fixMax(*delta, -codeBookScfLavBalance); else index = fixMin(*delta, codeBookScfLavBalance); if (index != *delta) { *delta = index; return (10000); } delta_bits = hufftableBalance[index + codeBookScfLavBalance]; } else { if (*delta < 0) index = fixMax(*delta, -codeBookScfLavLevel); else index = fixMin(*delta, codeBookScfLavLevel); if (index != *delta) { *delta = index; return (10000); } delta_bits = hufftableLevel[index + codeBookScfLavLevel]; } } else { if (*delta < 0) index = fixMax(*delta, -codeBookScfLavLevel); else index = fixMin(*delta, codeBookScfLavLevel); if (index != *delta) { *delta = index; return (10000); } delta_bits = hufftableLevel[index + codeBookScfLavLevel]; } return (delta_bits); } /******************************************************************************* Functionname: FDKsbrEnc_codeEnvelope ******************************************************************************* Description: Arguments: INT *sfb_nrg, const FREQ_RES *freq_res, SBR_CODE_ENVELOPE * h_sbrCodeEnvelope, INT *directionVec, INT scalable, INT nEnvelopes, INT channel, INT headerActive) Return: none h_sbrCodeEnvelope->sfb_nrg_prev is modified ! sfb_nrg is modified h_sbrCodeEnvelope->update is modfied ! *directionVec is modified *******************************************************************************/ void FDKsbrEnc_codeEnvelope(SCHAR *sfb_nrg, const FREQ_RES *freq_res, SBR_CODE_ENVELOPE *h_sbrCodeEnvelope, INT *directionVec, INT coupling, INT nEnvelopes, INT channel, INT headerActive) { INT i, no_of_bands, band; FIXP_DBL tmp1,tmp2,tmp3,dF_edge_1stEnv; SCHAR *ptr_nrg; INT codeBookScfLavLevelTime; INT codeBookScfLavLevelFreq; INT codeBookScfLavBalanceTime; INT codeBookScfLavBalanceFreq; const UCHAR *hufftableLevelTimeL; const UCHAR *hufftableBalanceTimeL; const UCHAR *hufftableLevelFreqL; const UCHAR *hufftableBalanceFreqL; INT offset = h_sbrCodeEnvelope->offset; INT envDataTableCompFactor; INT delta_F_bits = 0, delta_T_bits = 0; INT use_dT; SCHAR delta_F[MAX_FREQ_COEFFS]; SCHAR delta_T[MAX_FREQ_COEFFS]; SCHAR last_nrg, curr_nrg; tmp1 = FL2FXCONST_DBL(0.5f) >> (DFRACT_BITS-16-1); tmp2 = h_sbrCodeEnvelope->dF_edge_1stEnv >> (DFRACT_BITS-16); tmp3 = (FIXP_DBL)(((INT)(LONG)h_sbrCodeEnvelope->dF_edge_incr*h_sbrCodeEnvelope->dF_edge_incr_fac) >> (DFRACT_BITS-16)); dF_edge_1stEnv = tmp1 + tmp2 + tmp3; if (coupling) { codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavLevelTime; codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavLevelFreq; codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavBalanceTime; codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavBalanceFreq; hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableLevelTimeL; hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableBalanceTimeL; hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableLevelFreqL; hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableBalanceFreqL; } else { codeBookScfLavLevelTime = h_sbrCodeEnvelope->codeBookScfLavTime; codeBookScfLavLevelFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; codeBookScfLavBalanceTime = h_sbrCodeEnvelope->codeBookScfLavTime; codeBookScfLavBalanceFreq = h_sbrCodeEnvelope->codeBookScfLavFreq; hufftableLevelTimeL = h_sbrCodeEnvelope->hufftableTimeL; hufftableBalanceTimeL = h_sbrCodeEnvelope->hufftableTimeL; hufftableLevelFreqL = h_sbrCodeEnvelope->hufftableFreqL; hufftableBalanceFreqL = h_sbrCodeEnvelope->hufftableFreqL; } if(coupling == 1 && channel == 1) envDataTableCompFactor = 1; /*should be one when the new huffman-tables are ready*/ else envDataTableCompFactor = 0; if (h_sbrCodeEnvelope->deltaTAcrossFrames == 0) h_sbrCodeEnvelope->upDate = 0; /* no delta coding in time in case of a header */ if (headerActive) h_sbrCodeEnvelope->upDate = 0; for (i = 0; i < nEnvelopes; i++) { if (freq_res[i] == FREQ_RES_HIGH) no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; else no_of_bands = h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW]; ptr_nrg = sfb_nrg; curr_nrg = *ptr_nrg; delta_F[0] = curr_nrg >> envDataTableCompFactor; if (coupling && channel == 1) delta_F_bits = h_sbrCodeEnvelope->start_bits_balance; else delta_F_bits = h_sbrCodeEnvelope->start_bits; if(h_sbrCodeEnvelope->upDate != 0) { delta_T[0] = (curr_nrg - h_sbrCodeEnvelope->sfb_nrg_prev[0]) >> envDataTableCompFactor; delta_T_bits = computeBits (&delta_T[0], codeBookScfLavLevelTime, codeBookScfLavBalanceTime, hufftableLevelTimeL, hufftableBalanceTimeL, coupling, channel); } mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, 0, freq_res[i]); /* ensure that nrg difference is not higher than codeBookScfLavXXXFreq */ if ( coupling && channel == 1 ) { for (band = no_of_bands - 1; band > 0; band--) { if ( ptr_nrg[band] - ptr_nrg[band-1] > codeBookScfLavBalanceFreq ) { ptr_nrg[band-1] = ptr_nrg[band] - codeBookScfLavBalanceFreq; } } for (band = 1; band < no_of_bands; band++) { if ( ptr_nrg[band-1] - ptr_nrg[band] > codeBookScfLavBalanceFreq ) { ptr_nrg[band] = ptr_nrg[band-1] - codeBookScfLavBalanceFreq; } } } else { for (band = no_of_bands - 1; band > 0; band--) { if ( ptr_nrg[band] - ptr_nrg[band-1] > codeBookScfLavLevelFreq ) { ptr_nrg[band-1] = ptr_nrg[band] - codeBookScfLavLevelFreq; } } for (band = 1; band < no_of_bands; band++) { if ( ptr_nrg[band-1] - ptr_nrg[band] > codeBookScfLavLevelFreq ) { ptr_nrg[band] = ptr_nrg[band-1] - codeBookScfLavLevelFreq; } } } /* Coding loop*/ for (band = 1; band < no_of_bands; band++) { last_nrg = (*ptr_nrg); ptr_nrg++; curr_nrg = (*ptr_nrg); delta_F[band] = (curr_nrg - last_nrg) >> envDataTableCompFactor; delta_F_bits += computeBits (&delta_F[band], codeBookScfLavLevelFreq, codeBookScfLavBalanceFreq, hufftableLevelFreqL, hufftableBalanceFreqL, coupling, channel); if(h_sbrCodeEnvelope->upDate != 0) { delta_T[band] = curr_nrg - h_sbrCodeEnvelope->sfb_nrg_prev[indexLow2High(offset, band, freq_res[i])]; delta_T[band] = delta_T[band] >> envDataTableCompFactor; } mapLowResEnergyVal(curr_nrg, h_sbrCodeEnvelope->sfb_nrg_prev, offset, band, freq_res[i]); if(h_sbrCodeEnvelope->upDate != 0) { delta_T_bits += computeBits (&delta_T[band], codeBookScfLavLevelTime, codeBookScfLavBalanceTime, hufftableLevelTimeL, hufftableBalanceTimeL, coupling, channel); } } /* Replace sfb_nrg with deltacoded samples and set flag */ if (i == 0) { INT tmp_bits; tmp_bits = (((delta_T_bits * dF_edge_1stEnv) >> (DFRACT_BITS-18)) + (FIXP_DBL)1) >> 1; use_dT = (h_sbrCodeEnvelope->upDate != 0 && (delta_F_bits > tmp_bits)); } else use_dT = (delta_T_bits < delta_F_bits && h_sbrCodeEnvelope->upDate != 0); if (use_dT) { directionVec[i] = TIME; FDKmemcpy (sfb_nrg, delta_T, no_of_bands * sizeof (SCHAR)); } else { h_sbrCodeEnvelope->upDate = 0; directionVec[i] = FREQ; FDKmemcpy (sfb_nrg, delta_F, no_of_bands * sizeof (SCHAR)); } sfb_nrg += no_of_bands; h_sbrCodeEnvelope->upDate = 1; } } /******************************************************************************* Functionname: FDKsbrEnc_InitSbrCodeEnvelope ******************************************************************************* Description: Arguments: Return: *******************************************************************************/ INT FDKsbrEnc_InitSbrCodeEnvelope (HANDLE_SBR_CODE_ENVELOPE h_sbrCodeEnvelope, INT *nSfb, INT deltaTAcrossFrames, FIXP_DBL dF_edge_1stEnv, FIXP_DBL dF_edge_incr) { FDKmemclear(h_sbrCodeEnvelope,sizeof(SBR_CODE_ENVELOPE)); h_sbrCodeEnvelope->deltaTAcrossFrames = deltaTAcrossFrames; h_sbrCodeEnvelope->dF_edge_1stEnv = dF_edge_1stEnv; h_sbrCodeEnvelope->dF_edge_incr = dF_edge_incr; h_sbrCodeEnvelope->dF_edge_incr_fac = 0; h_sbrCodeEnvelope->upDate = 0; h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] = nSfb[FREQ_RES_LOW]; h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH] = nSfb[FREQ_RES_HIGH]; h_sbrCodeEnvelope->offset = 2*h_sbrCodeEnvelope->nSfb[FREQ_RES_LOW] - h_sbrCodeEnvelope->nSfb[FREQ_RES_HIGH]; return (0); } fdk-aac-0.1.3/libSBRenc/src/bit_sbr.h0000644000175000017500000002215012372261464017601 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief SBR bit writing */ #ifndef __BIT_SBR_H #define __BIT_SBR_H #include "sbr_def.h" #include "cmondata.h" #include "fram_gen.h" struct SBR_ENV_DATA; struct SBR_BITSTREAM_DATA { INT TotalBits; INT PayloadBits; INT FillBits; INT HeaderActive; INT NrSendHeaderData; /**< input from commandline */ INT CountSendHeaderData; /**< modulo count. If < 0 then no counting is done (no SBR headers) */ }; typedef struct SBR_BITSTREAM_DATA *HANDLE_SBR_BITSTREAM_DATA; struct SBR_HEADER_DATA { AMP_RES sbr_amp_res; INT sbr_start_frequency; INT sbr_stop_frequency; INT sbr_xover_band; INT sbr_noise_bands; INT sbr_data_extra; INT header_extra_1; INT header_extra_2; INT sbr_lc_stereo_mode; INT sbr_limiter_bands; INT sbr_limiter_gains; INT sbr_interpol_freq; INT sbr_smoothing_length; INT alterScale; INT freqScale; /* element of channelpairelement */ INT coupling; INT prev_coupling; /* element of singlechannelelement */ }; typedef struct SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA; struct SBR_ENV_DATA { INT sbr_xpos_ctrl; INT freq_res_fixfix; INVF_MODE sbr_invf_mode; INVF_MODE sbr_invf_mode_vec[MAX_NUM_NOISE_VALUES]; XPOS_MODE sbr_xpos_mode; INT ienvelope[MAX_ENVELOPES][MAX_FREQ_COEFFS]; INT codeBookScfLavBalance; INT codeBookScfLav; const INT *hufftableTimeC; const INT *hufftableFreqC; const UCHAR *hufftableTimeL; const UCHAR *hufftableFreqL; const INT *hufftableLevelTimeC; const INT *hufftableBalanceTimeC; const INT *hufftableLevelFreqC; const INT *hufftableBalanceFreqC; const UCHAR *hufftableLevelTimeL; const UCHAR *hufftableBalanceTimeL; const UCHAR *hufftableLevelFreqL; const UCHAR *hufftableBalanceFreqL; const UCHAR *hufftableNoiseTimeL; const INT *hufftableNoiseTimeC; const UCHAR *hufftableNoiseFreqL; const INT *hufftableNoiseFreqC; const UCHAR *hufftableNoiseLevelTimeL; const INT *hufftableNoiseLevelTimeC; const UCHAR *hufftableNoiseBalanceTimeL; const INT *hufftableNoiseBalanceTimeC; const UCHAR *hufftableNoiseLevelFreqL; const INT *hufftableNoiseLevelFreqC; const UCHAR *hufftableNoiseBalanceFreqL; const INT *hufftableNoiseBalanceFreqC; HANDLE_SBR_GRID hSbrBSGrid; INT noHarmonics; INT addHarmonicFlag; UCHAR addHarmonic[MAX_FREQ_COEFFS]; /* calculated helper vars */ INT si_sbr_start_env_bits_balance; INT si_sbr_start_env_bits; INT si_sbr_start_noise_bits_balance; INT si_sbr_start_noise_bits; INT noOfEnvelopes; INT noScfBands[MAX_ENVELOPES]; INT domain_vec[MAX_ENVELOPES]; INT domain_vec_noise[MAX_ENVELOPES]; SCHAR sbr_noise_levels[MAX_FREQ_COEFFS]; INT noOfnoisebands; INT balance; AMP_RES init_sbr_amp_res; AMP_RES currentAmpResFF; /* extended data */ INT extended_data; INT extension_size; INT extension_id; UCHAR extended_data_buffer[SBR_EXTENDED_DATA_MAX_CNT]; UCHAR ldGrid; }; typedef struct SBR_ENV_DATA *HANDLE_SBR_ENV_DATA; INT FDKsbrEnc_WriteEnvSingleChannelElement(struct SBR_HEADER_DATA *sbrHeaderData, struct T_PARAMETRIC_STEREO *hParametricStereo, struct SBR_BITSTREAM_DATA *sbrBitstreamData, struct SBR_ENV_DATA *sbrEnvData, struct COMMON_DATA *cmonData, UINT sbrSyntaxFlags); INT FDKsbrEnc_WriteEnvChannelPairElement(struct SBR_HEADER_DATA *sbrHeaderData, struct T_PARAMETRIC_STEREO *hParametricStereo, struct SBR_BITSTREAM_DATA *sbrBitstreamData, struct SBR_ENV_DATA *sbrEnvDataLeft, struct SBR_ENV_DATA *sbrEnvDataRight, struct COMMON_DATA *cmonData, UINT sbrSyntaxFlags); INT FDKsbrEnc_CountSbrChannelPairElement (struct SBR_HEADER_DATA *sbrHeaderData, struct T_PARAMETRIC_STEREO *hParametricStereo, struct SBR_BITSTREAM_DATA *sbrBitstreamData, struct SBR_ENV_DATA *sbrEnvDataLeft, struct SBR_ENV_DATA *sbrEnvDataRight, struct COMMON_DATA *cmonData, UINT sbrSyntaxFlags); /* debugging and tuning functions */ /*#define SBR_ENV_STATISTICS */ /*#define SBR_PAYLOAD_MONITOR*/ #endif fdk-aac-0.1.3/libSBRenc/src/sbr_encoder.cpp0000644000175000017500000023656012372261464021011 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Andreas Ehret, Tobias Chalupka Description: SBR encoder top level processing. ******************************************************************************/ #include "sbr_encoder.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "sbrenc_freq_sca.h" #include "env_bit.h" #include "cmondata.h" #include "sbr_misc.h" #include "sbr.h" #include "qmf.h" #include "ps_main.h" #define SBRENCODER_LIB_VL0 3 #define SBRENCODER_LIB_VL1 3 #define SBRENCODER_LIB_VL2 4 /***************************************************************************/ /* * SBR Delay balancing definitions. */ /* input buffer (1ch) |------------ 1537 -------------|-----|---------- 2048 -------------| (core2sbr delay ) ds (read, core and ds area) */ #define SFB(dwnsmp) (32 << (dwnsmp-1)) /* SBR Frequency bands: 64 for dual-rate, 32 for single-rate */ #define STS(fl) (((fl)==1024)?32:30) /* SBR Time Slots: 32 for core frame length 1024, 30 for core frame length 960 */ #define DELAY_QMF_ANA(dwnsmp) ((320<<((dwnsmp)-1)) - (32<<((dwnsmp)-1))) /* Full bandwidth */ #define DELAY_HYB_ANA (10*64) /* + 0.5 */ /* */ #define DELAY_HYB_SYN (6*64 - 32) /* */ #define DELAY_QMF_POSTPROC(dwnsmp) (32*(dwnsmp)) /* QMF postprocessing delay */ #define DELAY_DEC_QMF(dwnsmp) (6 * SFB(dwnsmp) ) /* Decoder QMF overlap */ #define DELAY_QMF_SYN (2) /* NO_POLY/2=2.5, rounded down to 2 */ #define DELAY_QMF_DS (32) /* QMF synthesis for downsampled time signal */ /* Delay in QMF paths */ #define DELAY_SBR(fl,dwnsmp) (DELAY_QMF_ANA(dwnsmp) + (SFB(dwnsmp)*STS(fl) - 1) + DELAY_QMF_SYN) #define DELAY_PS(fl,dwnsmp) (DELAY_QMF_ANA(dwnsmp) + DELAY_HYB_ANA + DELAY_DEC_QMF(dwnsmp) + (SFB(dwnsmp)*STS(fl)-1) + DELAY_HYB_SYN + DELAY_QMF_SYN) #define DELAY_ELDSBR(fl,dwnsmp) ( ( ((fl)/2)*(dwnsmp) ) - 1 + DELAY_QMF_POSTPROC(dwnsmp) ) /* Delay differences for SBR and SBR+PS */ #define MAX_DS_FILTER_DELAY (5) /* the additional max downsampler filter delay (source fs) */ #define DELAY_AAC2SBR(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_QMF_SYN) - DELAY_SBR((fl),(dwnsmp))) #define DELAY_ELD2SBR(fl,dwnsmp) ((DELAY_QMF_POSTPROC(dwnsmp)) - DELAY_ELDSBR(fl,dwnsmp)) #define DELAY_AAC2PS(fl,dwnsmp) ((DELAY_QMF_ANA(dwnsmp) + DELAY_QMF_DS + /*(DELAY_AAC(fl)*2) + */ DELAY_QMF_ANA(dwnsmp) + DELAY_DEC_QMF(dwnsmp) + DELAY_HYB_SYN + DELAY_QMF_SYN) - DELAY_PS(fl,dwnsmp)) /* 2048 - 463*2 */ /* Assumption: The sample delay resulting of of DELAY_AAC2PS is always smaller than the sample delay implied by DELAY_AAC2SBR */ #define MAX_SAMPLE_DELAY (DELAY_AAC2SBR(1024,2) + MAX_DS_FILTER_DELAY) /* maximum delay: frame length of 1024 and dual-rate sbr */ /***************************************************************************/ #define INVALID_TABLE_IDX -1 /***************************************************************************/ /*! \brief Selects the SBR tuning settings to use dependent on number of channels, bitrate, sample rate and core coder \return Index to the appropriate table ****************************************************************************/ #define DISTANCE_CEIL_VALUE 5000000 static INT getSbrTuningTableIndex(UINT bitrate, /*! the total bitrate in bits/sec */ UINT numChannels,/*! the number of channels for the core coder */ UINT sampleRate, /*! the sampling rate of the core coder */ AUDIO_OBJECT_TYPE core, UINT *pBitRateClosest ) { int i, bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1, found = 0; UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE; int isforThisCodec=0; #define isForThisCore(i) \ ( ( sbrTuningTable[i].coreCoder == CODEC_AACLD && core == AOT_ER_AAC_ELD ) || \ ( sbrTuningTable[i].coreCoder == CODEC_AAC && core != AOT_ER_AAC_ELD ) ) for (i=0; i < sbrTuningTableSize ; i++) { if ( isForThisCore(i) ) /* tuning table is for this core codec */ { if ( numChannels == sbrTuningTable [i].numChannels && sampleRate == sbrTuningTable [i].sampleRate ) { found = 1; if ((bitrate >= sbrTuningTable [i].bitrateFrom) && (bitrate < sbrTuningTable [i].bitrateTo)) { bitRateClosestLower = bitrate; bitRateClosestUpper = bitrate; //FDKprintf("entry %d\n", i); return i ; } else { if ( sbrTuningTable [i].bitrateFrom > bitrate ) { if (sbrTuningTable [i].bitrateFrom < bitRateClosestLower) { bitRateClosestLower = sbrTuningTable [i].bitrateFrom; bitRateClosestLowerIndex = i; } } if ( sbrTuningTable [i].bitrateTo <= bitrate ) { if (sbrTuningTable [i].bitrateTo > bitRateClosestUpper) { bitRateClosestUpper = sbrTuningTable [i].bitrateTo-1; bitRateClosestUpperIndex = i; } } } } } } if (pBitRateClosest != NULL) { /* If there was at least one matching tuning entry found then pick the least distance bit rate */ if (found) { int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE; if (bitRateClosestLowerIndex >= 0) { distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate; } if (bitRateClosestUpperIndex >= 0) { distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo; } if ( distanceUpper < distanceLower ) { *pBitRateClosest = bitRateClosestUpper; } else { *pBitRateClosest = bitRateClosestLower; } } else { *pBitRateClosest = 0; } } return INVALID_TABLE_IDX; } /***************************************************************************/ /*! \brief Selects the PS tuning settings to use dependent on bitrate and core coder \return Index to the appropriate table ****************************************************************************/ static INT getPsTuningTableIndex(UINT bitrate, UINT *pBitRateClosest){ INT i, paramSets = sizeof (psTuningTable) / sizeof (psTuningTable [0]); int bitRateClosestLowerIndex=-1, bitRateClosestUpperIndex=-1; UINT bitRateClosestUpper = 0, bitRateClosestLower=DISTANCE_CEIL_VALUE; for (i = 0 ; i < paramSets ; i++) { if ((bitrate >= psTuningTable [i].bitrateFrom) && (bitrate < psTuningTable [i].bitrateTo)) { return i ; } else { if ( psTuningTable [i].bitrateFrom > bitrate ) { if (psTuningTable [i].bitrateFrom < bitRateClosestLower) { bitRateClosestLower = psTuningTable [i].bitrateFrom; bitRateClosestLowerIndex = i; } } if ( psTuningTable [i].bitrateTo <= bitrate ) { if (psTuningTable [i].bitrateTo > bitRateClosestUpper) { bitRateClosestUpper = psTuningTable [i].bitrateTo-1; bitRateClosestUpperIndex = i; } } } } if (pBitRateClosest != NULL) { int distanceUpper=DISTANCE_CEIL_VALUE, distanceLower=DISTANCE_CEIL_VALUE; if (bitRateClosestLowerIndex >= 0) { distanceLower = sbrTuningTable [bitRateClosestLowerIndex].bitrateFrom - bitrate; } if (bitRateClosestUpperIndex >= 0) { distanceUpper = bitrate - sbrTuningTable [bitRateClosestUpperIndex].bitrateTo; } if ( distanceUpper < distanceLower ) { *pBitRateClosest = bitRateClosestUpper; } else { *pBitRateClosest = bitRateClosestLower; } } return INVALID_TABLE_IDX; } /***************************************************************************/ /*! \brief In case of downsampled SBR we may need to lower the stop freq of a tuning setting to fit into the lower half of the spectrum ( which is sampleRate/4 ) \return the adapted stop frequency index (-1 -> error) \ingroup SbrEncCfg ****************************************************************************/ static INT FDKsbrEnc_GetDownsampledStopFreq ( const INT sampleRateCore, const INT startFreq, INT stopFreq, const INT downSampleFactor ) { INT maxStopFreqRaw = sampleRateCore / 2; INT startBand, stopBand; HANDLE_ERROR_INFO err; while (stopFreq > 0 && FDKsbrEnc_getSbrStopFreqRAW(stopFreq, sampleRateCore) > maxStopFreqRaw) { stopFreq--; } if (FDKsbrEnc_getSbrStopFreqRAW( stopFreq, sampleRateCore) > maxStopFreqRaw) return -1; err = FDKsbrEnc_FindStartAndStopBand ( sampleRateCore<<(downSampleFactor-1), sampleRateCore, 32<<(downSampleFactor-1), startFreq, stopFreq, &startBand, &stopBand ); if (err) return -1; return stopFreq; } /***************************************************************************/ /*! \brief tells us, if for the given coreCoder, bitrate, number of channels and input sampling rate an SBR setting is available. If yes, it tells us also the core sampling rate we would need to run with \return a flag indicating success: yes (1) or no (0) ****************************************************************************/ static UINT FDKsbrEnc_IsSbrSettingAvail ( UINT bitrate, /*! the total bitrate in bits/sec */ UINT vbrMode, /*! the vbr paramter, 0 means constant bitrate */ UINT numOutputChannels, /*! the number of channels for the core coder */ UINT sampleRateInput, /*! the input sample rate [in Hz] */ UINT sampleRateCore, /*! the core's sampling rate */ AUDIO_OBJECT_TYPE core ) { INT idx = INVALID_TABLE_IDX; if (sampleRateInput < 16000) return 0; if (bitrate==0) { /* map vbr quality to bitrate */ if (vbrMode < 30) bitrate = 24000; else if (vbrMode < 40) bitrate = 28000; else if (vbrMode < 60) bitrate = 32000; else if (vbrMode < 75) bitrate = 40000; else bitrate = 48000; bitrate *= numOutputChannels; } idx = getSbrTuningTableIndex(bitrate, numOutputChannels, sampleRateCore, core, NULL); return (idx == INVALID_TABLE_IDX ? 0 : 1); } /***************************************************************************/ /*! \brief Adjusts the SBR settings according to the chosen core coder settings which are accessible via config->codecSettings \return A flag indicating success: yes (1) or no (0) ****************************************************************************/ static UINT FDKsbrEnc_AdjustSbrSettings (const sbrConfigurationPtr config, /*! output, modified */ UINT bitRate, /*! the total bitrate in bits/sec */ UINT numChannels, /*! the core coder number of channels */ UINT sampleRateCore, /*! the core coder sampling rate in Hz */ UINT sampleRateSbr, /*! the sbr coder sampling rate in Hz */ UINT transFac, /*! the short block to long block ratio */ UINT standardBitrate, /*! the standard bitrate per channel in bits/sec */ UINT vbrMode, /*! the vbr paramter, 0 poor quality .. 100 high quality*/ UINT useSpeechConfig, /*!< adapt tuning parameters for speech ? */ UINT lcsMode, /*! the low complexity stereo mode */ UINT bParametricStereo, /*!< use parametric stereo */ AUDIO_OBJECT_TYPE core) /* Core audio codec object type */ { INT idx = INVALID_TABLE_IDX; /* set the core codec settings */ config->codecSettings.bitRate = bitRate; config->codecSettings.nChannels = numChannels; config->codecSettings.sampleFreq = sampleRateCore; config->codecSettings.transFac = transFac; config->codecSettings.standardBitrate = standardBitrate; if (bitRate==0) { /* map vbr quality to bitrate */ if (vbrMode < 30) bitRate = 24000; else if (vbrMode < 40) bitRate = 28000; else if (vbrMode < 60) bitRate = 32000; else if (vbrMode < 75) bitRate = 40000; else bitRate = 48000; bitRate *= numChannels; /* fix to enable mono vbrMode<40 @ 44.1 of 48kHz */ if (numChannels==1) { if (sampleRateSbr==44100 || sampleRateSbr==48000) { if (vbrMode<40) bitRate = 32000; } } } idx = getSbrTuningTableIndex(bitRate,numChannels,sampleRateCore, core, NULL); if (idx != INVALID_TABLE_IDX) { config->startFreq = sbrTuningTable[idx].startFreq ; config->stopFreq = sbrTuningTable[idx].stopFreq ; if (useSpeechConfig) { config->startFreq = sbrTuningTable[idx].startFreqSpeech; config->stopFreq = sbrTuningTable[idx].stopFreqSpeech; } /* Adapt stop frequency in case of downsampled SBR - only 32 bands then */ if (1 == config->downSampleFactor) { INT dsStopFreq = FDKsbrEnc_GetDownsampledStopFreq( sampleRateCore, config->startFreq, config->stopFreq, config->downSampleFactor ); if (dsStopFreq < 0) { return 0; } config->stopFreq = dsStopFreq; } config->sbr_noise_bands = sbrTuningTable[idx].numNoiseBands ; if (core == AOT_ER_AAC_ELD) config->init_amp_res_FF = SBR_AMP_RES_1_5; config->noiseFloorOffset= sbrTuningTable[idx].noiseFloorOffset; config->ana_max_level = sbrTuningTable[idx].noiseMaxLevel ; config->stereoMode = sbrTuningTable[idx].stereoMode ; config->freqScale = sbrTuningTable[idx].freqScale ; /* adjust usage of parametric coding dependent on bitrate and speech config flag */ if (useSpeechConfig) config->parametricCoding = 0; if (core == AOT_ER_AAC_ELD) { if (bitRate < 28000) config->init_amp_res_FF = SBR_AMP_RES_3_0; config->SendHeaderDataTime = -1; } if (numChannels == 1) { if (bitRate < 16000) { config->parametricCoding = 0; } } else { if (bitRate < 20000) { config->parametricCoding = 0; } } config->useSpeechConfig = useSpeechConfig; /* PS settings */ config->bParametricStereo = bParametricStereo; return 1 ; } else { return 0 ; } } /***************************************************************************** functionname: FDKsbrEnc_InitializeSbrDefaults description: initializes the SBR confifuration returns: error status input: - core codec type, - factor of SBR to core frame length, - core frame length output: initialized SBR configuration *****************************************************************************/ static UINT FDKsbrEnc_InitializeSbrDefaults (sbrConfigurationPtr config, INT downSampleFactor, UINT codecGranuleLen ) { if ( (downSampleFactor < 1 || downSampleFactor > 2) || (codecGranuleLen*downSampleFactor > QMF_CHANNELS*QMF_MAX_TIME_SLOTS) ) return(0); /* error */ config->SendHeaderDataTime = 1000; config->useWaveCoding = 0; config->crcSbr = 0; config->dynBwSupported = 1; config->tran_thr = 13000; config->parametricCoding = 1; config->sbrFrameSize = codecGranuleLen * downSampleFactor; config->downSampleFactor = downSampleFactor; /* sbr default parameters */ config->sbr_data_extra = 0; config->amp_res = SBR_AMP_RES_3_0 ; config->tran_fc = 0 ; config->tran_det_mode = 1 ; config->spread = 1 ; config->stat = 0 ; config->e = 1 ; config->deltaTAcrossFrames = 1 ; config->dF_edge_1stEnv = FL2FXCONST_DBL(0.3f) ; config->dF_edge_incr = FL2FXCONST_DBL(0.3f) ; config->sbr_invf_mode = INVF_SWITCHED; config->sbr_xpos_mode = XPOS_LC; config->sbr_xpos_ctrl = SBR_XPOS_CTRL_DEFAULT; config->sbr_xpos_level = 0; config->useSaPan = 0; config->dynBwEnabled = 0; /* the following parameters are overwritten by the FDKsbrEnc_AdjustSbrSettings() function since they are included in the tuning table */ config->stereoMode = SBR_SWITCH_LRC; config->ana_max_level = 6; config->noiseFloorOffset = 0; config->startFreq = 5; /* 5.9 respectively 6.0 kHz at fs = 44.1/48 kHz */ config->stopFreq = 9; /* 16.2 respectively 16.8 kHz at fs = 44.1/48 kHz */ /* header_extra_1 */ config->freqScale = SBR_FREQ_SCALE_DEFAULT; config->alterScale = SBR_ALTER_SCALE_DEFAULT; config->sbr_noise_bands = SBR_NOISE_BANDS_DEFAULT; /* header_extra_2 */ config->sbr_limiter_bands = SBR_LIMITER_BANDS_DEFAULT; config->sbr_limiter_gains = SBR_LIMITER_GAINS_DEFAULT; config->sbr_interpol_freq = SBR_INTERPOL_FREQ_DEFAULT; config->sbr_smoothing_length = SBR_SMOOTHING_LENGTH_DEFAULT; return 1; } /***************************************************************************** functionname: DeleteEnvChannel description: frees memory of one SBR channel returns: - input: handle of channel output: released handle *****************************************************************************/ static void deleteEnvChannel (HANDLE_ENV_CHANNEL hEnvCut) { if (hEnvCut) { FDKsbrEnc_DeleteTonCorrParamExtr(&hEnvCut->TonCorr); FDKsbrEnc_deleteExtractSbrEnvelope (&hEnvCut->sbrExtractEnvelope); } } /***************************************************************************** functionname: sbrEncoder_ChannelClose description: close the channel coding handle returns: input: phSbrChannel output: *****************************************************************************/ static void sbrEncoder_ChannelClose(HANDLE_SBR_CHANNEL hSbrChannel) { if (hSbrChannel != NULL) { deleteEnvChannel (&hSbrChannel->hEnvChannel); } } /***************************************************************************** functionname: sbrEncoder_ElementClose description: close the channel coding handle returns: input: phSbrChannel output: *****************************************************************************/ static void sbrEncoder_ElementClose(HANDLE_SBR_ELEMENT *phSbrElement) { HANDLE_SBR_ELEMENT hSbrElement = *phSbrElement; if (hSbrElement!=NULL) { if (hSbrElement->sbrConfigData.v_k_master) FreeRam_Sbr_v_k_master(&hSbrElement->sbrConfigData.v_k_master); if (hSbrElement->sbrConfigData.freqBandTable[LO]) FreeRam_Sbr_freqBandTableLO(&hSbrElement->sbrConfigData.freqBandTable[LO]); if (hSbrElement->sbrConfigData.freqBandTable[HI]) FreeRam_Sbr_freqBandTableHI(&hSbrElement->sbrConfigData.freqBandTable[HI]); FreeRam_SbrElement(phSbrElement); } return ; } void sbrEncoder_Close (HANDLE_SBR_ENCODER *phSbrEncoder) { HANDLE_SBR_ENCODER hSbrEncoder = *phSbrEncoder; if (hSbrEncoder != NULL) { int el, ch; for (el=0; el<(8); el++) { if (hSbrEncoder->sbrElement[el]!=NULL) { sbrEncoder_ElementClose(&hSbrEncoder->sbrElement[el]); } } /* Close sbr Channels */ for (ch=0; ch<(8); ch++) { if (hSbrEncoder->pSbrChannel[ch]) { sbrEncoder_ChannelClose(hSbrEncoder->pSbrChannel[ch]); FreeRam_SbrChannel(&hSbrEncoder->pSbrChannel[ch]); } if (hSbrEncoder->QmfAnalysis[ch].FilterStates) FreeRam_Sbr_QmfStatesAnalysis((FIXP_QAS**)&hSbrEncoder->QmfAnalysis[ch].FilterStates); } if (hSbrEncoder->hParametricStereo) PSEnc_Destroy(&hSbrEncoder->hParametricStereo); if (hSbrEncoder->qmfSynthesisPS.FilterStates) FreeRam_PsQmfStatesSynthesis((FIXP_DBL**)&hSbrEncoder->qmfSynthesisPS.FilterStates); /* Release Overlay */ FreeRam_SbrDynamic_RAM((FIXP_DBL**)&hSbrEncoder->pSBRdynamic_RAM); FreeRam_SbrEncoder(phSbrEncoder); } } /***************************************************************************** functionname: updateFreqBandTable description: updates vk_master returns: - input: config handle output: error info *****************************************************************************/ static INT updateFreqBandTable( HANDLE_SBR_CONFIG_DATA sbrConfigData, HANDLE_SBR_HEADER_DATA sbrHeaderData, const INT downSampleFactor ) { INT k0, k2; if( FDKsbrEnc_FindStartAndStopBand ( sbrConfigData->sampleFreq, sbrConfigData->sampleFreq >> (downSampleFactor-1), sbrConfigData->noQmfBands, sbrHeaderData->sbr_start_frequency, sbrHeaderData->sbr_stop_frequency, &k0, &k2 ) ) return(1); if( FDKsbrEnc_UpdateFreqScale( sbrConfigData->v_k_master, &sbrConfigData->num_Master, k0, k2, sbrHeaderData->freqScale, sbrHeaderData->alterScale ) ) return(1); sbrHeaderData->sbr_xover_band=0; if( FDKsbrEnc_UpdateHiRes( sbrConfigData->freqBandTable[HI], &sbrConfigData->nSfb[HI], sbrConfigData->v_k_master, sbrConfigData->num_Master, &sbrHeaderData->sbr_xover_band ) ) return(1); FDKsbrEnc_UpdateLoRes( sbrConfigData->freqBandTable[LO], &sbrConfigData->nSfb[LO], sbrConfigData->freqBandTable[HI], sbrConfigData->nSfb[HI] ); sbrConfigData->xOverFreq = (sbrConfigData->freqBandTable[LOW_RES][0] * sbrConfigData->sampleFreq / sbrConfigData->noQmfBands+1)>>1; return (0); } /***************************************************************************** functionname: resetEnvChannel description: resets parameters and allocates memory returns: error status input: output: hEnv *****************************************************************************/ static INT resetEnvChannel (HANDLE_SBR_CONFIG_DATA sbrConfigData, HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_ENV_CHANNEL hEnv) { /* note !!! hEnv->encEnvData.noOfnoisebands will be updated later in function FDKsbrEnc_extractSbrEnvelope !!!*/ hEnv->TonCorr.sbrNoiseFloorEstimate.noiseBands = sbrHeaderData->sbr_noise_bands; if(FDKsbrEnc_ResetTonCorrParamExtr(&hEnv->TonCorr, sbrConfigData->xposCtrlSwitch, sbrConfigData->freqBandTable[HI][0], sbrConfigData->v_k_master, sbrConfigData->num_Master, sbrConfigData->sampleFreq, sbrConfigData->freqBandTable, sbrConfigData->nSfb, sbrConfigData->noQmfBands)) return(1); hEnv->sbrCodeNoiseFloor.nSfb[LO] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; hEnv->sbrCodeNoiseFloor.nSfb[HI] = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; hEnv->sbrCodeEnvelope.nSfb[LO] = sbrConfigData->nSfb[LO]; hEnv->sbrCodeEnvelope.nSfb[HI] = sbrConfigData->nSfb[HI]; hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; hEnv->sbrCodeEnvelope.upDate = 0; hEnv->sbrCodeNoiseFloor.upDate = 0; return (0); } /* ****************************** FDKsbrEnc_SbrGetXOverFreq ******************************/ /** * @fn * @brief calculates the closest possible crossover frequency * @return the crossover frequency SBR accepts * */ static INT FDKsbrEnc_SbrGetXOverFreq(HANDLE_SBR_ELEMENT hEnv, /*!< handle to SBR encoder instance */ INT xoverFreq) /*!< from core coder suggested crossover frequency */ { INT band; INT lastDiff, newDiff; INT cutoffSb; UCHAR *RESTRICT pVKMaster = hEnv->sbrConfigData.v_k_master; /* Check if there is a matching cutoff frequency in the master table */ cutoffSb = (4*xoverFreq * hEnv->sbrConfigData.noQmfBands / hEnv->sbrConfigData.sampleFreq + 1)>>1; lastDiff = cutoffSb; for (band = 0; band < hEnv->sbrConfigData.num_Master; band++) { newDiff = fixp_abs((INT)pVKMaster[band] - cutoffSb); if(newDiff >= lastDiff) { band--; break; } lastDiff = newDiff; } return ((pVKMaster[band] * hEnv->sbrConfigData.sampleFreq/hEnv->sbrConfigData.noQmfBands+1)>>1); } /***************************************************************************** functionname: FDKsbrEnc_EnvEncodeFrame description: performs the sbr envelope calculation for one element returns: input: output: *****************************************************************************/ INT FDKsbrEnc_EnvEncodeFrame(HANDLE_SBR_ENCODER hEnvEncoder, int iElement, INT_PCM *samples, /*!< time samples, always interleaved */ UINT timeInStride, /*!< time buffer channel interleaving stride */ UINT *sbrDataBits, /*!< Size of SBR payload */ UCHAR *sbrData, /*!< SBR payload */ int clearOutput /*!< Do not consider any input signal */ ) { HANDLE_SBR_ELEMENT hSbrElement = hEnvEncoder->sbrElement[iElement]; FDK_CRCINFO crcInfo; INT crcReg; INT ch; INT band; INT cutoffSb; INT newXOver; if (hEnvEncoder == NULL) return -1; hSbrElement = hEnvEncoder->sbrElement[iElement]; if (hSbrElement == NULL) return -1; /* header bitstream handling */ HANDLE_SBR_BITSTREAM_DATA sbrBitstreamData = &hSbrElement->sbrBitstreamData; INT psHeaderActive = 0; sbrBitstreamData->HeaderActive = 0; /* Anticipate PS header because of internal PS bitstream delay in order to be in sync with SBR header. */ if ( sbrBitstreamData->CountSendHeaderData==(sbrBitstreamData->NrSendHeaderData-1) ) { psHeaderActive = 1; } /* Signal SBR header to be written into bitstream */ if ( sbrBitstreamData->CountSendHeaderData==0 ) { sbrBitstreamData->HeaderActive = 1; } /* Increment header interval counter */ if (sbrBitstreamData->NrSendHeaderData == 0) { sbrBitstreamData->CountSendHeaderData = 1; } else { if (sbrBitstreamData->CountSendHeaderData >= 0) { sbrBitstreamData->CountSendHeaderData++; sbrBitstreamData->CountSendHeaderData %= sbrBitstreamData->NrSendHeaderData; } } if (hSbrElement->CmonData.dynBwEnabled ) { INT i; for ( i = 4; i > 0; i-- ) hSbrElement->dynXOverFreqDelay[i] = hSbrElement->dynXOverFreqDelay[i-1]; hSbrElement->dynXOverFreqDelay[0] = hSbrElement->CmonData.dynXOverFreqEnc; if (hSbrElement->dynXOverFreqDelay[1] > hSbrElement->dynXOverFreqDelay[2]) newXOver = hSbrElement->dynXOverFreqDelay[2]; else newXOver = hSbrElement->dynXOverFreqDelay[1]; /* has the crossover frequency changed? */ if ( hSbrElement->sbrConfigData.dynXOverFreq != newXOver ) { /* get corresponding master band */ cutoffSb = ((4* newXOver * hSbrElement->sbrConfigData.noQmfBands / hSbrElement->sbrConfigData.sampleFreq)+1)>>1; for ( band = 0; band < hSbrElement->sbrConfigData.num_Master; band++ ) { if ( cutoffSb == hSbrElement->sbrConfigData.v_k_master[band] ) break; } FDK_ASSERT( band < hSbrElement->sbrConfigData.num_Master ); hSbrElement->sbrConfigData.dynXOverFreq = newXOver; hSbrElement->sbrHeaderData.sbr_xover_band = band; hSbrElement->sbrBitstreamData.HeaderActive=1; psHeaderActive = 1; /* ps header is one frame delayed */ /* update vk_master table */ if(updateFreqBandTable(&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, hEnvEncoder->downSampleFactor )) return(1); /* reset SBR channels */ INT nEnvCh = hSbrElement->sbrConfigData.nChannels; for ( ch = 0; ch < nEnvCh; ch++ ) { if(resetEnvChannel (&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, &hSbrElement->sbrChannel[ch]->hEnvChannel)) return(1); } } } /* allocate space for dummy header and crc */ crcReg = FDKsbrEnc_InitSbrBitstream(&hSbrElement->CmonData, hSbrElement->payloadDelayLine[hEnvEncoder->nBitstrDelay], MAX_PAYLOAD_SIZE*sizeof(UCHAR), &crcInfo, hSbrElement->sbrConfigData.sbrSyntaxFlags); /* Temporal Envelope Data */ SBR_FRAME_TEMP_DATA _fData; SBR_FRAME_TEMP_DATA *fData = &_fData; SBR_ENV_TEMP_DATA eData[MAX_NUM_CHANNELS]; /* Init Temporal Envelope Data */ { int i; FDKmemclear(&eData[0], sizeof(SBR_ENV_TEMP_DATA)); FDKmemclear(&eData[1], sizeof(SBR_ENV_TEMP_DATA)); FDKmemclear(fData, sizeof(SBR_FRAME_TEMP_DATA)); for(i=0; ires[i] = FREQ_RES_HIGH; } if (!clearOutput) { /* * Transform audio data into QMF domain */ for(ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++) { HANDLE_ENV_CHANNEL h_envChan = &hSbrElement->sbrChannel[ch]->hEnvChannel; HANDLE_SBR_EXTRACT_ENVELOPE sbrExtrEnv = &h_envChan->sbrExtractEnvelope; if(hSbrElement->elInfo.fParametricStereo == 0) { QMF_SCALE_FACTOR tmpScale; FIXP_DBL **pQmfReal, **pQmfImag; C_AALLOC_SCRATCH_START(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) /* Obtain pointers to QMF buffers. */ pQmfReal = sbrExtrEnv->rBuffer; pQmfImag = sbrExtrEnv->iBuffer; qmfAnalysisFiltering( hSbrElement->hQmfAnalysis[ch], pQmfReal, pQmfImag, &tmpScale, samples + hSbrElement->elInfo.ChannelIndex[ch], timeInStride, qmfWorkBuffer ); h_envChan->qmfScale = tmpScale.lb_scale + 7; C_AALLOC_SCRATCH_END(qmfWorkBuffer, FIXP_DBL, QMF_CHANNELS*2) } /* fParametricStereo == 0 */ /* Parametric Stereo processing */ if (hSbrElement->elInfo.fParametricStereo) { INT error = noError; /* Limit Parametric Stereo to one instance */ FDK_ASSERT(ch == 0); if(error == noError){ /* parametric stereo processing: - input: o left and right time domain samples - processing: o stereo qmf analysis o stereo hybrid analysis o ps parameter extraction o downmix + hybrid synthesis - output: o downmixed qmf data is written to sbrExtrEnv->rBuffer and sbrExtrEnv->iBuffer */ SCHAR qmfScale; INT_PCM* pSamples[2] = {samples + hSbrElement->elInfo.ChannelIndex[0],samples + hSbrElement->elInfo.ChannelIndex[1]}; error = FDKsbrEnc_PSEnc_ParametricStereoProcessing( hEnvEncoder->hParametricStereo, pSamples, timeInStride, hSbrElement->hQmfAnalysis, sbrExtrEnv->rBuffer, sbrExtrEnv->iBuffer, samples + hSbrElement->elInfo.ChannelIndex[ch], &hEnvEncoder->qmfSynthesisPS, &qmfScale, psHeaderActive ); if (noError != error) { error = handBack(error); } h_envChan->qmfScale = (int)qmfScale; } } /* if (hEnvEncoder->hParametricStereo) */ /* Extract Envelope relevant things from QMF data */ FDKsbrEnc_extractSbrEnvelope1( &hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, &hSbrElement->sbrBitstreamData, h_envChan, &hSbrElement->CmonData, &eData[ch], fData ); } /* hEnvEncoder->sbrConfigData.nChannels */ } /* Process Envelope relevant things and calculate envelope data and write payload */ FDKsbrEnc_extractSbrEnvelope2( &hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, (hSbrElement->elInfo.fParametricStereo) ? hEnvEncoder->hParametricStereo : NULL, &hSbrElement->sbrBitstreamData, &hSbrElement->sbrChannel[0]->hEnvChannel, &hSbrElement->sbrChannel[1]->hEnvChannel, &hSbrElement->CmonData, eData, fData, clearOutput ); /* format payload, calculate crc */ FDKsbrEnc_AssembleSbrBitstream(&hSbrElement->CmonData, &crcInfo, crcReg, hSbrElement->sbrConfigData.sbrSyntaxFlags); /* save new payload, set to zero length if greater than MAX_PAYLOAD_SIZE */ hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] = FDKgetValidBits(&hSbrElement->CmonData.sbrBitbuf); if(hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay] > (MAX_PAYLOAD_SIZE<<3)) hSbrElement->payloadDelayLineSize[hEnvEncoder->nBitstrDelay]=0; /* While filling the Delay lines, sbrData is NULL */ if (sbrData) { *sbrDataBits = hSbrElement->payloadDelayLineSize[0]; FDKmemcpy(sbrData, hSbrElement->payloadDelayLine[0], (hSbrElement->payloadDelayLineSize[0]+7)>>3); } /*******************************/ if (hEnvEncoder->fTimeDomainDownsampling) { int ch; int nChannels = hSbrElement->sbrConfigData.nChannels; for (ch=0; ch < nChannels; ch++) { INT nOutSamples; FDKaacEnc_Downsample(&hSbrElement->sbrChannel[ch]->downSampler, samples + hSbrElement->elInfo.ChannelIndex[ch] + hEnvEncoder->bufferOffset, hSbrElement->sbrConfigData.frameSize, timeInStride, samples + hSbrElement->elInfo.ChannelIndex[ch], &nOutSamples, hEnvEncoder->nChannels); } } /* downsample */ return (0); } /***************************************************************************** functionname: createEnvChannel description: initializes parameters and allocates memory returns: error status input: output: hEnv *****************************************************************************/ static INT createEnvChannel (HANDLE_ENV_CHANNEL hEnv, INT channel ,UCHAR* dynamic_RAM ) { FDKmemclear(hEnv,sizeof (struct ENV_CHANNEL)); if ( FDKsbrEnc_CreateTonCorrParamExtr(&hEnv->TonCorr, channel) ) { return(1); } if ( FDKsbrEnc_CreateExtractSbrEnvelope (&hEnv->sbrExtractEnvelope, channel ,/*chan*/0 ,dynamic_RAM ) ) { return(1); } return 0; } /***************************************************************************** functionname: initEnvChannel description: initializes parameters returns: error status input: output: *****************************************************************************/ static INT initEnvChannel ( HANDLE_SBR_CONFIG_DATA sbrConfigData, HANDLE_SBR_HEADER_DATA sbrHeaderData, HANDLE_ENV_CHANNEL hEnv, sbrConfigurationPtr params, ULONG statesInitFlag ,INT chanInEl ,UCHAR* dynamic_RAM ) { int frameShift, tran_off=0; INT e; INT tran_fc; INT timeSlots, timeStep, startIndex; INT noiseBands[2] = { 3, 3 }; e = 1 << params->e; FDK_ASSERT(params->e >= 0); hEnv->encEnvData.freq_res_fixfix = 1; hEnv->fLevelProtect = 0; hEnv->encEnvData.ldGrid = (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? 1 : 0; hEnv->encEnvData.sbr_xpos_mode = (XPOS_MODE)params->sbr_xpos_mode; if (hEnv->encEnvData.sbr_xpos_mode == XPOS_SWITCHED) { /* no other type than XPOS_MDCT or XPOS_SPEECH allowed, but enable switching */ sbrConfigData->switchTransposers = TRUE; hEnv->encEnvData.sbr_xpos_mode = XPOS_MDCT; } else { sbrConfigData->switchTransposers = FALSE; } hEnv->encEnvData.sbr_xpos_ctrl = params->sbr_xpos_ctrl; /* extended data */ if(params->parametricCoding) { hEnv->encEnvData.extended_data = 1; } else { hEnv->encEnvData.extended_data = 0; } hEnv->encEnvData.extension_size = 0; startIndex = QMF_FILTER_PROTOTYPE_SIZE - sbrConfigData->noQmfBands; switch (params->sbrFrameSize) { case 2304: timeSlots = 18; break; case 2048: case 1024: case 512: timeSlots = 16; break; case 1920: case 960: case 480: timeSlots = 15; break; case 1152: timeSlots = 9; break; default: return (1); /* Illegal frame size */ } timeStep = sbrConfigData->noQmfSlots / timeSlots; if ( FDKsbrEnc_InitTonCorrParamExtr(params->sbrFrameSize, &hEnv->TonCorr, sbrConfigData, timeSlots, params->sbr_xpos_ctrl, params->ana_max_level, sbrHeaderData->sbr_noise_bands, params->noiseFloorOffset, params->useSpeechConfig) ) return(1); hEnv->encEnvData.noOfnoisebands = hEnv->TonCorr.sbrNoiseFloorEstimate.noNoiseBands; noiseBands[0] = hEnv->encEnvData.noOfnoisebands; noiseBands[1] = hEnv->encEnvData.noOfnoisebands; hEnv->encEnvData.sbr_invf_mode = (INVF_MODE)params->sbr_invf_mode; if (hEnv->encEnvData.sbr_invf_mode == INVF_SWITCHED) { hEnv->encEnvData.sbr_invf_mode = INVF_MID_LEVEL; hEnv->TonCorr.switchInverseFilt = TRUE; } else { hEnv->TonCorr.switchInverseFilt = FALSE; } tran_fc = params->tran_fc; if (tran_fc == 0) { tran_fc = fixMin (5000, FDKsbrEnc_getSbrStartFreqRAW (sbrHeaderData->sbr_start_frequency,params->codecSettings.sampleFreq)); } tran_fc = (tran_fc*4*sbrConfigData->noQmfBands/sbrConfigData->sampleFreq + 1)>>1; if (sbrConfigData->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { frameShift = LD_PRETRAN_OFF; tran_off = LD_PRETRAN_OFF + FRAME_MIDDLE_SLOT_512LD*timeStep; } else { frameShift = 0; switch (timeSlots) { /* The factor of 2 is by definition. */ case NUMBER_TIME_SLOTS_2048: tran_off = 8 + FRAME_MIDDLE_SLOT_2048 * timeStep; break; case NUMBER_TIME_SLOTS_1920: tran_off = 7 + FRAME_MIDDLE_SLOT_1920 * timeStep; break; default: return 1; } } if ( FDKsbrEnc_InitExtractSbrEnvelope (&hEnv->sbrExtractEnvelope, sbrConfigData->noQmfSlots, sbrConfigData->noQmfBands, startIndex, timeSlots, timeStep, tran_off, statesInitFlag ,chanInEl ,dynamic_RAM ,sbrConfigData->sbrSyntaxFlags ) ) return(1); if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeEnvelope, sbrConfigData->nSfb, params->deltaTAcrossFrames, params->dF_edge_1stEnv, params->dF_edge_incr)) return(1); if(FDKsbrEnc_InitSbrCodeEnvelope (&hEnv->sbrCodeNoiseFloor, noiseBands, params->deltaTAcrossFrames, 0,0)) return(1); sbrConfigData->initAmpResFF = params->init_amp_res_FF; if(FDKsbrEnc_InitSbrHuffmanTables (&hEnv->encEnvData, &hEnv->sbrCodeEnvelope, &hEnv->sbrCodeNoiseFloor, sbrHeaderData->sbr_amp_res)) return(1); FDKsbrEnc_initFrameInfoGenerator (&hEnv->SbrEnvFrame, params->spread, e, params->stat, timeSlots, hEnv->encEnvData.freq_res_fixfix ,hEnv->encEnvData.ldGrid ); if(FDKsbrEnc_InitSbrTransientDetector (&hEnv->sbrTransientDetector, sbrConfigData->frameSize, sbrConfigData->sampleFreq, params, tran_fc, sbrConfigData->noQmfSlots, sbrConfigData->noQmfBands, hEnv->sbrExtractEnvelope.YBufferWriteOffset, hEnv->sbrExtractEnvelope.YBufferSzShift, frameShift, tran_off )) return(1); sbrConfigData->xposCtrlSwitch = params->sbr_xpos_ctrl; hEnv->encEnvData.noHarmonics = sbrConfigData->nSfb[HI]; hEnv->encEnvData.addHarmonicFlag = 0; return (0); } INT sbrEncoder_Open( HANDLE_SBR_ENCODER *phSbrEncoder, INT nElements, INT nChannels, INT supportPS ) { INT i; INT errorStatus = 1; HANDLE_SBR_ENCODER hSbrEncoder = NULL; if (phSbrEncoder==NULL ) { goto bail; } hSbrEncoder = GetRam_SbrEncoder(); if (hSbrEncoder==NULL) { goto bail; } FDKmemclear(hSbrEncoder, sizeof(SBR_ENCODER)); hSbrEncoder->pSBRdynamic_RAM = (UCHAR*)GetRam_SbrDynamic_RAM(); hSbrEncoder->dynamicRam = hSbrEncoder->pSBRdynamic_RAM; for (i=0; isbrElement[i] = GetRam_SbrElement(i); if (hSbrEncoder->sbrElement[i]==NULL) { goto bail; } FDKmemclear(hSbrEncoder->sbrElement[i], sizeof(SBR_ELEMENT)); hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO] = GetRam_Sbr_freqBandTableLO(i); hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI] = GetRam_Sbr_freqBandTableHI(i); hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master = GetRam_Sbr_v_k_master(i); if ( (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[LO]==NULL) || (hSbrEncoder->sbrElement[i]->sbrConfigData.freqBandTable[HI]==NULL) || (hSbrEncoder->sbrElement[i]->sbrConfigData.v_k_master==NULL) ) { goto bail; } } for (i=0; ipSbrChannel[i] = GetRam_SbrChannel(i); if (hSbrEncoder->pSbrChannel[i]==NULL) { goto bail; } if ( createEnvChannel(&hSbrEncoder->pSbrChannel[i]->hEnvChannel, i ,hSbrEncoder->dynamicRam ) ) { goto bail; } } for (i=0; iQmfAnalysis[i].FilterStates = GetRam_Sbr_QmfStatesAnalysis(i); if (hSbrEncoder->QmfAnalysis[i].FilterStates==NULL) { goto bail; } } if (supportPS) { if (PSEnc_Create(&hSbrEncoder->hParametricStereo)) { goto bail; } hSbrEncoder->qmfSynthesisPS.FilterStates = GetRam_PsQmfStatesSynthesis(); if (hSbrEncoder->qmfSynthesisPS.FilterStates==NULL) { goto bail; } } /* supportPS */ *phSbrEncoder = hSbrEncoder; errorStatus = 0; return errorStatus; bail: /* Close SBR encoder instance */ sbrEncoder_Close(&hSbrEncoder); return errorStatus; } static INT FDKsbrEnc_Reallocate( HANDLE_SBR_ENCODER hSbrEncoder, SBR_ELEMENT_INFO elInfo[(8)], const INT noElements) { INT totalCh = 0; INT totalQmf = 0; INT coreEl; INT el=-1; hSbrEncoder->lfeChIdx = -1; /* default value, until lfe found */ for (coreEl=0; coreEllfeChIdx = elInfo[coreEl].ChannelIndex[0]; } continue; } SBR_ELEMENT_INFO *pelInfo = &elInfo[coreEl]; HANDLE_SBR_ELEMENT hSbrElement = hSbrEncoder->sbrElement[el]; int ch; for ( ch = 0; ch < pelInfo->nChannelsInEl; ch++ ) { hSbrElement->sbrChannel[ch] = hSbrEncoder->pSbrChannel[totalCh]; totalCh++; } /* analysis QMF */ for ( ch = 0; ch < ((pelInfo->fParametricStereo)?2:pelInfo->nChannelsInEl); ch++ ) { hSbrElement->elInfo.ChannelIndex[ch] = pelInfo->ChannelIndex[ch]; hSbrElement->hQmfAnalysis[ch] = &hSbrEncoder->QmfAnalysis[totalQmf++]; } /* Copy Element info */ hSbrElement->elInfo.elType = pelInfo->elType; hSbrElement->elInfo.instanceTag = pelInfo->instanceTag; hSbrElement->elInfo.nChannelsInEl = pelInfo->nChannelsInEl; hSbrElement->elInfo.fParametricStereo = pelInfo->fParametricStereo; } /* coreEl */ return 0; } /***************************************************************************** functionname: FDKsbrEnc_EnvInit description: initializes parameters returns: error status input: output: hEnv *****************************************************************************/ static INT FDKsbrEnc_EnvInit ( HANDLE_SBR_ELEMENT hSbrElement, sbrConfigurationPtr params, INT *coreBandWith, AUDIO_OBJECT_TYPE aot, int nBitstrDelay, int nElement, const int headerPeriod, ULONG statesInitFlag, int fTimeDomainDownsampling ,UCHAR *dynamic_RAM ) { UCHAR *bitstreamBuffer; int ch, i; if ((params->codecSettings.nChannels < 1) || (params->codecSettings.nChannels > MAX_NUM_CHANNELS)){ return(1); } /* initialize the encoder handle and structs*/ bitstreamBuffer = hSbrElement->payloadDelayLine[nBitstrDelay]; /* init and set syntax flags */ hSbrElement->sbrConfigData.sbrSyntaxFlags = 0; switch (aot) { case AOT_DRM_MPEG_PS: case AOT_DRM_SBR: hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_SCALABLE; hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_DRM_CRC; hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; break; case AOT_ER_AAC_ELD: hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_LOW_DELAY; break; default: break; } if (params->crcSbr) { hSbrElement->sbrConfigData.sbrSyntaxFlags |= SBR_SYNTAX_CRC; } hSbrElement->sbrConfigData.noQmfBands = QMF_CHANNELS>>(2-params->downSampleFactor); switch (hSbrElement->sbrConfigData.noQmfBands) { case 64: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6; break; case 32: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>5; break; default: hSbrElement->sbrConfigData.noQmfSlots = params->sbrFrameSize>>6; return(2); } FDKinitBitStream(&hSbrElement->CmonData.sbrBitbuf, bitstreamBuffer, MAX_PAYLOAD_SIZE*sizeof(UCHAR), 0, BS_WRITER); /* now initialize sbrConfigData, sbrHeaderData and sbrBitstreamData, */ hSbrElement->sbrConfigData.nChannels = params->codecSettings.nChannels; if(params->codecSettings.nChannels == 2) hSbrElement->sbrConfigData.stereoMode = params->stereoMode; else hSbrElement->sbrConfigData.stereoMode = SBR_MONO; hSbrElement->sbrConfigData.frameSize = params->sbrFrameSize; hSbrElement->sbrConfigData.sampleFreq = params->downSampleFactor * params->codecSettings.sampleFreq; hSbrElement->sbrBitstreamData.CountSendHeaderData = 0; if (params->SendHeaderDataTime > 0 ) { if (headerPeriod==-1) { hSbrElement->sbrBitstreamData.NrSendHeaderData = (INT)(params->SendHeaderDataTime * hSbrElement->sbrConfigData.sampleFreq / (1000 * hSbrElement->sbrConfigData.frameSize)); hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMax(hSbrElement->sbrBitstreamData.NrSendHeaderData,1); } else { /* assure header period at least once per second */ hSbrElement->sbrBitstreamData.NrSendHeaderData = fixMin(fixMax(headerPeriod,1),(hSbrElement->sbrConfigData.sampleFreq/hSbrElement->sbrConfigData.frameSize)); } } else { hSbrElement->sbrBitstreamData.NrSendHeaderData = 0; } hSbrElement->sbrHeaderData.sbr_data_extra = params->sbr_data_extra; hSbrElement->sbrBitstreamData.HeaderActive = 0; hSbrElement->sbrHeaderData.sbr_start_frequency = params->startFreq; hSbrElement->sbrHeaderData.sbr_stop_frequency = params->stopFreq; hSbrElement->sbrHeaderData.sbr_xover_band = 0; hSbrElement->sbrHeaderData.sbr_lc_stereo_mode = 0; /* data_extra */ if (params->sbr_xpos_ctrl!= SBR_XPOS_CTRL_DEFAULT) hSbrElement->sbrHeaderData.sbr_data_extra = 1; hSbrElement->sbrHeaderData.sbr_amp_res = (AMP_RES)params->amp_res; /* header_extra_1 */ hSbrElement->sbrHeaderData.freqScale = params->freqScale; hSbrElement->sbrHeaderData.alterScale = params->alterScale; hSbrElement->sbrHeaderData.sbr_noise_bands = params->sbr_noise_bands; hSbrElement->sbrHeaderData.header_extra_1 = 0; if ((params->freqScale != SBR_FREQ_SCALE_DEFAULT) || (params->alterScale != SBR_ALTER_SCALE_DEFAULT) || (params->sbr_noise_bands != SBR_NOISE_BANDS_DEFAULT)) { hSbrElement->sbrHeaderData.header_extra_1 = 1; } /* header_extra_2 */ hSbrElement->sbrHeaderData.sbr_limiter_bands = params->sbr_limiter_bands; hSbrElement->sbrHeaderData.sbr_limiter_gains = params->sbr_limiter_gains; if ((hSbrElement->sbrConfigData.sampleFreq > 48000) && (hSbrElement->sbrHeaderData.sbr_start_frequency >= 9)) { hSbrElement->sbrHeaderData.sbr_limiter_gains = SBR_LIMITER_GAINS_INFINITE; } hSbrElement->sbrHeaderData.sbr_interpol_freq = params->sbr_interpol_freq; hSbrElement->sbrHeaderData.sbr_smoothing_length = params->sbr_smoothing_length; hSbrElement->sbrHeaderData.header_extra_2 = 0; if ((params->sbr_limiter_bands != SBR_LIMITER_BANDS_DEFAULT) || (params->sbr_limiter_gains != SBR_LIMITER_GAINS_DEFAULT) || (params->sbr_interpol_freq != SBR_INTERPOL_FREQ_DEFAULT) || (params->sbr_smoothing_length != SBR_SMOOTHING_LENGTH_DEFAULT)) { hSbrElement->sbrHeaderData.header_extra_2 = 1; } /* other switches */ hSbrElement->sbrConfigData.useWaveCoding = params->useWaveCoding; hSbrElement->sbrConfigData.useParametricCoding = params->parametricCoding; /* init freq band table */ if(updateFreqBandTable(&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, params->downSampleFactor )) { return(1); } /* now create envelope ext and QMF for each available channel */ for ( ch = 0; ch < hSbrElement->sbrConfigData.nChannels; ch++ ) { if ( initEnvChannel(&hSbrElement->sbrConfigData, &hSbrElement->sbrHeaderData, &hSbrElement->sbrChannel[ch]->hEnvChannel, params, statesInitFlag ,ch ,dynamic_RAM ) ) { return(1); } } /* nChannels */ /* reset and intialize analysis qmf */ for ( ch = 0; ch < ((hSbrElement->elInfo.fParametricStereo)?2:hSbrElement->sbrConfigData.nChannels); ch++ ) { int err; UINT qmfFlags = (hSbrElement->sbrConfigData.sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) ? QMF_FLAG_CLDFB : 0; if (statesInitFlag) qmfFlags &= ~QMF_FLAG_KEEP_STATES; else qmfFlags |= QMF_FLAG_KEEP_STATES; err = qmfInitAnalysisFilterBank( hSbrElement->hQmfAnalysis[ch], (FIXP_QAS*)hSbrElement->hQmfAnalysis[ch]->FilterStates, hSbrElement->sbrConfigData.noQmfSlots, hSbrElement->sbrConfigData.noQmfBands, hSbrElement->sbrConfigData.noQmfBands, hSbrElement->sbrConfigData.noQmfBands, qmfFlags ); if (0!=err) { return err; } } /* */ hSbrElement->CmonData.xOverFreq = hSbrElement->sbrConfigData.xOverFreq; hSbrElement->CmonData.dynBwEnabled = (params->dynBwSupported && params->dynBwEnabled); hSbrElement->CmonData.dynXOverFreqEnc = FDKsbrEnc_SbrGetXOverFreq( hSbrElement, hSbrElement->CmonData.xOverFreq); for ( i = 0; i < 5; i++ ) hSbrElement->dynXOverFreqDelay[i] = hSbrElement->CmonData.dynXOverFreqEnc; hSbrElement->CmonData.sbrNumChannels = hSbrElement->sbrConfigData.nChannels; hSbrElement->sbrConfigData.dynXOverFreq = hSbrElement->CmonData.xOverFreq; /* Update Bandwith to be passed to the core encoder */ *coreBandWith = hSbrElement->CmonData.xOverFreq; return(0); } INT sbrEncoder_GetInBufferSize(int noChannels) { INT temp; temp = (2048); temp += 1024 + MAX_SAMPLE_DELAY; temp *= noChannels; temp *= sizeof(INT_PCM); return temp; } /* * Encode Dummy SBR payload frames to fill the delay lines. */ static INT FDKsbrEnc_DelayCompensation ( HANDLE_SBR_ENCODER hEnvEnc, INT_PCM *timeBuffer ) { int n, el; for (n=hEnvEnc->nBitstrDelay; n>0; n--) { for (el=0; elnoElements; el++) { if (FDKsbrEnc_EnvEncodeFrame( hEnvEnc, el, timeBuffer + hEnvEnc->downsampledOffset, hEnvEnc->sbrElement[el]->sbrConfigData.nChannels, NULL, NULL, 1 )) return -1; } sbrEncoder_UpdateBuffers(hEnvEnc, timeBuffer); } return 0; } UINT sbrEncoder_LimitBitRate(UINT bitRate, UINT numChannels, UINT coreSampleRate, AUDIO_OBJECT_TYPE aot) { UINT newBitRate; INT index; FDK_ASSERT(numChannels > 0 && numChannels <= 2); if (aot == AOT_PS) { if (numChannels == 2) { index = getPsTuningTableIndex(bitRate, &newBitRate); if (index == INVALID_TABLE_IDX) { bitRate = newBitRate; } /* Set numChannels to 1 because for PS we need a SBR SCE (mono) element. */ numChannels = 1; } else { return 0; } } index = getSbrTuningTableIndex(bitRate, numChannels, coreSampleRate, aot, &newBitRate); if (index != INVALID_TABLE_IDX) { newBitRate = bitRate; } return newBitRate; } UINT sbrEncoder_IsSingleRatePossible(AUDIO_OBJECT_TYPE aot) { UINT isPossible=(AOT_PS==aot)?0:1; return isPossible; } INT sbrEncoder_Init( HANDLE_SBR_ENCODER hSbrEncoder, SBR_ELEMENT_INFO elInfo[(8)], int noElements, INT_PCM *inputBuffer, INT *coreBandwidth, INT *inputBufferOffset, INT *numChannels, INT *coreSampleRate, UINT *downSampleFactor, INT *frameLength, AUDIO_OBJECT_TYPE aot, int *delay, int transformFactor, const int headerPeriod, ULONG statesInitFlag ) { HANDLE_ERROR_INFO errorInfo = noError; sbrConfiguration sbrConfig[(8)]; INT error = 0; INT lowestBandwidth; /* Save input parameters */ INT inputSampleRate = *coreSampleRate; int coreFrameLength = *frameLength; int inputBandWidth = *coreBandwidth; int inputChannels = *numChannels; int downsampledOffset = 0; int sbrOffset = 0; int downsamplerDelay = 0; int timeDomainDownsample = 0; int nBitstrDelay = 0; int highestSbrStartFreq, highestSbrStopFreq; int lowDelay = 0; int usePs = 0; /* check whether SBR setting is available for the current encoder configuration (bitrate, samplerate) */ if (!sbrEncoder_IsSingleRatePossible(aot)) { *downSampleFactor = 2; } if ( (aot==AOT_PS) || (aot==AOT_MP2_PS) || (aot==AOT_DABPLUS_PS) || (aot==AOT_DRM_MPEG_PS) ) { usePs = 1; } if ( (aot==AOT_ER_AAC_ELD) ) { lowDelay = 1; } else if ( (aot==AOT_ER_AAC_LD) ) { error = 1; goto bail; } /* Parametric Stereo */ if ( usePs ) { if ( *numChannels == 2 && noElements == 1) { /* Override Element type in case of Parametric stereo */ elInfo[0].elType = ID_SCE; elInfo[0].fParametricStereo = 1; elInfo[0].nChannelsInEl = 1; /* core encoder gets downmixed mono signal */ *numChannels = 1; } else { error = 1; goto bail; } } /* usePs */ /* set the core's sample rate */ switch (*downSampleFactor) { case 1: *coreSampleRate = inputSampleRate; break; case 2: *coreSampleRate = inputSampleRate>>1; break; default: *coreSampleRate = inputSampleRate>>1; return 0; /* return error */ } /* check whether SBR setting is available for the current encoder configuration (bitrate, coreSampleRate) */ { int delayDiff = 0; int el, coreEl; /* Check if every element config is feasible */ for (coreEl=0; coreEl 0) { /* * We must tweak the balancing into a situation where the downsampled path * is the one to be delayed, because delaying the QMF domain input, also delays * the downsampled audio, counteracting to the purpose of delay balancing. */ while ( delayDiff > 0 ) { /* Encoder delay increases */ { *delay += coreFrameLength * *downSampleFactor; /* Add one frame delay to SBR path */ delayDiff -= coreFrameLength * *downSampleFactor; } nBitstrDelay += 1; } } else { *delay += fixp_abs(delayDiff); } if (delayDiff < 0) { /* Delay AAC data */ delayDiff = -delayDiff; /* Multiply downsampled offset by AAC core channels. Divide by 2 because of half samplerate of downsampled data. */ FDK_ASSERT(*downSampleFactor>0 && *downSampleFactor<=2); downsampledOffset = (delayDiff*(*numChannels))>>(*downSampleFactor-1); sbrOffset = 0; } else { /* Delay SBR input */ if ( delayDiff > (int)coreFrameLength * (int)*downSampleFactor ) { /* Do bitstream frame-wise delay balancing if we have more than SBR framelength samples delay difference */ delayDiff -= coreFrameLength * *downSampleFactor; nBitstrDelay = 1; } /* Multiply input offset by input channels */ sbrOffset = delayDiff*(*numChannels); downsampledOffset = 0; } hSbrEncoder->nBitstrDelay = nBitstrDelay; hSbrEncoder->nChannels = *numChannels; hSbrEncoder->frameSize = coreFrameLength * *downSampleFactor; hSbrEncoder->fTimeDomainDownsampling = timeDomainDownsample; hSbrEncoder->downSampleFactor = *downSampleFactor; hSbrEncoder->estimateBitrate = 0; hSbrEncoder->inputDataDelay = 0; /* Open SBR elements */ el = -1; highestSbrStartFreq = highestSbrStopFreq = 0; lowestBandwidth = 99999; /* Loop through each core encoder element and get a matching SBR element config */ for (coreEl=0; coreElnoElements = el+1; FDKsbrEnc_Reallocate(hSbrEncoder, elInfo, noElements); for (el=0; elnoElements; el++) { int bandwidth = *coreBandwidth; /* Use lowest common bandwidth */ sbrConfig[el].startFreq = highestSbrStartFreq; sbrConfig[el].stopFreq = highestSbrStopFreq; /* initialize SBR element, and get core bandwidth */ error = FDKsbrEnc_EnvInit(hSbrEncoder->sbrElement[el], &sbrConfig[el], &bandwidth, aot, nBitstrDelay, el, headerPeriod, statesInitFlag, hSbrEncoder->fTimeDomainDownsampling ,hSbrEncoder->dynamicRam ); if (error != 0) { error = 2; goto bail; } /* Get lowest core encoder bandwidth to be returned later. */ lowestBandwidth = fixMin(lowestBandwidth, bandwidth); } /* second element loop */ /* Initialize a downsampler for each channel in each SBR element */ if (hSbrEncoder->fTimeDomainDownsampling) { for (el=0; elnoElements; el++) { HANDLE_SBR_ELEMENT hSbrEl = hSbrEncoder->sbrElement[el]; INT Wc, ch; /* Calculated required normalized cutoff frequency (Wc = 1.0 -> lowestBandwidth = inputSampleRate/2) */ Wc = (2*lowestBandwidth)*1000 / inputSampleRate; for (ch=0; chelInfo.nChannelsInEl; ch++) { FDKaacEnc_InitDownsampler (&hSbrEl->sbrChannel[ch]->downSampler, Wc, *downSampleFactor); FDK_ASSERT (hSbrEl->sbrChannel[ch]->downSampler.delay <=MAX_DS_FILTER_DELAY); } downsamplerDelay = hSbrEl->sbrChannel[0]->downSampler.delay; } /* third element loop */ /* lfe */ FDKaacEnc_InitDownsampler (&hSbrEncoder->lfeDownSampler, 0, *downSampleFactor); /* Add the resampler additional delay to get the final delay and buffer offset values. */ if (sbrOffset > 0 || downsampledOffset <= ((downsamplerDelay * (*numChannels))>>(*downSampleFactor-1))) { sbrOffset += (downsamplerDelay - downsampledOffset) * (*numChannels) ; *delay += downsamplerDelay - downsampledOffset; downsampledOffset = 0; } else { downsampledOffset -= (downsamplerDelay * (*numChannels))>>(*downSampleFactor-1); sbrOffset = 0; } hSbrEncoder->inputDataDelay = downsamplerDelay; } /* Assign core encoder Bandwidth */ *coreBandwidth = lowestBandwidth; /* Estimate sbr bitrate, 2.5 kBit/s per sbr channel */ hSbrEncoder->estimateBitrate += 2500 * (*numChannels); /* initialize parametric stereo */ if (usePs) { PSENC_CONFIG psEncConfig; FDK_ASSERT(hSbrEncoder->noElements == 1); INT psTuningTableIdx = getPsTuningTableIndex(elInfo[0].bitRate, NULL); psEncConfig.frameSize = coreFrameLength; //sbrConfig.sbrFrameSize; psEncConfig.qmfFilterMode = 0; psEncConfig.sbrPsDelay = 0; /* tuning parameters */ if (psTuningTableIdx != INVALID_TABLE_IDX) { psEncConfig.nStereoBands = psTuningTable[psTuningTableIdx].nStereoBands; psEncConfig.maxEnvelopes = psTuningTable[psTuningTableIdx].nEnvelopes; psEncConfig.iidQuantErrorThreshold = (FIXP_DBL)psTuningTable[psTuningTableIdx].iidQuantErrorThreshold; /* calculation is not quite linear, increased number of envelopes causes more bits */ /* assume avg. 50 bits per frame for 10 stereo bands / 1 envelope configuration */ hSbrEncoder->estimateBitrate += ( (((*coreSampleRate) * 5 * psEncConfig.nStereoBands * psEncConfig.maxEnvelopes) / hSbrEncoder->frameSize)); } else { error = ERROR(CDI, "Invalid ps tuning table index."); goto bail; } qmfInitSynthesisFilterBank(&hSbrEncoder->qmfSynthesisPS, (FIXP_DBL*)hSbrEncoder->qmfSynthesisPS.FilterStates, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands>>1, (statesInitFlag) ? 0 : QMF_FLAG_KEEP_STATES); if(errorInfo == noError){ /* update delay */ psEncConfig.sbrPsDelay = FDKsbrEnc_GetEnvEstDelay(&hSbrEncoder->sbrElement[0]->sbrChannel[0]->hEnvChannel.sbrExtractEnvelope); if(noError != (errorInfo = PSEnc_Init( hSbrEncoder->hParametricStereo, &psEncConfig, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfSlots, hSbrEncoder->sbrElement[0]->sbrConfigData.noQmfBands ,hSbrEncoder->dynamicRam ))) { errorInfo = handBack(errorInfo); } } /* QMF analysis + Hybrid analysis + Hybrid synthesis + QMF synthesis + downsampled input buffer delay */ hSbrEncoder->inputDataDelay = (64*10/2) + (6*64) + (0) + (64*10/2-64+1) + ((*downSampleFactor)*downsampledOffset); } hSbrEncoder->downsampledOffset = downsampledOffset; { hSbrEncoder->downmixSize = coreFrameLength*(*numChannels); } hSbrEncoder->bufferOffset = sbrOffset; /* Delay Compensation: fill bitstream delay buffer with zero input signal */ if ( hSbrEncoder->nBitstrDelay > 0 ) { error = FDKsbrEnc_DelayCompensation (hSbrEncoder, inputBuffer); if (error != 0) goto bail; } /* Set Output frame length */ *frameLength = coreFrameLength * *downSampleFactor; /* Input buffer offset */ *inputBufferOffset = fixMax(sbrOffset, downsampledOffset); } return error; bail: /* Restore input settings */ *coreSampleRate = inputSampleRate; *frameLength = coreFrameLength; *numChannels = inputChannels; *coreBandwidth = inputBandWidth; return error; } INT sbrEncoder_EncodeFrame( HANDLE_SBR_ENCODER hSbrEncoder, INT_PCM *samples, UINT timeInStride, UINT sbrDataBits[(8)], UCHAR sbrData[(8)][MAX_PAYLOAD_SIZE] ) { INT error; int el; for (el=0; elnoElements; el++) { if (hSbrEncoder->sbrElement[el] != NULL) { error = FDKsbrEnc_EnvEncodeFrame( hSbrEncoder, el, samples + hSbrEncoder->downsampledOffset, timeInStride, &sbrDataBits[el], sbrData[el], 0 ); if (error) return error; } } if ( ( hSbrEncoder->lfeChIdx!=-1) && (hSbrEncoder->downSampleFactor > 1) ) { /* lfe downsampler */ INT nOutSamples; FDKaacEnc_Downsample(&hSbrEncoder->lfeDownSampler, samples + hSbrEncoder->downsampledOffset + hSbrEncoder->bufferOffset + hSbrEncoder->lfeChIdx, hSbrEncoder->frameSize, timeInStride, samples + hSbrEncoder->downsampledOffset + hSbrEncoder->lfeChIdx, &nOutSamples, hSbrEncoder->nChannels); } return 0; } INT sbrEncoder_UpdateBuffers( HANDLE_SBR_ENCODER hSbrEncoder, INT_PCM *timeBuffer ) { if ( hSbrEncoder->downsampledOffset > 0 ) { /* Move delayed downsampled data */ FDKmemcpy ( timeBuffer, timeBuffer + hSbrEncoder->downmixSize, sizeof(INT_PCM) * (hSbrEncoder->downsampledOffset) ); } else { /* Move delayed input data */ FDKmemcpy ( timeBuffer, timeBuffer + hSbrEncoder->nChannels * hSbrEncoder->frameSize, sizeof(INT_PCM) * hSbrEncoder->bufferOffset ); } if ( hSbrEncoder->nBitstrDelay > 0 ) { int el; for (el=0; elnoElements; el++) { FDKmemmove ( hSbrEncoder->sbrElement[el]->payloadDelayLine[0], hSbrEncoder->sbrElement[el]->payloadDelayLine[1], sizeof(UCHAR) * (hSbrEncoder->nBitstrDelay*MAX_PAYLOAD_SIZE) ); FDKmemmove( &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[0], &hSbrEncoder->sbrElement[el]->payloadDelayLineSize[1], sizeof(UINT) * (hSbrEncoder->nBitstrDelay) ); } } return 0; } INT sbrEncoder_GetEstimateBitrate(HANDLE_SBR_ENCODER hSbrEncoder) { INT estimateBitrate = 0; if(hSbrEncoder) { estimateBitrate += hSbrEncoder->estimateBitrate; } return estimateBitrate; } INT sbrEncoder_GetInputDataDelay(HANDLE_SBR_ENCODER hSbrEncoder) { INT delay = -1; if(hSbrEncoder) { delay = hSbrEncoder->inputDataDelay; } return delay; } INT sbrEncoder_GetLibInfo( LIB_INFO *info ) { int i; if (info == NULL) { return -1; } /* search for next free tab */ for (i = 0; i < FDK_MODULE_LAST; i++) { if (info[i].module_id == FDK_NONE) break; } if (i == FDK_MODULE_LAST) { return -1; } info += i; info->module_id = FDK_SBRENC; info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2); LIB_VERSION_STRING(info); info->build_date = __DATE__; info->build_time = __TIME__; info->title = "SBR Encoder"; /* Set flags */ info->flags = 0 | CAPF_SBR_HQ | CAPF_SBR_PS_MPEG ; /* End of flags */ return 0; } fdk-aac-0.1.3/libSBRenc/src/ps_main.cpp0000644000175000017500000005603512372261464020147 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial Authors: M. Multrus Contents/Description: PS Wrapper, Downmix ******************************************************************************/ #include "ps_main.h" /* Includes ******************************************************************/ #include "ps_const.h" #include "ps_bitenc.h" #include "sbr_ram.h" /*--------------- function declarations --------------------*/ static void psFindBestScaling( HANDLE_PARAMETRIC_STEREO hParametricStereo, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], UCHAR *dynBandScale, FIXP_QMF *maxBandValue, SCHAR *dmxScale ); /*------------- function definitions ----------------*/ FDK_PSENC_ERROR PSEnc_Create( HANDLE_PARAMETRIC_STEREO *phParametricStereo ) { FDK_PSENC_ERROR error = PSENC_OK; if (phParametricStereo==NULL) { error = PSENC_INVALID_HANDLE; } else { int i; HANDLE_PARAMETRIC_STEREO hParametricStereo = NULL; if (NULL==(hParametricStereo = GetRam_ParamStereo())) { error = PSENC_MEMORY_ERROR; goto bail; } FDKmemclear(hParametricStereo, sizeof(PARAMETRIC_STEREO)); if (PSENC_OK != (error = FDKsbrEnc_CreatePSEncode(&hParametricStereo->hPsEncode))) { goto bail; } for (i=0; ifdkHybAnaFilter[i], hParametricStereo->__staticHybAnaStatesLF[i], sizeof(hParametricStereo->__staticHybAnaStatesLF[i]), hParametricStereo->__staticHybAnaStatesHF[i], sizeof(hParametricStereo->__staticHybAnaStatesHF[i]) ) !=0 ) { error = PSENC_MEMORY_ERROR; goto bail; } } *phParametricStereo = hParametricStereo; /* return allocated handle */ } bail: return error; } FDK_PSENC_ERROR PSEnc_Init( HANDLE_PARAMETRIC_STEREO hParametricStereo, const HANDLE_PSENC_CONFIG hPsEncConfig, INT noQmfSlots, INT noQmfBands ,UCHAR *dynamic_RAM ) { FDK_PSENC_ERROR error = PSENC_OK; if ( (NULL==hParametricStereo) || (NULL==hPsEncConfig) ) { error = PSENC_INVALID_HANDLE; } else { int ch, i; hParametricStereo->initPS = 1; hParametricStereo->noQmfSlots = noQmfSlots; hParametricStereo->noQmfBands = noQmfBands; /* clear delay lines */ FDKmemclear(hParametricStereo->qmfDelayLines, sizeof(hParametricStereo->qmfDelayLines)); hParametricStereo->qmfDelayScale = FRACT_BITS-1; /* create configuration for hybrid filter bank */ for (ch=0; chfdkHybAnaFilter[ch], THREE_TO_TEN, QMF_CHANNELS, QMF_CHANNELS, 1 ); } /* ch */ FDKhybridSynthesisInit( &hParametricStereo->fdkHybSynFilter, THREE_TO_TEN, QMF_CHANNELS, QMF_CHANNELS ); /* determine average delay */ hParametricStereo->psDelay = (HYBRID_FILTER_DELAY*hParametricStereo->noQmfBands); if ( (hPsEncConfig->maxEnvelopes < PSENC_NENV_1) || (hPsEncConfig->maxEnvelopes > PSENC_NENV_MAX) ) { hPsEncConfig->maxEnvelopes = PSENC_NENV_DEFAULT; } hParametricStereo->maxEnvelopes = hPsEncConfig->maxEnvelopes; if (PSENC_OK != (error = FDKsbrEnc_InitPSEncode(hParametricStereo->hPsEncode, (PS_BANDS) hPsEncConfig->nStereoBands, hPsEncConfig->iidQuantErrorThreshold))){ goto bail; } for (ch = 0; chpHybridData[i+HYBRID_READ_OFFSET][ch][0] = &pDynReal[i*MAX_HYBRID_BANDS]; hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][ch][1] = &pDynImag[i*MAX_HYBRID_BANDS];; } for (i=0; ipHybridData[i][ch][0] = hParametricStereo->__staticHybridData[i][ch][0]; hParametricStereo->pHybridData[i][ch][1] = hParametricStereo->__staticHybridData[i][ch][1]; } } /* ch */ /* clear static hybrid buffer */ FDKmemclear(hParametricStereo->__staticHybridData, sizeof(hParametricStereo->__staticHybridData)); /* clear bs buffer */ FDKmemclear(hParametricStereo->psOut, sizeof(hParametricStereo->psOut)); hParametricStereo->psOut[0].enablePSHeader = 1; /* write ps header in first frame */ /* clear scaling buffer */ FDKmemclear(hParametricStereo->dynBandScale, sizeof(UCHAR)*PS_MAX_BANDS); FDKmemclear(hParametricStereo->maxBandValue, sizeof(FIXP_QMF)*PS_MAX_BANDS); } /* valid handle */ bail: return error; } FDK_PSENC_ERROR PSEnc_Destroy( HANDLE_PARAMETRIC_STEREO *phParametricStereo ) { FDK_PSENC_ERROR error = PSENC_OK; if (NULL!=phParametricStereo) { HANDLE_PARAMETRIC_STEREO hParametricStereo = *phParametricStereo; if(hParametricStereo != NULL){ FDKsbrEnc_DestroyPSEncode(&hParametricStereo->hPsEncode); FreeRam_ParamStereo(phParametricStereo); } } return error; } static FDK_PSENC_ERROR ExtractPSParameters( HANDLE_PARAMETRIC_STEREO hParametricStereo, const int sendHeader, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2] ) { FDK_PSENC_ERROR error = PSENC_OK; if (hParametricStereo == NULL) { error = PSENC_INVALID_HANDLE; } else { /* call ps encode function */ if (hParametricStereo->initPS){ hParametricStereo->psOut[1] = hParametricStereo->psOut[0]; } hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; if (PSENC_OK != (error = FDKsbrEnc_PSEncode( hParametricStereo->hPsEncode, &hParametricStereo->psOut[1], hParametricStereo->dynBandScale, hParametricStereo->maxEnvelopes, hybridData, hParametricStereo->noQmfSlots, sendHeader))) { goto bail; } if (hParametricStereo->initPS) { hParametricStereo->psOut[0] = hParametricStereo->psOut[1]; hParametricStereo->initPS = 0; } } bail: return error; } static FDK_PSENC_ERROR DownmixPSQmfData( HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_QMF_FILTER_BANK sbrSynthQmf, FIXP_QMF **RESTRICT mixRealQmfData, FIXP_QMF **RESTRICT mixImagQmfData, INT_PCM *downsampledOutSignal, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], const INT noQmfSlots, const INT psQmfScale[MAX_PS_CHANNELS], SCHAR *qmfScale ) { FDK_PSENC_ERROR error = PSENC_OK; if(hParametricStereo == NULL){ error = PSENC_INVALID_HANDLE; } else { int n, k; C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS) /* define scalings */ int dynQmfScale = fixMax(0, hParametricStereo->dmxScale-1); /* scale one bit more for addition of left and right */ int downmixScale = psQmfScale[0] - dynQmfScale; const FIXP_DBL maxStereoScaleFactor = MAXVAL_DBL; /* 2.f/2.f */ for (n = 0; n>1) < fMult(maxStereoScaleFactor,tmpScaleFactor) ) { int sc_num = CountLeadingBits(stereoScaleFactor) ; int sc_denum = CountLeadingBits(tmpScaleFactor) ; sc = -(sc_num-sc_denum); tmpScaleFactor = schur_div((stereoScaleFactor<<(sc_num))>>1, tmpScaleFactor<>=1; } stereoScaleFactor = sqrtFixp(tmpScaleFactor); stereoScaleFactor <<= (sc>>1); } else { stereoScaleFactor = maxStereoScaleFactor; } /* write data to hybrid output */ tmpHybrid[0][k] = fMultDiv2(stereoScaleFactor, (FIXP_QMF)(tmpLeftReal + tmpRightReal))>>dynScale; tmpHybrid[1][k] = fMultDiv2(stereoScaleFactor, (FIXP_QMF)(tmpLeftImag + tmpRightImag))>>dynScale; } /* hybrid bands - k */ FDKhybridSynthesisApply( &hParametricStereo->fdkHybSynFilter, tmpHybrid[0], tmpHybrid[1], mixRealQmfData[n], mixImagQmfData[n]); qmfSynthesisFilteringSlot( sbrSynthQmf, mixRealQmfData[n], mixImagQmfData[n], downmixScale-7, downmixScale-7, downsampledOutSignal+(n*sbrSynthQmf->no_channels), 1, pWorkBuffer); } /* slots */ *qmfScale = -downmixScale + 7; C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 2*QMF_CHANNELS) { const INT noQmfSlots2 = hParametricStereo->noQmfSlots>>1; const int noQmfBands = hParametricStereo->noQmfBands; INT scale, i, j, slotOffset; FIXP_QMF tmp[2][QMF_CHANNELS]; for (i=0; iqmfDelayLines[0][i], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(tmp[1], hParametricStereo->qmfDelayLines[1][i], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(hParametricStereo->qmfDelayLines[0][i], mixRealQmfData[i+noQmfSlots2], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(hParametricStereo->qmfDelayLines[1][i], mixImagQmfData[i+noQmfSlots2], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(mixRealQmfData[i+noQmfSlots2], mixRealQmfData[i], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(mixImagQmfData[i+noQmfSlots2], mixImagQmfData[i], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(mixRealQmfData[i], tmp[0], noQmfBands*sizeof(FIXP_QMF)); FDKmemcpy(mixImagQmfData[i], tmp[1], noQmfBands*sizeof(FIXP_QMF)); } if (hParametricStereo->qmfDelayScale > *qmfScale) { scale = hParametricStereo->qmfDelayScale - *qmfScale; slotOffset = 0; } else { scale = *qmfScale - hParametricStereo->qmfDelayScale; slotOffset = noQmfSlots2; } for (i=0; i>= scale; mixImagQmfData[i+slotOffset][j] >>= scale; } } scale = *qmfScale; *qmfScale = FDKmin(*qmfScale, hParametricStereo->qmfDelayScale); hParametricStereo->qmfDelayScale = scale; } } /* valid handle */ return error; } INT FDKsbrEnc_PSEnc_WritePSData( HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitstream ) { return ( (hParametricStereo!=NULL) ? FDKsbrEnc_WritePSBitstream(&hParametricStereo->psOut[0], hBitstream) : 0 ); } FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( HANDLE_PARAMETRIC_STEREO hParametricStereo, INT_PCM *samples[2], UINT timeInStride, QMF_FILTER_BANK **hQmfAnalysis, FIXP_QMF **RESTRICT downmixedRealQmfData, FIXP_QMF **RESTRICT downmixedImagQmfData, INT_PCM *downsampledOutSignal, HANDLE_QMF_FILTER_BANK sbrSynthQmf, SCHAR *qmfScale, const int sendHeader ) { FDK_PSENC_ERROR error = PSENC_OK; INT psQmfScale[MAX_PS_CHANNELS] = {0}; int psCh, i; C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS) for (psCh = 0; psChno_col; i++) { qmfAnalysisFilteringSlot( hQmfAnalysis[psCh], &pWorkBuffer[2*QMF_CHANNELS], /* qmfReal[QMF_CHANNELS] */ &pWorkBuffer[3*QMF_CHANNELS], /* qmfImag[QMF_CHANNELS] */ samples[psCh]+i*(hQmfAnalysis[psCh]->no_channels*timeInStride), timeInStride, &pWorkBuffer[0*QMF_CHANNELS] /* qmf workbuffer 2*QMF_CHANNELS */ ); FDKhybridAnalysisApply( &hParametricStereo->fdkHybAnaFilter[psCh], &pWorkBuffer[2*QMF_CHANNELS], /* qmfReal[QMF_CHANNELS] */ &pWorkBuffer[3*QMF_CHANNELS], /* qmfImag[QMF_CHANNELS] */ hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][psCh][0], hParametricStereo->pHybridData[i+HYBRID_READ_OFFSET][psCh][1] ); } /* no_col loop i */ psQmfScale[psCh] = hQmfAnalysis[psCh]->outScalefactor; } /* for psCh */ C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_QMF, 4*QMF_CHANNELS) /* find best scaling in new QMF and Hybrid data */ psFindBestScaling( hParametricStereo, &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], hParametricStereo->dynBandScale, hParametricStereo->maxBandValue, &hParametricStereo->dmxScale ) ; /* extract the ps parameters */ if(PSENC_OK != (error = ExtractPSParameters(hParametricStereo, sendHeader, &hParametricStereo->pHybridData[0]))){ goto bail; } /* save hybrid date for next frame */ for (i=0; ipHybridData[i][0][0], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][0][0], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* left, real */ FDKmemcpy(hParametricStereo->pHybridData[i][0][1], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][0][1], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* left, imag */ FDKmemcpy(hParametricStereo->pHybridData[i][1][0], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][1][0], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* right, real */ FDKmemcpy(hParametricStereo->pHybridData[i][1][1], hParametricStereo->pHybridData[HYBRID_FRAMESIZE+i][1][1], MAX_HYBRID_BANDS*sizeof(FIXP_DBL)); /* right, imag */ } /* downmix and hybrid synthesis */ if (PSENC_OK != (error = DownmixPSQmfData(hParametricStereo, sbrSynthQmf, downmixedRealQmfData, downmixedImagQmfData, downsampledOutSignal, &hParametricStereo->pHybridData[HYBRID_READ_OFFSET], hParametricStereo->noQmfSlots, psQmfScale, qmfScale))) { goto bail; } bail: return error; } static void psFindBestScaling( HANDLE_PARAMETRIC_STEREO hParametricStereo, FIXP_DBL *hybridData[HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2], UCHAR *dynBandScale, FIXP_QMF *maxBandValue, SCHAR *dmxScale ) { HANDLE_PS_ENCODE hPsEncode = hParametricStereo->hPsEncode; INT group, bin, col, band; const INT frameSize = hParametricStereo->noQmfSlots; const INT psBands = (INT) hPsEncode->psEncMode; const INT nIidGroups = hPsEncode->nQmfIidGroups + hPsEncode->nSubQmfIidGroups; /* group wise scaling */ FIXP_QMF maxVal [2][PS_MAX_BANDS]; FIXP_QMF maxValue = FL2FXCONST_DBL(0.f); FDKmemclear(maxVal, sizeof(maxVal)); /* start with hybrid data */ for (group=0; group < nIidGroups; group++) { /* Translate group to bin */ bin = hPsEncode->subband2parameterIndex[group]; /* Translate from 20 bins to 10 bins */ if (hPsEncode->psEncMode == PS_BANDS_COARSE) { bin >>= 1; } /* QMF downmix scaling */ { FIXP_QMF tmp = maxVal[0][bin]; int i; for (col=0; coliidGroupBorders[group]; i < hPsEncode->iidGroupBorders[group+1]; i++) { tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][0][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][1][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][0][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][1][i])); } } maxVal[0][bin] = tmp; tmp = maxVal[1][bin]; for (col=frameSize-HYBRID_READ_OFFSET; coliidGroupBorders[group]; i < hPsEncode->iidGroupBorders[group+1]; i++) { tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][0][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][0][1][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][0][i])); tmp = fixMax(tmp, (FIXP_QMF)fixp_abs(hybridData[col][1][1][i])); } } maxVal[1][bin] = tmp; } } /* nIidGroups */ /* convert maxSpec to maxScaling, find scaling space */ for (band=0; bandalb copied from non LD tables*/ { CODEC_AACLD, 16000, 18000, 16000, 1, 4, 5, 9, 7, 1, 0, 6, SBR_MONO, 3 }, /* nominal: 16 kbit/s wrr: tuned */ { CODEC_AACLD, 18000, 22000, 16000, 1, 7, 7,12,12, 1, 6, 9, SBR_MONO, 3 }, /* nominal: 20 kbit/s wrr: tuned */ { CODEC_AACLD, 22000, 28000, 16000, 1, 6, 6, 9, 9, 2, 3, 6, SBR_MONO, 3 }, /* nominal: 24 kbit/s wrr: tuned */ { CODEC_AACLD, 28000, 36000, 16000, 1, 8, 8,12, 7, 2, 9,12, SBR_MONO, 3 }, /* jgr: special */ /* wrr: tuned */ { CODEC_AACLD, 36000, 44000, 16000, 1, 10,14,12,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 44000, 64001, 16000, 1, 11,14,13,13, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ /* 22.05/44.1 kHz dual rate */ { CODEC_AACLD, 18000, 22000, 22050, 1, 4, 4, 5, 5, 2, 0, 6, SBR_MONO, 3 }, /* nominal: 20 kbit/s */ { CODEC_AACLD, 22000, 28000, 22050, 1, 5, 5, 6, 6, 2, 0, 6, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ { CODEC_AACLD, 28000, 36000, 22050, 1, 7, 8, 8, 8, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ { CODEC_AACLD, 36000, 44000, 22050, 1, 9, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 44000, 52000, 22050, 1, 12,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 48 kbit/s */ { CODEC_AACLD, 52000, 64001, 22050, 1, 13,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 56 kbit/s */ /* 24/48 kHz dual rate */ { CODEC_AACLD, 20000, 22000, 24000, 1, 4, 1, 8, 4, 2, 3, 6, SBR_MONO, 2 }, /* nominal: 20 kbit/s */ { CODEC_AACLD, 22000, 28000, 24000, 1, 3, 8, 8, 7, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 24 kbit/s */ { CODEC_AACLD, 28000, 36000, 24000, 1, 4, 8, 8, 7, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 32 kbit/s */ { CODEC_AACLD, 36000, 56000, 24000, 1, 8, 9, 9, 9, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 56000, 64001, 24000, 1, 13,11,11,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 kbit/s */ /* 32/64 kHz dual rate */ /* placebo settings */ /*jgr: new, copy from CODEC_AAC */ { CODEC_AACLD, 24000, 36000, 32000, 1, 4, 4, 4, 4, 2, 0, 3, SBR_MONO, 3 }, /* lowest range */ { CODEC_AACLD, 36000, 60000, 32000, 1, 7, 7, 6, 6, 2, 0, 3, SBR_MONO, 2 }, /* lowest range */ { CODEC_AACLD, 60000, 72000, 32000, 1, 9, 9, 8, 8, 2, 0, 3, SBR_MONO, 1 }, /* low range */ { CODEC_AACLD, 72000,100000, 32000, 1, 11,11,10,10, 2, 0, 3, SBR_MONO, 1 }, /* SBR sweet spot */ { CODEC_AACLD, 100000,160001, 32000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* backwards compatible */ /* 44/88 kHz dual rate */ /* not yet finally tuned */ { CODEC_AACLD, 36000, 60000, 44100, 1, 8, 7, 6, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */ { CODEC_AACLD, 60000, 72000, 44100, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */ { CODEC_AACLD, 72000,100000, 44100, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */ { CODEC_AACLD, 100000,160001, 44100, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */ /* 48/96 kHz dual rate */ /* 32 and 40kbps line tuned for dual-rate SBR */ { CODEC_AACLD, 36000, 60000, 48000, 1, 8, 7, 6, 9, 2, 0, 3, SBR_MONO, 2 }, /* nominal: 40 */ { CODEC_AACLD, 60000, 72000, 48000, 1, 9, 9,10,10, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 64 */ { CODEC_AACLD, 72000,100000, 48000, 1, 11,11,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 80 */ { CODEC_AACLD, 100000,160001, 48000, 1, 13,13,11,11, 2, 0, 3, SBR_MONO, 1 }, /* nominal: 128 */ /*** stereo ***/ /* 16/32 kHz dual rate not yet tuned ->alb copied from non LD tables*/ { CODEC_AACLD, 32000, 36000, 16000, 2, 10, 9,12,11, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ { CODEC_AACLD, 36000, 44000, 16000, 2, 13,13,13,13, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 44000, 52000, 16000, 2, 10, 9,11, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* tune12 nominal: 48 kbit/s */ { CODEC_AACLD, 52000, 60000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ { CODEC_AACLD, 60000, 76000, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ { CODEC_AACLD, 76000,128001, 16000, 2, 14,14,13,13, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ /* 22.05/44.1 kHz dual rate */ { CODEC_AACLD, 32000, 36000, 22050, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ { CODEC_AACLD, 36000, 44000, 22050, 2, 5, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 44000, 52000, 22050, 2, 7,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ { CODEC_AACLD, 52000, 60000, 22050, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ { CODEC_AACLD, 60000, 76000, 22050, 2, 10,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ { CODEC_AACLD, 76000, 82000, 22050, 2, 12,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ { CODEC_AACLD, 82000,128001, 22050, 2, 13,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ /* 24/48 kHz dual rate */ { CODEC_AACLD, 32000, 36000, 24000, 2, 5, 4, 7, 6, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */ { CODEC_AACLD, 36000, 44000, 24000, 2, 4, 8, 8, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */ { CODEC_AACLD, 44000, 52000, 24000, 2, 6,10, 8, 8, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */ { CODEC_AACLD, 52000, 60000, 24000, 2, 9,11, 9, 9, 3, 0, -3, SBR_SWITCH_LRC, 1 }, /* nominal: 56 kbit/s */ { CODEC_AACLD, 60000, 76000, 24000, 2, 11,12,10,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 64 kbit/s */ { CODEC_AACLD, 76000, 88000, 24000, 2, 12,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 80 kbit/s */ { CODEC_AACLD, 88000,128001, 24000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 92 kbit/s */ /* 32/64 kHz dual rate */ /* placebo settings */ /*jgr: new, copy from CODEC_AAC */ { CODEC_AACLD, 60000, 80000, 32000, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ { CODEC_AACLD, 80000,112000, 32000, 2, 9, 9, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* low range */ { CODEC_AACLD, 112000,144000, 32000, 2, 11,11,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* SBR sweet spot */ { CODEC_AACLD, 144000,256001, 32000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ /* 44.1/88.2 kHz dual rate */ /* placebo settings */ /*wrr: new, copy from CODEC_AAC */ { CODEC_AACLD, 60000, 80000, 44100, 2, 7, 7, 6, 6, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* lowest range (multichannel rear) */ { CODEC_AACLD, 80000,112000, 44100, 2, 10,10, 8, 8, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */ { CODEC_AACLD, 112000,144000, 44100, 2, 12,12,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 11-08-29 */ { CODEC_AACLD, 144000,256001, 44100, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* backwards compatible */ /* 48/96 kHz dual rate */ /* not yet finally tuned */ /*wrr: new, copy from CODEC_AAC */ { CODEC_AACLD, 60000, 80000, 48000, 2, 7, 7,10,10, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 */ { CODEC_AACLD, 80000,112000, 48000, 2, 9, 9,10,10, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 96 */ { CODEC_AACLD, 112000,144000, 48000, 2, 11,11,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* nominal: 128 */ { CODEC_AACLD, 144000,176000, 48000, 2, 12,12,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */ { CODEC_AACLD, 176000,256001, 48000, 2, 13,13,11,11, 3, 0, -3, SBR_LEFT_RIGHT, 1 }, /* hlm 09-10-19 */ }; const int sbrTuningTableSize = sizeof(sbrTuningTable)/sizeof(sbrTuningTable[0]); const psTuningTable_t psTuningTable[4] = { { 8000, 22000, PSENC_STEREO_BANDS_10, PSENC_NENV_1, FL2FXCONST_DBL(3.0f/4.0f) }, { 22000, 28000, PSENC_STEREO_BANDS_20, PSENC_NENV_1, FL2FXCONST_DBL(2.0f/4.0f) }, { 28000, 36000, PSENC_STEREO_BANDS_20, PSENC_NENV_2, FL2FXCONST_DBL(1.5f/4.0f) }, { 36000, 160001, PSENC_STEREO_BANDS_20, PSENC_NENV_4, FL2FXCONST_DBL(1.1f/4.0f) }, }; //@} fdk-aac-0.1.3/libSBRenc/src/resampler.cpp0000644000175000017500000004511612372261464020511 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief FDK resampler tool box: \author M. Werner */ #include "resampler.h" #include "genericStds.h" /**************************************************************************/ /* BIQUAD Filter Specifications */ /**************************************************************************/ #define B1 0 #define B2 1 #define A1 2 #define A2 3 #define BQC(x) FL2FXCONST_SGL(x/2) struct FILTER_PARAM { const FIXP_SGL *coeffa; /*! SOS matrix One row/section. Scaled using BQC(). Order of coefficients: B1,B2,A1,A2. B0=A0=1.0 */ FIXP_DBL g; /*! overall gain */ int Wc; /*! normalized passband bandwidth at input samplerate * 1000 */ int noCoeffs; /*! number of filter coeffs */ int delay; /*! delay in samples at input samplerate */ }; #define BIQUAD_COEFSTEP 4 /** *\brief Low Pass Wc = 0,5, order 30, Stop Band -96dB. Wc criteria is "almost 0dB passband", not the usual -3db gain point. [b,a]=cheby2(30,96,0.505) [sos,g]=tf2sos(b,a) bandwidth 0.48 */ static const FIXP_SGL sos48[] = { BQC(1.98941075681938), BQC(0.999999996890811), BQC(0.863264527201963), BQC( 0.189553799960663), BQC(1.90733804822445), BQC(1.00000001736189), BQC(0.836321575841691), BQC( 0.203505809266564), BQC(1.75616665495325), BQC(0.999999946079721), BQC(0.784699225121588), BQC( 0.230471265506986), BQC(1.55727745512726), BQC(1.00000011737815), BQC(0.712515423588351), BQC( 0.268752723900498), BQC(1.33407591943643), BQC(0.999999795953228), BQC(0.625059117330989), BQC( 0.316194685288965), BQC(1.10689898412458), BQC(1.00000035057114), BQC(0.52803514366398), BQC( 0.370517843224669), BQC(0.89060371078454), BQC(0.999999343962822), BQC(0.426920462165257), BQC( 0.429608200207746), BQC(0.694438261209433), BQC( 1.0000008629792), BQC(0.326530699561716), BQC( 0.491714450654174), BQC(0.523237800935322), BQC(1.00000101349782), BQC(0.230829556274851), BQC( 0.555559034843281), BQC(0.378631165929563), BQC(0.99998986482665), BQC(0.142906422036095), BQC( 0.620338874442411), BQC(0.260786911308437), BQC(1.00003261460178), BQC(0.0651008576256505), BQC( 0.685759923926262), BQC(0.168409429188098), BQC(0.999933049695828), BQC(-0.000790067789975562), BQC( 0.751905896602325), BQC(0.100724533818628), BQC(1.00009472669872), BQC(-0.0533772830257041), BQC( 0.81930744384525), BQC(0.0561434357867363), BQC(0.999911636304276), BQC(-0.0913550299236405), BQC( 0.88883625875915), BQC(0.0341680678662057), BQC(1.00003667508676), BQC(-0.113405185536697), BQC( 0.961756638268446) }; #ifdef RS_BIQUAD_SCATTERGAIN static const FIXP_DBL g48 = FL2FXCONST_DBL(0.67436532061161992682404480717671 - 0.001); #else static const FIXP_DBL g48 = FL2FXCONST_DBL(0.002712866530047) - (FIXP_DBL)0x8000; #endif static const struct FILTER_PARAM param_set48 = { sos48, g48, 480, 15, 4 /* LF 2 */ }; /** *\brief Low Pass Wc = 0,5, order 24, Stop Band -96dB. Wc criteria is "almost 0dB passband", not the usual -3db gain point. [b,a]=cheby2(24,96,0.5) [sos,g]=tf2sos(b,a) bandwidth 0.45 */ static const FIXP_SGL sos45[] = { BQC(1.982962601444), BQC(1.00000000007504), BQC(0.646113303737836), BQC( 0.10851149979981), BQC(1.85334094281111), BQC(0.999999999677192), BQC(0.612073220102006), BQC( 0.130022141698044), BQC(1.62541051415425), BQC(1.00000000080398), BQC(0.547879702855959), BQC( 0.171165825133192), BQC(1.34554656923247), BQC(0.9999999980169), BQC(0.460373914508491), BQC( 0.228677463376354), BQC(1.05656568503116), BQC(1.00000000569363), BQC(0.357891894038287), BQC( 0.298676843912185), BQC(0.787967587877312), BQC(0.999999984415017), BQC(0.248826893211877), BQC( 0.377441803512978), BQC(0.555480971120497), BQC(1.00000003583307), BQC(0.140614263345315), BQC( 0.461979302213679), BQC(0.364986207070964), BQC(0.999999932084303), BQC(0.0392669446074516), BQC( 0.55033451180825), BQC(0.216827267631558), BQC(1.00000010534682), BQC(-0.0506232228865103), BQC( 0.641691581560946), BQC(0.108951672277119), BQC(0.999999871167516), BQC(-0.125584840183225), BQC( 0.736367748771803), BQC(0.0387988607229035), BQC(1.00000011205574), BQC(-0.182814849097974), BQC( 0.835802108714964), BQC(0.0042866175809225), BQC(0.999999954830813), BQC(-0.21965740617151), BQC( 0.942623047782363) }; #ifdef RS_BIQUAD_SCATTERGAIN static const FIXP_DBL g45 = FL2FXCONST_DBL(0.60547428891341319051142629706723 - 0.001); #else static const FIXP_DBL g45 = FL2FXCONST_DBL(0.00242743980909524) - (FIXP_DBL)0x8000; #endif static const struct FILTER_PARAM param_set45 = { sos45, g45, 450, 12, 4 /* LF 2 */ }; /* Created by Octave 2.1.73, Mon Oct 13 17:31:32 2008 CEST Wc = 0,5, order 16, Stop Band -96dB damping. [b,a]=cheby2(16,96,0.5) [sos,g]=tf2sos(b,a) bandwidth = 0.41 */ static const FIXP_SGL sos41[] = { BQC(1.96193625292), BQC(0.999999999999964), BQC(0.169266178786789), BQC(0.0128823300475907), BQC(1.68913437662092), BQC(1.00000000000053), BQC(0.124751503206552), BQC(0.0537472273950989), BQC(1.27274692366017), BQC(0.999999999995674), BQC(0.0433108625178357), BQC(0.131015753236317), BQC(0.85214175088395), BQC(1.00000000001813), BQC(-0.0625658152550408), BQC(0.237763778993806), BQC(0.503841579939009), BQC(0.999999999953223), BQC(-0.179176128722865), BQC(0.367475236424474), BQC(0.249990711986162), BQC(1.00000000007952), BQC(-0.294425165824676), BQC(0.516594857170212), BQC(0.087971668680286), BQC(0.999999999915528), BQC(-0.398956566777928), BQC(0.686417767801123), BQC(0.00965373325350294), BQC(1.00000000003744), BQC(-0.48579173764817), BQC(0.884931534239068) }; #ifdef RS_BIQUAD_SCATTERGAIN static const FIXP_DBL g41 = FL2FXCONST_DBL(0.44578514476476679750811222123569); #else static const FIXP_DBL g41 = FL2FXCONST_DBL(0.00155956951169248); #endif static const struct FILTER_PARAM param_set41 = { sos41, g41, 410, 8, 5 /* LF 3 */ }; /* # Created by Octave 2.1.73, Mon Oct 13 17:55:33 2008 CEST Wc = 0,5, order 12, Stop Band -96dB damping. [b,a]=cheby2(12,96,0.5); [sos,g]=tf2sos(b,a) */ static const FIXP_SGL sos35[] = { BQC(1.93299325235762), BQC(0.999999999999985), BQC(-0.140733187246596), BQC(0.0124139497836062), BQC(1.4890416764109), BQC(1.00000000000011), BQC(-0.198215402588504), BQC(0.0746730616584138), BQC(0.918450161309795), BQC(0.999999999999619), BQC(-0.30133912791941), BQC(0.192276468839529), BQC(0.454877024246818), BQC(1.00000000000086), BQC(-0.432337328809815), BQC(0.356852933642815), BQC(0.158017147118507), BQC(0.999999999998876), BQC(-0.574817494249777), BQC(0.566380436970833), BQC(0.0171834649478749), BQC(1.00000000000055), BQC(-0.718581178041165), BQC(0.83367484487889) }; #ifdef RS_BIQUAD_SCATTERGAIN static const FIXP_DBL g35 = FL2FXCONST_DBL(0.34290853574973898694521267606792); #else static const FIXP_DBL g35 = FL2FXCONST_DBL(0.00162580994125131); #endif static const struct FILTER_PARAM param_set35 = { sos35, g35, 350, 6, 4 }; /* # Created by Octave 2.1.73, Mon Oct 13 18:15:38 2008 CEST Wc = 0,5, order 8, Stop Band -96dB damping. [b,a]=cheby2(8,96,0.5); [sos,g]=tf2sos(b,a) */ static const FIXP_SGL sos25[] = { BQC(1.85334094301225), BQC(1.0), BQC(-0.702127214212663), BQC(0.132452403998767), BQC(1.056565682167), BQC(0.999999999999997), BQC(-0.789503667880785), BQC(0.236328693569128), BQC(0.364986307455489), BQC(0.999999999999996), BQC(-0.955191189843375), BQC(0.442966457936379), BQC(0.0387985751642125), BQC(1.0), BQC(-1.19817786088084), BQC(0.770493895456328) }; #ifdef RS_BIQUAD_SCATTERGAIN static const FIXP_DBL g25 = FL2FXCONST_DBL(0.17533917408936346960080259950471); #else static const FIXP_DBL g25 = FL2FXCONST_DBL(0.000945182835294559); #endif static const struct FILTER_PARAM param_set25 = { sos25, g25, 250, 4, 5 }; /* Must be sorted in descending order */ static const struct FILTER_PARAM *const filter_paramSet[] = { ¶m_set48, ¶m_set45, ¶m_set41, ¶m_set35, ¶m_set25 }; /**************************************************************************/ /* Resampler Functions */ /**************************************************************************/ /*! \brief Reset downsampler instance and clear delay lines \return success of operation */ INT FDKaacEnc_InitDownsampler(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ int Wc, /*!< normalized cutoff freq * 1000* */ int ratio) /*!< downsampler ratio (only 2 supported at the momment) */ { UINT i; const struct FILTER_PARAM *currentSet=NULL; FDK_ASSERT(ratio == 2); FDKmemclear(DownSampler->downFilter.states, sizeof(DownSampler->downFilter.states)); DownSampler->downFilter.ptr = 0; /* find applicable parameter set */ currentSet = filter_paramSet[0]; for(i=1;iWc <= Wc) { break; } currentSet = filter_paramSet[i]; } DownSampler->downFilter.coeffa = currentSet->coeffa; DownSampler->downFilter.gain = currentSet->g; FDK_ASSERT(currentSet->noCoeffs <= MAXNR_SECTIONS*2); DownSampler->downFilter.noCoeffs = currentSet->noCoeffs; DownSampler->delay = currentSet->delay; DownSampler->downFilter.Wc = currentSet->Wc; DownSampler->ratio = ratio; DownSampler->pending = ratio-1; return(1); } /*! \brief faster simple folding operation Filter: H(z) = A(z)/B(z) with A(z) = a[0]*z^0 + a[1]*z^1 + a[2]*z^2 ... a[n]*z^n \return filtered value */ static inline INT_PCM AdvanceFilter(LP_FILTER *downFilter, /*!< pointer to iir filter instance */ INT_PCM *pInput, /*!< input of filter */ int downRatio, int inStride) { INT_PCM output; int i, n; #ifdef RS_BIQUAD_SCATTERGAIN #define BIQUAD_SCALE 3 #else #define BIQUAD_SCALE 12 #endif FIXP_DBL y = FL2FXCONST_DBL(0.0f); FIXP_DBL input; for (n=0; nstates; const FIXP_SGL *coeff = downFilter->coeffa; int s1,s2; s1 = downFilter->ptr; s2 = s1 ^ 1; #if (SAMPLE_BITS == 16) input = ((FIXP_DBL)pInput[n*inStride]) << (DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE); #elif (SAMPLE_BITS == 32) input = pInput[n*inStride] >> BIQUAD_SCALE; #else #error NOT IMPLEMENTED #endif #ifndef RS_BIQUAD_SCATTERGAIN /* Merged Direct form I */ FIXP_BQS state1, state2, state1b, state2b; state1 = states[0][s1]; state2 = states[0][s2]; /* Loop over sections */ for (i=0; inoCoeffs; i++) { FIXP_DBL state0; /* Load merged states (from next section) */ state1b = states[i+1][s1]; state2b = states[i+1][s2]; state0 = input + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]); y = state0 - fMult(state1b, coeff[A1]) - fMult(state2b, coeff[A2]); /* Store new feed forward merge state */ states[i+1][s2] = y<<1; /* Store new feed backward state */ states[i][s2] = input<<1; /* Feedback output to next section. */ input = y; /* Transfer merged states */ state1 = state1b; state2 = state2b; /* Step to next coef set */ coeff += BIQUAD_COEFSTEP; } downFilter->ptr ^= 1; } /* Apply global gain */ y = fMult(y, downFilter->gain); #else /* Direct form II */ /* Loop over sections */ for (i=0; inoCoeffs; i++) { FIXP_BQS state1, state2; FIXP_DBL state0; /* Load states */ state1 = states[i][s1]; state2 = states[i][s2]; state0 = input - fMult(state1, coeff[A1]) - fMult(state2, coeff[A2]); y = state0 + fMult(state1, coeff[B1]) + fMult(state2, coeff[B2]); /* Apply scattered gain */ y = fMult(y, downFilter->gain); /* Store new state in normalized form */ #ifdef RS_BIQUAD_STATES16 /* Do not saturate any state value ! The result would be unacceptable. Rounding makes SNR around 10dB better. */ states[i][s2] = (FIXP_BQS)(LONG)((state0 + (FIXP_DBL)(1<<(DFRACT_BITS-FRACT_BITS-2))) >> (DFRACT_BITS-FRACT_BITS-1)); #else states[i][s2] = state0<<1; #endif /* Feedback output to next section. */ input=y; /* Step to next coef set */ coeff += BIQUAD_COEFSTEP; } downFilter->ptr ^= 1; } #endif /* Apply final gain/scaling to output */ #if (SAMPLE_BITS == 16) output = (INT_PCM) SATURATE_RIGHT_SHIFT(y+(FIXP_DBL)(1<<(DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE-1)), DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS); //output = (INT_PCM) SATURATE_RIGHT_SHIFT(y, DFRACT_BITS-SAMPLE_BITS-BIQUAD_SCALE, SAMPLE_BITS); #else output = SATURATE_LEFT_SHIFT(y, BIQUAD_SCALE, SAMPLE_BITS); #endif return output; } /*! \brief FDKaacEnc_Downsample numInSamples of type INT_PCM Returns number of output samples in numOutSamples \return success of operation */ INT FDKaacEnc_Downsample(DOWNSAMPLER *DownSampler, /*!< pointer to downsampler instance */ INT_PCM *inSamples, /*!< pointer to input samples */ INT numInSamples, /*!< number of input samples */ INT inStride, /*!< increment of input samples */ INT_PCM *outSamples, /*!< pointer to output samples */ INT *numOutSamples, /*!< pointer tp number of output samples */ INT outStride /*!< increment of output samples */ ) { INT i; *numOutSamples=0; for(i=0; iratio) { *outSamples = AdvanceFilter(&(DownSampler->downFilter), &inSamples[i*inStride], DownSampler->ratio, inStride); outSamples += outStride; } *numOutSamples = numInSamples/DownSampler->ratio; return 0; } fdk-aac-0.1.3/libSBRenc/src/ps_bitenc.cpp0000644000175000017500000005622512372261464020470 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial author: N. Rettelbach contents/description: Parametric Stereo bitstream encoder ******************************************************************************/ #include "ps_main.h" #include "ps_const.h" #include "ps_bitenc.h" static inline UCHAR FDKsbrEnc_WriteBits_ps(HANDLE_FDK_BITSTREAM hBitStream, UINT value, const UINT numberOfBits) { /* hBitStream == NULL happens here intentionally */ if(hBitStream!=NULL){ FDKwriteBits(hBitStream, value, numberOfBits); } return numberOfBits; } #define SI_SBR_EXTENSION_SIZE_BITS 4 #define SI_SBR_EXTENSION_ESC_COUNT_BITS 8 #define SI_SBR_EXTENSION_ID_BITS 2 #define EXTENSION_ID_PS_CODING 2 #define PS_EXT_ID_V0 0 static const INT iidDeltaCoarse_Offset = 14; static const INT iidDeltaCoarse_MaxVal = 28; static const INT iidDeltaFine_Offset = 30; static const INT iidDeltaFine_MaxVal = 60; /* PS Stereo Huffmantable: iidDeltaFreqCoarse */ static const UINT iidDeltaFreqCoarse_Length[] = { 17, 17, 17, 17, 16, 15, 13, 10, 9, 7, 6, 5, 4, 3, 1, 3, 4, 5, 6, 6, 8, 11, 13, 14, 14, 15, 17, 18, 18 }; static const UINT iidDeltaFreqCoarse_Code[] = { 0x0001fffb, 0x0001fffc, 0x0001fffd, 0x0001fffa, 0x0000fffc, 0x00007ffc, 0x00001ffd, 0x000003fe, 0x000001fe, 0x0000007e, 0x0000003c, 0x0000001d, 0x0000000d, 0x00000005, 0000000000, 0x00000004, 0x0000000c, 0x0000001c, 0x0000003d, 0x0000003e, 0x000000fe, 0x000007fe, 0x00001ffc, 0x00003ffc, 0x00003ffd, 0x00007ffd, 0x0001fffe, 0x0003fffe, 0x0003ffff }; /* PS Stereo Huffmantable: iidDeltaFreqFine */ static const UINT iidDeltaFreqFine_Length[] = { 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, 18, 17, 17, 16, 16, 15, 14, 14, 13, 12, 12, 11, 10, 10, 8, 7, 6, 5, 4, 3, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18 }; static const UINT iidDeltaFreqFine_Code[] = { 0x0001feb4, 0x0001feb5, 0x0001fd76, 0x0001fd77, 0x0001fd74, 0x0001fd75, 0x0001fe8a, 0x0001fe8b, 0x0001fe88, 0x0000fe80, 0x0001feb6, 0x0000fe82, 0x0000feb8, 0x00007f42, 0x00007fae, 0x00003faf, 0x00001fd1, 0x00001fe9, 0x00000fe9, 0x000007ea, 0x000007fb, 0x000003fb, 0x000001fb, 0x000001ff, 0x0000007c, 0x0000003c, 0x0000001c, 0x0000000c, 0000000000, 0x00000001, 0x00000001, 0x00000002, 0x00000001, 0x0000000d, 0x0000001d, 0x0000003d, 0x0000007d, 0x000000fc, 0x000001fc, 0x000003fc, 0x000003f4, 0x000007eb, 0x00000fea, 0x00001fea, 0x00001fd6, 0x00003fd0, 0x00007faf, 0x00007f43, 0x0000feb9, 0x0000fe83, 0x0001feb7, 0x0000fe81, 0x0001fe89, 0x0001fe8e, 0x0001fe8f, 0x0001fe8c, 0x0001fe8d, 0x0001feb2, 0x0001feb3, 0x0001feb0, 0x0001feb1 }; /* PS Stereo Huffmantable: iidDeltaTimeCoarse */ static const UINT iidDeltaTimeCoarse_Length[] = { 19, 19, 19, 20, 20, 20, 17, 15, 12, 10, 8, 6, 4, 2, 1, 3, 5, 7, 9, 11, 13, 14, 17, 19, 20, 20, 20, 20, 20 }; static const UINT iidDeltaTimeCoarse_Code[] = { 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9, 0x000ffffa, 0x0001fffd, 0x00007ffe, 0x00000ffe, 0x000003fe, 0x000000fe, 0x0000003e, 0x0000000e, 0x00000002, 0000000000, 0x00000006, 0x0000001e, 0x0000007e, 0x000001fe, 0x000007fe, 0x00001ffe, 0x00003ffe, 0x0001fffc, 0x0007fff8, 0x000ffffb, 0x000ffffc, 0x000ffffd, 0x000ffffe, 0x000fffff }; /* PS Stereo Huffmantable: iidDeltaTimeFine */ static const UINT iidDeltaTimeFine_Length[] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 15, 15, 15, 15, 15, 15, 14, 14, 13, 13, 13, 12, 12, 11, 10, 9, 9, 7, 6, 5, 3, 1, 2, 5, 6, 7, 8, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; static const UINT iidDeltaTimeFine_Code[] = { 0x00004ed4, 0x00004ed5, 0x00004ece, 0x00004ecf, 0x00004ecc, 0x00004ed6, 0x00004ed8, 0x00004f46, 0x00004f60, 0x00002718, 0x00002719, 0x00002764, 0x00002765, 0x0000276d, 0x000027b1, 0x000013b7, 0x000013d6, 0x000009c7, 0x000009e9, 0x000009ed, 0x000004ee, 0x000004f7, 0x00000278, 0x00000139, 0x0000009a, 0x0000009f, 0x00000020, 0x00000011, 0x0000000a, 0x00000003, 0x00000001, 0000000000, 0x0000000b, 0x00000012, 0x00000021, 0x0000004c, 0x0000009b, 0x0000013a, 0x00000279, 0x00000270, 0x000004ef, 0x000004e2, 0x000009ea, 0x000009d8, 0x000013d7, 0x000013d0, 0x000027b2, 0x000027a2, 0x0000271a, 0x0000271b, 0x00004f66, 0x00004f67, 0x00004f61, 0x00004f47, 0x00004ed9, 0x00004ed7, 0x00004ecd, 0x00004ed2, 0x00004ed3, 0x00004ed0, 0x00004ed1 }; static const INT iccDelta_Offset = 7; static const INT iccDelta_MaxVal = 14; /* PS Stereo Huffmantable: iccDeltaFreq */ static const UINT iccDeltaFreq_Length[] = { 14, 14, 12, 10, 7, 5, 3, 1, 2, 4, 6, 8, 9, 11, 13 }; static const UINT iccDeltaFreq_Code[] = { 0x00003fff, 0x00003ffe, 0x00000ffe, 0x000003fe, 0x0000007e, 0x0000001e, 0x00000006, 0000000000, 0x00000002, 0x0000000e, 0x0000003e, 0x000000fe, 0x000001fe, 0x000007fe, 0x00001ffe }; /* PS Stereo Huffmantable: iccDeltaTime */ static const UINT iccDeltaTime_Length[] = { 14, 13, 11, 9, 7, 5, 3, 1, 2, 4, 6, 8, 10, 12, 14 }; static const UINT iccDeltaTime_Code[] = { 0x00003ffe, 0x00001ffe, 0x000007fe, 0x000001fe, 0x0000007e, 0x0000001e, 0x00000006, 0000000000, 0x00000002, 0x0000000e, 0x0000003e, 0x000000fe, 0x000003fe, 0x00000ffe, 0x00003fff }; static const INT ipdDelta_Offset = 0; static const INT ipdDelta_MaxVal = 7; /* PS Stereo Huffmantable: ipdDeltaFreq */ static const UINT ipdDeltaFreq_Length[] = { 1, 3, 4, 4, 4, 4, 4, 4 }; static const UINT ipdDeltaFreq_Code[] = { 0x00000001, 0000000000, 0x00000006, 0x00000004, 0x00000002, 0x00000003, 0x00000005, 0x00000007 }; /* PS Stereo Huffmantable: ipdDeltaTime */ static const UINT ipdDeltaTime_Length[] = { 1, 3, 4, 5, 5, 4, 4, 3 }; static const UINT ipdDeltaTime_Code[] = { 0x00000001, 0x00000002, 0x00000002, 0x00000003, 0x00000002, 0000000000, 0x00000003, 0x00000003 }; static const INT opdDelta_Offset = 0; static const INT opdDelta_MaxVal = 7; /* PS Stereo Huffmantable: opdDeltaFreq */ static const UINT opdDeltaFreq_Length[] = { 1, 3, 4, 4, 5, 5, 4, 3 }; static const UINT opdDeltaFreq_Code[] = { 0x00000001, 0x00000001, 0x00000006, 0x00000004, 0x0000000f, 0x0000000e, 0x00000005, 0000000000, }; /* PS Stereo Huffmantable: opdDeltaTime */ static const UINT opdDeltaTime_Length[] = { 1, 3, 4, 5, 5, 4, 4, 3 }; static const UINT opdDeltaTime_Code[] = { 0x00000001, 0x00000002, 0x00000001, 0x00000007, 0x00000006, 0000000000, 0x00000002, 0x00000003 }; static const INT psBands[] = { PS_BANDS_COARSE, PS_BANDS_MID }; static INT getNoBands(UINT mode) { if(mode>=6) return 0; if(mode>=3) mode = mode-3; return psBands[mode]; } static INT getIIDRes(INT iidMode) { if(iidMode<3) return PS_IID_RES_COARSE; else return PS_IID_RES_FINE; } static INT encodeDeltaFreq(HANDLE_FDK_BITSTREAM hBitBuf, const INT *val, const INT nBands, const UINT *codeTable, const UINT *lengthTable, const INT tableOffset, const INT maxVal, INT *error) { INT bitCnt = 0; INT lastVal = 0; INT band; for(band=0;bandmaxVal) || (delta<0) ) { *error = 1; delta = delta>0?maxVal:0; } bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); } return bitCnt; } static INT encodeDeltaTime(HANDLE_FDK_BITSTREAM hBitBuf, const INT *val, const INT *valLast, const INT nBands, const UINT *codeTable, const UINT *lengthTable, const INT tableOffset, const INT maxVal, INT *error) { INT bitCnt = 0; INT band; for(band=0;bandmaxVal) || (delta<0) ) { *error = 1; delta = delta>0?maxVal:0; } bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, codeTable[delta], lengthTable[delta]); } return bitCnt; } INT FDKsbrEnc_EncodeIid(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iidVal, const INT *iidValLast, const INT nBands, const PS_IID_RESOLUTION res, const PS_DELTA mode, INT *error) { const UINT *codeTable; const UINT *lengthTable; INT bitCnt = 0; bitCnt = 0; switch(mode) { case PS_DELTA_FREQ: switch(res) { case PS_IID_RES_COARSE: codeTable = iidDeltaFreqCoarse_Code; lengthTable = iidDeltaFreqCoarse_Length; bitCnt += encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, lengthTable, iidDeltaCoarse_Offset, iidDeltaCoarse_MaxVal, error); break; case PS_IID_RES_FINE: codeTable = iidDeltaFreqFine_Code; lengthTable = iidDeltaFreqFine_Length; bitCnt += encodeDeltaFreq(hBitBuf, iidVal, nBands, codeTable, lengthTable, iidDeltaFine_Offset, iidDeltaFine_MaxVal, error); break; default: *error = 1; } break; case PS_DELTA_TIME: switch(res) { case PS_IID_RES_COARSE: codeTable = iidDeltaTimeCoarse_Code; lengthTable = iidDeltaTimeCoarse_Length; bitCnt += encodeDeltaTime(hBitBuf, iidVal, iidValLast, nBands, codeTable, lengthTable, iidDeltaCoarse_Offset, iidDeltaCoarse_MaxVal, error); break; case PS_IID_RES_FINE: codeTable = iidDeltaTimeFine_Code; lengthTable = iidDeltaTimeFine_Length; bitCnt += encodeDeltaTime(hBitBuf, iidVal, iidValLast, nBands, codeTable, lengthTable, iidDeltaFine_Offset, iidDeltaFine_MaxVal, error); break; default: *error = 1; } break; default: *error = 1; } return bitCnt; } INT FDKsbrEnc_EncodeIcc(HANDLE_FDK_BITSTREAM hBitBuf, const INT *iccVal, const INT *iccValLast, const INT nBands, const PS_DELTA mode, INT *error) { const UINT *codeTable; const UINT *lengthTable; INT bitCnt = 0; switch(mode) { case PS_DELTA_FREQ: codeTable = iccDeltaFreq_Code; lengthTable = iccDeltaFreq_Length; bitCnt += encodeDeltaFreq(hBitBuf, iccVal, nBands, codeTable, lengthTable, iccDelta_Offset, iccDelta_MaxVal, error); break; case PS_DELTA_TIME: codeTable = iccDeltaTime_Code; lengthTable = iccDeltaTime_Length; bitCnt += encodeDeltaTime(hBitBuf, iccVal, iccValLast, nBands, codeTable, lengthTable, iccDelta_Offset, iccDelta_MaxVal, error); break; default: *error = 1; } return bitCnt; } INT FDKsbrEnc_EncodeIpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *ipdVal, const INT *ipdValLast, const INT nBands, const PS_DELTA mode, INT *error) { const UINT *codeTable; const UINT *lengthTable; INT bitCnt = 0; switch(mode) { case PS_DELTA_FREQ: codeTable = ipdDeltaFreq_Code; lengthTable = ipdDeltaFreq_Length; bitCnt += encodeDeltaFreq(hBitBuf, ipdVal, nBands, codeTable, lengthTable, ipdDelta_Offset, ipdDelta_MaxVal, error); break; case PS_DELTA_TIME: codeTable = ipdDeltaTime_Code; lengthTable = ipdDeltaTime_Length; bitCnt += encodeDeltaTime(hBitBuf, ipdVal, ipdValLast, nBands, codeTable, lengthTable, ipdDelta_Offset, ipdDelta_MaxVal, error); break; default: *error = 1; } return bitCnt; } INT FDKsbrEnc_EncodeOpd(HANDLE_FDK_BITSTREAM hBitBuf, const INT *opdVal, const INT *opdValLast, const INT nBands, const PS_DELTA mode, INT *error) { const UINT *codeTable; const UINT *lengthTable; INT bitCnt = 0; switch(mode) { case PS_DELTA_FREQ: codeTable = opdDeltaFreq_Code; lengthTable = opdDeltaFreq_Length; bitCnt += encodeDeltaFreq(hBitBuf, opdVal, nBands, codeTable, lengthTable, opdDelta_Offset, opdDelta_MaxVal, error); break; case PS_DELTA_TIME: codeTable = opdDeltaTime_Code; lengthTable = opdDeltaTime_Length; bitCnt += encodeDeltaTime(hBitBuf, opdVal, opdValLast, nBands, codeTable, lengthTable, opdDelta_Offset, opdDelta_MaxVal, error); break; default: *error = 1; } return bitCnt; } static INT encodeIpdOpd(HANDLE_PS_OUT psOut, HANDLE_FDK_BITSTREAM hBitBuf ) { INT bitCnt = 0; INT error = 0; INT env; FDKsbrEnc_WriteBits_ps(hBitBuf, psOut->enableIpdOpd, 1); if(psOut->enableIpdOpd==1) { INT *ipdLast = psOut->ipdLast; INT *opdLast = psOut->opdLast; for(env=0; envnEnvelopes; env++) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaIPD[env], 1); bitCnt += FDKsbrEnc_EncodeIpd( hBitBuf, psOut->ipd[env], ipdLast, getNoBands((UINT)psOut->iidMode), psOut->deltaIPD[env], &error); bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaOPD[env], 1); bitCnt += FDKsbrEnc_EncodeOpd( hBitBuf, psOut->opd[env], opdLast, getNoBands((UINT)psOut->iidMode), psOut->deltaOPD[env], &error ); } /* reserved bit */ bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, 0, 1); } return bitCnt; } static INT getEnvIdx(const INT nEnvelopes, const INT frameClass) { INT envIdx = 0; switch(nEnvelopes) { case 0: envIdx = 0; break; case 1: if (frameClass==0) envIdx = 1; else envIdx = 0; break; case 2: if (frameClass==0) envIdx = 2; else envIdx = 1; break; case 3: envIdx = 2; break; case 4: envIdx = 3; break; default: /* unsupported number of envelopes */ envIdx = 0; } return envIdx; } static INT encodePSExtension(const HANDLE_PS_OUT psOut, HANDLE_FDK_BITSTREAM hBitBuf ) { INT bitCnt = 0; if(psOut->enableIpdOpd==1) { INT ipdOpdBits = 0; INT extSize = (2 + encodeIpdOpd(psOut,NULL)+7)>>3; if(extSize<15) { bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, extSize, 4); } else { bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, 15 , 4); bitCnt += FDKsbrEnc_WriteBits_ps(hBitBuf, (extSize-15), 8); } /* write ipd opd data */ ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, PS_EXT_ID_V0, 2); ipdOpdBits += encodeIpdOpd(psOut, hBitBuf ); /* byte align the ipd opd data */ if(ipdOpdBits%8) ipdOpdBits += FDKsbrEnc_WriteBits_ps(hBitBuf, 0, (8-(ipdOpdBits%8)) ); bitCnt += ipdOpdBits; } return (bitCnt); } INT FDKsbrEnc_WritePSBitstream(const HANDLE_PS_OUT psOut, HANDLE_FDK_BITSTREAM hBitBuf ) { INT psExtEnable = 0; INT bitCnt = 0; INT error = 0; INT env; if(psOut != NULL){ /* PS HEADER */ bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enablePSHeader, 1); if(psOut->enablePSHeader) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enableIID, 1); if(psOut->enableIID) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->iidMode, 3); } bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->enableICC, 1); if(psOut->enableICC) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->iccMode, 3); } if(psOut->enableIpdOpd) { psExtEnable = 1; } bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psExtEnable, 1); } /* Frame class, number of envelopes */ bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->frameClass, 1); bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, getEnvIdx(psOut->nEnvelopes, psOut->frameClass), 2); if(psOut->frameClass==1) { for(env=0; envnEnvelopes; env++) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->frameBorder[env], 5); } } if(psOut->enableIID==1) { INT *iidLast = psOut->iidLast; for(env=0; envnEnvelopes; env++) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaIID[env], 1); bitCnt += FDKsbrEnc_EncodeIid( hBitBuf, psOut->iid[env], iidLast, getNoBands((UINT)psOut->iidMode), (PS_IID_RESOLUTION)getIIDRes(psOut->iidMode), psOut->deltaIID[env], &error ); iidLast = psOut->iid[env]; } } if(psOut->enableICC==1) { INT *iccLast = psOut->iccLast; for(env=0; envnEnvelopes; env++) { bitCnt += FDKsbrEnc_WriteBits_ps( hBitBuf, psOut->deltaICC[env], 1); bitCnt += FDKsbrEnc_EncodeIcc( hBitBuf, psOut->icc[env], iccLast, getNoBands((UINT)psOut->iccMode), psOut->deltaICC[env], &error); iccLast = psOut->icc[env]; } } if(psExtEnable!=0) { bitCnt += encodePSExtension(psOut, hBitBuf); } } /* if(psOut != NULL) */ return bitCnt; } fdk-aac-0.1.3/libSBRenc/src/tran_det.h0000644000175000017500000001552712372261464017767 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Transient detector prototypes */ #ifndef __TRAN_DET_H #define __TRAN_DET_H #include "sbr_encoder.h" #include "sbr_def.h" typedef struct { FIXP_DBL transients[QMF_MAX_TIME_SLOTS+(QMF_MAX_TIME_SLOTS/2)]; FIXP_DBL thresholds[QMF_CHANNELS]; FIXP_DBL tran_thr; /* Master threshold for transient signals */ FIXP_DBL split_thr; /* Threshold for splitting FIXFIX-frames into 2 env */ FIXP_DBL prevLowBandEnergy; /* Energy of low band */ FIXP_DBL prevHighBandEnergy; /* Energy of high band */ INT tran_fc; /* Number of lowband subbands to discard */ INT no_cols; INT no_rows; INT mode; int frameShift; int tran_off; /* Offset for reading energy values. */ } SBR_TRANSIENT_DETECTOR; typedef SBR_TRANSIENT_DETECTOR *HANDLE_SBR_TRANSIENT_DETECTOR; void FDKsbrEnc_transientDetect(HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, FIXP_DBL **Energies, INT *scaleEnergies, UCHAR *tran_vector, int YBufferWriteOffset, int YBufferSzShift, int timeStep, int frameMiddleBorder); int FDKsbrEnc_InitSbrTransientDetector (HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, INT frameSize, INT sampleFreq, sbrConfigurationPtr params, int tran_fc, int no_cols, int no_rows, int YBufferWriteOffset, int YBufferSzShift, int frameShift, int tran_off); void FDKsbrEnc_frameSplitter(FIXP_DBL **Energies, INT *scaleEnergies, HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector, UCHAR *freqBandTable, UCHAR *tran_vector, int YBufferWriteOffset, int YBufferSzShift, int nSfb, int timeStep, int no_cols); #endif fdk-aac-0.1.3/libSBRenc/src/ps_main.h0000644000175000017500000002601712372261464017611 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /***************************** MPEG Audio Encoder *************************** Initial Authors: Markus Multrus Contents/Description: PS Wrapper, Downmix header file ******************************************************************************/ #ifndef __INCLUDED_PS_MAIN_H #define __INCLUDED_PS_MAIN_H /* Includes ******************************************************************/ #include "sbr_def.h" #include "qmf.h" #include "ps_encode.h" #include "FDK_bitstream.h" #include "FDK_hybrid.h" /* Data Types ****************************************************************/ typedef enum { PSENC_STEREO_BANDS_INVALID = 0, PSENC_STEREO_BANDS_10 = 10, PSENC_STEREO_BANDS_20 = 20 } PSENC_STEREO_BANDS_CONFIG; typedef enum { PSENC_NENV_1 = 1, PSENC_NENV_2 = 2, PSENC_NENV_4 = 4, PSENC_NENV_DEFAULT = PSENC_NENV_2, PSENC_NENV_MAX = PSENC_NENV_4 } PSENC_NENV_CONFIG; typedef struct { UINT bitrateFrom; /* inclusive */ UINT bitrateTo; /* exclusive */ PSENC_STEREO_BANDS_CONFIG nStereoBands; PSENC_NENV_CONFIG nEnvelopes; LONG iidQuantErrorThreshold; /* quantization threshold to switch between coarse and fine iid quantization */ } psTuningTable_t; /* Function / Class Declarations *********************************************/ typedef struct T_PARAMETRIC_STEREO { HANDLE_PS_ENCODE hPsEncode; PS_OUT psOut[2]; FIXP_DBL __staticHybridData[HYBRID_READ_OFFSET][MAX_PS_CHANNELS][2][MAX_HYBRID_BANDS]; FIXP_DBL *pHybridData[HYBRID_READ_OFFSET+HYBRID_FRAMESIZE][MAX_PS_CHANNELS][2]; FIXP_QMF qmfDelayLines[2][QMF_MAX_TIME_SLOTS>>1][QMF_CHANNELS]; int qmfDelayScale; INT psDelay; UINT maxEnvelopes; UCHAR dynBandScale[PS_MAX_BANDS]; FIXP_DBL maxBandValue[PS_MAX_BANDS]; SCHAR dmxScale; INT initPS; INT noQmfSlots; INT noQmfBands; FIXP_DBL __staticHybAnaStatesLF[MAX_PS_CHANNELS][2*HYBRID_FILTER_LENGTH*HYBRID_MAX_QMF_BANDS]; FIXP_DBL __staticHybAnaStatesHF[MAX_PS_CHANNELS][2*HYBRID_FILTER_DELAY*(QMF_CHANNELS-HYBRID_MAX_QMF_BANDS)]; FDK_ANA_HYB_FILTER fdkHybAnaFilter[MAX_PS_CHANNELS]; FDK_SYN_HYB_FILTER fdkHybSynFilter; } PARAMETRIC_STEREO; typedef struct T_PSENC_CONFIG { INT frameSize; INT qmfFilterMode; INT sbrPsDelay; PSENC_STEREO_BANDS_CONFIG nStereoBands; PSENC_NENV_CONFIG maxEnvelopes; FIXP_DBL iidQuantErrorThreshold; } PSENC_CONFIG, *HANDLE_PSENC_CONFIG; typedef struct T_PARAMETRIC_STEREO *HANDLE_PARAMETRIC_STEREO; /** * \brief Create a parametric stereo encoder instance. * * \param phParametricStereo A pointer to a parametric stereo handle to be allocated. Initialized on return. * * \return * - PSENC_OK, on succes. * - PSENC_INVALID_HANDLE, PSENC_MEMORY_ERROR, on failure. */ FDK_PSENC_ERROR PSEnc_Create( HANDLE_PARAMETRIC_STEREO *phParametricStereo ); /** * \brief Initialize a parametric stereo encoder instance. * * \param hParametricStereo Meta Data handle. * \param hPsEncConfig Filled parametric stereo configuration structure. * \param noQmfSlots Number of slots within one audio frame. * \param noQmfBands Number of QMF bands. * \param dynamic_RAM Pointer to preallocated workbuffer. * * \return * - PSENC_OK, on succes. * - PSENC_INVALID_HANDLE, PSENC_INIT_ERROR, on failure. */ FDK_PSENC_ERROR PSEnc_Init( HANDLE_PARAMETRIC_STEREO hParametricStereo, const HANDLE_PSENC_CONFIG hPsEncConfig, INT noQmfSlots, INT noQmfBands ,UCHAR *dynamic_RAM ); /** * \brief Destroy parametric stereo encoder instance. * * Deallocate instance and free whole memory. * * \param phParametricStereo Pointer to the parametric stereo handle to be deallocated. * * \return * - PSENC_OK, on succes. * - PSENC_INVALID_HANDLE, on failure. */ FDK_PSENC_ERROR PSEnc_Destroy( HANDLE_PARAMETRIC_STEREO *phParametricStereo ); /** * \brief Apply parametric stereo processing. * * \param hParametricStereo Meta Data handle. * \param samples Pointer to 2 channel audio input signal. * \param timeInStride, Stride factor of input buffer. * \param hQmfAnalysis, Pointer to QMF analysis filterbanks. * \param downmixedRealQmfData Pointer to real QMF buffer to be written to. * \param downmixedImagQmfData Pointer to imag QMF buffer to be written to. * \param downsampledOutSignal Pointer to buffer where to write downmixed timesignal. * \param sbrSynthQmf Pointer to QMF synthesis filterbank. * \param qmfScale Return scaling factor of the qmf data. * \param sendHeader Signal whether to write header data. * * \return * - PSENC_OK, on succes. * - PSENC_INVALID_HANDLE, PSENC_ENCODE_ERROR, on failure. */ FDK_PSENC_ERROR FDKsbrEnc_PSEnc_ParametricStereoProcessing( HANDLE_PARAMETRIC_STEREO hParametricStereo, INT_PCM *samples[2], UINT timeInStride, QMF_FILTER_BANK **hQmfAnalysis, FIXP_QMF **RESTRICT downmixedRealQmfData, FIXP_QMF **RESTRICT downmixedImagQmfData, INT_PCM *downsampledOutSignal, HANDLE_QMF_FILTER_BANK sbrSynthQmf, SCHAR *qmfScale, const int sendHeader ); /** * \brief Write parametric stereo bitstream. * * Write ps_data() element to bitstream and return number of written bits. * Returns number of written bits only, if hBitstream == NULL. * * \param hParametricStereo Meta Data handle. * \param hBitstream Bitstream buffer handle. * * \return * - number of written bits. */ INT FDKsbrEnc_PSEnc_WritePSData( HANDLE_PARAMETRIC_STEREO hParametricStereo, HANDLE_FDK_BITSTREAM hBitstream ); #endif /* __INCLUDED_PS_MAIN_H */ fdk-aac-0.1.3/libSBRenc/src/ton_corr.h0000644000175000017500000003064412372261464020011 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief General tonality correction detector module. */ #ifndef _TON_CORR_EST_H #define _TON_CORR_EST_H #include "sbr_encoder.h" #include "mh_det.h" #include "nf_est.h" #include "invf_est.h" #define MAX_NUM_PATCHES 6 #define SCALE_NRGVEC 4 /** parameter set for one single patch */ typedef struct { INT sourceStartBand; /*!< first band in lowbands where to take the samples from */ INT sourceStopBand; /*!< first band in lowbands which is not included in the patch anymore */ INT guardStartBand; /*!< first band in highbands to be filled with zeros in order to reduce interferences between patches */ INT targetStartBand; /*!< first band in highbands to be filled with whitened lowband signal */ INT targetBandOffs; /*!< difference between 'startTargetBand' and 'startSourceBand' */ INT numBandsInPatch; /*!< number of consecutive bands in this one patch */ } PATCH_PARAM; typedef struct { INT switchInverseFilt; /*!< Flag to enable dynamic adaption of invf. detection */ INT noQmfChannels; INT bufferLength; /*!< Length of the r and i buffers. */ INT stepSize; /*!< Stride for the lpc estimate. */ INT numberOfEstimates; /*!< The total number of estiamtes, available in the quotaMatrix.*/ INT numberOfEstimatesPerFrame; /*!< The number of estimates per frame available in the quotaMatrix.*/ INT lpcLength[2]; /*!< Segment length used for second order LPC analysis.*/ INT nextSample; /*!< Where to start the LPC analysis of the current frame.*/ INT move; /*!< How many estimates to move in the quotaMatrix, when buffering. */ INT frameStartIndex; /*!< The start index for the current frame in the r and i buffers. */ INT startIndexMatrix; /*!< The start index for the current frame in the quotaMatrix. */ INT frameStartIndexInvfEst; /*!< The start index of the inverse filtering, not the same as the others, dependent on what decoder is used (buffer opt, or no buffer opt). */ INT prevTransientFlag; /*!< The transisent flag (from the transient detector) for the previous frame. */ INT transientNextFrame; /*!< Flag to indicate that the transient will show up in the next frame. */ INT transientPosOffset; /*!< An offset value to match the transient pos as calculated by the transient detector with the actual position in the frame.*/ INT *signMatrix[MAX_NO_OF_ESTIMATES]; /*!< Matrix holding the sign of each channe, i.e. indicating in what part of a QMF channel a possible sine is. */ FIXP_DBL *quotaMatrix[MAX_NO_OF_ESTIMATES];/*!< Matrix holding the quota values for all estimates, all channels. */ FIXP_DBL nrgVector[MAX_NO_OF_ESTIMATES]; /*!< Vector holding the averaged energies for every QMF band. */ FIXP_DBL nrgVectorFreq[QMF_CHANNELS]; /*!< Vector holding the averaged energies for every QMF channel */ SCHAR indexVector[QMF_CHANNELS]; /*!< Index vector poINTing to the correct lowband channel, when indexing a highband channel, -1 represents a guard band */ PATCH_PARAM patchParam[MAX_NUM_PATCHES]; /*!< new parameter set for patching */ INT guard; /*!< number of guardbands between every patch */ INT shiftStartSb; /*!< lowest subband of source range to be included in the patches */ INT noOfPatches; /*!< number of patches */ SBR_MISSING_HARMONICS_DETECTOR sbrMissingHarmonicsDetector; /*!< SBR_MISSING_HARMONICS_DETECTOR struct. */ SBR_NOISE_FLOOR_ESTIMATE sbrNoiseFloorEstimate; /*!< SBR_NOISE_FLOOR_ESTIMATE struct. */ SBR_INV_FILT_EST sbrInvFilt; /*!< SBR_INV_FILT_EST struct. */ } SBR_TON_CORR_EST; typedef SBR_TON_CORR_EST *HANDLE_SBR_TON_CORR_EST; void FDKsbrEnc_TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ INVF_MODE* infVec, /*!< Vector where the inverse filtering levels will be stored. */ FIXP_DBL * noiseLevels, /*!< Vector where the noise levels will be stored. */ INT* missingHarmonicFlag, /*!< Flag set to one or zero, dependent on if any strong sines are missing.*/ UCHAR* missingHarmonicsIndex, /*!< Vector indicating where sines are missing. */ UCHAR* envelopeCompensation, /*!< Vector to store compensation values for the energies in. */ const SBR_FRAME_INFO *frameInfo, /*!< Frame info struct, contains the time and frequency grid of the current frame.*/ UCHAR* transientInfo, /*!< Transient info.*/ UCHAR * freqBandTable, /*!< Frequency band tables for high-res.*/ INT nSfb, /*!< Number of scalefactor bands for high-res. */ XPOS_MODE xposType, /*!< Type of transposer used in the decoder.*/ UINT sbrSyntaxFlags ); INT FDKsbrEnc_CreateTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ INT chan); /*!< Channel index, needed for mem allocation */ INT FDKsbrEnc_InitTonCorrParamExtr(INT frameSize, /*!< Current SBR frame size. */ HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */ HANDLE_SBR_CONFIG_DATA sbrCfg, /*!< Pointer to SBR configuration parameters. */ INT timeSlots, /*!< Number of time-slots per frame */ INT xposCtrl, /*!< Different patch modes. */ INT ana_max_level, /*!< Maximum level of the adaptive noise. */ INT noiseBands, /*!< Number of noise bands per octave. */ INT noiseFloorOffset, /*!< Noise floor offset. */ UINT useSpeechConfig /*!< Speech or music tuning. */ ); void FDKsbrEnc_DeleteTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr); /*!< Handle to SBR_TON_CORR struct. */ void FDKsbrEnc_CalculateTonalityQuotas(HANDLE_SBR_TON_CORR_EST hTonCorr, FIXP_DBL **sourceBufferReal, FIXP_DBL **sourceBufferImag, INT usb, INT qmfScale /*!< sclefactor of QMF subsamples */ ); INT FDKsbrEnc_ResetTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */ INT xposctrl, /*!< Different patch modes. */ INT highBandStartSb, /*!< Start band of the SBR range. */ UCHAR *v_k_master, /*!< Master frequency table from which all other table are derived.*/ INT numMaster, /*!< Number of elements in the master table. */ INT fs, /*!< Sampling frequency (of the SBR part). */ UCHAR** freqBandTable, /*!< Frequency band table for low-res and high-res. */ INT* nSfb, /*!< Number of frequency bands (hig-res and low-res). */ INT noQmfChannels /*!< Number of QMF channels. */ ); #endif fdk-aac-0.1.3/libSBRenc/src/fram_gen.h0000644000175000017500000003432512372261464017742 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Framing generator prototypes and structs */ #ifndef _FRAM_GEN_H #define _FRAM_GEN_H #include "sbr_def.h" /* for MAX_ENVELOPES and MAX_NOISE_ENVELOPES in struct FRAME_INFO and CODEC_TYPE */ #define MAX_ENVELOPES_VARVAR MAX_ENVELOPES /*!< worst case number of envelopes in a VARVAR frame */ #define MAX_ENVELOPES_FIXVAR_VARFIX 4 /*!< worst case number of envelopes in VARFIX and FIXVAR frames */ #define MAX_NUM_REL 3 /*!< maximum number of relative borders in any VAR frame */ /* SBR frame class definitions */ typedef enum { FIXFIX = 0, /*!< bs_frame_class: leading and trailing frame borders are fixed */ FIXVAR, /*!< bs_frame_class: leading frame border is fixed, trailing frame border is variable */ VARFIX, /*!< bs_frame_class: leading frame border is variable, trailing frame border is fixed */ VARVAR /*!< bs_frame_class: leading and trailing frame borders are variable */ ,FIXFIXonly /*!< bs_frame_class: leading border fixed (0), trailing border fixed (nrTimeSlots) and encased borders are dynamically derived from the tranPos */ }FRAME_CLASS; /* helper constants */ #define DC 4711 /*!< helper constant: don't care */ #define EMPTY (-99) /*!< helper constant: empty */ /* system constants: AAC+SBR, DRM Frame-Length */ #define FRAME_MIDDLE_SLOT_1920 4 #define NUMBER_TIME_SLOTS_1920 15 #define LD_PRETRAN_OFF 3 #define FRAME_MIDDLE_SLOT_512LD 0 #define NUMBER_TIME_SLOTS_512LD 8 #define TRANSIENT_OFFSET_LD 0 /* system constants: AAC+SBR or aacPRO (hybrid format), Standard Frame-Length, Multi-Rate --------------------------------------------------------------------------- Number of slots (numberTimeSlots): 16 (NUMBER_TIME_SLOTS_2048) Detector-offset (frameMiddleSlot): 4 Overlap : 3 Buffer-offset : 8 (BUFFER_FRAME_START_2048 = 0) |<------------tranPos---------->| |c|d|e|f|0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f| FixFix | | FixVar | :<- ->: VarFix :<- ->: | VarVar :<- ->: :<- ->: 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 ................................................................................ |-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-| frame-generator:0 16 24 32 analysis-buffer:8 24 32 40 */ #define FRAME_MIDDLE_SLOT_2048 4 #define NUMBER_TIME_SLOTS_2048 16 /* system constants: mp3PRO, Multi-Rate & Single-Rate -------------------------------------------------- Number of slots (numberTimeSlots): 9 (NUMBER_TIME_SLOTS_1152) Detector-offset (frameMiddleSlot): 4 (FRAME_MIDDLE_SLOT_1152) Overlap : 3 Buffer-offset : 4.5 (BUFFER_FRAME_START_1152 = 0) |<----tranPos---->| |5|6|7|8|0|1|2|3|4|5|6|7|8| FixFix | | FixVar | :<- ->: VarFix :<- ->: | VarVar :<- ->: :<- ->: 0 1 2 3 4 5 6 7 8 0 1 2 3 ............................................. -|-|-|-|-B-|-|-|-|-|-|-|-|-B-|-|-|-|-|-|-|-|-| frame-generator: 0 9 13 18 analysis-buffer: 4.5 13.5 22.5 */ #define FRAME_MIDDLE_SLOT_1152 4 #define NUMBER_TIME_SLOTS_1152 9 /* system constants: Layer2+SBR */ #define FRAME_MIDDLE_SLOT_2304 8 #define NUMBER_TIME_SLOTS_2304 18 /*! \struct SBR_GRID \brief sbr_grid() signals to be converted to bitstream elements The variables hold the signals (e.g. lengths and numbers) in "clear text" */ typedef struct { /* system constants */ INT bufferFrameStart; /*!< frame generator vs analysis buffer time alignment (currently set to 0, offset added elsewhere) */ INT numberTimeSlots; /*!< number of SBR timeslots per frame */ /* will be adjusted for every frame */ FRAME_CLASS frameClass; /*!< SBR frame class */ INT bs_num_env; /*!< bs_num_env, number of envelopes for FIXFIX */ INT bs_abs_bord; /*!< bs_abs_bord, absolute border for VARFIX and FIXVAR */ INT n; /*!< number of relative borders for VARFIX and FIXVAR */ INT p; /*!< pointer-to-transient-border */ INT bs_rel_bord[MAX_NUM_REL]; /*!< bs_rel_bord, relative borders for all VAR */ INT v_f[MAX_ENVELOPES_FIXVAR_VARFIX]; /*!< envelope frequency resolutions for FIXVAR and VARFIX */ INT bs_abs_bord_0; /*!< bs_abs_bord_0, leading absolute border for VARVAR */ INT bs_abs_bord_1; /*!< bs_abs_bord_1, trailing absolute border for VARVAR */ INT bs_num_rel_0; /*!< bs_num_rel_0, number of relative borders associated with leading absolute border for VARVAR */ INT bs_num_rel_1; /*!< bs_num_rel_1, number of relative borders associated with trailing absolute border for VARVAR */ INT bs_rel_bord_0[MAX_NUM_REL]; /*!< bs_rel_bord_0, relative borders associated with leading absolute border for VARVAR */ INT bs_rel_bord_1[MAX_NUM_REL]; /*!< bs_rel_bord_1, relative borders associated with trailing absolute border for VARVAR */ INT v_fLR[MAX_ENVELOPES_VARVAR]; /*!< envelope frequency resolutions for VARVAR */ } SBR_GRID; typedef SBR_GRID *HANDLE_SBR_GRID; /*! \struct SBR_FRAME_INFO \brief time/frequency grid description for one frame */ typedef struct { INT nEnvelopes; /*!< number of envelopes */ INT borders[MAX_ENVELOPES+1]; /*!< envelope borders in SBR timeslots */ FREQ_RES freqRes[MAX_ENVELOPES]; /*!< frequency resolution of each envelope */ INT shortEnv; /*!< number of an envelope to be shortened (starting at 1) or 0 for no shortened envelope */ INT nNoiseEnvelopes; /*!< number of noise floors */ INT bordersNoise[MAX_NOISE_ENVELOPES+1];/*!< noise floor borders in SBR timeslots */ } SBR_FRAME_INFO; /* WARNING: When rearranging the elements of this struct keep in mind that the static * initializations in the corresponding C-file have to be rearranged as well! * snd 2002/01/23 */ typedef SBR_FRAME_INFO *HANDLE_SBR_FRAME_INFO; /*! \struct SBR_ENVELOPE_FRAME \brief frame generator main struct Contains tuning parameters, time/frequency grid description, sbr_grid() bitstream elements, and generator internal signals */ typedef struct { /* system constants */ INT frameMiddleSlot; /*!< transient detector offset in SBR timeslots */ /* basic tuning parameters */ INT staticFraming; /*!< 1: run static framing in time, i.e. exclusive use of bs_frame_class = FIXFIX */ INT numEnvStatic; /*!< number of envelopes per frame for static framing */ INT freq_res_fixfix; /*!< envelope frequency resolution to use for bs_frame_class = FIXFIX */ /* expert tuning parameters */ const int *v_tuningSegm; /*!< segment lengths to use around transient */ const int *v_tuningFreq; /*!< frequency resolutions to use around transient */ INT dmin; /*!< minimum length of dependent segments */ INT dmax; /*!< maximum length of dependent segments */ INT allowSpread; /*!< 1: allow isolated transient to influence grid of 3 consecutive frames */ /* internally used signals */ FRAME_CLASS frameClassOld; /*!< frame class used for previous frame */ INT spreadFlag; /*!< 1: use VARVAR instead of VARFIX to follow up old transient */ INT v_bord[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< borders for current frame and preliminary borders for next frame (fixed borders excluded) */ INT length_v_bord; /*!< helper variable: length of v_bord */ INT v_freq[2 * MAX_ENVELOPES_VARVAR + 1]; /*!< frequency resolutions for current frame and preliminary resolutions for next frame */ INT length_v_freq; /*!< helper variable: length of v_freq */ INT v_bordFollow[MAX_ENVELOPES_VARVAR]; /*!< preliminary borders for current frame (calculated during previous frame) */ INT length_v_bordFollow; /*!< helper variable: length of v_bordFollow */ INT i_tranFollow; /*!< points to transient border in v_bordFollow (may be negative, see keepForFollowUp()) */ INT i_fillFollow; /*!< points to first fill border in v_bordFollow */ INT v_freqFollow[MAX_ENVELOPES_VARVAR]; /*!< preliminary frequency resolutions for current frame (calculated during previous frame) */ INT length_v_freqFollow; /*!< helper variable: length of v_freqFollow */ /* externally needed signals */ SBR_GRID SbrGrid; /*!< sbr_grid() signals to be converted to bitstream elements */ SBR_FRAME_INFO SbrFrameInfo; /*!< time/frequency grid description for one frame */ } SBR_ENVELOPE_FRAME; typedef SBR_ENVELOPE_FRAME *HANDLE_SBR_ENVELOPE_FRAME; void FDKsbrEnc_initFrameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, INT allowSpread, INT numEnvStatic, INT staticFraming, INT timeSlots, INT freq_res_fixfix ,int ldGrid ); HANDLE_SBR_FRAME_INFO FDKsbrEnc_frameInfoGenerator (HANDLE_SBR_ENVELOPE_FRAME hSbrEnvFrame, UCHAR *v_transient_info, UCHAR *v_transient_info_pre, int ldGrid, const int *v_tuning); #endif fdk-aac-0.1.3/libSBRenc/src/cmondata.h0000644000175000017500000001310012372261464017736 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Core Coder's and SBR's shared data structure definition */ #ifndef __SBR_CMONDATA_H #define __SBR_CMONDATA_H #include "FDK_bitstream.h" struct COMMON_DATA { INT sbrHdrBits; /**< number of SBR header bits */ INT sbrDataBits; /**< number of SBR data bits */ INT sbrFillBits; /**< number of SBR fill bits */ FDK_BITSTREAM sbrBitbuf; /**< the SBR data bitbuffer */ FDK_BITSTREAM tmpWriteBitbuf; /**< helper var for writing header*/ INT xOverFreq; /**< the SBR crossover frequency */ INT dynBwEnabled; /**< indicates if dynamic bandwidth is enabled */ INT sbrNumChannels; /**< number of channels (meaning mono or stereo) */ INT dynXOverFreqEnc; /**< encoder dynamic crossover frequency */ }; typedef struct COMMON_DATA *HANDLE_COMMON_DATA; #endif fdk-aac-0.1.3/libSBRenc/src/sbr_misc.h0000644000175000017500000001235312372261464017762 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file \brief Sbr miscellaneous helper functions prototypes \author */ #ifndef _SBR_MISC_H #define _SBR_MISC_H #include "sbr_encoder.h" /* Sorting routines */ void FDKsbrEnc_Shellsort_fract (FIXP_DBL *in, INT n); void FDKsbrEnc_Shellsort_int (INT *in, INT n); void FDKsbrEnc_AddLeft (INT *vector, INT *length_vector, INT value); void FDKsbrEnc_AddRight (INT *vector, INT *length_vector, INT value); void FDKsbrEnc_AddVecLeft (INT *dst, INT *length_dst, INT *src, INT length_src); void FDKsbrEnc_AddVecRight (INT *dst, INT *length_vector_dst, INT *src, INT length_src); FIXP_DBL FDKsbrEnc_LSI_divide_scale_fract(FIXP_DBL num, FIXP_DBL denom, FIXP_DBL scale); #endif fdk-aac-0.1.3/wavreader.c0000644000175000017500000001130612372261464015537 0ustar00tootstoots00000000000000/* ------------------------------------------------------------------ * Copyright (C) 2009 Martin Storsjo * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. * See the License for the specific language governing permissions * and limitations under the License. * ------------------------------------------------------------------- */ #include "wavreader.h" #include #include #include #include #define TAG(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) struct wav_reader { FILE *wav; uint32_t data_length; int format; int sample_rate; int bits_per_sample; int channels; int byte_rate; int block_align; int streamed; }; static uint32_t read_tag(struct wav_reader* wr) { uint32_t tag = 0; tag = (tag << 8) | fgetc(wr->wav); tag = (tag << 8) | fgetc(wr->wav); tag = (tag << 8) | fgetc(wr->wav); tag = (tag << 8) | fgetc(wr->wav); return tag; } static uint32_t read_int32(struct wav_reader* wr) { uint32_t value = 0; value |= fgetc(wr->wav) << 0; value |= fgetc(wr->wav) << 8; value |= fgetc(wr->wav) << 16; value |= fgetc(wr->wav) << 24; return value; } static uint16_t read_int16(struct wav_reader* wr) { uint16_t value = 0; value |= fgetc(wr->wav) << 0; value |= fgetc(wr->wav) << 8; return value; } static void skip(FILE *f, int n) { int i; for (i = 0; i < n; i++) fgetc(f); } void* wav_read_open(const char *filename) { struct wav_reader* wr = (struct wav_reader*) malloc(sizeof(*wr)); long data_pos = 0; memset(wr, 0, sizeof(*wr)); if (!strcmp(filename, "-")) wr->wav = stdin; else wr->wav = fopen(filename, "rb"); if (wr->wav == NULL) { free(wr); return NULL; } while (1) { uint32_t tag, tag2, length; tag = read_tag(wr); if (feof(wr->wav)) break; length = read_int32(wr); if (!length || length >= 0x7fff0000) { wr->streamed = 1; length = ~0; } if (tag != TAG('R', 'I', 'F', 'F') || length < 4) { fseek(wr->wav, length, SEEK_CUR); continue; } tag2 = read_tag(wr); length -= 4; if (tag2 != TAG('W', 'A', 'V', 'E')) { fseek(wr->wav, length, SEEK_CUR); continue; } // RIFF chunk found, iterate through it while (length >= 8) { uint32_t subtag, sublength; subtag = read_tag(wr); if (feof(wr->wav)) break; sublength = read_int32(wr); length -= 8; if (length < sublength) break; if (subtag == TAG('f', 'm', 't', ' ')) { if (sublength < 16) { // Insufficient data for 'fmt ' break; } wr->format = read_int16(wr); wr->channels = read_int16(wr); wr->sample_rate = read_int32(wr); wr->byte_rate = read_int32(wr); wr->block_align = read_int16(wr); wr->bits_per_sample = read_int16(wr); if (wr->format == 0xfffe) { if (sublength < 28) { // Insufficient data for waveformatex break; } skip(wr->wav, 8); wr->format = read_int32(wr); skip(wr->wav, sublength - 28); } else { skip(wr->wav, sublength - 16); } } else if (subtag == TAG('d', 'a', 't', 'a')) { data_pos = ftell(wr->wav); wr->data_length = sublength; if (!wr->data_length || wr->streamed) { wr->streamed = 1; return wr; } fseek(wr->wav, sublength, SEEK_CUR); } else { skip(wr->wav, sublength); } length -= sublength; } if (length > 0) { // Bad chunk? fseek(wr->wav, length, SEEK_CUR); } } fseek(wr->wav, data_pos, SEEK_SET); return wr; } void wav_read_close(void* obj) { struct wav_reader* wr = (struct wav_reader*) obj; if (wr->wav != stdin) fclose(wr->wav); free(wr); } int wav_get_header(void* obj, int* format, int* channels, int* sample_rate, int* bits_per_sample, unsigned int* data_length) { struct wav_reader* wr = (struct wav_reader*) obj; if (format) *format = wr->format; if (channels) *channels = wr->channels; if (sample_rate) *sample_rate = wr->sample_rate; if (bits_per_sample) *bits_per_sample = wr->bits_per_sample; if (data_length) *data_length = wr->data_length; return wr->format && wr->sample_rate; } int wav_read_data(void* obj, unsigned char* data, unsigned int length) { struct wav_reader* wr = (struct wav_reader*) obj; int n; if (wr->wav == NULL) return -1; if (length > wr->data_length && !wr->streamed) length = wr->data_length; n = fread(data, 1, length, wr->wav); wr->data_length -= length; return n; } fdk-aac-0.1.3/fdk-aac.pc.in0000644000175000017500000000042312372261464015630 0ustar00tootstoots00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Fraunhofer FDK AAC Codec Library Description: AAC codec library Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lfdk-aac @LIBS_PUBLIC@ Libs.private: @LIBS_PRIVATE@ Cflags: -I${includedir} fdk-aac-0.1.3/Makefile.in0000644000175000017500000021116012372262357015462 0ustar00tootstoots00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/fdk-aac.pc.in depcomp $(fdk_aacinclude_HEADERS) \ $(am__noinst_HEADERS_DIST) ChangeLog compile config.guess \ config.sub install-sh missing ltmain.sh ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = fdk-aac.pc CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(fdk_aacincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) libfdk_aac_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am__objects_1 = libAACdec/src/aacdec_drc.lo \ libAACdec/src/aacdec_hcr.lo libAACdec/src/aacdecoder.lo \ libAACdec/src/aacdec_pns.lo libAACdec/src/aac_ram.lo \ libAACdec/src/block.lo libAACdec/src/channelinfo.lo \ libAACdec/src/ldfiltbank.lo libAACdec/src/rvlcbit.lo \ libAACdec/src/rvlc.lo libAACdec/src/aacdec_hcr_bit.lo \ libAACdec/src/aacdec_hcrs.lo libAACdec/src/aacdecoder_lib.lo \ libAACdec/src/aacdec_tns.lo libAACdec/src/aac_rom.lo \ libAACdec/src/channel.lo libAACdec/src/conceal.lo \ libAACdec/src/pulsedata.lo libAACdec/src/rvlcconceal.lo \ libAACdec/src/stereo.lo am__objects_2 = libAACenc/src/aacenc.lo libAACenc/src/aacEnc_ram.lo \ libAACenc/src/band_nrg.lo libAACenc/src/block_switch.lo \ libAACenc/src/grp_data.lo libAACenc/src/metadata_main.lo \ libAACenc/src/pre_echo_control.lo libAACenc/src/quantize.lo \ libAACenc/src/tonality.lo libAACenc/src/aacenc_hcr.lo \ libAACenc/src/aacEnc_rom.lo libAACenc/src/bandwidth.lo \ libAACenc/src/channel_map.lo libAACenc/src/intensity.lo \ libAACenc/src/ms_stereo.lo libAACenc/src/psy_configuration.lo \ libAACenc/src/sf_estim.lo libAACenc/src/transform.lo \ libAACenc/src/aacenc_lib.lo libAACenc/src/aacenc_tns.lo \ libAACenc/src/bit_cnt.lo libAACenc/src/chaosmeasure.lo \ libAACenc/src/line_pe.lo libAACenc/src/noisedet.lo \ libAACenc/src/psy_main.lo libAACenc/src/spreading.lo \ libAACenc/src/aacenc_pns.lo libAACenc/src/adj_thr.lo \ libAACenc/src/bitenc.lo libAACenc/src/dyn_bits.lo \ libAACenc/src/metadata_compressor.lo libAACenc/src/pnsparam.lo \ libAACenc/src/qc_main.lo am__objects_3 = libMpegTPDec/src/tpdec_adif.lo \ libMpegTPDec/src/tpdec_adts.lo libMpegTPDec/src/tpdec_asc.lo \ libMpegTPDec/src/tpdec_latm.lo libMpegTPDec/src/tpdec_lib.lo am__objects_4 = libMpegTPEnc/src/tpenc_adif.lo \ libMpegTPEnc/src/tpenc_adts.lo libMpegTPEnc/src/tpenc_asc.lo \ libMpegTPEnc/src/tpenc_latm.lo libMpegTPEnc/src/tpenc_lib.lo am__objects_5 = libSBRdec/src/env_calc.lo libSBRdec/src/env_dec.lo \ libSBRdec/src/env_extr.lo libSBRdec/src/huff_dec.lo \ libSBRdec/src/lpp_tran.lo libSBRdec/src/psbitdec.lo \ libSBRdec/src/psdec.lo libSBRdec/src/psdec_hybrid.lo \ libSBRdec/src/sbr_crc.lo libSBRdec/src/sbr_deb.lo \ libSBRdec/src/sbr_dec.lo libSBRdec/src/sbrdec_drc.lo \ libSBRdec/src/sbrdec_freq_sca.lo libSBRdec/src/sbrdecoder.lo \ libSBRdec/src/sbr_ram.lo libSBRdec/src/sbr_rom.lo am__objects_6 = libSBRenc/src/bit_sbr.lo libSBRenc/src/env_bit.lo \ libSBRenc/src/fram_gen.lo libSBRenc/src/mh_det.lo \ libSBRenc/src/ps_bitenc.lo libSBRenc/src/ps_encode.lo \ libSBRenc/src/resampler.lo libSBRenc/src/sbr_encoder.lo \ libSBRenc/src/sbr_ram.lo libSBRenc/src/ton_corr.lo \ libSBRenc/src/code_env.lo libSBRenc/src/env_est.lo \ libSBRenc/src/invf_est.lo libSBRenc/src/nf_est.lo \ libSBRenc/src/ps_main.lo libSBRenc/src/sbrenc_freq_sca.lo \ libSBRenc/src/sbr_misc.lo libSBRenc/src/sbr_rom.lo \ libSBRenc/src/tran_det.lo am__objects_7 = libPCMutils/src/pcmutils_lib.lo am__objects_8 = libFDK/src/autocorr2nd.lo libFDK/src/dct.lo \ libFDK/src/FDK_bitbuffer.lo libFDK/src/FDK_core.lo \ libFDK/src/FDK_crc.lo libFDK/src/FDK_hybrid.lo \ libFDK/src/FDK_tools_rom.lo libFDK/src/FDK_trigFcts.lo \ libFDK/src/fft.lo libFDK/src/fft_rad2.lo \ libFDK/src/fixpoint_math.lo libFDK/src/mdct.lo \ libFDK/src/qmf.lo libFDK/src/scale.lo am__objects_9 = libSYS/src/cmdl_parser.lo libSYS/src/conv_string.lo \ libSYS/src/genericStds.lo libSYS/src/wav_file.lo am_libfdk_aac_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ $(am__objects_3) $(am__objects_4) $(am__objects_5) \ $(am__objects_6) $(am__objects_7) $(am__objects_8) \ $(am__objects_9) libfdk_aac_la_OBJECTS = $(am_libfdk_aac_la_OBJECTS) PROGRAMS = $(bin_PROGRAMS) am__aac_enc_SOURCES_DIST = aac-enc.c wavreader.c @EXAMPLE_TRUE@am_aac_enc_OBJECTS = aac-enc.$(OBJEXT) \ @EXAMPLE_TRUE@ wavreader.$(OBJEXT) aac_enc_OBJECTS = $(am_aac_enc_OBJECTS) @EXAMPLE_TRUE@aac_enc_DEPENDENCIES = libfdk-aac.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libfdk_aac_la_SOURCES) \ $(nodist_EXTRA_libfdk_aac_la_SOURCES) $(aac_enc_SOURCES) DIST_SOURCES = $(libfdk_aac_la_SOURCES) $(am__aac_enc_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(pkgconfig_DATA) am__noinst_HEADERS_DIST = wavreader.h HEADERS = $(fdk_aacinclude_HEADERS) $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FDK_AAC_VERSION = @FDK_AAC_VERSION@ FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_PRIVATE = @LIBS_PRIVATE@ LIBS_PUBLIC = @LIBS_PUBLIC@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = subdir-objects AM_CPPFLAGS = \ -I$(top_srcdir)/libAACdec/include \ -I$(top_srcdir)/libAACenc/include \ -I$(top_srcdir)/libSBRdec/include \ -I$(top_srcdir)/libSBRenc/include \ -I$(top_srcdir)/libMpegTPDec/include \ -I$(top_srcdir)/libMpegTPEnc/include \ -I$(top_srcdir)/libSYS/include \ -I$(top_srcdir)/libFDK/include \ -I$(top_srcdir)/libPCMutils/include AM_CXXFLAGS = -fno-exceptions -fno-rtti libfdk_aac_la_LINK = $(LINK) $(libfdk_aac_la_LDFLAGS) # Mention a dummy pure C file to trigger generation of the $(LINK) variable nodist_EXTRA_libfdk_aac_la_SOURCES = dummy.c fdk_aacincludedir = $(includedir)/fdk-aac fdk_aacinclude_HEADERS = \ $(top_srcdir)/libSYS/include/machine_type.h \ $(top_srcdir)/libSYS/include/genericStds.h \ $(top_srcdir)/libSYS/include/FDK_audio.h \ $(top_srcdir)/libAACenc/include/aacenc_lib.h \ $(top_srcdir)/libAACdec/include/aacdecoder_lib.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = fdk-aac.pc lib_LTLIBRARIES = libfdk-aac.la libfdk_aac_la_LDFLAGS = -version-info @FDK_AAC_VERSION@ -no-undefined \ -export-symbols $(top_srcdir)/fdk-aac.sym @EXAMPLE_TRUE@bin_PROGRAMS = aac-enc$(EXEEXT) @EXAMPLE_TRUE@aac_enc_LDADD = libfdk-aac.la @EXAMPLE_TRUE@aac_enc_SOURCES = aac-enc.c wavreader.c @EXAMPLE_TRUE@noinst_HEADERS = wavreader.h AACDEC_SRC = \ libAACdec/src/aacdec_drc.cpp \ libAACdec/src/aacdec_hcr.cpp \ libAACdec/src/aacdecoder.cpp \ libAACdec/src/aacdec_pns.cpp \ libAACdec/src/aac_ram.cpp \ libAACdec/src/block.cpp \ libAACdec/src/channelinfo.cpp \ libAACdec/src/ldfiltbank.cpp \ libAACdec/src/rvlcbit.cpp \ libAACdec/src/rvlc.cpp \ libAACdec/src/aacdec_hcr_bit.cpp \ libAACdec/src/aacdec_hcrs.cpp \ libAACdec/src/aacdecoder_lib.cpp \ libAACdec/src/aacdec_tns.cpp \ libAACdec/src/aac_rom.cpp \ libAACdec/src/channel.cpp \ libAACdec/src/conceal.cpp \ libAACdec/src/pulsedata.cpp \ libAACdec/src/rvlcconceal.cpp \ libAACdec/src/stereo.cpp AACENC_SRC = \ libAACenc/src/aacenc.cpp \ libAACenc/src/aacEnc_ram.cpp \ libAACenc/src/band_nrg.cpp \ libAACenc/src/block_switch.cpp \ libAACenc/src/grp_data.cpp \ libAACenc/src/metadata_main.cpp \ libAACenc/src/pre_echo_control.cpp \ libAACenc/src/quantize.cpp \ libAACenc/src/tonality.cpp \ libAACenc/src/aacenc_hcr.cpp \ libAACenc/src/aacEnc_rom.cpp \ libAACenc/src/bandwidth.cpp \ libAACenc/src/channel_map.cpp \ libAACenc/src/intensity.cpp \ libAACenc/src/ms_stereo.cpp \ libAACenc/src/psy_configuration.cpp \ libAACenc/src/sf_estim.cpp \ libAACenc/src/transform.cpp \ libAACenc/src/aacenc_lib.cpp \ libAACenc/src/aacenc_tns.cpp \ libAACenc/src/bit_cnt.cpp \ libAACenc/src/chaosmeasure.cpp \ libAACenc/src/line_pe.cpp \ libAACenc/src/noisedet.cpp \ libAACenc/src/psy_main.cpp \ libAACenc/src/spreading.cpp \ libAACenc/src/aacenc_pns.cpp \ libAACenc/src/adj_thr.cpp \ libAACenc/src/bitenc.cpp \ libAACenc/src/dyn_bits.cpp \ libAACenc/src/metadata_compressor.cpp \ libAACenc/src/pnsparam.cpp \ libAACenc/src/qc_main.cpp FDK_SRC = \ libFDK/src/autocorr2nd.cpp \ libFDK/src/dct.cpp \ libFDK/src/FDK_bitbuffer.cpp \ libFDK/src/FDK_core.cpp \ libFDK/src/FDK_crc.cpp \ libFDK/src/FDK_hybrid.cpp \ libFDK/src/FDK_tools_rom.cpp \ libFDK/src/FDK_trigFcts.cpp \ libFDK/src/fft.cpp \ libFDK/src/fft_rad2.cpp \ libFDK/src/fixpoint_math.cpp \ libFDK/src/mdct.cpp \ libFDK/src/qmf.cpp \ libFDK/src/scale.cpp MPEGTPDEC_SRC = \ libMpegTPDec/src/tpdec_adif.cpp \ libMpegTPDec/src/tpdec_adts.cpp \ libMpegTPDec/src/tpdec_asc.cpp \ libMpegTPDec/src/tpdec_latm.cpp \ libMpegTPDec/src/tpdec_lib.cpp MPEGTPENC_SRC = \ libMpegTPEnc/src/tpenc_adif.cpp \ libMpegTPEnc/src/tpenc_adts.cpp \ libMpegTPEnc/src/tpenc_asc.cpp \ libMpegTPEnc/src/tpenc_latm.cpp \ libMpegTPEnc/src/tpenc_lib.cpp PCMUTILS_SRC = \ libPCMutils/src/pcmutils_lib.cpp SBRDEC_SRC = \ libSBRdec/src/env_calc.cpp \ libSBRdec/src/env_dec.cpp \ libSBRdec/src/env_extr.cpp \ libSBRdec/src/huff_dec.cpp \ libSBRdec/src/lpp_tran.cpp \ libSBRdec/src/psbitdec.cpp \ libSBRdec/src/psdec.cpp \ libSBRdec/src/psdec_hybrid.cpp \ libSBRdec/src/sbr_crc.cpp \ libSBRdec/src/sbr_deb.cpp \ libSBRdec/src/sbr_dec.cpp \ libSBRdec/src/sbrdec_drc.cpp \ libSBRdec/src/sbrdec_freq_sca.cpp \ libSBRdec/src/sbrdecoder.cpp \ libSBRdec/src/sbr_ram.cpp \ libSBRdec/src/sbr_rom.cpp SBRENC_SRC = \ libSBRenc/src/bit_sbr.cpp \ libSBRenc/src/env_bit.cpp \ libSBRenc/src/fram_gen.cpp \ libSBRenc/src/mh_det.cpp \ libSBRenc/src/ps_bitenc.cpp \ libSBRenc/src/ps_encode.cpp \ libSBRenc/src/resampler.cpp \ libSBRenc/src/sbr_encoder.cpp \ libSBRenc/src/sbr_ram.cpp \ libSBRenc/src/ton_corr.cpp \ libSBRenc/src/code_env.cpp \ libSBRenc/src/env_est.cpp \ libSBRenc/src/invf_est.cpp \ libSBRenc/src/nf_est.cpp \ libSBRenc/src/ps_main.cpp \ libSBRenc/src/sbrenc_freq_sca.cpp \ libSBRenc/src/sbr_misc.cpp \ libSBRenc/src/sbr_rom.cpp \ libSBRenc/src/tran_det.cpp SYS_SRC = \ libSYS/src/cmdl_parser.cpp \ libSYS/src/conv_string.cpp \ libSYS/src/genericStds.cpp \ libSYS/src/wav_file.cpp libfdk_aac_la_SOURCES = \ $(AACDEC_SRC) $(AACENC_SRC) \ $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ $(SBRDEC_SRC) $(SBRENC_SRC) \ $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) EXTRA_DIST = \ $(top_srcdir)/autogen.sh \ $(top_srcdir)/NOTICE \ $(top_srcdir)/Android.mk \ $(top_srcdir)/fdk-aac.sym \ $(top_srcdir)/documentation/*.pdf \ $(top_srcdir)/libAACdec/src/*.h \ $(top_srcdir)/libAACdec/src/arm/*.cpp \ $(top_srcdir)/libAACenc/src/*.h \ $(top_srcdir)/libSBRenc/src/*.h \ $(top_srcdir)/libSBRenc/include/*.h \ $(top_srcdir)/libSBRdec/src/*.h \ $(top_srcdir)/libSBRdec/src/arm/*.cpp \ $(top_srcdir)/libSBRdec/include/*.h \ $(top_srcdir)/libSYS/include/*.h \ $(top_srcdir)/libSYS/src/linux/*.cpp \ $(top_srcdir)/libSYS/src/mips/*.cpp \ $(top_srcdir)/libPCMutils/include/*.h \ $(top_srcdir)/libMpegTPEnc/include/*.h \ $(top_srcdir)/libMpegTPEnc/src/*.h \ $(top_srcdir)/libMpegTPEnc/src/version \ $(top_srcdir)/libMpegTPDec/include/*.h \ $(top_srcdir)/libMpegTPDec/src/*.h \ $(top_srcdir)/libMpegTPDec/src/version \ $(top_srcdir)/libFDK/include/*.h \ $(top_srcdir)/libFDK/include/arm/*.h \ $(top_srcdir)/libFDK/include/mips/*.h \ $(top_srcdir)/libFDK/include/x86/*.h \ $(top_srcdir)/libFDK/src/arm/*.cpp \ $(top_srcdir)/libFDK/src/mips/*.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): fdk-aac.pc: $(top_builddir)/config.status $(srcdir)/fdk-aac.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libAACdec/src/$(am__dirstamp): @$(MKDIR_P) libAACdec/src @: > libAACdec/src/$(am__dirstamp) libAACdec/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libAACdec/src/$(DEPDIR) @: > libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_drc.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_hcr.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdecoder.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_pns.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aac_ram.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/block.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/channelinfo.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/ldfiltbank.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/rvlcbit.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/rvlc.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_hcr_bit.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_hcrs.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdecoder_lib.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aacdec_tns.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/aac_rom.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/channel.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/conceal.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/pulsedata.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/rvlcconceal.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACdec/src/stereo.lo: libAACdec/src/$(am__dirstamp) \ libAACdec/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/$(am__dirstamp): @$(MKDIR_P) libAACenc/src @: > libAACenc/src/$(am__dirstamp) libAACenc/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libAACenc/src/$(DEPDIR) @: > libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacenc.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacEnc_ram.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/band_nrg.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/block_switch.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/grp_data.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/metadata_main.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/pre_echo_control.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/quantize.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/tonality.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacenc_hcr.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacEnc_rom.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/bandwidth.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/channel_map.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/intensity.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/ms_stereo.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/psy_configuration.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/sf_estim.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/transform.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacenc_lib.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacenc_tns.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/bit_cnt.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/chaosmeasure.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/line_pe.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/noisedet.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/psy_main.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/spreading.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/aacenc_pns.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/adj_thr.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/bitenc.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/dyn_bits.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/metadata_compressor.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/pnsparam.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libAACenc/src/qc_main.lo: libAACenc/src/$(am__dirstamp) \ libAACenc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/$(am__dirstamp): @$(MKDIR_P) libMpegTPDec/src @: > libMpegTPDec/src/$(am__dirstamp) libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libMpegTPDec/src/$(DEPDIR) @: > libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/tpdec_adif.lo: libMpegTPDec/src/$(am__dirstamp) \ libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/tpdec_adts.lo: libMpegTPDec/src/$(am__dirstamp) \ libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/tpdec_asc.lo: libMpegTPDec/src/$(am__dirstamp) \ libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/tpdec_latm.lo: libMpegTPDec/src/$(am__dirstamp) \ libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPDec/src/tpdec_lib.lo: libMpegTPDec/src/$(am__dirstamp) \ libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/$(am__dirstamp): @$(MKDIR_P) libMpegTPEnc/src @: > libMpegTPEnc/src/$(am__dirstamp) libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libMpegTPEnc/src/$(DEPDIR) @: > libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/tpenc_adif.lo: libMpegTPEnc/src/$(am__dirstamp) \ libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/tpenc_adts.lo: libMpegTPEnc/src/$(am__dirstamp) \ libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/tpenc_asc.lo: libMpegTPEnc/src/$(am__dirstamp) \ libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/tpenc_latm.lo: libMpegTPEnc/src/$(am__dirstamp) \ libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libMpegTPEnc/src/tpenc_lib.lo: libMpegTPEnc/src/$(am__dirstamp) \ libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/$(am__dirstamp): @$(MKDIR_P) libSBRdec/src @: > libSBRdec/src/$(am__dirstamp) libSBRdec/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libSBRdec/src/$(DEPDIR) @: > libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/env_calc.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/env_dec.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/env_extr.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/huff_dec.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/lpp_tran.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/psbitdec.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/psdec.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/psdec_hybrid.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbr_crc.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbr_deb.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbr_dec.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbrdec_drc.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbrdec_freq_sca.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbrdecoder.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbr_ram.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRdec/src/sbr_rom.lo: libSBRdec/src/$(am__dirstamp) \ libSBRdec/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/$(am__dirstamp): @$(MKDIR_P) libSBRenc/src @: > libSBRenc/src/$(am__dirstamp) libSBRenc/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libSBRenc/src/$(DEPDIR) @: > libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/bit_sbr.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/env_bit.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/fram_gen.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/mh_det.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/ps_bitenc.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/ps_encode.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/resampler.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/sbr_encoder.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/sbr_ram.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/ton_corr.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/code_env.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/env_est.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/invf_est.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/nf_est.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/ps_main.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/sbrenc_freq_sca.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/sbr_misc.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/sbr_rom.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libSBRenc/src/tran_det.lo: libSBRenc/src/$(am__dirstamp) \ libSBRenc/src/$(DEPDIR)/$(am__dirstamp) libPCMutils/src/$(am__dirstamp): @$(MKDIR_P) libPCMutils/src @: > libPCMutils/src/$(am__dirstamp) libPCMutils/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libPCMutils/src/$(DEPDIR) @: > libPCMutils/src/$(DEPDIR)/$(am__dirstamp) libPCMutils/src/pcmutils_lib.lo: libPCMutils/src/$(am__dirstamp) \ libPCMutils/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/$(am__dirstamp): @$(MKDIR_P) libFDK/src @: > libFDK/src/$(am__dirstamp) libFDK/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libFDK/src/$(DEPDIR) @: > libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/autocorr2nd.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/dct.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_bitbuffer.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_core.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_crc.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_hybrid.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_tools_rom.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/FDK_trigFcts.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/fft.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/fft_rad2.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/fixpoint_math.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/mdct.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/qmf.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libFDK/src/scale.lo: libFDK/src/$(am__dirstamp) \ libFDK/src/$(DEPDIR)/$(am__dirstamp) libSYS/src/$(am__dirstamp): @$(MKDIR_P) libSYS/src @: > libSYS/src/$(am__dirstamp) libSYS/src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) libSYS/src/$(DEPDIR) @: > libSYS/src/$(DEPDIR)/$(am__dirstamp) libSYS/src/cmdl_parser.lo: libSYS/src/$(am__dirstamp) \ libSYS/src/$(DEPDIR)/$(am__dirstamp) libSYS/src/conv_string.lo: libSYS/src/$(am__dirstamp) \ libSYS/src/$(DEPDIR)/$(am__dirstamp) libSYS/src/genericStds.lo: libSYS/src/$(am__dirstamp) \ libSYS/src/$(DEPDIR)/$(am__dirstamp) libSYS/src/wav_file.lo: libSYS/src/$(am__dirstamp) \ libSYS/src/$(DEPDIR)/$(am__dirstamp) libfdk-aac.la: $(libfdk_aac_la_OBJECTS) $(libfdk_aac_la_DEPENDENCIES) $(EXTRA_libfdk_aac_la_DEPENDENCIES) $(AM_V_GEN)$(libfdk_aac_la_LINK) -rpath $(libdir) $(libfdk_aac_la_OBJECTS) $(libfdk_aac_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list aac-enc$(EXEEXT): $(aac_enc_OBJECTS) $(aac_enc_DEPENDENCIES) $(EXTRA_aac_enc_DEPENDENCIES) @rm -f aac-enc$(EXEEXT) $(AM_V_CCLD)$(LINK) $(aac_enc_OBJECTS) $(aac_enc_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f libAACdec/src/*.$(OBJEXT) -rm -f libAACdec/src/*.lo -rm -f libAACenc/src/*.$(OBJEXT) -rm -f libAACenc/src/*.lo -rm -f libFDK/src/*.$(OBJEXT) -rm -f libFDK/src/*.lo -rm -f libMpegTPDec/src/*.$(OBJEXT) -rm -f libMpegTPDec/src/*.lo -rm -f libMpegTPEnc/src/*.$(OBJEXT) -rm -f libMpegTPEnc/src/*.lo -rm -f libPCMutils/src/*.$(OBJEXT) -rm -f libPCMutils/src/*.lo -rm -f libSBRdec/src/*.$(OBJEXT) -rm -f libSBRdec/src/*.lo -rm -f libSBRenc/src/*.$(OBJEXT) -rm -f libSBRenc/src/*.lo -rm -f libSYS/src/*.$(OBJEXT) -rm -f libSYS/src/*.lo distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aac-enc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dummy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wavreader.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aac_ram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aac_rom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_drc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_hcr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_hcr_bit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_hcrs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_pns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdec_tns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdecoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/aacdecoder_lib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/block.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/channel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/channelinfo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/conceal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/ldfiltbank.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/pulsedata.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/rvlc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/rvlcbit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/rvlcconceal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACdec/src/$(DEPDIR)/stereo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacEnc_ram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacEnc_rom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacenc_hcr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacenc_lib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacenc_pns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/aacenc_tns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/adj_thr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/band_nrg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/bandwidth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/bit_cnt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/bitenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/block_switch.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/channel_map.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/chaosmeasure.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/dyn_bits.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/grp_data.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/intensity.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/line_pe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/metadata_compressor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/metadata_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/ms_stereo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/noisedet.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/pnsparam.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/pre_echo_control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/psy_configuration.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/psy_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/qc_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/quantize.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/sf_estim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/spreading.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/tonality.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libAACenc/src/$(DEPDIR)/transform.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_bitbuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_crc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_hybrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_tools_rom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/FDK_trigFcts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/autocorr2nd.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/dct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/fft.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/fft_rad2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/fixpoint_math.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/mdct.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/qmf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libFDK/src/$(DEPDIR)/scale.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPDec/src/$(DEPDIR)/tpdec_adif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPDec/src/$(DEPDIR)/tpdec_adts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPDec/src/$(DEPDIR)/tpdec_asc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPDec/src/$(DEPDIR)/tpdec_latm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPDec/src/$(DEPDIR)/tpdec_lib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPEnc/src/$(DEPDIR)/tpenc_adif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPEnc/src/$(DEPDIR)/tpenc_adts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPEnc/src/$(DEPDIR)/tpenc_asc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPEnc/src/$(DEPDIR)/tpenc_latm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libMpegTPEnc/src/$(DEPDIR)/tpenc_lib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libPCMutils/src/$(DEPDIR)/pcmutils_lib.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/env_calc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/env_dec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/env_extr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/huff_dec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/lpp_tran.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/psbitdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/psdec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/psdec_hybrid.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbr_crc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbr_deb.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbr_dec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbr_ram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbr_rom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbrdec_drc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbrdec_freq_sca.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRdec/src/$(DEPDIR)/sbrdecoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/bit_sbr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/code_env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/env_bit.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/env_est.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/fram_gen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/invf_est.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/mh_det.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/nf_est.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/ps_bitenc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/ps_encode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/ps_main.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/resampler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/sbr_encoder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/sbr_misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/sbr_ram.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/sbr_rom.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/sbrenc_freq_sca.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/ton_corr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSBRenc/src/$(DEPDIR)/tran_det.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSYS/src/$(DEPDIR)/cmdl_parser.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSYS/src/$(DEPDIR)/conv_string.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSYS/src/$(DEPDIR)/genericStds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@libSYS/src/$(DEPDIR)/wav_file.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf libAACdec/src/.libs libAACdec/src/_libs -rm -rf libAACenc/src/.libs libAACenc/src/_libs -rm -rf libFDK/src/.libs libFDK/src/_libs -rm -rf libMpegTPDec/src/.libs libMpegTPDec/src/_libs -rm -rf libMpegTPEnc/src/.libs libMpegTPEnc/src/_libs -rm -rf libPCMutils/src/.libs libPCMutils/src/_libs -rm -rf libSBRdec/src/.libs libSBRdec/src/_libs -rm -rf libSBRenc/src/.libs libSBRenc/src/_libs -rm -rf libSYS/src/.libs libSYS/src/_libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-fdk_aacincludeHEADERS: $(fdk_aacinclude_HEADERS) @$(NORMAL_INSTALL) @list='$(fdk_aacinclude_HEADERS)'; test -n "$(fdk_aacincludedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(fdk_aacincludedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(fdk_aacincludedir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(fdk_aacincludedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(fdk_aacincludedir)" || exit $$?; \ done uninstall-fdk_aacincludeHEADERS: @$(NORMAL_UNINSTALL) @list='$(fdk_aacinclude_HEADERS)'; test -n "$(fdk_aacincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(fdk_aacincludedir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(fdk_aacincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f libAACdec/src/$(DEPDIR)/$(am__dirstamp) -rm -f libAACdec/src/$(am__dirstamp) -rm -f libAACenc/src/$(DEPDIR)/$(am__dirstamp) -rm -f libAACenc/src/$(am__dirstamp) -rm -f libFDK/src/$(DEPDIR)/$(am__dirstamp) -rm -f libFDK/src/$(am__dirstamp) -rm -f libMpegTPDec/src/$(DEPDIR)/$(am__dirstamp) -rm -f libMpegTPDec/src/$(am__dirstamp) -rm -f libMpegTPEnc/src/$(DEPDIR)/$(am__dirstamp) -rm -f libMpegTPEnc/src/$(am__dirstamp) -rm -f libPCMutils/src/$(DEPDIR)/$(am__dirstamp) -rm -f libPCMutils/src/$(am__dirstamp) -rm -f libSBRdec/src/$(DEPDIR)/$(am__dirstamp) -rm -f libSBRdec/src/$(am__dirstamp) -rm -f libSBRenc/src/$(DEPDIR)/$(am__dirstamp) -rm -f libSBRenc/src/$(am__dirstamp) -rm -f libSYS/src/$(DEPDIR)/$(am__dirstamp) -rm -f libSYS/src/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) libAACdec/src/$(DEPDIR) libAACenc/src/$(DEPDIR) libFDK/src/$(DEPDIR) libMpegTPDec/src/$(DEPDIR) libMpegTPEnc/src/$(DEPDIR) libPCMutils/src/$(DEPDIR) libSBRdec/src/$(DEPDIR) libSBRenc/src/$(DEPDIR) libSYS/src/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-fdk_aacincludeHEADERS install-pkgconfigDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) libAACdec/src/$(DEPDIR) libAACenc/src/$(DEPDIR) libFDK/src/$(DEPDIR) libMpegTPDec/src/$(DEPDIR) libMpegTPEnc/src/$(DEPDIR) libPCMutils/src/$(DEPDIR) libSBRdec/src/$(DEPDIR) libSBRenc/src/$(DEPDIR) libSYS/src/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-fdk_aacincludeHEADERS \ uninstall-libLTLIBRARIES uninstall-pkgconfigDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-cscope clean-generic \ clean-libLTLIBRARIES clean-libtool cscope cscopelist-am ctags \ ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am \ install-fdk_aacincludeHEADERS install-html install-html-am \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-pkgconfigDATA \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-fdk_aacincludeHEADERS uninstall-libLTLIBRARIES \ uninstall-pkgconfigDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fdk-aac-0.1.3/config.guess0000755000175000017500000013036112372262356015737 0ustar00tootstoots00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fdk-aac-0.1.3/Android.mk0000644000175000017500000000427412144411136015320 0ustar00tootstoots00000000000000LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) aacdec_sources := $(wildcard $(LOCAL_PATH)/libAACdec/src/*.cpp) aacdec_sources := $(aacdec_sources:$(LOCAL_PATH)/libAACdec/src/%=%) aacenc_sources := $(wildcard $(LOCAL_PATH)/libAACenc/src/*.cpp) aacenc_sources := $(aacenc_sources:$(LOCAL_PATH)/libAACenc/src/%=%) pcmutils_sources := $(wildcard $(LOCAL_PATH)/libPCMutils/src/*.cpp) pcmutils_sources := $(pcmutils_sources:$(LOCAL_PATH)/libPCMutils/src/%=%) fdk_sources := $(wildcard $(LOCAL_PATH)/libFDK/src/*.cpp) fdk_sources := $(fdk_sources:$(LOCAL_PATH)/libFDK/src/%=%) sys_sources := $(wildcard $(LOCAL_PATH)/libSYS/src/*.cpp) sys_sources := $(sys_sources:$(LOCAL_PATH)/libSYS/src/%=%) mpegtpdec_sources := $(wildcard $(LOCAL_PATH)/libMpegTPDec/src/*.cpp) mpegtpdec_sources := $(mpegtpdec_sources:$(LOCAL_PATH)/libMpegTPDec/src/%=%) mpegtpenc_sources := $(wildcard $(LOCAL_PATH)/libMpegTPEnc/src/*.cpp) mpegtpenc_sources := $(mpegtpenc_sources:$(LOCAL_PATH)/libMpegTPEnc/src/%=%) sbrdec_sources := $(wildcard $(LOCAL_PATH)/libSBRdec/src/*.cpp) sbrdec_sources := $(sbrdec_sources:$(LOCAL_PATH)/libSBRdec/src/%=%) sbrenc_sources := $(wildcard $(LOCAL_PATH)/libSBRenc/src/*.cpp) sbrenc_sources := $(sbrenc_sources:$(LOCAL_PATH)/libSBRenc/src/%=%) LOCAL_SRC_FILES := \ $(aacdec_sources:%=libAACdec/src/%) \ $(aacenc_sources:%=libAACenc/src/%) \ $(pcmutils_sources:%=libPCMutils/src/%) \ $(fdk_sources:%=libFDK/src/%) \ $(sys_sources:%=libSYS/src/%) \ $(mpegtpdec_sources:%=libMpegTPDec/src/%) \ $(mpegtpenc_sources:%=libMpegTPEnc/src/%) \ $(sbrdec_sources:%=libSBRdec/src/%) \ $(sbrenc_sources:%=libSBRenc/src/%) LOCAL_CFLAGS := -DANDROID LOCAL_CFLAGS += -Wno-sequence-point -Wno-extra LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/libAACdec/include \ $(LOCAL_PATH)/libAACenc/include \ $(LOCAL_PATH)/libPCMutils/include \ $(LOCAL_PATH)/libFDK/include \ $(LOCAL_PATH)/libSYS/include \ $(LOCAL_PATH)/libMpegTPDec/include \ $(LOCAL_PATH)/libMpegTPEnc/include \ $(LOCAL_PATH)/libSBRdec/include \ $(LOCAL_PATH)/libSBRenc/include LOCAL_MODULE:= libFraunhoferAAC include $(BUILD_STATIC_LIBRARY) fdk-aac-0.1.3/libFDK/0000755000175000017500000000000012372262442014502 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/include/0000755000175000017500000000000012372262446016131 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/include/FDK_hybrid.h0000644000175000017500000002530512372261464020253 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Markus Lohwasser Description: FDK Tools Hybrid Filterbank ******************************************************************************/ #ifndef __FDK_HYBRID_H #define __FDK_HYBRID_H #include "common_fix.h" /*--------------- enums -------------------------------*/ /** * Hybrid Filterband modes. */ typedef enum { THREE_TO_TEN, THREE_TO_TWELVE, THREE_TO_SIXTEEN } FDK_HYBRID_MODE; /*--------------- structure definitions ---------------*/ typedef struct FDK_HYBRID_SETUP *HANDLE_FDK_HYBRID_SETUP; typedef struct { FIXP_DBL *bufferLFReal[3]; /*!< LF real filter states. */ FIXP_DBL *bufferLFImag[3]; /*!< LF imag filter states. */ FIXP_DBL *bufferHFReal[13]; /*!< HF real delay lines. */ FIXP_DBL *bufferHFImag[13]; /*!< HF imag delay lines. */ INT bufferLFpos; /*!< Position to write incoming data into ringbuffer. */ INT bufferHFpos; /*!< Delay line positioning. */ INT nrBands; /*!< Number of QMF bands. */ INT cplxBands; /*!< Number of complex QMF bands.*/ UCHAR hfMode; /*!< Flag signalizes treatment of HF bands. */ FIXP_DBL *pLFmemory; /*!< Pointer to LF states buffer. */ FIXP_DBL *pHFmemory; /*!< Pointer to HF states buffer. */ UINT LFmemorySize; /*!< Size of LF states buffer. */ UINT HFmemorySize; /*!< Size of HF states buffer. */ HANDLE_FDK_HYBRID_SETUP pSetup; /*!< Pointer to filter setup. */ } FDK_ANA_HYB_FILTER; typedef struct { INT nrBands; /*!< Number of QMF bands. */ INT cplxBands; /*!< Number of complex QMF bands.*/ HANDLE_FDK_HYBRID_SETUP pSetup; /*!< Pointer to filter setup. */ } FDK_SYN_HYB_FILTER; typedef FDK_ANA_HYB_FILTER *HANDLE_FDK_ANA_HYB_FILTER; typedef FDK_SYN_HYB_FILTER *HANDLE_FDK_SYN_HYB_FILTER; /** * \brief Create one instance of Hybrid Analyis Filterbank. * * \param hAnalysisHybFilter Pointer to an outlying allocated Hybrid Analysis Filterbank structure. * \param pLFmemory Pointer to outlying buffer used LF filtering. * \param LFmemorySize Size of pLFmemory in bytes. * \param pHFmemory Pointer to outlying buffer used HF delay line. * \param HFmemorySize Size of pLFmemory in bytes. * * \return 0 on success. */ INT FDKhybridAnalysisOpen( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, FIXP_DBL *const pLFmemory, const UINT LFmemorySize, FIXP_DBL *const pHFmemory, const UINT HFmemorySize ); /** * \brief Initialize and configure Hybrdid Analysis Filterbank instance. * * \param hAnalysisHybFilter A Hybrid Analysis Filterbank handle. * \param mode Select hybrid filter configuration. * \param qmfBands Number of qmf bands to be processed. * \param cplxBands Number of complex qmf bands to be processed. * \param initStatesFlag Indicates whether the states buffer has to be cleared. * * \return 0 on success. */ INT FDKhybridAnalysisInit( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const FDK_HYBRID_MODE mode, const INT qmfBands, const INT cplxBands, const INT initStatesFlag ); /** * \brief Adjust Hybrdid Analysis Filterbank states. * * \param hAnalysisHybFilter A Hybrid Analysis Filterbank handle. * \param scalingValue Scaling value to be applied on filter states. * * \return 0 on success. */ INT FDKhybridAnalysisScaleStates( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const INT scalingValue ); /** * \brief Apply Hybrid Analysis Filterbank on Qmf input data. * * \param hAnalysisHybFilter A Hybrid Analysis Filterbank handle. * \param pQmfReal Qmf input data. * \param pQmfImag Qmf input data. * \param pHybridReal Hybrid output data. * \param pHybridImag Hybrid output data. * * \return 0 on success. */ INT FDKhybridAnalysisApply( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, FIXP_DBL *const pHybridReal, FIXP_DBL *const pHybridImag ); /** * \brief Close a Hybrid Analysis Filterbank instance. * * \param hAnalysisHybFilter Pointer to a Hybrid Analysis Filterbank instance. * * \return 0 on success. */ INT FDKhybridAnalysisClose( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter ); /** * \brief Initialize and configure Hybrdid Synthesis Filterbank instance. * * \param hSynthesisHybFilter A Hybrid Synthesis Filterbank handle. * \param mode Select hybrid filter configuration. * \param qmfBands Number of qmf bands to be processed. * \param cplxBands Number of complex qmf bands to be processed. * * \return 0 on success. */ INT FDKhybridSynthesisInit( HANDLE_FDK_SYN_HYB_FILTER hSynthesisHybFilter, const FDK_HYBRID_MODE mode, const INT qmfBands, const INT cplxBands ); /** * \brief Apply Hybrid Analysis Filterbank on Hybrid data. * * \param hSynthesisHybFilter A Hybrid Analysis Filterbandk handle. * \param pHybridReal Hybrid input data. * \param pHybridImag Hybrid input data. * \param pQmfReal Qmf output data. * \param pQmfImag Qmf output data. * * \return 0 on success. */ INT FDKhybridSynthesisApply( HANDLE_FDK_SYN_HYB_FILTER hSynthesisHybFilter, const FIXP_DBL *const pHybridReal, const FIXP_DBL *const pHybridImag, FIXP_DBL *const pQmfReal, FIXP_DBL *const pQmfImag ); #endif /* __FDK_HYBRID_H */ fdk-aac-0.1.3/libFDK/include/mips/0000755000175000017500000000000012372262446017101 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/include/mips/abs_mips.h0000644000175000017500000001245312372261464021053 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__mips__) #if defined(__GNUC__) && defined(__mips__) #if defined(__mips_dsp) #define FUNCTION_fixabs_D #define FUNCTION_fixabs_I #define FUNCTION_fixabs_S inline FIXP_DBL fixabs_D(FIXP_DBL x) { return __builtin_mips_absq_s_w(x); } inline FIXP_SGL fixabs_S(FIXP_SGL x) { return ((x) > (FIXP_SGL)(0)) ? (x) : -(x) ; } inline INT fixabs_I(INT x) { return __builtin_mips_absq_s_w(x); } #endif /* __mips_dsp */ #endif /* defined(__GNUC__) && defined(__mips__) */ #endif /*__mips__ */ fdk-aac-0.1.3/libFDK/include/mips/cplx_mul.h0000644000175000017500000001541212372261464021077 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__GNUC__) && defined(__mips__) //#define FUNCTION_cplxMultDiv2_32x16 //#define FUNCTION_cplxMultDiv2_32x16X2 #define FUNCTION_cplxMultDiv2_32x32X2 //#define FUNCTION_cplxMult_32x16 //#define FUNCTION_cplxMult_32x16X2 #define FUNCTION_cplxMult_32x32X2 #if defined(FUNCTION_cplxMultDiv2_32x32X2) inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, FIXP_DBL a_Re, FIXP_DBL a_Im, FIXP_DBL b_Re, FIXP_DBL b_Im) { INT result; __asm__ ("mult %[a_Re], %[b_Re];\n" "msub %[a_Im], %[b_Im];\n" "mfhi %[result];\n" : [result]"=r"(result) : [a_Re]"d"(a_Re), [b_Re]"d"(b_Re), [a_Im]"d"(a_Im), [b_Im]"d"(b_Im) : "lo"); *c_Re = result; __asm__ ("mult %[a_Re], %[b_Im];\n" "madd %[a_Im], %[b_Re];\n" "mfhi %[result];\n" : [result]"=r"(result) : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) : "lo"); *c_Im = result; } #endif #if defined(FUNCTION_cplxMult_32x32X2) inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL *c_Im, FIXP_DBL a_Re, FIXP_DBL a_Im, FIXP_DBL b_Re, FIXP_DBL b_Im) { INT result; __asm__ ("mult %[a_Re], %[b_Re];\n" "msub %[a_Im], %[b_Im];\n" "mfhi %[result];\n" //"extr_w %[result], 31;\n" : [result]"=r"(result) : [a_Re]"r"(a_Re), [b_Re]"r"(b_Re), [a_Im]"r"(a_Im), [b_Im]"r"(b_Im) : "lo"); *c_Re = result<<1; __asm__ ("mult %[a_Re], %[b_Im];\n" "madd %[a_Im], %[b_Re];\n" "mfhi %[result];\n" //"extr_w %[result], 31;\n" : [result]"=r"(result) : [a_Re]"r"(a_Re), [b_Im]"r"(b_Im), [a_Im]"r"(a_Im), [b_Re]"r"(b_Re) : "lo"); *c_Im = result<<1; } #endif #endif /* defined(__GNUC__) && defined(__mips__) */ fdk-aac-0.1.3/libFDK/include/mips/fixmadd_mips.h0000644000175000017500000001150412372261464021716 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__mips__) #endif /* __mips__ */ fdk-aac-0.1.3/libFDK/include/mips/scale.h0000644000175000017500000001236012372261464020342 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: ******************************************************************************/ #ifndef MIPS_SCALE_H #define MIPS_SCALE_H #if defined(__mips_dsp) /*! * * \brief Scale input value by 2^{scale} and saturate output to 2^{dBits-1} * \return scaled and saturated value * * This macro scales src value right or left and applies saturation to (2^dBits)-1 * maxima output. */ #define SATURATE_RIGHT_SHIFT(src, scale, dBits) \ (__builtin_mips_shll_s_w((src)>>scale,(DFRACT_BITS-(dBits)))>>(DFRACT_BITS-(dBits))) #endif /*__mips_dsp */ #endif /* MIPS_SCALE_H */ fdk-aac-0.1.3/libFDK/include/mips/scramble.h0000644000175000017500000001236012372261464021043 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: ******************************************************************************/ #ifndef MIPS_SCRAMBLE_H #define MIPS_SCRAMBLE_H #define FUNCTION_scramble #if defined(FUNCTION_scramble) inline void scramble(FIXP_DBL *x, INT n) { INT m,j; int ldn=1; do {ldn++;} while((1<> (16-ldn); if (j>m) { FIXP_DBL tmp; tmp=x[2*m]; x[2*m]=x[2*j]; x[2*j]=tmp; tmp=x[2*m+1]; x[2*m+1]=x[2*j+1]; x[2*j+1]=tmp; } } } #endif #endif /* MIPS_SCRAMBLE_H */ fdk-aac-0.1.3/libFDK/include/mips/clz_mips.h0000644000175000017500000001245312372261464021076 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__mips__) #if defined(__mips__) && (__GNUC__==2) && (mips>=32) #define FUNCTION_fixnormz_D inline INT fixnormz_D(LONG value) { INT result; __asm__ ("clz %0,%1" : "=d" (result) : "d" (value)); return result; } #elif defined(__mips__) && (__GNUC__==3) && (__mips>=32) #define FUNCTION_fixnormz_D INT inline fixnormz_D(LONG value) { INT result; __asm__ ("clz %[result], %[value]" : [result] "=r" (result) : [value] "r" (value)) ; return result; } #endif #endif /* __mips__ */ fdk-aac-0.1.3/libFDK/include/mips/fixmul_mips.h0000644000175000017500000001242012372261464021604 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__mips__) #if (__GNUC__) && defined(__mips__) /* cppp replaced: elif */ /* MIPS GCC based compiler */ #define FUNCTION_fixmuldiv2_DD #define FUNCTION_fixmuldiv2BitExact_DD #define fixmuldiv2BitExact_DD(a,b) fixmuldiv2_DD(a,b) inline INT fixmuldiv2_DD (const INT a, const INT b) { INT result ; result = ((long long)a * b)>>32; return result ; } #endif /* (__GNUC__) && defined(__mips__) */ #endif /* __mips__ */ #define FUNCTION_fixmulBitExact_DD #define fixmulBitExact_DD fixmul_DD fdk-aac-0.1.3/libFDK/include/FDK_bitstream.h0000644000175000017500000005235712372261464020773 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): M. Lohwasser Description: bitstream interface to bitbuffer routines ******************************************************************************/ #ifndef __FDK_BITSTREAM_H__ #define __FDK_BITSTREAM_H__ #include "FDK_bitbuffer.h" #include "machine_type.h" #include "genericStds.h" #define CACHE_BITS 32 typedef enum { BS_READER, BS_WRITER } FDK_BS_CFG; typedef struct { UINT CacheWord ; UINT BitsInCache ; FDK_BITBUF hBitBuf; UINT ConfigCache ; } FDK_BITSTREAM; typedef FDK_BITSTREAM* HANDLE_FDK_BITSTREAM; /** * \brief CreateBitStream Function. * * Create and initialize bitstream with extern allocated buffer. * * \param pBuffer Pointer to BitBuffer array. * \param bufSize Length of BitBuffer array. (awaits size 2^n) * \param config Initialize BitStream as Reader or Writer. */ FDK_INLINE HANDLE_FDK_BITSTREAM FDKcreateBitStream (UCHAR *pBuffer, UINT bufSize, FDK_BS_CFG config = BS_READER) { HANDLE_FDK_BITSTREAM hBitStream = (HANDLE_FDK_BITSTREAM) FDKcalloc(1, sizeof(FDK_BITSTREAM)); FDK_InitBitBuffer(&hBitStream->hBitBuf, pBuffer, bufSize, 0) ; /* init cache */ hBitStream->CacheWord = hBitStream->BitsInCache = 0 ; hBitStream->ConfigCache = config ; return hBitStream ; } /** * \brief Initialize BistreamBuffer. BitBuffer can point to filled BitBuffer array . * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param pBuffer Pointer to BitBuffer array. * \param bufSize Length of BitBuffer array. (awaits size 2^n) * \param validBits Number of valid BitBuffer filled Bits. * \param config Initialize BitStream as Reader or Writer. * \return void */ FDK_INLINE void FDKinitBitStream (HANDLE_FDK_BITSTREAM hBitStream, UCHAR *pBuffer, UINT bufSize, UINT validBits, FDK_BS_CFG config = BS_READER) { FDK_InitBitBuffer(&hBitStream->hBitBuf, pBuffer, bufSize, validBits) ; /* init cache */ hBitStream->CacheWord = hBitStream->BitsInCache = 0 ; hBitStream->ConfigCache = config ; } /** * \brief ResetBitbuffer Function. Reset states in BitBuffer and Cache. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param config Initialize BitStream as Reader or Writer. * \return void */ FDK_INLINE void FDKresetBitbuffer( HANDLE_FDK_BITSTREAM hBitStream, FDK_BS_CFG config = BS_READER) { FDK_ResetBitBuffer( &hBitStream->hBitBuf ) ; /* init cache */ hBitStream->CacheWord = hBitStream->BitsInCache = 0 ; hBitStream->ConfigCache = config ; } /** DeleteBitStream. Deletes the in Create Bitstream allocated BitStream and BitBuffer. */ FDK_INLINE void FDKdeleteBitStream (HANDLE_FDK_BITSTREAM hBitStream) { FDK_DeleteBitBuffer(&hBitStream->hBitBuf) ; FDKfree(hBitStream) ; } /** * \brief ReadBits Function (forward). This function returns a number of sequential * bits from the input bitstream. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param numberOfBits The number of bits to be retrieved. * \return the requested bits, right aligned * \return */ #define OPTIMIZE_FDKREADBITS FDK_INLINE UINT FDKreadBits(HANDLE_FDK_BITSTREAM hBitStream, const UINT numberOfBits) { #ifdef noOPTIMIZE_FDKREADBITS INT missingBits = numberOfBits - hBitStream->BitsInCache; if (missingBits > 0) { UINT bits = hBitStream->CacheWord << missingBits; hBitStream->CacheWord = FDK_get32 (&hBitStream->hBitBuf) ; hBitStream->BitsInCache = CACHE_BITS - missingBits; return ( bits | (hBitStream->CacheWord >> hBitStream->BitsInCache)) & BitMask[numberOfBits]; } hBitStream->BitsInCache -= numberOfBits; return ( hBitStream->CacheWord >> hBitStream->BitsInCache) & BitMask[numberOfBits]; #else const UINT validMask = BitMask [numberOfBits] ; if (hBitStream->BitsInCache <= numberOfBits) { const INT freeBits = (CACHE_BITS-1) - hBitStream->BitsInCache ; hBitStream->CacheWord = (hBitStream->CacheWord << freeBits) | FDK_get (&hBitStream->hBitBuf,freeBits) ; hBitStream->BitsInCache += freeBits ; } hBitStream->BitsInCache -= numberOfBits ; return (hBitStream->CacheWord >> hBitStream->BitsInCache) & validMask ; #endif } FDK_INLINE UINT FDKreadBit(HANDLE_FDK_BITSTREAM hBitStream) { #ifdef OPTIMIZE_FDKREADBITS if (!hBitStream->BitsInCache) { hBitStream->CacheWord = FDK_get32 (&hBitStream->hBitBuf); hBitStream->BitsInCache = CACHE_BITS; } hBitStream->BitsInCache--; return (hBitStream->CacheWord >> hBitStream->BitsInCache) & 1; #else return FDKreadBits(hBitStream,1); #endif } /** * \brief Read2Bits Function (forward). This function 2 sequential * bits from the input bitstream. It is the optimized version of FDKreadBits() for readign 2 bits. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return the requested bits, right aligned * \return */ inline UINT FDKread2Bits(HANDLE_FDK_BITSTREAM hBitStream) { UINT BitsInCache = hBitStream->BitsInCache; if (BitsInCache < 2) /* Comparison changed from 'less-equal' to 'less' */ { const INT freeBits = (CACHE_BITS-1) - BitsInCache ; hBitStream->CacheWord = (hBitStream->CacheWord << freeBits) | FDK_get (&hBitStream->hBitBuf,freeBits) ; BitsInCache += freeBits; } hBitStream->BitsInCache = BitsInCache - 2; return (hBitStream->CacheWord >> hBitStream->BitsInCache) & 0x3; } /** * \brief ReadBits Function (backward). This function returns a number of sequential bits * from the input bitstream. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param numberOfBits The number of bits to be retrieved. * \return the requested bits, right aligned */ FDK_INLINE UINT FDKreadBitsBwd(HANDLE_FDK_BITSTREAM hBitStream, const UINT numberOfBits) { const UINT validMask = BitMask [numberOfBits] ; if (hBitStream->BitsInCache <= numberOfBits) { const INT freeBits = (CACHE_BITS-1) - hBitStream->BitsInCache ; hBitStream->CacheWord = (hBitStream->CacheWord << freeBits) | FDK_getBwd (&hBitStream->hBitBuf,freeBits) ; hBitStream->BitsInCache += freeBits ; } hBitStream->BitsInCache -= numberOfBits ; return (hBitStream->CacheWord >> hBitStream->BitsInCache) & validMask ; } /** * \brief return a number of bits from the bitBuffer. * You have to know what you do! Cache has to be synchronized before using this * function. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param numBits The number of bits to be retrieved. * \return the requested bits, right aligned */ FDK_INLINE UINT FDKgetBits (HANDLE_FDK_BITSTREAM hBitStream, UINT numBits) { return FDK_get (&hBitStream->hBitBuf, numBits) ; } /** * \brief WriteBits Function. This function writes numberOfBits of value into bitstream. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param value Variable holds data to be written. * \param numberOfBits The number of bits to be written. * \return number of bits written */ FDK_INLINE UCHAR FDKwriteBits(HANDLE_FDK_BITSTREAM hBitStream, UINT value, const UINT numberOfBits) { const UINT validMask = BitMask [numberOfBits] ; if ((hBitStream->BitsInCache+numberOfBits) < CACHE_BITS) { hBitStream->BitsInCache += numberOfBits ; hBitStream->CacheWord = (hBitStream->CacheWord << numberOfBits) | (value & validMask); } else { FDK_put(&hBitStream->hBitBuf, hBitStream->CacheWord, hBitStream->BitsInCache) ; hBitStream->BitsInCache = numberOfBits ; hBitStream->CacheWord = (value & validMask) ; } return numberOfBits; } /** * \brief WriteBits Function (backward). This function writes numberOfBits of value into bitstream. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param value Variable holds data to be written. * \param numberOfBits The number of bits to be written. * \return number of bits written */ FDK_INLINE UCHAR FDKwriteBitsBwd(HANDLE_FDK_BITSTREAM hBitStream, UINT value, const UINT numberOfBits) { const UINT validMask = BitMask [numberOfBits] ; if ((hBitStream->BitsInCache+numberOfBits) <= CACHE_BITS) { hBitStream->BitsInCache += numberOfBits ; hBitStream->CacheWord = (hBitStream->CacheWord << numberOfBits) | (value & validMask); } else { FDK_putBwd(&hBitStream->hBitBuf, hBitStream->CacheWord, hBitStream->BitsInCache) ; hBitStream->BitsInCache = numberOfBits ; hBitStream->CacheWord = (value & validMask) ; } return numberOfBits; } /** * \brief SyncCache Function. Clear cache after read forward. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return void */ FDK_INLINE void FDKsyncCache (HANDLE_FDK_BITSTREAM hBitStream) { if (hBitStream->ConfigCache == BS_READER) FDK_pushBack (&hBitStream->hBitBuf,hBitStream->BitsInCache,hBitStream->ConfigCache) ; else /* BS_WRITER */ FDK_put(&hBitStream->hBitBuf, hBitStream->CacheWord, hBitStream->BitsInCache) ; hBitStream->BitsInCache = 0 ; hBitStream->CacheWord = 0 ; } /** * \brief SyncCache Function. Clear cache after read backwards. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return void */ FDK_INLINE void FDKsyncCacheBwd (HANDLE_FDK_BITSTREAM hBitStream) { if (hBitStream->ConfigCache == BS_READER) { FDK_pushForward (&hBitStream->hBitBuf,hBitStream->BitsInCache,hBitStream->ConfigCache) ; } else { /* BS_WRITER */ FDK_putBwd (&hBitStream->hBitBuf, hBitStream->CacheWord, hBitStream->BitsInCache) ; } hBitStream->BitsInCache = 0 ; hBitStream->CacheWord = 0 ; } /** * \brief Byte Alignment Function. * This function performs the byte_alignment() syntactic function on the input stream, * i.e. some bits will be discarded/padded so that the next bits to be read/written will * be aligned on a byte boundary with respect to the bit position 0. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return void */ FDK_INLINE void FDKbyteAlign (HANDLE_FDK_BITSTREAM hBitStream) { FDKsyncCache (hBitStream) ; FDK_byteAlign (&hBitStream->hBitBuf, (UCHAR)hBitStream->ConfigCache) ; } /** * \brief Byte Alignment Function with anchor * This function performs the byte_alignment() syntactic function on the input stream, * i.e. some bits will be discarded so that the next bits to be read/written would be aligned * on a byte boundary with respect to the given alignment anchor. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param alignmentAnchor bit position to be considered as origin for byte alignment * \return void */ FDK_INLINE void FDKbyteAlign (HANDLE_FDK_BITSTREAM hBitStream, UINT alignmentAnchor) { FDKsyncCache (hBitStream) ; if (hBitStream->ConfigCache == BS_READER) { FDK_pushForward (&hBitStream->hBitBuf, (8 - ((alignmentAnchor - FDK_getValidBits(&hBitStream->hBitBuf)) & 0x07)) & 0x07, hBitStream->ConfigCache) ; } else { FDK_put (&hBitStream->hBitBuf, 0, (8 - ((FDK_getValidBits(&hBitStream->hBitBuf)-alignmentAnchor) & 0x07)) & 0x07 ); } } /** * \brief Push Back(Cache) / For / BiDirectional Function. * PushBackCache function ungets a number of bits erroneously read/written by the last Get() call. * NB: The number of bits to be stuffed back into the stream may never exceed the * number of bits returned by the immediately preceding Get() call. * * PushBack function ungets a number of bits (combines cache and bitbuffer indices) * PushFor function gets a number of bits (combines cache and bitbuffer indices) * PushBiDirectional gets/ungets number of bits as defined in PusBack/For function * NB: The sign of bits is not known, so the function checks direction and calls * appropriate function. (positive sign pushFor, negative sign pushBack ) * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param numberOfBits The number of bits to be pushed back/for. * \return void */ FDK_INLINE void FDKpushBackCache (HANDLE_FDK_BITSTREAM hBitStream, const UINT numberOfBits) { FDK_ASSERT ((hBitStream->BitsInCache+numberOfBits)<=CACHE_BITS); hBitStream->BitsInCache += numberOfBits ; } FDK_INLINE void FDKpushBack (HANDLE_FDK_BITSTREAM hBitStream, const UINT numberOfBits) { if ((hBitStream->BitsInCache+numberOfBits)ConfigCache == BS_READER) ) { hBitStream->BitsInCache += numberOfBits ; FDKsyncCache(hBitStream) ; /* sync cache to avoid invalid cache */ } else { FDKsyncCache(hBitStream) ; FDK_pushBack(&hBitStream->hBitBuf,numberOfBits,hBitStream->ConfigCache); } } FDK_INLINE void FDKpushFor (HANDLE_FDK_BITSTREAM hBitStream, const UINT numberOfBits) { if ( (hBitStream->BitsInCache>numberOfBits) && (hBitStream->ConfigCache == BS_READER) ) { hBitStream->BitsInCache -= numberOfBits; } else { FDKsyncCache(hBitStream) ; FDK_pushForward(&hBitStream->hBitBuf,numberOfBits,hBitStream->ConfigCache); } } FDK_INLINE void FDKpushBiDirectional (HANDLE_FDK_BITSTREAM hBitStream, const INT numberOfBits) { if(numberOfBits>=0) FDKpushFor(hBitStream, numberOfBits) ; else FDKpushBack(hBitStream, -numberOfBits) ; } /** * \brief GetValidBits Function. Clear cache and return valid Bits from Bitbuffer. * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return amount of valid bits that still can be read or were already written. * */ FDK_INLINE UINT FDKgetValidBits (HANDLE_FDK_BITSTREAM hBitStream) { FDKsyncCache(hBitStream) ; return FDK_getValidBits(&hBitStream->hBitBuf) ; } /** * \brief return amount of unused Bits from Bitbuffer. * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return amount of free bits that still can be written into the bitstream */ FDK_INLINE INT FDKgetFreeBits (HANDLE_FDK_BITSTREAM hBitStream) { return FDK_getFreeBits (&hBitStream->hBitBuf) ; } /** * \brief reset bitcounter in bitBuffer to zero. * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return void */ FDK_INLINE void FDKresetBitCnt (HANDLE_FDK_BITSTREAM hBitStream) { FDKsyncCache (hBitStream) ; FDK_setBitCnt (&hBitStream->hBitBuf, 0) ; } /** * \brief set bitcoutner in bitBuffer to given value. * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param value new value to be assigned to the bit counter * \return void */ FDK_INLINE void FDKsetBitCnt (HANDLE_FDK_BITSTREAM hBitStream, UINT value) { FDKsyncCache (hBitStream) ; FDK_setBitCnt (&hBitStream->hBitBuf, value) ; } /** * \brief get bitcounter state from bitBuffer. * \param hBitStream HANDLE_FDK_BITSTREAM handle * \return current bit counter value */ FDK_INLINE INT FDKgetBitCnt (HANDLE_FDK_BITSTREAM hBitStream) { FDKsyncCache(hBitStream) ; return FDK_getBitCnt(&hBitStream->hBitBuf) ; } /** * \brief Fill the BitBuffer with a number of input bytes from external source. * The bytesValid variable returns the number of ramaining valid bytes in extern inputBuffer. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param inputBuffer Pointer to input buffer with bitstream data. * \param bufferSize Total size of inputBuffer array. * \param bytesValid Input: number of valid bytes in inputBuffer. Output: bytes still left unread in inputBuffer. * \return void */ FDK_INLINE void FDKfeedBuffer (HANDLE_FDK_BITSTREAM hBitStream, const UCHAR inputBuffer [], const UINT bufferSize, UINT *bytesValid) { FDKsyncCache (hBitStream) ; FDK_Feed(&hBitStream->hBitBuf, (UCHAR*)inputBuffer, bufferSize, bytesValid ) ; } /** * \brief fill destination BitBuffer with a number of bytes from source BitBuffer. The * bytesValid variable returns the number of ramaining valid bytes in source BitBuffer. * * \param hBSDst HANDLE_FDK_BITSTREAM handle to write data into * \param hBSSrc HANDLE_FDK_BITSTREAM handle to read data from * \param bytesValid Input: number of valid bytes in inputBuffer. Output: bytes still left unread in inputBuffer. * \return void */ FDK_INLINE void FDKcopyBuffer (HANDLE_FDK_BITSTREAM hBSDst, HANDLE_FDK_BITSTREAM hBSSrc, UINT *bytesValid) { FDKsyncCache (hBSSrc) ; FDK_Copy (&hBSDst->hBitBuf, &hBSSrc->hBitBuf, bytesValid) ; } /** * \brief fill the outputBuffer with all valid bytes hold in BitBuffer. The WriteBytes * variable returns the number of written Bytes. * * \param hBitStream HANDLE_FDK_BITSTREAM handle * \param outputBuffer Pointer to output buffer. * \param writeBytes Number of bytes write to output buffer. * \return void */ FDK_INLINE void FDKfetchBuffer(HANDLE_FDK_BITSTREAM hBitStream, UCHAR *outputBuffer, UINT *writeBytes) { FDKsyncCache (hBitStream) ; FDK_Fetch(&hBitStream->hBitBuf, outputBuffer, writeBytes); } #endif fdk-aac-0.1.3/libFDK/include/x86/0000755000175000017500000000000012372262446016556 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/include/x86/fixmul_x86.h0000644000175000017500000001476412372261464020753 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__x86__) #if defined(_MSC_VER) && defined(_M_IX86) /* Intel x86 */ #define FUNCTION_fixmul_DD #define FUNCTION_fixmuldiv2_DD #define FUNCTION_fixmuldiv2BitExact_DD #define fixmuldiv2BitExact_DD(a,b) fixmuldiv2_DD(a,b) #define FUNCTION_fixmulBitExact_DD #define fixmulBitExact_DD(a,b) fixmul_DD(a,b) #define FUNCTION_fixmuldiv2BitExact_DS #define fixmuldiv2BitExact_DS(a,b) fixmuldiv2_DS(a,b) #define FUNCTION_fixmulBitExact_DS #define fixmulBitExact_DS(a,b) fixmul_DS(a,b) inline INT fixmul_DD (INT a, const INT b) { __asm { mov eax, a imul b shl edx, 1 mov a, edx } return a ; } inline INT fixmuldiv2_DD (INT a, const INT b) { __asm { mov eax, a imul b mov a, edx } return a ; } /* ############################################################################# */ #elif (defined(__GNUC__)||defined(__gnu_linux__)) && defined(__x86__) #define FUNCTION_fixmul_DD #define FUNCTION_fixmuldiv2_DD #define FUNCTION_fixmuldiv2BitExact_DD #define fixmuldiv2BitExact_DD(a,b) fixmuldiv2_DD(a,b) #define FUNCTION_fixmulBitExact_DD #define fixmulBitExact_DD(a,b) fixmul_DD(a,b) #define FUNCTION_fixmuldiv2BitExact_DS #define fixmuldiv2BitExact_DS(a,b) fixmuldiv2_DS(a,b) #define FUNCTION_fixmulBitExact_DS #define fixmulBitExact_DS(a,b) fixmul_DS(a,b) inline INT fixmul_DD (INT a, const INT b) { INT result; asm( "imul %2;\n" "shl $1, %0;\n" : "=d"(result), "+a"(a) : "r"(b) ); return result; } inline INT fixmuldiv2_DD (INT a, const INT b) { INT result; asm ( "imul %2;" : "=d"(result), "+a"(a) : "r"(b) ); return result; } #endif /* (defined(__GNUC__)||defined(__gnu_linux__)) && defined(__x86__) */ #endif /* __x86__ */ fdk-aac-0.1.3/libFDK/include/x86/abs_x86.h0000644000175000017500000001223612372261464020204 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__x86__) #if defined(__x86_64__) inline INT fixabs_D(INT x) { return ((x) > (INT)(0)) ? (x) : -(x) ; } inline INT fixabs_S(INT x) { return ((x) > (INT)(0)) ? (x) : -(x) ; } #define fixabs_I(x) fixabs_D(x) #define FUNCTION_fixabs_S #define FUNCTION_fixabs_D #define FUNCTION_fixabs_I #endif /* __x86_64__ */ #endif /*__x86__ */ fdk-aac-0.1.3/libFDK/include/x86/clz_x86.h0000644000175000017500000001355612372261464020235 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__GNUC__) && (defined(__x86__) || defined(__x86_64__)) #define FUNCTION_fixnormz_D #define FUNCTION_fixnorm_D inline INT fixnormz_D(LONG value) { INT result; if (value != 0) { result = __builtin_clz(value); } else { result = 32; } return result; } inline INT fixnorm_D(LONG value) { INT result; if (value == 0) { return 0; } if (value < 0) { value = ~value; } result = fixnormz_D(value); return result - 1; } #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include #define FUNCTION_fixnormz_D #define FUNCTION_fixnorm_D inline INT fixnormz_D(LONG value) { unsigned long result = 0; unsigned char err; err = _BitScanReverse(&result, value); if (err) { return 31 - result; } else { return 32; } } inline INT fixnorm_D(LONG value) { INT result; if (value == 0) { return 0; } if (value < 0) { value = ~value; } result = fixnormz_D(value); return result - 1; } #endif /* toolchain */ fdk-aac-0.1.3/libFDK/include/FDK_bitbuffer.h0000644000175000017500000001565212372261464020746 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): M. Lohwasser Description: common bitbuffer read/write routines ******************************************************************************/ #ifndef __FDK_BITBUFFER_H__ #define __FDK_BITBUFFER_H__ #include "machine_type.h" typedef struct { UINT ValidBits; UINT ReadOffset; UINT WriteOffset; UINT BitCnt; UINT BitNdx; UCHAR *Buffer; UINT bufSize; UINT bufBits; } FDK_BITBUF; typedef FDK_BITBUF *HANDLE_FDK_BITBUF; #ifdef __cplusplus extern "C" { #endif extern const UINT BitMask [32+1]; /** The BitBuffer Functions are called straight from FDK_bitstream Interface. For Functions functional survey look there. */ void FDK_CreateBitBuffer (HANDLE_FDK_BITBUF *hBitBuffer, UCHAR *pBuffer, UINT bufSize) ; void FDK_InitBitBuffer (HANDLE_FDK_BITBUF hBitBuffer, UCHAR *pBuffer, UINT bufSize, UINT validBits) ; void FDK_ResetBitBuffer (HANDLE_FDK_BITBUF hBitBuffer) ; void FDK_DeleteBitBuffer (HANDLE_FDK_BITBUF hBitBuffer) ; INT FDK_get (HANDLE_FDK_BITBUF hBitBuffer, const UINT numberOfBits) ; INT FDK_get32 (HANDLE_FDK_BITBUF hBitBuffer) ; void FDK_put (HANDLE_FDK_BITBUF hBitBuffer, UINT value, const UINT numberOfBits) ; INT FDK_getBwd (HANDLE_FDK_BITBUF hBitBuffer, const UINT numberOfBits); void FDK_putBwd (HANDLE_FDK_BITBUF hBitBuffer, UINT value, const UINT numberOfBits) ; void FDK_pushBack (HANDLE_FDK_BITBUF hBitBuffer, const UINT numberOfBits, UCHAR config) ; void FDK_pushForward (HANDLE_FDK_BITBUF hBitBuffer, const UINT numberOfBits, UCHAR config) ; void FDK_byteAlign (HANDLE_FDK_BITBUF hBitBuffer, UCHAR config) ; UINT FDK_getValidBits (HANDLE_FDK_BITBUF hBitBuffer) ; INT FDK_getFreeBits (HANDLE_FDK_BITBUF hBitBuffer) ; void FDK_setBitCnt (HANDLE_FDK_BITBUF hBitBuffer, const UINT value) ; INT FDK_getBitCnt (HANDLE_FDK_BITBUF hBitBuffer) ; void FDK_Feed (HANDLE_FDK_BITBUF hBitBuffer, UCHAR inputBuffer [], const UINT bufferSize, UINT *bytesValid) ; void FDK_Copy (HANDLE_FDK_BITBUF hBitBufDst, HANDLE_FDK_BITBUF hBitBufSrc, UINT *bytesValid) ; void FDK_Fetch (HANDLE_FDK_BITBUF hBitBuffer, UCHAR outBuf[], UINT *writeBytes); #ifdef __cplusplus } #endif #endif fdk-aac-0.1.3/libFDK/include/cplx_mul.h0000644000175000017500000002410512372261464020126 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #include "common_fix.h" #if !defined(__CPLX_Mult_H__) #define __CPLX_Mult_H__ #if defined(__CC_ARM) || defined(__arm__) || defined(_M_ARM) /* cppp replaced: elif */ #include "arm/cplx_mul.h" #elif defined(__GNUC__) && defined(__mips__) /* cppp replaced: elif */ #include "mips/cplx_mul.h" #endif /* #if defined all cores: bfin, arm, etc. */ /* ############################################################################# */ /* Fallback generic implementations */ #if !defined(FUNCTION_cplxMultDiv2_32x16X2) #define FUNCTION_cplxMultDiv2_32x16X2 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { *c_Re = fMultDiv2(a_Re,b_Re) - fMultDiv2(a_Im,b_Im); *c_Im = fMultDiv2(a_Re,b_Im) + fMultDiv2(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMultDiv2_32x16) #define FUNCTION_cplxMultDiv2_32x16 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SPK w ) { cplxMultDiv2(c_Re, c_Im, a_Re, a_Im, w.v.re, w.v.im); } #endif #if !defined(FUNCTION_cplxMultAddDiv2_32x16X2) #define FUNCTION_cplxMultAddDiv2_32x16X2 inline void cplxMultAddDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { *c_Re += fMultDiv2(a_Re,b_Re) - fMultDiv2(a_Im,b_Im); *c_Im += fMultDiv2(a_Re,b_Im) + fMultDiv2(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMultSubDiv2_32x16X2) #define FUNCTION_cplxMultSubDiv2_32x16X2 inline void cplxMultSubDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { *c_Re -= fMultDiv2(a_Re,b_Re) - fMultDiv2(a_Im,b_Im); *c_Im -= fMultDiv2(a_Re,b_Im) + fMultDiv2(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMultDiv2_32x32X2) #define FUNCTION_cplxMultDiv2_32x32X2 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DBL b_Re, const FIXP_DBL b_Im) { *c_Re = fMultDiv2(a_Re,b_Re) - fMultDiv2(a_Im,b_Im); *c_Im = fMultDiv2(a_Re,b_Im) + fMultDiv2(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMultDiv2_32x32) #define FUNCTION_cplxMultDiv2_32x32 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DPK w) { cplxMultDiv2(c_Re, c_Im, a_Re, a_Im, w.v.re, w.v.im); } #endif #if !defined(FUNCTION_cplxMultSubDiv2_32x32X2) #define FUNCTION_cplxMultSubDiv2_32x32X2 inline void cplxMultSubDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DBL b_Re, const FIXP_DBL b_Im) { *c_Re -= fMultDiv2(a_Re,b_Re) - fMultDiv2(a_Im,b_Im); *c_Im -= fMultDiv2(a_Re,b_Im) + fMultDiv2(a_Im,b_Re); } #endif /* ############################################################################# */ #if !defined(FUNCTION_cplxMult_32x16X2) #define FUNCTION_cplxMult_32x16X2 inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { *c_Re = fMult(a_Re,b_Re) - fMult(a_Im,b_Im); *c_Im = fMult(a_Re,b_Im) + fMult(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMult_32x16) #define FUNCTION_cplxMult_32x16 inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SPK w ) { cplxMult(c_Re, c_Im, a_Re, a_Im, w.v.re, w.v.im); } #endif #if !defined(FUNCTION_cplxMult_32x32X2) #define FUNCTION_cplxMult_32x32X2 inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DBL b_Re, const FIXP_DBL b_Im) { *c_Re = fMult(a_Re,b_Re) - fMult(a_Im,b_Im); *c_Im = fMult(a_Re,b_Im) + fMult(a_Im,b_Re); } #endif #if !defined(FUNCTION_cplxMult_32x32) #define FUNCTION_cplxMult_32x32 inline void cplxMult( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DPK w) { cplxMult(c_Re, c_Im, a_Re, a_Im, w.v.re, w.v.im); } #endif /* ############################################################################# */ #endif /* __CPLX_Mult_H__ */ fdk-aac-0.1.3/libFDK/include/FDK_trigFcts.h0000644000175000017500000002064112372261464020555 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Haricharan Lakshman, Manuel Jander Description: Trigonometric functions fixed point fractional implementation. ******************************************************************************/ #include "common_fix.h" #include "FDK_tools_rom.h" /* Fixed point precision definitions */ #define Q(format) ((FIXP_DBL)(((LONG)1) << (format))) #ifndef M_PI #define M_PI (3.14159265358979323846f) #endif /*! * Inverse tangent function. */ // --- fixp_atan() ---- #define Q_ATANINP (25) // Input in q25, Output in q30 #define Q_ATANOUT (30) #define ATI_SF ((DFRACT_BITS-1)-Q_ATANINP) // 6 #define ATI_SCALE ((float)(1<> shift; residual &= ( (1< (1< (1<<(LD-1))) { FIXP_STP tmp; /* Cosine/Sine simetry for angles greater than PI/4 */ s = (1<> (DFRACT_BITS-FRACT_BITS-1)) + 1) > (((LONG)1< 0) ) ? \ (FIXP_SGL)(SHORT)(((LONG)1<<(FRACT_BITS-1))-1):(FIXP_SGL)(SHORT)((((val) >> (DFRACT_BITS-FRACT_BITS-1)) + 1) >> 1) ) #define shouldBeUnion union /* unions are possible */ typedef SHORT FIXP_SGL; typedef LONG FIXP_DBL; /* macros for compile-time conversion of constant float values to fixedpoint */ #define FL2FXCONST_SPC FL2FXCONST_DBL #define MINVAL_DBL_CONST MINVAL_DBL #define MINVAL_SGL_CONST MINVAL_SGL #define FL2FXCONST_SGL(val) \ (FIXP_SGL)( ( (val) >= 0) ? \ ((( (double)(val) * (FRACT_FIX_SCALE) + 0.5 ) >= (double)(MAXVAL_SGL) ) ? (SHORT)(MAXVAL_SGL) : (SHORT)( (double)(val) * (double)(FRACT_FIX_SCALE) + 0.5)) : \ ((( (double)(val) * (FRACT_FIX_SCALE) - 0.5) <= (double)(MINVAL_SGL_CONST) ) ? (SHORT)(MINVAL_SGL_CONST) : (SHORT)( (double)(val) * (double)(FRACT_FIX_SCALE) - 0.5)) ) #define FL2FXCONST_DBL(val) \ (FIXP_DBL)( ( (val) >= 0) ? \ ((( (double)(val) * (DFRACT_FIX_SCALE) + 0.5 ) >= (double)(MAXVAL_DBL) ) ? (LONG)(MAXVAL_DBL) : (LONG)( (double)(val) * (double)(DFRACT_FIX_SCALE) + 0.5)) : \ ((( (double)(val) * (DFRACT_FIX_SCALE) - 0.5) <= (double)(MINVAL_DBL_CONST) ) ? (LONG)(MINVAL_DBL_CONST) : (LONG)( (double)(val) * (double)(DFRACT_FIX_SCALE) - 0.5)) ) /* macros for runtime conversion of float values to integer fixedpoint. NO OVERFLOW CHECK!!! */ #define FL2FX_SPC FL2FX_DBL #define FL2FX_SGL(val) ( (val)>0.0f ? (SHORT)( (val)*(float)(FRACT_FIX_SCALE)+0.5f ) : (SHORT)( (val)*(float)(FRACT_FIX_SCALE)-0.5f ) ) #define FL2FX_DBL(val) ( (val)>0.0f ? (LONG)( (val)*(float)(DFRACT_FIX_SCALE)+0.5f ) : (LONG)( (val)*(float)(DFRACT_FIX_SCALE)-0.5f ) ) /* macros for runtime conversion of fixedpoint values to other fixedpoint. NO ROUNDING!!! */ #define FX_ACC2FX_SGL(val) ((FIXP_SGL)((val)>>(ACCU_BITS-FRACT_BITS))) #define FX_ACC2FX_DBL(val) ((FIXP_DBL)((val)>>(ACCU_BITS-DFRACT_BITS))) #define FX_SGL2FX_ACC(val) ((FIXP_ACC)((LONG)(val)<<(ACCU_BITS-FRACT_BITS))) #define FX_SGL2FX_DBL(val) ((FIXP_DBL)((LONG)(val)<<(DFRACT_BITS-FRACT_BITS))) #define FX_DBL2FX_SGL(val) ((FIXP_SGL)((val)>>(DFRACT_BITS-FRACT_BITS))) /* ############################################################# */ /* macros for runtime conversion of integer fixedpoint values to float. */ /* This is just for temporary use and should not be required in a final version! */ /* #define FX_DBL2FL(val) ((float)(pow(2.,-31.)*(float)val)) */ /* version #1 */ #define FX_DBL2FL(val) ((float)((double)(val)/(double)DFRACT_FIX_SCALE)) /* version #2 - identical to class dfract cast from dfract to float */ /* ############################################################# */ #include "fixmul.h" FDK_INLINE LONG fMult(SHORT a, SHORT b) { return fixmul_SS(a, b); } FDK_INLINE LONG fMult(SHORT a, LONG b) { return fixmul_SD(a, b); } FDK_INLINE LONG fMult(LONG a, SHORT b) { return fixmul_DS(a, b); } FDK_INLINE LONG fMult(LONG a, LONG b) { return fixmul_DD(a, b); } FDK_INLINE LONG fPow2(LONG a) { return fixpow2_D(a); } FDK_INLINE LONG fPow2(SHORT a) { return fixpow2_S(a); } FDK_INLINE INT fMultI(LONG a, SHORT b) { return ( (INT)(((1<<(FRACT_BITS-2)) + fixmuldiv2_DD(a,((INT)b<>(FRACT_BITS-1)) ); } FDK_INLINE INT fMultIfloor(LONG a, INT b) { return ( (INT)((1 + fixmuldiv2_DD(a,(b<> (FRACT_BITS-1)) ); } FDK_INLINE INT fMultIceil(LONG a, INT b) { return ( (INT)(((INT)0x7fff + fixmuldiv2_DD(a,(b<> (FRACT_BITS-1)) ); } FDK_INLINE LONG fMultDiv2(SHORT a, SHORT b) { return fixmuldiv2_SS(a, b); } FDK_INLINE LONG fMultDiv2(SHORT a, LONG b) { return fixmuldiv2_SD(a, b); } FDK_INLINE LONG fMultDiv2(LONG a, SHORT b) { return fixmuldiv2_DS(a, b); } FDK_INLINE LONG fMultDiv2(LONG a, LONG b) { return fixmuldiv2_DD(a, b); } FDK_INLINE LONG fPow2Div2(LONG a) { return fixpow2div2_D(a); } FDK_INLINE LONG fPow2Div2(SHORT a) { return fixpow2div2_S(a); } FDK_INLINE LONG fMultDiv2BitExact(LONG a, LONG b) { return fixmuldiv2BitExact_DD(a, b); } FDK_INLINE LONG fMultDiv2BitExact(SHORT a, LONG b) { return fixmuldiv2BitExact_SD(a, b); } FDK_INLINE LONG fMultDiv2BitExact(LONG a, SHORT b) { return fixmuldiv2BitExact_DS(a, b); } FDK_INLINE LONG fMultBitExact(LONG a, LONG b) { return fixmulBitExact_DD(a, b); } FDK_INLINE LONG fMultBitExact(SHORT a, LONG b) { return fixmulBitExact_SD(a, b); } FDK_INLINE LONG fMultBitExact(LONG a, SHORT b) { return fixmulBitExact_DS(a, b); } /* ******************************************************************************** */ #include "abs.h" FDK_INLINE FIXP_DBL fAbs(FIXP_DBL x) { return fixabs_D(x); } FDK_INLINE FIXP_SGL fAbs(FIXP_SGL x) { return fixabs_S(x); } /* workaround for TI C6x compiler but not for TI ARM9E compiler */ #if (!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__LP64__) FDK_INLINE INT fAbs(INT x) { return fixabs_I(x); } #endif /* ******************************************************************************** */ #include "clz.h" FDK_INLINE INT fNormz(FIXP_DBL x) { return fixnormz_D(x); } FDK_INLINE INT fNormz(FIXP_SGL x) { return fixnormz_S(x); } FDK_INLINE INT fNorm(FIXP_DBL x) { return fixnorm_D(x); } FDK_INLINE INT fNorm(FIXP_SGL x) { return fixnorm_S(x); } /* ******************************************************************************** */ /* ******************************************************************************** */ /* ******************************************************************************** */ #include "clz.h" #define fixp_abs(x) fAbs(x) #define fixMin(a,b) fMin(a,b) #define fixMax(a,b) fMax(a,b) #define CntLeadingZeros(x) fixnormz_D(x) #define CountLeadingBits(x) fixnorm_D(x) #include "fixmadd.h" /* y = (x+0.5*a*b) */ FDK_INLINE FIXP_DBL fMultAddDiv2(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmadddiv2_DD(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmadddiv2_SD(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmadddiv2_DS(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2(FIXP_DBL x, FIXP_SGL a, FIXP_SGL b) { return fixmadddiv2_SS(x, a, b); } FDK_INLINE FIXP_DBL fPow2AddDiv2(FIXP_DBL x, FIXP_DBL a) { return fixpadddiv2_D(x, a); } FDK_INLINE FIXP_DBL fPow2AddDiv2(FIXP_DBL x, FIXP_SGL a) { return fixpadddiv2_S(x, a); } /* y = 2*(x+0.5*a*b) = (2x+a*b) */ FDK_INLINE FIXP_DBL fMultAdd(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmadd_DD(x, a, b); } inline FIXP_DBL fMultAdd(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmadd_SD(x, a, b); } inline FIXP_DBL fMultAdd(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmadd_DS(x, a, b); } inline FIXP_DBL fMultAdd(FIXP_DBL x, FIXP_SGL a, FIXP_SGL b) { return fixmadd_SS(x, a, b); } inline FIXP_DBL fPow2Add(FIXP_DBL x, FIXP_DBL a) { return fixpadd_D(x, a); } inline FIXP_DBL fPow2Add(FIXP_DBL x, FIXP_SGL a) { return fixpadd_S(x, a); } /* y = (x-0.5*a*b) */ inline FIXP_DBL fMultSubDiv2(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmsubdiv2_DD(x, a, b); } inline FIXP_DBL fMultSubDiv2(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmsubdiv2_SD(x, a, b); } inline FIXP_DBL fMultSubDiv2(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmsubdiv2_DS(x, a, b); } inline FIXP_DBL fMultSubDiv2(FIXP_DBL x, FIXP_SGL a, FIXP_SGL b) { return fixmsubdiv2_SS(x, a, b); } /* y = 2*(x-0.5*a*b) = (2*x-a*b) */ FDK_INLINE FIXP_DBL fMultSub(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmsub_DD(x, a, b); } inline FIXP_DBL fMultSub(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmsub_SD(x, a, b); } inline FIXP_DBL fMultSub(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmsub_DS(x, a, b); } inline FIXP_DBL fMultSub(FIXP_DBL x, FIXP_SGL a, FIXP_SGL b) { return fixmsub_SS(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2BitExact(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmadddiv2BitExact_DD(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2BitExact(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmadddiv2BitExact_SD(x, a, b); } FDK_INLINE FIXP_DBL fMultAddDiv2BitExact(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmadddiv2BitExact_DS(x, a, b); } FDK_INLINE FIXP_DBL fMultSubDiv2BitExact(FIXP_DBL x, FIXP_DBL a, FIXP_DBL b) { return fixmsubdiv2BitExact_DD(x, a, b); } FDK_INLINE FIXP_DBL fMultSubDiv2BitExact(FIXP_DBL x, FIXP_SGL a, FIXP_DBL b) { return fixmsubdiv2BitExact_SD(x, a, b); } FDK_INLINE FIXP_DBL fMultSubDiv2BitExact(FIXP_DBL x, FIXP_DBL a, FIXP_SGL b) { return fixmsubdiv2BitExact_DS(x, a, b); } #include "fixminmax.h" FDK_INLINE FIXP_DBL fMin(FIXP_DBL a, FIXP_DBL b) { return fixmin_D(a,b); } FDK_INLINE FIXP_DBL fMax(FIXP_DBL a, FIXP_DBL b) { return fixmax_D(a,b); } FDK_INLINE FIXP_SGL fMin(FIXP_SGL a, FIXP_SGL b) { return fixmin_S(a,b); } FDK_INLINE FIXP_SGL fMax(FIXP_SGL a, FIXP_SGL b) { return fixmax_S(a,b); } /* workaround for TI C6x compiler but not for TI ARM9E */ #if ((!defined(__TI_COMPILER_VERSION__) || defined(__TI_TMS470_V5__)) && !defined(__LP64__)) || (FIX_FRACT == 1) FDK_INLINE INT fMax(INT a, INT b) { return fixmax_I(a,b); } FDK_INLINE INT fMin(INT a, INT b) { return fixmin_I(a,b); } #endif inline UINT fMax(UINT a, UINT b) { return fixmax_UI(a,b); } inline UINT fMin(UINT a, UINT b) { return fixmin_UI(a,b); } /* Complex data types */ typedef shouldBeUnion { /* vector representation for arithmetic */ struct { FIXP_SGL re; FIXP_SGL im; } v; /* word representation for memory move */ LONG w; } FIXP_SPK; typedef shouldBeUnion { /* vector representation for arithmetic */ struct { FIXP_DBL re; FIXP_DBL im; } v; /* word representation for memory move */ INT64 w; } FIXP_DPK; #include "fixmul.h" #include "fixmadd.h" #include "cplx_mul.h" #include "scale.h" #include "fixpoint_math.h" #endif fdk-aac-0.1.3/libFDK/include/qmf.h0000644000175000017500000002740512372261464017074 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file qmf.h \brief Complex qmf analysis/synthesis \author Markus Werner */ #ifndef __QMF_H #define __QMF_H #include "common_fix.h" #include "FDK_tools_rom.h" #include "dct.h" /* * Filter coefficient type definition */ #ifdef QMF_DATA_16BIT #define FIXP_QMF FIXP_SGL #define FX_DBL2FX_QMF FX_DBL2FX_SGL #define FX_QMF2FX_DBL FX_SGL2FX_DBL #define QFRACT_BITS FRACT_BITS #else #define FIXP_QMF FIXP_DBL #define FX_DBL2FX_QMF #define FX_QMF2FX_DBL #define QFRACT_BITS DFRACT_BITS #endif /* ARM neon optimized QMF analysis filter requires 32 bit input. Implemented for RVCT only, currently disabled. See src/arm/qmf_arm.cpp:45 */ #define FIXP_QAS FIXP_PCM #define QAS_BITS SAMPLE_BITS #ifdef QMFSYN_STATES_16BIT #define FIXP_QSS FIXP_SGL #define QSS_BITS FRACT_BITS #else #define FIXP_QSS FIXP_DBL #define QSS_BITS DFRACT_BITS #endif /* Flags for QMF intialization */ /* Low Power mode flag */ #define QMF_FLAG_LP 1 /* Filter is not symetric. This flag is set internally in the QMF initialization as required. */ #define QMF_FLAG_NONSYMMETRIC 2 /* Complex Low Delay Filter Bank (or std symmetric filter bank) */ #define QMF_FLAG_CLDFB 4 /* Flag indicating that the states should be kept. */ #define QMF_FLAG_KEEP_STATES 8 /* Complex Low Delay Filter Bank used in MPEG Surround Encoder */ #define QMF_FLAG_MPSLDFB 16 /* Complex Low Delay Filter Bank used in MPEG Surround Encoder allows a optimized calculation of the modulation in qmfForwardModulationHQ() */ #define QMF_FLAG_MPSLDFB_OPTIMIZE_MODULATION 32 /* Flag to indicate HE-AAC down-sampled SBR mode (decoder) -> adapt analysis post twiddling */ #define QMF_FLAG_DOWNSAMPLED 64 typedef struct { int lb_scale; /*!< Scale of low band area */ int ov_lb_scale; /*!< Scale of adjusted overlap low band area */ int hb_scale; /*!< Scale of high band area */ int ov_hb_scale; /*!< Scale of adjusted overlap high band area */ } QMF_SCALE_FACTOR; struct QMF_FILTER_BANK { const FIXP_PFT *p_filter; /*!< Pointer to filter coefficients */ void *FilterStates; /*!< Pointer to buffer of filter states FIXP_PCM in analyse and FIXP_DBL in synthesis filter */ int FilterSize; /*!< Size of prototype filter. */ const FIXP_QTW *t_cos; /*!< Modulation tables. */ const FIXP_QTW *t_sin; int filterScale; /*!< filter scale */ int no_channels; /*!< Total number of channels (subbands) */ int no_col; /*!< Number of time slots */ int lsb; /*!< Top of low subbands */ int usb; /*!< Top of high subbands */ int outScalefactor; /*!< Scale factor of output data (syn only) */ FIXP_DBL outGain; /*!< Gain output data (syn only) (init with 0x80000000 to ignore) */ UINT flags; /*!< flags */ UCHAR p_stride; /*!< Stride Factor of polyphase filters */ }; typedef struct QMF_FILTER_BANK *HANDLE_QMF_FILTER_BANK; void qmfAnalysisFiltering( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ FIXP_QMF **qmfReal, /*!< Pointer to real subband slots */ FIXP_QMF **qmfImag, /*!< Pointer to imag subband slots */ QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ const INT_PCM *timeIn, /*!< Time signal */ const int stride, /*!< Stride factor of audio data */ FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ); void qmfSynthesisFiltering( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_QMF **QmfBufferReal, /*!< Pointer to real subband slots */ FIXP_QMF **QmfBufferImag, /*!< Pointer to imag subband slots */ const QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ const int ov_len, /*!< Length of band overlap */ INT_PCM *timeOut, /*!< Time signal */ const int stride, /*!< Stride factor of audio data */ FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ); int qmfInitAnalysisFilterBank( HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ FIXP_QAS *pFilterStates, /*!< Pointer to filter state buffer */ int noCols, /*!< Number of time slots */ int lsb, /*!< Number of lower bands */ int usb, /*!< Number of upper bands */ int no_channels, /*!< Number of critically sampled bands */ int flags); /*!< Flags */ void qmfAnalysisFilteringSlot( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_QMF *qmfReal, /*!< Low and High band, real */ FIXP_QMF *qmfImag, /*!< Low and High band, imag */ const INT_PCM *timeIn, /*!< Pointer to input */ const int stride, /*!< stride factor of input */ FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ); int qmfInitSynthesisFilterBank( HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ FIXP_QSS *pFilterStates, /*!< Pointer to filter state buffer */ int noCols, /*!< Number of time slots */ int lsb, /*!< Number of lower bands */ int usb, /*!< Number of upper bands */ int no_channels, /*!< Number of critically sampled bands */ int flags); /*!< Flags */ void qmfSynthesisFilteringSlot( HANDLE_QMF_FILTER_BANK synQmf, const FIXP_QMF *realSlot, const FIXP_QMF *imagSlot, const int scaleFactorLowBand, const int scaleFactorHighBand, INT_PCM *timeOut, const int stride, FIXP_QMF *pWorkBuffer); void qmfChangeOutScalefactor (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ int outScalefactor /*!< New scaling factor for output data */ ); void qmfChangeOutGain (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_DBL outputGain /*!< New gain for output data */ ); #endif /* __QMF_H */ fdk-aac-0.1.3/libFDK/include/scale.h0000644000175000017500000002250312372261464017372 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: Scaling operations ******************************************************************************/ #ifndef SCALE_H #define SCALE_H #include "common_fix.h" #include "genericStds.h" #include "fixminmax.h" #define SCALE_INLINE inline #if defined(__arm__) /* cppp replaced: elif */ #include "arm/scale.h" #elif defined(__mips__) /* cppp replaced: elif */ #include "mips/scale.h" #endif #include "../src/scale.cpp" #ifndef FUNCTION_scaleValue /*! * * \brief Multiply input by \f$ 2^{scalefactor} \f$ * * \return Scaled input * */ #define FUNCTION_scaleValue inline FIXP_DBL scaleValue(const FIXP_DBL value, /*!< Value */ INT scalefactor /*!< Scalefactor */ ) { if(scalefactor > 0) return (value<>(-scalefactor)); } #endif #ifndef FUNCTION_scaleValueSaturate /*! * * \brief Multiply input by \f$ 2^{scalefactor} \f$ * \param value The value to be scaled. * \param the shift amount * \return \f$ value * 2^scalefactor \f$ * */ #define FUNCTION_scaleValueSaturate inline FIXP_DBL scaleValueSaturate( const FIXP_DBL value, INT scalefactor ) { if(scalefactor > 0) { if (fNorm(value) < scalefactor && value != (FIXP_DBL)0) { if (value > (FIXP_DBL)0) { return (FIXP_DBL)MAXVAL_DBL; } else { return (FIXP_DBL)MINVAL_DBL; } } else { return (value< scalefactor) { return (FIXP_DBL)0; } else { return (value>>(-scalefactor)); } } } #endif #ifndef FUNCTION_scaleValueInPlace /*! * * \brief Multiply input by \f$ 2^{scalefactor} \f$ in place * * \return void * */ #define FUNCTION_scaleValueInPlace inline void scaleValueInPlace( FIXP_DBL *value, /*!< Value */ INT scalefactor /*!< Scalefactor */ ) { INT newscale; /* Note: The assignment inside the if conditional allows combining a load with the compare to zero (on ARM and maybe others) */ if ((newscale = (scalefactor)) >= 0) { *(value) <<= newscale; } else { *(value) >>= -newscale; } } #endif /*! * * \brief Scale input value by 2^{scale} and saturate output to 2^{dBits-1} * \return scaled and saturated value * * This macro scales src value right or left and applies saturation to (2^dBits)-1 * maxima output. */ #ifndef SATURATE_RIGHT_SHIFT #define SATURATE_RIGHT_SHIFT(src, scale, dBits) \ ( (((LONG)(src)>>(scale)) > (LONG)(((1U)<<((dBits)-1))-1)) ? (LONG)(((1U)<<((dBits)-1))-1) \ : (((LONG)(src)>>(scale)) < ~((LONG)(((1U)<<((dBits)-1))-1))) ? ~((LONG)(((1U)<<((dBits)-1))-1)) \ : ((LONG)(src) >> (scale)) ) #endif #ifndef SATURATE_LEFT_SHIFT #define SATURATE_LEFT_SHIFT(src, scale, dBits) \ ( ((LONG)(src) > ((LONG)(((1U)<<((dBits)-1))-1)>>(scale))) ? (LONG)(((1U)<<((dBits)-1))-1) \ : ((LONG)(src) < ~((LONG)(((1U)<<((dBits)-1))-1)>>(scale))) ? ~((LONG)(((1U)<<((dBits)-1))-1)) \ : ((LONG)(src) << (scale)) ) #endif #ifndef SATURATE_SHIFT #define SATURATE_SHIFT(src, scale, dBits) \ ( ((scale) < 0) \ ? SATURATE_LEFT_SHIFT((src), -(scale), (dBits)) \ : SATURATE_RIGHT_SHIFT((src), (scale), (dBits)) ) #endif /* * Alternative shift and saturate left, saturates to -0.99999 instead of -1.0000 * to avoid problems when inverting the sign of the result. */ #ifndef SATURATE_LEFT_SHIFT_ALT #define SATURATE_LEFT_SHIFT_ALT(src, scale, dBits) \ ( ((LONG)(src) > ((LONG)(((1U)<<((dBits)-1))-1)>>(scale))) ? (LONG)(((1U)<<((dBits)-1))-1) \ : ((LONG)(src) < ~((LONG)(((1U)<<((dBits)-1))-2)>>(scale))) ? ~((LONG)(((1U)<<((dBits)-1))-2)) \ : ((LONG)(src) << (scale)) ) #endif #ifndef SATURATE_RIGHT_SHIFT_ALT #define SATURATE_RIGHT_SHIFT_ALT(src, scale, dBits) \ ( (((LONG)(src)>>(scale)) > (LONG)(((1U)<<((dBits)-1))-1)) ? (LONG)(((1U)<<((dBits)-1))-1) \ : (((LONG)(src)>>(scale)) < ~((LONG)(((1U)<<((dBits)-1))-2))) ? ~((LONG)(((1U)<<((dBits)-1))-2)) \ : ((LONG)(src) >> (scale)) ) #endif #ifndef SATURATE_INT_PCM_RIGHT_SHIFT #define SATURATE_INT_PCM_RIGHT_SHIFT(src, scale) SATURATE_RIGHT_SHIFT(src, scale, SAMPLE_BITS) #endif #ifndef SATURATE_INT_PCM_LEFT_SHIFT #define SATURATE_INT_PCM_LEFT_SHIFT(src, scale) SATURATE_LEFT_SHIFT(src, scale, SAMPLE_BITS) #endif #endif /* #ifndef SCALE_H */ fdk-aac-0.1.3/libFDK/include/scramble.h0000644000175000017500000001406512372261464020077 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: ******************************************************************************/ #ifndef SCRAMBLE_H #define SCRAMBLE_H #include "common_fix.h" #if defined(__arm__) #include "arm/scramble.h" #elif defined(__mips__) && defined(__mips_dsp) /* cppp replaced: elif */ #include "mips/scramble.h" #endif /***************************************************************************** functionname: scramble description: bitreversal of input data returns: input: output: *****************************************************************************/ #if !defined(FUNCTION_scramble_sgl) inline void scramble_sgl(FIXP_SGL *x, INT n) { INT m,k,j; for (m=1,j=0; m>1; (!((j^=k)&k)); k>>=1);} if (j>m) { FIXP_SGL tmp; tmp=x[2*m]; x[2*m]=x[2*j]; x[2*j]=tmp; tmp=x[2*m+1]; x[2*m+1]=x[2*j+1]; x[2*j+1]=tmp; } } } #endif #if !defined(FUNCTION_scramble) /* default scramble functionality */ inline void scramble(FIXP_DBL *x, INT n) { INT m,k,j; FDK_ASSERT(!(((UINT64)x)&(ALIGNMENT_DEFAULT-1))); for (m=1,j=0; m>1; (!((j^=k)&k)); k>>=1);} if (j>m) { FIXP_DBL tmp; tmp=x[2*m]; x[2*m]=x[2*j]; x[2*j]=tmp; tmp=x[2*m+1]; x[2*m+1]=x[2*j+1]; x[2*j+1]=tmp; } } } #endif /* !defined(FUNCTION_scramble) */ #endif /* SCRAMBLE_H */ fdk-aac-0.1.3/libFDK/include/fixminmax.h0000644000175000017500000001265212372261464020307 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Lohwasser, M. Gayer Description: min/max inline functions and defines ******************************************************************************/ #ifndef FIXMINMAX__H #define FIXMINMAX__H #include "FDK_archdef.h" #include "machine_type.h" /* Inline Function to determine the smaller/bigger value of two values with same type. */ template inline T fixmin (T a, T b) { return (a < b ? a : b); } template inline T fixmax (T a, T b) { return (a > b ? a : b); } #define fixmax_D(a,b) fixmax(a,b) #define fixmin_D(a,b) fixmin(a,b) #define fixmax_S(a,b) fixmax(a,b) #define fixmin_S(a,b) fixmin(a,b) #define fixmax_I(a,b) fixmax(a,b) #define fixmin_I(a,b) fixmin(a,b) #define fixmax_UI(a,b) fixmax(a,b) #define fixmin_UI(a,b) fixmin(a,b) #endif fdk-aac-0.1.3/libFDK/include/fixmadd.h0000644000175000017500000002572412372261464017727 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Lohwasser, M. Gayer Description: fixed point intrinsics ******************************************************************************/ #if !defined(__FIXMADD_H__) #define __FIXMADD_H__ #include "FDK_archdef.h" #include "machine_type.h" #include "fixmul.h" #if defined(__arm__) #include "arm/fixmadd_arm.h" #elif defined(__mips__) /* cppp replaced: elif */ #include "mips/fixmadd_mips.h" #endif /* all cores */ /************************************************************************* ************************************************************************* Software fallbacks for missing functions. ************************************************************************** **************************************************************************/ /* Divide by two versions. */ #if !defined(FUNCTION_fixmadddiv2_DD) inline FIXP_DBL fixmadddiv2_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return (x + fMultDiv2 (a, b)); } #endif #if !defined(FUNCTION_fixmadddiv2_SD) inline FIXP_DBL fixmadddiv2_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmadddiv2_DS return fixmadddiv2_DS(x, b, a); #else return fixmadddiv2_DD(x, FX_SGL2FX_DBL(a), b); #endif } #endif #if !defined(FUNCTION_fixmadddiv2_DS) inline FIXP_DBL fixmadddiv2_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmadddiv2_SD return fixmadddiv2_SD(x, b, a); #else return fixmadddiv2_DD(x, a, FX_SGL2FX_DBL(b)); #endif } #endif #if !defined(FUNCTION_fixmadddiv2_SS) inline FIXP_DBL fixmadddiv2_SS (FIXP_DBL x, const FIXP_SGL a, const FIXP_SGL b) { return x + fMultDiv2(a,b); } #endif #if !defined(FUNCTION_fixmsubdiv2_DD) inline FIXP_DBL fixmsubdiv2_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return (x - fMultDiv2 (a, b)); } #endif #if !defined(FUNCTION_fixmsubdiv2_SD) inline FIXP_DBL fixmsubdiv2_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmsubdiv2_DS return fixmsubdiv2_DS(x, b, a); #else return fixmsubdiv2_DD(x, FX_SGL2FX_DBL(a), b); #endif } #endif #if !defined(FUNCTION_fixmsubdiv2_DS) inline FIXP_DBL fixmsubdiv2_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmsubdiv2_SD return fixmsubdiv2_SD(x, b, a); #else return fixmsubdiv2_DD(x, a, FX_SGL2FX_DBL(b)); #endif } #endif #if !defined(FUNCTION_fixmsubdiv2_SS) inline FIXP_DBL fixmsubdiv2_SS (FIXP_DBL x, const FIXP_SGL a, const FIXP_SGL b) { return x - fMultDiv2(a,b); } #endif #if !defined(FUNCTION_fixmadddiv2BitExact_DD) #define FUNCTION_fixmadddiv2BitExact_DD inline FIXP_DBL fixmadddiv2BitExact_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return x + fMultDiv2BitExact(a, b); } #endif #if !defined(FUNCTION_fixmadddiv2BitExact_SD) #define FUNCTION_fixmadddiv2BitExact_SD inline FIXP_DBL fixmadddiv2BitExact_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmadddiv2BitExact_DS return fixmadddiv2BitExact_DS(x, b, a); #else return x + fMultDiv2BitExact(a, b); #endif } #endif #if !defined(FUNCTION_fixmadddiv2BitExact_DS) #define FUNCTION_fixmadddiv2BitExact_DS inline FIXP_DBL fixmadddiv2BitExact_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmadddiv2BitExact_SD return fixmadddiv2BitExact_SD(x, b, a); #else return x + fMultDiv2BitExact(a, b); #endif } #endif #if !defined(FUNCTION_fixmsubdiv2BitExact_DD) #define FUNCTION_fixmsubdiv2BitExact_DD inline FIXP_DBL fixmsubdiv2BitExact_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return x - fMultDiv2BitExact(a, b); } #endif #if !defined(FUNCTION_fixmsubdiv2BitExact_SD) #define FUNCTION_fixmsubdiv2BitExact_SD inline FIXP_DBL fixmsubdiv2BitExact_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmsubdiv2BitExact_DS return fixmsubdiv2BitExact_DS(x, b, a); #else return x - fMultDiv2BitExact(a, b); #endif } #endif #if !defined(FUNCTION_fixmsubdiv2BitExact_DS) #define FUNCTION_fixmsubdiv2BitExact_DS inline FIXP_DBL fixmsubdiv2BitExact_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmsubdiv2BitExact_SD return fixmsubdiv2BitExact_SD(x, b, a); #else return x - fMultDiv2BitExact(a, b); #endif } #endif /* Normal versions */ #if !defined(FUNCTION_fixmadd_DD) inline FIXP_DBL fixmadd_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return fixmadddiv2_DD(x,a,b)<<1; } #endif #if !defined(FUNCTION_fixmadd_SD) inline FIXP_DBL fixmadd_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmadd_DS return fixmadd_DS(x, b, a); #else return fixmadd_DD(x, FX_SGL2FX_DBL(a), b); #endif } #endif #if !defined(FUNCTION_fixmadd_DS) inline FIXP_DBL fixmadd_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmadd_SD return fixmadd_SD(x, b, a); #else return fixmadd_DD(x, a, FX_SGL2FX_DBL(b)); #endif } #endif #if !defined(FUNCTION_fixmadd_SS) inline FIXP_DBL fixmadd_SS (FIXP_DBL x, const FIXP_SGL a, const FIXP_SGL b) { return (x + fMultDiv2(a,b))<<1; } #endif #if !defined(FUNCTION_fixmsub_DD) inline FIXP_DBL fixmsub_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return fixmsubdiv2_DD(x,a,b)<<1; } #endif #if !defined(FUNCTION_fixmsub_SD) inline FIXP_DBL fixmsub_SD (FIXP_DBL x, const FIXP_SGL a, const FIXP_DBL b) { #ifdef FUNCTION_fixmsub_DS return fixmsub_DS(x, b, a); #else return fixmsub_DD(x, FX_SGL2FX_DBL(a), b); #endif } #endif #if !defined(FUNCTION_fixmsub_DS) inline FIXP_DBL fixmsub_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { #ifdef FUNCTION_fixmsub_SD return fixmsub_SD(x, b, a); #else return fixmsub_DD(x, a, FX_SGL2FX_DBL(b)); #endif } #endif #if !defined(FUNCTION_fixmsub_SS) inline FIXP_DBL fixmsub_SS (FIXP_DBL x, const FIXP_SGL a, const FIXP_SGL b) { return (x - fMultDiv2(a,b))<<1; } #endif #if !defined(FUNCTION_fixpow2adddiv2_D) inline INT fixpadddiv2_D (FIXP_DBL x, const FIXP_DBL a) { return (x + fPow2Div2(a)); } #endif #if !defined(FUNCTION_fixpow2add_D) inline INT fixpadd_D (FIXP_DBL x, const FIXP_DBL a) { return (x + fPow2(a)); } #endif #if !defined(FUNCTION_fixpow2adddiv2_S) inline INT fixpadddiv2_S (FIXP_DBL x, const FIXP_SGL a) { return (x + fPow2Div2(a)); } #endif #if !defined(FUNCTION_fixpow2add_S) inline INT fixpadd_S (FIXP_DBL x, const FIXP_SGL a) { return (x + fPow2(a)); } #endif #endif // __FIXMADD_H__ fdk-aac-0.1.3/libFDK/include/dct.h0000644000175000017500000001602012372261464017052 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: Library functions to calculate standard DCTs. This will most likely be replaced by hand-optimized functions for the specific target processor. ******************************************************************************/ #ifndef __dct_H #define __dct_H #include "common_fix.h" /** * \brief Calculate DCT type II of given length. The DCT IV is * calculated by a complex FFT, with some pre and post twiddeling. * A factor of sqrt(2/(N-1)) is NOT applied. * \param pDat pointer to input/output data (in place processing). * \param size size of pDat. * \param pDat_e pointer to an integer containing the exponent of the data * referenced by pDat. The exponent is updated accordingly. */ void dct_II(FIXP_DBL *pDat, FIXP_DBL *tmp, int size, int *pDat_e); /** * \brief Calculate DCT type III of given length. The DCT IV is * calculated by a complex FFT, with some pre and post twiddeling. * Note that the factor 0.5 for the sum term x[0] is 1.0 instead of 0.5. * A factor of sqrt(2/N) is NOT applied. * \param pDat pointer to input/output data (in place processing). * \param size size of pDat. * \param pDat_e pointer to an integer containing the exponent of the data * referenced by pDat. The exponent is updated accordingly. */ void dct_III(FIXP_DBL *pDat, FIXP_DBL *tmp, int size, int *pDat_e); /** * \brief Calculate DCT type IV of given length. The DCT IV is * calculated by a complex FFT, with some pre and post twiddeling. * A factor of sqrt(2/N) is NOT applied. * \param pDat pointer to input/output data (in place processing). * \param size size of pDat. * \param pDat_e pointer to an integer containing the exponent of the data * referenced by pDat. The exponent is updated accordingly. */ void dct_IV(FIXP_DBL *pDat,int size, int *pDat_e); /** * \brief Calculate DST type IV of given length. The DST IV is * calculated by a complex FFT, with some pre and post twiddeling. * A factor of sqrt(2/N) is NOT applied. * \param pDat pointer to input/output data (in place processing). * \param size size of pDat. * \param pDat_e pointer to an integer containing the exponent of the data * referenced by pDat. The exponent is updated accordingly. */ void dst_IV(FIXP_DBL *pDat,int size, int *pDat_e); #endif fdk-aac-0.1.3/libFDK/include/FDK_crc.h0000644000175000017500000002227512372261464017544 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** MPEG Audio Encoder ************************** Initial author: contents/description: CRC calculation ******************************************************************************/ #ifndef FDK_CRC_H #define FDK_CRC_H #include "FDK_bitstream.h" #define MAX_CRC_REGS 3 /*!< Maximal number of overlapping crc region in ADTS channel pair element is two. Select three independent regions preventively. */ /** * This structure describes single crc region used for crc calculation. */ typedef struct { UCHAR isActive; INT maxBits; UINT bitBufCntBits; UINT validBits; } CCrcRegData; /** * CRC info structure. */ typedef struct { CCrcRegData crcRegData[MAX_CRC_REGS]; /*!< Multiple crc region description. */ const USHORT *pCrcLookup; /*!< Pointer to lookup table filled in FDK_crcInit(). */ USHORT crcPoly; /*!< CRC generator polynom. */ USHORT crcMask; /*!< CRC mask. */ USHORT startValue; /*!< CRC start value. */ UCHAR crcLen; /*!< CRC length. */ UINT regStart; /*!< Start region marker for synchronization. */ UINT regStop; /*!< Stop region marker for synchronization. */ USHORT crcValue; /*!< Crc value to be calculated. */ } FDK_CRCINFO; /** * CRC info handle. */ typedef FDK_CRCINFO* HANDLE_FDK_CRCINFO; /** * \brief Initialize CRC structure. * * The function initializes existing crc info structure with denoted configuration. * * \param hCrcInfo Pointer to an outlying allocated crc info structure. * \param crcPoly Configure crc polynom. * \param crcStartValue Configure crc start value. * \param crcLen Configure crc length. * * \return none */ void FDKcrcInit( HANDLE_FDK_CRCINFO hCrcInfo, const UINT crcPoly, const UINT crcStartValue, const UINT crcLen ); /** * \brief Reset CRC info structure. * * This function clears all intern states of the crc structure. * * \param hCrcInfo Pointer to crc info stucture. * * \return none */ void FDKcrcReset( HANDLE_FDK_CRCINFO hCrcInfo ); /** * \brief Start CRC region with maximum number of bits. * * This function marks position in bitstream to be used as start point for crc calculation. * Bitstream range for crc calculation can be limited or kept dynamic depending on mBits parameter. * The crc region has to be terminated with FDKcrcEndReg() in each case. * * \param hCrcInfo Pointer to crc info stucture. * \param hBs Pointer to current bit buffer structure. * \param mBits Number of bits in crc region to be calculated. * - mBits > 0: Zero padding will be used for CRC calculation, if there * are less than mBits bits available. * - mBits < 0: No zero padding is done. * - mBits = 0: The number of bits used in crc calculation is dynamically, * depending on bitstream position between FDKcrcStartReg() and * FDKcrcEndReg() call. * * \return ID for the created region, -1 in case of an error */ INT FDKcrcStartReg( HANDLE_FDK_CRCINFO hCrcInfo, const HANDLE_FDK_BITSTREAM hBs, const INT mBits ); /** * \brief Ends CRC region. * * This function terminates crc region specified with FDKcrcStartReg(). The number of bits in crc region depends * on mBits parameter of FDKcrcStartReg(). * This function calculates and updates crc in info structure. * * \param hCrcInfo Pointer to crc info stucture. * \param hBs Pointer to current bit buffer structure. * \param reg Crc region ID created in FDKcrcStartReg(). * * \return 0 on success */ INT FDKcrcEndReg( HANDLE_FDK_CRCINFO hCrcInfo, const HANDLE_FDK_BITSTREAM hBs, const INT reg ); /** * \brief This function returns crc value from info struct. * * \param hCrcInfo Pointer to crc info stucture. * * \return CRC value masked with crc length. */ USHORT FDKcrcGetCRC( const HANDLE_FDK_CRCINFO hCrcInfo ); #endif /* FDK_CRC_H */ fdk-aac-0.1.3/libFDK/include/autocorr2nd.h0000644000175000017500000001340512372261464020546 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): M. Lohwasser Description: fixed point abs definitions ******************************************************************************/ #ifndef _AUTOCORR_2ND_H #define _AUTOCORR_2ND_H #include "common_fix.h" typedef struct { FIXP_DBL r00r; FIXP_DBL r11r; FIXP_DBL r22r; FIXP_DBL r01r; FIXP_DBL r02r; FIXP_DBL r12r; FIXP_DBL r01i; FIXP_DBL r02i; FIXP_DBL r12i; FIXP_DBL det; int det_scale; } ACORR_COEFS; #define LPC_ORDER 2 INT autoCorr2nd_real (ACORR_COEFS *ac, /*!< Pointer to autocorrelation coeffs */ const FIXP_DBL *reBuffer, /*!< Pointer to to real part of spectrum */ const int len /*!< Number of qmf slots */ ); INT autoCorr2nd_cplx (ACORR_COEFS *ac, /*!< Pointer to autocorrelation coeffs */ const FIXP_DBL *reBuffer, /*!< Pointer to to real part of spectrum */ const FIXP_DBL *imBuffer, /*!< Pointer to imag part of spectrum */ const int len /*!< Number of qmf slots */ ); #endif /* _AUTOCORR_2ND_H */ fdk-aac-0.1.3/libFDK/include/clz.h0000644000175000017500000001602212372262205017064 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Marc Gayer Description: fixed point intrinsics ******************************************************************************/ #if !defined(__CLZ_H__) #define __CLZ_H__ #include "FDK_archdef.h" #include "machine_type.h" #if defined(__arm__) #include "arm/clz_arm.h" #elif defined(__mips__) /* cppp replaced: elif */ #include "mips/clz_mips.h" #elif defined(__x86__) /* cppp replaced: elif */ #include "x86/clz_x86.h" #elif defined(__powerpc__) #include "ppc/clz_ppc.h" #endif /* all cores */ /************************************************************************* ************************************************************************* Software fallbacks for missing functions. ************************************************************************** **************************************************************************/ #if !defined(FUNCTION_fixnormz_S) #ifdef FUNCTION_fixnormz_D inline INT fixnormz_S (SHORT a) { return fixnormz_D((INT)(a)); } #else inline INT fixnormz_S (SHORT a) { int leadingBits = 0; a = ~a; while(a & 0x8000) { leadingBits++; a <<= 1; } return (leadingBits); } #endif #endif #if !defined(FUNCTION_fixnormz_D) inline INT fixnormz_D (LONG a) { INT leadingBits = 0; a = ~a; while(a & 0x80000000) { leadingBits++; a <<= 1; } return (leadingBits); } #endif /***************************************************************************** functionname: fixnorm_D description: Count leading ones or zeros of operand val for dfract/LONG INT values. Return this value minus 1. Return 0 if operand==0. *****************************************************************************/ #if !defined(FUNCTION_fixnorm_S) #ifdef FUNCTION_fixnorm_D inline INT fixnorm_S(FIXP_SGL val) { return fixnorm_D((INT)(val)); } #else inline INT fixnorm_S(FIXP_SGL val) { INT leadingBits = 0; if ( val != (FIXP_SGL)0 ) { if ( val < (FIXP_SGL)0 ) { val = ~val; } leadingBits = fixnormz_S(val) - 1; } return (leadingBits); } #endif #endif #if !defined(FUNCTION_fixnorm_D) inline INT fixnorm_D(FIXP_DBL val) { INT leadingBits = 0; if ( val != (FIXP_DBL)0 ) { if ( val < (FIXP_DBL)0 ) { val = ~val; } leadingBits = fixnormz_D(val) - 1; } return (leadingBits); } #endif #endif /* __CLZ_H__ */ fdk-aac-0.1.3/libFDK/include/FDK_archdef.h0000644000175000017500000002306512372262205020361 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Description: ******************************************************************************/ #ifndef __ARCH_H__ #define __ARCH_H__ /* Performance / Quality profile selector */ #define FDK_HIGH_PERFORMANCE /* Unify some few toolchain specific defines to avoid having large "or" macro contraptions all over the source code. */ /* Take action against VisualStudio 2005 crosscompile problems. */ /* Use single macro (the GCC built in macro) for architecture identification independent of the particular toolchain */ #if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || (defined(_MSC_VER) && defined(_M_IX86)) || defined (__x86_64__) #define __x86__ #endif #if (defined(_M_ARM) || defined(__CC_ARM)) && !defined(__arm__) || defined(__TI_TMS470_V5__) && !defined(__arm__) #define __arm__ #endif #if defined(_ARCH_PPC) && !defined(__powerpc__) #define __powerpc__ 1 #endif /* Define __ARM_ARCH_5TE__ if armv5te features are supported */ #if (__TARGET_ARCH_ARM == 5) || defined(__TARGET_FEATURE_DSPMUL) || (_M_ARM == 5) || defined(__ARM_ARCH_5TEJ__) || defined(__TI_TMS470_V5__) || defined(__ARM_ARCH_7EM__) #define __ARM_ARCH_5TE__ #endif /* Define __ARM_ARCH_6__ if the armv6 intructions are being supported. */ #if (__TARGET_ARCH_ARM == 6) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6ZK__) #define __ARM_ARCH_5TE__ #define __ARM_ARCH_6__ #endif /* Define __ARM_ARCH_7_A__ if the armv7 intructions are being supported. */ #if defined(__TARGET_ARCH_7_R) || defined(__ARM_ARCH_7R__) #define __ARM_ARCH_5TE__ #define __ARM_ARCH_6__ #define __ARM_ARCH_7_R__ #endif /* Define __ARM_ARCH_7_A__ if the armv7 intructions are being supported. */ #if defined(__TARGET_ARCH_7_A) || defined(__ARM_ARCH_7A__) #define __ARM_ARCH_5TE__ #define __ARM_ARCH_6__ #define __ARM_ARCH_7_A__ #endif /* Define __ARM_ARCH_7M__ if the ARMv7-M instructions are being supported, e.g. Cortex-M3. */ #if defined(__TARGET_ARCH_7_M) || defined(__ARM_ARCH_7_M__) #define __ARM_ARCH_7M__ #endif /* Define __ARM_ARCH_7EM__ if the ARMv7-ME instructions are being supported, e.g. Cortex-M4. */ #if defined(__TARGET_ARCH_7E_M) || defined(__ARM_ARCH_7E_M__) #define __ARM_ARCH_7EM__ #endif /* Detect and unify macros for neon feature. */ #if defined(__TARGET_FEATURE_NEON) && !defined(__ARM_NEON__) #define __ARM_NEON__ #endif #ifdef _M_ARM #include "cmnintrin.h" #include "armintr.h" #endif /* Define preferred Multiplication type */ #if defined(FDK_HIGH_PERFORMANCE) && !defined(FDK_HIGH_QUALITY) /* FDK_HIGH_PERFORMANCE */ #if defined(__mips__) || defined(__sh__) #define ARCH_PREFER_MULT_16x16 #undef SINETABLE_16BIT #undef POW2COEFF_16BIT #undef LDCOEFF_16BIT #undef WINDOWTABLE_16BIT #elif defined(__arm__) && defined(__ARM_ARCH_5TE__) /* cppp replaced: elif */ /* cppp replaced: elif */ #define ARCH_PREFER_MULT_32x16 #define SINETABLE_16BIT #define POW2COEFF_16BIT #define LDCOEFF_16BIT #define WINDOWTABLE_16BIT #elif defined(__arm__) && defined(__ARM_ARCH_7M__) #define ARCH_PREFER_MULT_32x16 #define SINETABLE_16BIT #define POW2COEFF_16BIT #define LDCOEFF_16BIT #define WINDOWTABLE_16BIT #elif defined(__arm__) && defined(__ARM_ARCH_7EM__) #define ARCH_PREFER_MULT_32x32 #define ARCH_PREFER_MULT_32x16 #define SINETABLE_16BIT #define POW2COEFF_16BIT #define LDCOEFF_16BIT #define WINDOWTABLE_16BIT #elif defined(__arm__) && !defined(__ARM_ARCH_5TE__) #define ARCH_PREFER_MULT_16x16 #undef SINETABLE_16BIT #undef WINDOWTABLE_16BIT #undef POW2COEFF_16BIT #undef LDCOEFF_16BIT #elif defined(__x86__) /* cppp replaced: elif */ #define ARCH_PREFER_MULT_32x16 #define SINETABLE_16BIT #define WINDOWTABLE_16BIT #define POW2COEFF_16BIT #define LDCOEFF_16BIT #elif defined(__powerpc__) #define ARCH_PREFER_MULT_32x32 #define ARCH_PREFER_MULT_32x16 #define SINETABLE_16BIT #define POW2COEFF_16BIT #define LDCOEFF_16BIT #define WINDOWTABLE_16BIT #else #error >>>> Please set architecture characterization defines for your platform (FDK_HIGH_PERFORMANCE)! <<<< #endif /* Architecture switches */ #else /* neither FDK_HIGH_QUALITY or FDK_HIGH_PERFORMANCE */ #error Either set FDK_HIGH_QUALITY or FDK_HIGH_PERFORMANCE, but not both nor none of them. #endif /* End of quality/complexity tradeoff */ #define FDKTOOLS_PACKED_TABLES #ifdef SINETABLE_16BIT #define FIXP_STB FIXP_SGL /* STB sinus Tab used in transformation */ #define FIXP_STP FIXP_SPK #define STC(a) (FX_DBL2FXCONST_SGL(a)) #else #define FIXP_STB FIXP_DBL #define FIXP_STP FIXP_DPK #define STC(a) ((FIXP_DBL)(LONG)(a)) #endif /* defined(SINETABLE_16BIT) */ #define STCP(cos,sin) { { STC(cos), STC(sin) } } #ifdef WINDOWTABLE_16BIT #define FIXP_WTB FIXP_SGL /* single FIXP_SGL values */ #define FIXP_WTP FIXP_SPK /* packed FIXP_SGL values */ #define WTC(a) FX_DBL2FXCONST_SGL(a) #else /* SINETABLE_16BIT */ #define FIXP_WTB FIXP_DBL #define FIXP_WTP FIXP_DPK #define WTC(a) (FIXP_DBL)(a) #endif /* SINETABLE_16BIT */ #define WTCP(a,b) { { WTC(a), WTC(b) } } #endif /* __ARCH_H__ */ fdk-aac-0.1.3/libFDK/include/FDK_core.h0000644000175000017500000001215712372261464017723 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Manuel Jander Description: FDK tools versioning support ******************************************************************************/ #ifndef FDK_CORE_H #define FDK_CORE_H #include "FDK_audio.h" #ifdef __cplusplus extern "C" { #endif /** @brief Get FDK_tools library information. * @return Return 0 on success and a negative errorcode on failure (see errorcodes.h). */ int FDK_toolsGetLibInfo(LIB_INFO *info); #ifdef __cplusplus } #endif #endif fdk-aac-0.1.3/libFDK/include/fixmul.h0000644000175000017500000002424212372262205017603 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Stefan Gewinner Description: fixed point multiplication ******************************************************************************/ #if !defined(__FIXMUL_H__) #define __FIXMUL_H__ #include "FDK_archdef.h" #include "machine_type.h" #if defined(__arm__) #include "arm/fixmul_arm.h" #elif defined(__mips__) /* cppp replaced: elif */ #include "mips/fixmul_mips.h" #elif defined(__x86__) /* cppp replaced: elif */ #include "x86/fixmul_x86.h" #elif defined(__powerpc__) #include "ppc/fixmul_ppc.h" #endif /* all cores */ /************************************************************************* ************************************************************************* Software fallbacks for missing functions ************************************************************************** **************************************************************************/ #if !defined(FUNCTION_fixmuldiv2_DD) #define FUNCTION_fixmuldiv2_DD #if defined(_MSC_VER) || defined(__CC_ARM) || defined(__ANALOG_EXTENSIONS__) || defined(__TI_COMPILER_VERSION__) #pragma message ("Extremely slow implementation of fixmuldiv2_DD !!") #else #warning Extremely slow implementation of fixmuldiv2_DD !! #endif inline LONG fixmuldiv2_DD (const LONG a, const LONG b) { return (LONG) ((((INT64)a) * b) >> 32) ; } #endif #if !defined(FUNCTION_fixmuldiv2BitExact_DD) #define FUNCTION_fixmuldiv2BitExact_DD #if defined(_MSC_VER) || defined(__CC_ARM) || defined(__ANALOG_EXTENSIONS__) || defined(__TI_COMPILER_VERSION__) #pragma message ("Extremely slow implementation of fixmuldiv2BitExact_DD !!") #else #warning Extremely slow implementation of fixmuldiv2BitExact_DD !! #endif inline LONG fixmuldiv2BitExact_DD (const LONG a, const LONG b) { return (LONG) ((((INT64)a) * b) >> 32) ; } #endif #if !defined(FUNCTION_fixmul_DD) #define FUNCTION_fixmul_DD inline LONG fixmul_DD (const LONG a, const LONG b) { return fixmuldiv2_DD (a, b) << 1 ; } #endif #if !defined(FUNCTION_fixmulBitExact_DD) #define FUNCTION_fixmulBitExact_DD #if defined(_MSC_VER) || defined(__CC_ARM) || defined(__ANALOG_EXTENSIONS__) || defined(__TI_COMPILER_VERSION__) || defined(__XTENSA__) #pragma message ("Extremely slow implementation of fixmulBitExact_DD !!") #else #warning Extremely slow implementation of fixmulBitExact_DD !! #endif inline LONG fixmulBitExact_DD (const LONG a, const LONG b) { return ( (LONG) ((((INT64)a) * b) >> 32) ) << 1; } #endif #if !defined(FUNCTION_fixmuldiv2_SS) #define FUNCTION_fixmuldiv2_SS inline LONG fixmuldiv2_SS (const SHORT a, const SHORT b) { return ((LONG)a*b); } #endif #if !defined(FUNCTION_fixmul_SS) #define FUNCTION_fixmul_SS inline LONG fixmul_SS (const SHORT a, const SHORT b) { return (a*b) <<1; } #endif #if !defined(FUNCTION_fixmuldiv2_SD) #define FUNCTION_fixmuldiv2_SD inline LONG fixmuldiv2_SD (const SHORT a, const LONG b) #ifdef FUNCTION_fixmuldiv2_DS { return fixmuldiv2_DS(b, a); } #else { return fixmuldiv2_DD(FX_SGL2FX_DBL(a), b); } #endif #endif #if !defined(FUNCTION_fixmuldiv2_DS) #define FUNCTION_fixmuldiv2_DS inline LONG fixmuldiv2_DS (const LONG a, const SHORT b) #ifdef FUNCTION_fixmuldiv2_SD { return fixmuldiv2_SD(b, a); } #else { return fixmuldiv2_DD(a, FX_SGL2FX_DBL(b)); } #endif #endif #if !defined(FUNCTION_fixmuldiv2BitExact_SD) #define FUNCTION_fixmuldiv2BitExact_SD inline LONG fixmuldiv2BitExact_SD (const SHORT a, const LONG b) #ifdef FUNCTION_fixmuldiv2BitExact_DS { return fixmuldiv2BitExact_DS(b, a); } #else { return (LONG) ((((INT64)a) * b) >> 16) ; } #endif #endif #if !defined(FUNCTION_fixmuldiv2BitExact_DS) #define FUNCTION_fixmuldiv2BitExact_DS inline LONG fixmuldiv2BitExact_DS (const LONG a, const SHORT b) #ifdef FUNCTION_fixmuldiv2BitExact_SD { return fixmuldiv2BitExact_SD(b, a); } #else { return (LONG) ((((INT64)a) * b) >> 16) ; } #endif #endif #if !defined(FUNCTION_fixmul_SD) #define FUNCTION_fixmul_SD inline LONG fixmul_SD (const SHORT a, const LONG b) { #ifdef FUNCTION_fixmul_DS return fixmul_SD(b, a); #else return fixmuldiv2_SD (a, b) << 1 ; #endif } #endif #if !defined(FUNCTION_fixmul_DS) #define FUNCTION_fixmul_DS inline LONG fixmul_DS (const LONG a, const SHORT b) { #ifdef FUNCTION_fixmul_SD return fixmul_SD(b, a); #else return fixmuldiv2_DS(a, b) << 1 ; #endif } #endif #if !defined(FUNCTION_fixmulBitExact_SD) #define FUNCTION_fixmulBitExact_SD inline LONG fixmulBitExact_SD (const SHORT a, const LONG b) #ifdef FUNCTION_fixmulBitExact_DS { return fixmulBitExact_DS(b, a); } #else { return (LONG) (((((INT64)a) * b) >> 16) << 1); } #endif #endif #if !defined(FUNCTION_fixmulBitExact_DS) #define FUNCTION_fixmulBitExact_DS inline LONG fixmulBitExact_DS (const LONG a, const SHORT b) #ifdef FUNCTION_fixmulBitExact_SD { return fixmulBitExact_SD(b, a); } #else { return (LONG) (((((INT64)a) * b) >> 16) << 1); } #endif #endif #if !defined(FUNCTION_fixpow2div2_D) #ifdef ARCH_WA_16BITMULT #error Fallback for fixpow2div2_D is not 16 bit safe ! #endif #define FUNCTION_fixpow2div2_D inline LONG fixpow2div2_D (const LONG a) { return fixmuldiv2_DD(a, a); } #endif #if !defined(FUNCTION_fixpow2_D) #ifdef ARCH_WA_16BITMULT #error Fallback for fixpow2_D is not 16 bit safe ! #endif #define FUNCTION_fixpow2_D inline LONG fixpow2_D (const LONG a) { return fixpow2div2_D(a)<<1; } #endif #if !defined(FUNCTION_fixpow2div2_S) #define FUNCTION_fixpow2div2_S inline LONG fixpow2div2_S (const SHORT a) { return fixmuldiv2_SS(a, a); } #endif #if !defined(FUNCTION_fixpow2_S) #define FUNCTION_fixpow2_S inline LONG fixpow2_S (const SHORT a) { return fixpow2div2_S(a)<<1; } #endif #endif /* __FIXMUL_H__ */ fdk-aac-0.1.3/libFDK/include/mdct.h0000644000175000017500000002373312372261464017240 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Manuel Jander, Josef Hoepfl Description: MDCT routines ******************************************************************************/ #ifndef __MDCT_H__ #define __MDCT_H__ #include "common_fix.h" #define MDCT_OUT_HEADROOM 2 /* Output additional headroom */ #define MDCT_OUTPUT_SCALE (DFRACT_BITS-SAMPLE_BITS-MDCT_OUT_HEADROOM) /* Refer to "Output word length" in ISO/IEC 14496-3:2008(E) 23.2.3.6 */ #define MDCT_OUTPUT_GAIN 16 #if (SAMPLE_BITS == DFRACT_BITS) #define IMDCT_SCALE(x) (INT_PCM)SATURATE_LEFT_SHIFT(x, -MDCT_OUTPUT_SCALE, SAMPLE_BITS) #else #define IMDCT_SCALE(x) (INT_PCM)SATURATE_RIGHT_SHIFT(x, MDCT_OUTPUT_SCALE, SAMPLE_BITS) #endif #define IMDCT_SCALE_DBL(x) (FIXP_DBL)(x) /** * \brief MDCT persistent data */ typedef struct { union { FIXP_DBL *freq; FIXP_DBL *time; } overlap; /**< Pointer to overlap memory */ const FIXP_WTP *prev_wrs; /**< pointer to previous right window slope */ int prev_tl; /**< previous tranform length */ int prev_nr; /**< previous right window offset */ int prev_fr; /**< previous right window slope length */ int ov_offset; /**< overlap time data fill level */ int ov_size; /**< Overlap buffer size in words */ } mdct_t; typedef mdct_t* H_MDCT; /** * \brief Initialize as valid MDCT handle * * \param hMdct handle of an allocated MDCT handle. * \param overlap pointer to FIXP_DBL overlap buffer. * \param overlapBufferSize size in FIXP_DBLs of the given overlap buffer. * \return void */ void mdct_init( H_MDCT hMdct, FIXP_DBL *overlap, INT overlapBufferSize ); /** * \brief perform MDCT transform (time domain to frequency domain) with given parameters. * * \param hMdct handle of an allocated MDCT handle. * \param spectrum pointer to where the resulting MDCT spectrum will be stored into. * \param scalefactor pointer to the input scale shift value. Updated accordingly on return. * \param input pointer to input time domain signal * \param tl transformation length. * \param nr right window slope offset (amount of window coefficients assumed to be 1.0) * \param fr right overlap window slope length * \param wrs pointer to the right side overlap window coefficients. * \return number of input samples processed. */ INT mdct_block( H_MDCT hMdct, FIXP_DBL *spectrum, INT *scalefactor, INT_PCM *input, INT tl, INT nr, INT fr, const FIXP_WTB *wrs ); /** * \brief add/multiply 2/N transform gain and MPEG4 part 3 defined output gain (see definition * of MDCT_OUTPUT_GAIN) to given mantissa factor and exponent. * \param pGain pointer to the mantissa of a gain factor to be applied to IMDCT data. * \param pExponent pointer to the exponent of a gain factor to be applied to IMDCT data. * \param tl length of the IMDCT where the gain *pGain * (2 ^ *pExponent) will be applied to. */ void imdct_gain( FIXP_DBL *pGain, int *pExponent, int tl ); /** * \brief drain buffered output samples into given buffer. Changes the MDCT state. */ INT imdct_drain( H_MDCT hMdct, FIXP_DBL * pTimeData, INT nrSamplesRoom ); /** * \brief Copy overlap time domain data to given buffer. Does not change the MDCT state. * \return number of actually copied samples (ov + nr). */ INT imdct_copy_ov_and_nr( H_MDCT hMdct, FIXP_DBL * pTimeData, INT nrSamples ); /** * \brief Adapt MDCT parameters for non-matching window slopes. * \param hMdct handle of an allocated MDCT handle. * \param pfl pointer to left overlap window side length. * \param pnl pointer to length of the left n part of the window. * \param tl transform length. * \param wls pointer to the left side overlap window coefficients. * \param noOutSamples desired number of output samples. */ void imdct_adapt_parameters(H_MDCT hMdct, int *pfl, int *pnl, int tl, const FIXP_WTP *wls, int noOutSamples); /** * \brief perform several inverse MDCT transforms (frequency domain to time domain) with given parameters. * * \param hMdct handle of an allocated MDCT handle. * \param output pointer to where the output time domain signal will be stored into. * \param stride the stride factor for accessing time domain samples in output. * \param spectrum pointer to the input MDCT spectra. * \param scalefactors scale shift values of the input spectrum. * \param nSpec number of MDCT spectrums. * \param noOutSamples desired number of output samples. * \param tl transform length. * \param wls pointer to the left side overlap window coefficients. * \param fl left overlap window side length. * \param wrs pointer to the right side overlap window coefficients of all individual IMDCTs. * \param fr right overlap window side length of all individual IMDCTs. * \param gain factor to apply to output samples (if != 0). * \return number of output samples returned. */ INT imdct_block( H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *spectrum, const SHORT scalefactor[], const INT nSpec, const INT noOutSamples, const INT tl, const FIXP_WTP *wls, INT fl, const FIXP_WTP *wrs, const INT fr, FIXP_DBL gain ); #endif /* __MDCT_H__ */ fdk-aac-0.1.3/libFDK/include/fft_rad2.h0000644000175000017500000001435412372261464017777 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Lohwasser, M. Gayer Description: ******************************************************************************/ #ifndef _FFT_RAD2_H #define _FFT_RAD2_H #include "common_fix.h" /** * \brief Performe an inplace complex valued FFT of 2^n length * * \param x Input/Output data buffer. The input data must have at least 1 bit scale headroom. * The values are interleaved, real/imag pairs. * \param ldn log2 of FFT length * \param trigdata Pointer to a sinetable of a length of at least (2^ldn)/2 sine values. * \param trigDataSize length of the sinetable "trigdata". */ void dit_fft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) ; /** * \brief Performe an inplace complex valued inverse FFT of 2^n length * * \param x Input/Output data buffer. The input data must have at least 1 bit scale headroom. * The values are interleaved, real/imag pairs. * \param ldn log2 of FFT length * \param trigdata Pointer to a sinetable of a length of at least (2^ldn)/2 sine values. * \param trigDataSize length of the sinetable "trigdata". */ void dit_ifft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) ; /* Rest of the world. */ #define SCALEFACTOR2048 10 #define SCALEFACTOR1024 9 #define SCALEFACTOR512 8 #define SCALEFACTOR256 7 #define SCALEFACTOR128 6 #define SCALEFACTOR64 5 #define SCALEFACTOR32 4 #define SCALEFACTOR16 3 #define SCALEFACTOR8 2 #define SCALEFACTOR4 1 #define SCALEFACTOR2 1 #endif /* _FFT_RAD2_H */ fdk-aac-0.1.3/libFDK/include/fft.h0000644000175000017500000002202212372261464017056 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Josef Hoepfl, DSP Solutions Description: Fix point FFT ******************************************************************************/ #ifndef __FFT_H__ #define __FFT_H__ #include "common_fix.h" /** * \brief Perform an inplace complex valued FFT of length 2^n * * \param length Length of the FFT to be calculated. * \param pInput Input/Output data buffer. The input data must have at least 1 bit scale headroom. * The values are interleaved, real/imag pairs. * \param scalefactor Pointer to an INT, which contains the current scale of the input data, * which is updated according to the FFT scale. */ void fft(int length, FIXP_DBL *pInput, INT *scalefactor); /** * \brief Perform an inplace complex valued IFFT of length 2^n * * \param length Length of the FFT to be calculated. * \param pInput Input/Output data buffer. The input data must have at least 1 bit scale headroom. * The values are interleaved, real/imag pairs. * \param scalefactor Pointer to an INT, which contains the current scale of the input data, * which is updated according to the IFFT scale. */ void ifft(int length, FIXP_DBL *pInput, INT *scalefactor); /* * Frequently used and fixed short length FFTs. */ LNK_SECTION_CODE_L1 static void FORCEINLINE fft_4(FIXP_DBL *x) { FIXP_DBL a00, a10, a20, a30, tmp0, tmp1; a00 = (x[0] + x[4])>>1; /* Re A + Re B */ a10 = (x[2] + x[6])>>1; /* Re C + Re D */ a20 = (x[1] + x[5])>>1; /* Im A + Im B */ a30 = (x[3] + x[7])>>1; /* Im C + Im D */ x[0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */ x[1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */ tmp0 = a00 - x[4]; /* Re A - Re B */ tmp1 = a20 - x[5]; /* Im A - Im B */ x[4] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */ x[5] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */ a10 = a10 - x[6]; /* Re C - Re D */ a30 = a30 - x[7]; /* Im C - Im D */ x[2] = tmp0 + a30; /* Re B' = Re A - Re B + Im C - Im D */ x[6] = tmp0 - a30; /* Re D' = Re A - Re B - Im C + Im D */ x[3] = tmp1 - a10; /* Im B' = Im A - Im B - Re C + Re D */ x[7] = tmp1 + a10; /* Im D' = Im A - Im B + Re C - Re D */ } LNK_SECTION_CODE_L1 static void FORCEINLINE fft_8(FIXP_DBL *x) { #define W_PiFOURTH STC(0x5a82799a) FIXP_DBL a00, a10, a20, a30; FIXP_DBL y[16]; a00 = (x[0] + x[8])>>1; a10 = x[4] + x[12]; a20 = (x[1] + x[9])>>1; a30 = x[5] + x[13]; y[0] = a00 + (a10>>1); y[4] = a00 - (a10>>1); y[1] = a20 + (a30>>1); y[5] = a20 - (a30>>1); a00 = a00 - x[8]; a10 = (a10>>1) - x[12]; a20 = a20 - x[9]; a30 = (a30>>1) - x[13]; y[2] = a00 + a30; y[6] = a00 - a30; y[3] = a20 - a10; y[7] = a20 + a10; a00 = (x[2] + x[10])>>1; a10 = x[6] + x[14]; a20 = (x[3] + x[11])>>1; a30 = x[7] + x[15]; y[8] = a00 + (a10>>1); y[12] = a00 - (a10>>1); y[9] = a20 + (a30>>1); y[13] = a20 - (a30>>1); a00 = a00 - x[10]; a10 = (a10>>1) - x[14]; a20 = a20 - x[11]; a30 = (a30>>1) - x[15]; y[10] = a00 + a30; y[14] = a00 - a30; y[11] = a20 - a10; y[15] = a20 + a10; FIXP_DBL vr, vi, ur, ui; ur = y[0]>>1; ui = y[1]>>1; vr = y[8]; vi = y[9]; x[0] = ur + (vr>>1); x[1] = ui + (vi>>1); x[8] = ur - (vr>>1); x[9] = ui - (vi>>1); ur = y[4]>>1; ui = y[5]>>1; vi = y[12]; vr = y[13]; x[4] = ur + (vr>>1); x[5] = ui - (vi>>1); x[12] = ur - (vr>>1); x[13] = ui + (vi>>1); ur = y[10]; ui = y[11]; vr = fMultDiv2(ui+ur,W_PiFOURTH); vi = fMultDiv2(ui-ur,W_PiFOURTH); ur = y[2]; ui = y[3]; x[2] = (ur>>1) + vr; x[3] = (ui>>1) + vi; x[10] = (ur>>1) - vr; x[11] = (ui>>1) - vi; ur = y[14]; ui = y[15]; vr = fMultDiv2(ui-ur,W_PiFOURTH); vi = fMultDiv2(ui+ur,W_PiFOURTH); ur = y[6]; ui = y[7]; x[6] = (ur>>1) + vr; x[7] = (ui>>1) - vi; x[14] = (ur>>1) - vr; x[15] = (ui>>1) + vi; } /** * \brief FFT of fixed length 16 */ inline void fft_16(FIXP_DBL *x); /** * \brief FFT of fixed length 32 */ inline void fft_32(FIXP_DBL *x); #endif fdk-aac-0.1.3/libFDK/include/FDK_tools_rom.h0000644000175000017500000002307012372261464021004 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Oliver Moser Description: ROM tables used by FDK tools ******************************************************************************/ #ifndef __FDK_TOOLS_ROM_H__ #define __FDK_TOOLS_ROM_H__ #include "common_fix.h" #include "FDK_audio.h" /* None radix2 rotation vectors */ extern const FIXP_STB RotVectorReal60[60]; extern const FIXP_STB RotVectorImag60[60]; extern const FIXP_STB RotVectorReal240[240]; extern const FIXP_STB RotVectorImag240[240]; extern const FIXP_STB RotVectorReal480[480]; extern const FIXP_STB RotVectorImag480[480]; /* Regular sine tables */ extern const FIXP_STP SineTable512[]; extern const FIXP_STP SineTable480[]; /* AAC-LC windows */ extern const FIXP_WTP SineWindow1024[]; extern const FIXP_WTP KBDWindow1024[]; extern const FIXP_WTP SineWindow128[]; extern const FIXP_WTP KBDWindow128[]; extern const FIXP_WTP SineWindow960[]; extern const FIXP_WTP KBDWindow960[]; extern const FIXP_WTP SineWindow120[]; extern const FIXP_WTP KBDWindow120[]; /* AAC-LD windows */ extern const FIXP_WTP SineWindow512[]; #define LowOverlapWindow512 SineWindow128 extern const FIXP_WTP SineWindow480[]; #define LowOverlapWindow480 SineWindow120 extern const FIXP_WTP SineWindow64[]; extern const FIXP_WTP SineWindow32[]; /** * \brief Helper table for window slope mapping. You should prefer the usage of the * function FDKgetWindowSlope(), this table is only made public for some optimized * access inside dct.cpp. */ extern const FIXP_WTP *const windowSlopes[2][3][9]; /** * \brief Window slope access helper. Obtain a window of given length and shape. * \param length Length of the window slope. * \param shape Shape index of the window slope. 0: sine window, 1: Kaiser-Bessel. Any other * value is applied a mask of 1 to, mapping it to either 0 or 1. * \param Pointer to window slope or NULL if the requested window slope is not available. */ const FIXP_WTP * FDKgetWindowSlope(int length, int shape); extern const FIXP_WTP sin_twiddle_L64[]; /* * Filter coefficient type definition */ #if defined(ARCH_PREFER_MULT_16x16) || defined(ARCH_PREFER_MULT_32x16) #define QMF_COEFF_16BIT #endif #define QMF_FILTER_PROTOTYPE_SIZE 640 #define QMF_NO_POLY 5 #ifdef QMF_COEFF_16BIT #define FIXP_PFT FIXP_SGL #define FIXP_QTW FIXP_SGL #else #define FIXP_PFT FIXP_DBL #define FIXP_QTW FIXP_DBL #endif #define QMF640_PFT_TABLE_SIZE (640/2 + QMF_NO_POLY) extern const FIXP_QTW qmf_phaseshift_cos32[32]; extern const FIXP_QTW qmf_phaseshift_sin32[32]; /* Adapted analysis post-twiddles for down-sampled HQ SBR */ extern const FIXP_QTW qmf_phaseshift_cos_downsamp32[32]; extern const FIXP_QTW qmf_phaseshift_sin_downsamp32[32]; extern const FIXP_QTW qmf_phaseshift_cos64[64]; extern const FIXP_QTW qmf_phaseshift_sin64[64]; extern const FIXP_PFT qmf_64[QMF640_PFT_TABLE_SIZE+QMF_NO_POLY]; #define QMF640_CLDFB_PFT_TABLE_SIZE (640) #define QMF320_CLDFB_PFT_TABLE_SIZE (320) #define QMF_CLDFB_PFT_SCALE 1 extern const FIXP_QTW qmf_phaseshift_cos32_cldfb[32]; extern const FIXP_QTW qmf_phaseshift_sin32_cldfb[32]; extern const FIXP_QTW qmf_phaseshift_cos64_cldfb[64]; extern const FIXP_QTW qmf_phaseshift_sin64_cldfb[64]; extern const FIXP_PFT qmf_cldfb_640[QMF640_CLDFB_PFT_TABLE_SIZE]; extern const FIXP_PFT qmf_cldfb_320[QMF320_CLDFB_PFT_TABLE_SIZE]; /* * Raw Data Block list stuff. */ typedef enum { element_instance_tag, common_window, global_gain, ics_info, /* ics_reserved_bit, window_sequence, window_shape, max_sfb, scale_factor_grouping, predictor_data_present, ltp_data_present, ltp_data */ max_sfb, ms, /* ms_mask_present, ms_used */ /*predictor_data_present,*/ /* part of ics_info */ ltp_data_present, ltp_data, section_data, scale_factor_data, pulse, /* pulse_data_present, pulse_data */ tns_data_present, tns_data, gain_control_data_present, gain_control_data, esc1_hcr, esc2_rvlc, spectral_data, scale_factor_data_usac, core_mode, common_tw, lpd_channel_stream, tw_data, noise, ac_spectral_data, fac_data, tns_active, /* introduced in MPEG-D usac CD */ tns_data_present_usac, common_max_sfb, /* Non data list items */ adtscrc_start_reg1, adtscrc_start_reg2, adtscrc_end_reg1, adtscrc_end_reg2, drmcrc_start_reg, drmcrc_end_reg, next_channel, next_channel_loop, link_sequence, end_of_sequence } rbd_id_t; struct element_list { const rbd_id_t *id; const struct element_list *next[2]; }; typedef struct element_list element_list_t; /** * \brief get elementary stream pieces list for given parameters. * \param aot audio object type * \param epConfig the epConfig value from the current Audio Specific Config * \param nChannels amount of channels contained in the current element. * \param layer the layer of the current element. * \return element_list_t parser guidance structure. */ const element_list_t * getBitstreamElementList(AUDIO_OBJECT_TYPE aot, SCHAR epConfig, UCHAR nChannels, UCHAR layer); #endif fdk-aac-0.1.3/libFDK/include/fixpoint_math.h0000644000175000017500000003544412372262223021156 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2014 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Gayer Description: Fixed point specific mathematical functions ******************************************************************************/ #ifndef __fixpoint_math_H #define __fixpoint_math_H #include "common_fix.h" #define LD_DATA_SCALING (64.0f) #define LD_DATA_SHIFT 6 /* pow(2, LD_DATA_SHIFT) = LD_DATA_SCALING */ /** * \brief deprecated. Use fLog2() instead. */ FIXP_DBL CalcLdData(FIXP_DBL op); void LdDataVector(FIXP_DBL *srcVector, FIXP_DBL *destVector, INT number); FIXP_DBL CalcInvLdData(FIXP_DBL op); void InitLdInt(); FIXP_DBL CalcLdInt(INT i); extern const USHORT sqrt_tab[49]; inline FIXP_DBL sqrtFixp_lookup(FIXP_DBL x) { UINT y = (INT)x; UCHAR is_zero=(y==0); INT zeros=fixnormz_D(y) & 0x1e; y<<=zeros; UINT idx=(y>>26)-16; USHORT frac=(y>>10)&0xffff; USHORT nfrac=0xffff^frac; UINT t=nfrac*sqrt_tab[idx]+frac*sqrt_tab[idx+1]; t=t>>(zeros>>1); return(is_zero ? 0 : t); } inline FIXP_DBL sqrtFixp_lookup(FIXP_DBL x, INT *x_e) { UINT y = (INT)x; INT e; if (x == (FIXP_DBL)0) { return x; } /* Normalize */ e=fixnormz_D(y); y<<=e; e = *x_e - e + 2; /* Correct odd exponent. */ if (e & 1) { y >>= 1; e ++; } /* Get square root */ UINT idx=(y>>26)-16; USHORT frac=(y>>10)&0xffff; USHORT nfrac=0xffff^frac; UINT t=nfrac*sqrt_tab[idx]+frac*sqrt_tab[idx+1]; /* Write back exponent */ *x_e = e >> 1; return (FIXP_DBL)(LONG)(t>>1); } FIXP_DBL sqrtFixp(FIXP_DBL op); void InitInvSqrtTab(); FIXP_DBL invSqrtNorm2(FIXP_DBL op, INT *shift); /***************************************************************************** functionname: invFixp description: delivers 1/(op) *****************************************************************************/ inline FIXP_DBL invFixp(FIXP_DBL op) { INT tmp_exp ; FIXP_DBL tmp_inv = invSqrtNorm2(op, &tmp_exp) ; FDK_ASSERT((31-(2*tmp_exp+1))>=0) ; return ( fPow2Div2( (FIXP_DBL)tmp_inv ) >> (31-(2*tmp_exp+1)) ) ; } #if defined(__mips__) && (__GNUC__==2) #define FUNCTION_schur_div inline FIXP_DBL schur_div(FIXP_DBL num,FIXP_DBL denum, INT count) { INT result, tmp ; __asm__ ("srl %1, %2, 15\n" "div %3, %1\n" : "=lo" (result) : "%d" (tmp), "d" (denum) , "d" (num) : "hi" ) ; return result<<16 ; } /*###########################################################################################*/ #elif defined(__mips__) && (__GNUC__==3) #define FUNCTION_schur_div inline FIXP_DBL schur_div(FIXP_DBL num,FIXP_DBL denum, INT count) { INT result, tmp; __asm__ ("srl %[tmp], %[denum], 15\n" "div %[result], %[num], %[tmp]\n" : [tmp] "+r" (tmp), [result]"=r"(result) : [denum]"r"(denum), [num]"r"(num) : "hi", "lo"); return result << (DFRACT_BITS-16); } /*###########################################################################################*/ #elif defined(SIMULATE_MIPS_DIV) #define FUNCTION_schur_div inline FIXP_DBL schur_div(FIXP_DBL num, FIXP_DBL denum, INT count) { FDK_ASSERT (count<=DFRACT_BITS-1); FDK_ASSERT (num>=(FIXP_DBL)0); FDK_ASSERT (denum>(FIXP_DBL)0); FDK_ASSERT (num <= denum); INT tmp = denum >> (count-1); INT result = 0; while (num > tmp) { num -= tmp; result++; } return result << (DFRACT_BITS-count); } /*###########################################################################################*/ #endif /* target architecture selector */ #if !defined(FUNCTION_schur_div) /** * \brief Divide two FIXP_DBL values with given precision. * \param num dividend * \param denum divisor * \param count amount of significant bits of the result (starting to the MSB) * \return num/divisor */ FIXP_DBL schur_div(FIXP_DBL num,FIXP_DBL denum, INT count); #endif FIXP_DBL mul_dbl_sgl_rnd (const FIXP_DBL op1, const FIXP_SGL op2); /** * \brief multiply two values with normalization, thus max precision. * Author: Robert Weidner * * \param f1 first factor * \param f2 secod factor * \param result_e pointer to an INT where the exponent of the result is stored into * \return mantissa of the product f1*f2 */ FIXP_DBL fMultNorm( FIXP_DBL f1, FIXP_DBL f2, INT *result_e ); inline FIXP_DBL fMultNorm(FIXP_DBL f1, FIXP_DBL f2) { FIXP_DBL m; INT e; m = fMultNorm(f1, f2, &e); m = scaleValueSaturate(m, e); return m; } /** * \brief Divide 2 FIXP_DBL values with normalization of input values. * \param num numerator * \param denum denomintator * \return num/denum with exponent = 0 */ FIXP_DBL fDivNorm(FIXP_DBL num, FIXP_DBL denom, INT *result_e); /** * \brief Divide 2 FIXP_DBL values with normalization of input values. * \param num numerator * \param denum denomintator * \param result_e pointer to an INT where the exponent of the result is stored into * \return num/denum with exponent = *result_e */ FIXP_DBL fDivNorm(FIXP_DBL num, FIXP_DBL denom); /** * \brief Divide 2 FIXP_DBL values with normalization of input values. * \param num numerator * \param denum denomintator * \return num/denum with exponent = 0 */ FIXP_DBL fDivNormHighPrec(FIXP_DBL L_num, FIXP_DBL L_denum, INT *result_e); /** * \brief Calculate log(argument)/log(2) (logarithm with base 2). deprecated. Use fLog2() instead. * \param arg mantissa of the argument * \param arg_e exponent of the argument * \param result_e pointer to an INT to store the exponent of the result * \return the mantissa of the result. * \param */ FIXP_DBL CalcLog2(FIXP_DBL arg, INT arg_e, INT *result_e); /** * \brief return 2 ^ (exp * 2^exp_e) * \param exp_m mantissa of the exponent to 2.0f * \param exp_e exponent of the exponent to 2.0f * \param result_e pointer to a INT where the exponent of the result will be stored into * \return mantissa of the result */ FIXP_DBL f2Pow(const FIXP_DBL exp_m, const INT exp_e, INT *result_e); /** * \brief return 2 ^ (exp_m * 2^exp_e). This version returns only the mantissa with implicit exponent of zero. * \param exp_m mantissa of the exponent to 2.0f * \param exp_e exponent of the exponent to 2.0f * \return mantissa of the result */ FIXP_DBL f2Pow(const FIXP_DBL exp_m, const INT exp_e); /** * \brief return x ^ (exp * 2^exp_e), where log2(x) = baseLd_m * 2^(baseLd_e). This saves * the need to compute log2() of constant values (when x is a constant). * \param ldx_m mantissa of log2() of x. * \param ldx_e exponent of log2() of x. * \param exp_m mantissa of the exponent to 2.0f * \param exp_e exponent of the exponent to 2.0f * \param result_e pointer to a INT where the exponent of the result will be stored into * \return mantissa of the result */ FIXP_DBL fLdPow( FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e, INT *result_e ); /** * \brief return x ^ (exp * 2^exp_e), where log2(x) = baseLd_m * 2^(baseLd_e). This saves * the need to compute log2() of constant values (when x is a constant). This version * does not return an exponent, which is implicitly 0. * \param ldx_m mantissa of log2() of x. * \param ldx_e exponent of log2() of x. * \param exp_m mantissa of the exponent to 2.0f * \param exp_e exponent of the exponent to 2.0f * \return mantissa of the result */ FIXP_DBL fLdPow( FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e ); /** * \brief return (base * 2^base_e) ^ (exp * 2^exp_e). Use fLdPow() instead whenever possible. * \param base_m mantissa of the base. * \param base_e exponent of the base. * \param exp_m mantissa of power to be calculated of the base. * \param exp_e exponent of power to be calculated of the base. * \param result_e pointer to a INT where the exponent of the result will be stored into. * \return mantissa of the result. */ FIXP_DBL fPow(FIXP_DBL base_m, INT base_e, FIXP_DBL exp_m, INT exp_e, INT *result_e); /** * \brief return (base * 2^base_e) ^ N * \param base mantissa of the base * \param base_e exponent of the base * \param power to be calculated of the base * \param result_e pointer to a INT where the exponent of the result will be stored into * \return mantissa of the result */ FIXP_DBL fPowInt(FIXP_DBL base_m, INT base_e, INT N, INT *result_e); /** * \brief calculate logarithm of base 2 of x_m * 2^(x_e) * \param x_m mantissa of the input value. * \param x_e exponent of the input value. * \param pointer to an INT where the exponent of the result is returned into. * \return mantissa of the result. */ FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e, INT *result_e); /** * \brief calculate logarithm of base 2 of x_m * 2^(x_e) * \param x_m mantissa of the input value. * \param x_e exponent of the input value. * \return mantissa of the result with implicit exponent of LD_DATA_SHIFT. */ FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e); /** * \brief Add with saturation of the result. * \param a first summand * \param b second summand * \return saturated sum of a and b. */ inline FIXP_SGL fAddSaturate(const FIXP_SGL a, const FIXP_SGL b) { LONG sum; sum = (LONG)(SHORT)a + (LONG)(SHORT)b; sum = fMax(fMin((INT)sum, (INT)MAXVAL_SGL), (INT)MINVAL_SGL); return (FIXP_SGL)(SHORT)sum; } /** * \brief Add with saturation of the result. * \param a first summand * \param b second summand * \return saturated sum of a and b. */ inline FIXP_DBL fAddSaturate(const FIXP_DBL a, const FIXP_DBL b) { LONG sum; sum = (LONG)(a>>1) + (LONG)(b>>1); sum = fMax(fMin((INT)sum, (INT)(MAXVAL_DBL>>1)), (INT)(MINVAL_DBL>>1)); return (FIXP_DBL)(LONG)(sum<<1); } //#define TEST_ROUNDING /***************************************************************************** array for 1/n, n=1..80 ****************************************************************************/ extern const FIXP_DBL invCount[80]; LNK_SECTION_INITCODE inline void InitInvInt(void) {} /** * \brief Calculate the value of 1/i where i is a integer value. It supports * input values from 1 upto 80. * \param intValue Integer input value. * \param FIXP_DBL representation of 1/intValue */ inline FIXP_DBL GetInvInt(int intValue) { FDK_ASSERT((intValue > 0) && (intValue < 80)); FDK_ASSERT(intValue<80); return invCount[intValue]; } #endif fdk-aac-0.1.3/libFDK/include/abs.h0000644000175000017500000001335612372261464017056 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): M. Lohwasser Description: fixed point abs definitions ******************************************************************************/ #if !defined(__ABS_H__) #define __ABS_H__ #if defined(__mips__) /* cppp replaced: elif */ #include "mips/abs_mips.h" #elif defined(__x86__) /* cppp replaced: elif */ #include "x86/abs_x86.h" #endif /* all cores */ /************************************************************************* ************************************************************************* Software fallbacks for missing functions ************************************************************************** **************************************************************************/ #if !defined(FUNCTION_fixabs_D) inline FIXP_DBL fixabs_D(FIXP_DBL x) { return ((x) > (FIXP_DBL)(0)) ? (x) : -(x) ; } #endif #if !defined(FUNCTION_fixabs_I) inline INT fixabs_I(INT x) { return ((x) > (INT)(0)) ? (x) : -(x) ; } #endif #if !defined(FUNCTION_fixabs_S) inline FIXP_SGL fixabs_S(FIXP_SGL x) { return ((x) > (FIXP_SGL)(0)) ? (x) : -(x) ; } #endif #endif /* __ABS_H__ */ fdk-aac-0.1.3/libFDK/include/arm/0000755000175000017500000000000012372262446016710 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/include/arm/fixmadd_arm.h0000644000175000017500000001634712372261464021346 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__arm__) /* ############################################################################# */ #if defined(__GNUC__) && defined(__arm__) && !defined(__SYMBIAN32__) /* cppp replaced: elif */ /* ############################################################################# */ /* ARM GNU GCC */ #define FUNCTION_fixmadddiv2_DD #ifdef __ARM_ARCH_6__ inline FIXP_DBL fixmadddiv2_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { INT result; asm ("smmla %0, %1, %2, %3;\n" : "=r" (result) : "r" (a), "r" (b), "r"(x) ); return result ; } #define FUNCTION_fixmsubdiv2_DD inline FIXP_DBL fixmsubdiv2_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { INT result; asm ("smmls %0, %1, %2, %3;\n" : "=r" (result) : "r" (a), "r" (b), "r"(x) ); return result ; } #else /* __ARM_ARCH_6__ */ inline FIXP_DBL fixmadddiv2_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { INT discard, result = x; asm ("smlal %0, %1, %2, %3;\n" : "=r" (discard), "+r" (result) : "r" (a), "r" (b) ); return result ; } #endif /* __ARM_ARCH_6__ */ #if defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_6__) #define FUNCTION_fixmadddiv2_DS inline FIXP_DBL fixmadddiv2_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { INT result; asm("smlawb %0, %1, %2, %3 " : "=r" (result) : "r" (a), "r" (b), "r" (x) ); return result ; } #endif /* defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_6__) */ #define FUNCTION_fixmadddiv2BitExact_DD #define fixmadddiv2BitExact_DD(a, b, c) fixmadddiv2_DD(a, b, c) #define FUNCTION_fixmsubdiv2BitExact_DD inline FIXP_DBL fixmsubdiv2BitExact_DD (FIXP_DBL x, const FIXP_DBL a, const FIXP_DBL b) { return x - fixmuldiv2BitExact_DD(a, b); } #define FUNCTION_fixmadddiv2BitExact_DS #define fixmadddiv2BitExact_DS(a, b, c) fixmadddiv2_DS(a, b, c) #define FUNCTION_fixmsubdiv2BitExact_DS inline FIXP_DBL fixmsubdiv2BitExact_DS (FIXP_DBL x, const FIXP_DBL a, const FIXP_SGL b) { return x - fixmuldiv2BitExact_DS(a, b); } /* ############################################################################# */ #endif /* toolchain */ /* ############################################################################# */ #endif /* __arm__ */ fdk-aac-0.1.3/libFDK/include/arm/cplx_mul.h0000644000175000017500000002062212372261464020705 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__arm__) && defined(__GNUC__) /* cppp replaced: elif */ #if defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_6__) #define FUNCTION_cplxMultDiv2_32x16 #define FUNCTION_cplxMultDiv2_32x16X2 //#define FUNCTION_cplxMult_32x16 //#define FUNCTION_cplxMult_32x16X2 #endif #define FUNCTION_cplxMultDiv2_32x32X2 //#define FUNCTION_cplxMult_32x32X2 #ifdef FUNCTION_cplxMultDiv2_32x16 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SPK wpk ) { LONG tmp1,tmp2; const LONG w = wpk.w; asm("smulwt %0, %3, %4;\n" "rsb %1,%0,#0;\n" "smlawb %0, %2, %4, %1;\n" "smulwt %1, %2, %4;\n" "smlawb %1, %3, %4, %1;\n" : "=&r"(tmp1), "=&r"(tmp2) : "r"(a_Re), "r"(a_Im), "r"(w) ); *c_Re = tmp1; *c_Im = tmp2; } #endif /* FUNCTION_cplxMultDiv2_32x16 */ #ifdef FUNCTION_cplxMultDiv2_32x16X2 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { LONG tmp1, tmp2; asm("smulwb %0, %3, %5;\n" /* %7 = -a_Im * b_Im */ "rsb %1,%0,#0;\n" "smlawb %0, %2, %4, %1;\n" /* tmp1 = a_Re * b_Re - a_Im * b_Im */ "smulwb %1, %2, %5;\n" /* %7 = a_Re * b_Im */ "smlawb %1, %3, %4, %1;\n" /* tmp2 = a_Im * b_Re + a_Re * b_Im */ : "=&r"(tmp1), "=&r"(tmp2) : "r"(a_Re), "r"(a_Im), "r"(b_Re), "r"(b_Im) ); *c_Re = tmp1; *c_Im = tmp2; } #endif /* FUNCTION_cplxMultDiv2_32x16X2 */ #ifdef FUNCTION_cplxMultAddDiv2_32x16X2 inline void cplxMultAddDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_SGL b_Re, const FIXP_SGL b_Im) { LONG tmp1, tmp2; asm("smulwb %0, %3, %5;\n" "rsb %1,%0,#0;\n" "smlawb %0, %2, %4, %1;\n" "smulwb %1, %2, %5;\n" "smlawb %1, %3, %4, %1;\n" : "=&r"(tmp1), "=&r"(tmp2) : "r"(a_Re), "r"(a_Im), "r"(b_Re), "r"(b_Im) ); *c_Re += tmp1; *c_Im += tmp2; } #endif /* FUNCTION_cplxMultAddDiv2_32x16X2 */ #ifdef FUNCTION_cplxMultDiv2_32x32X2 inline void cplxMultDiv2( FIXP_DBL *c_Re, FIXP_DBL *c_Im, const FIXP_DBL a_Re, const FIXP_DBL a_Im, const FIXP_DBL b_Re, const FIXP_DBL b_Im) { LONG tmp1, tmp2; #ifdef __ARM_ARCH_6__ asm( "smmul %0, %2, %4;\n" /* tmp1 = a_Re * b_Re */ "smmls %0, %3, %5, %0;\n" /* tmp1 -= a_Im * b_Im */ "smmul %1, %2, %5;\n" /* tmp2 = a_Re * b_Im */ "smmla %1, %3, %4, %1;\n" /* tmp2 += a_Im * b_Re */ : "=&r"(tmp1), "=&r"(tmp2) : "r"(a_Re), "r"(a_Im), "r"(b_Re), "r"(b_Im) : "r0" ); #else LONG discard; asm( "smull %2, %0, %7, %6;\n" /* tmp1 = -a_Im * b_Im */ "smlal %2, %0, %3, %5;\n" /* tmp1 += a_Re * b_Re */ "smull %2, %1, %3, %6;\n" /* tmp2 = a_Re * b_Im */ "smlal %2, %1, %4, %5;\n" /* tmp2 += a_Im * b_Re */ : "=&r"(tmp1), "=&r"(tmp2), "=&r"(discard) : "r"(a_Re), "r"(a_Im), "r"(b_Re), "r"(b_Im), "r"(-a_Im) ); #endif *c_Re = tmp1; *c_Im = tmp2; } #endif /* FUNCTION_cplxMultDiv2_32x32X2 */ #endif fdk-aac-0.1.3/libFDK/include/arm/scale.h0000644000175000017500000001471512372261464020157 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** Fraunhofer IIS *************************** Author(s): Description: ARM scaling operations ******************************************************************************/ #if defined(__GNUC__) /* GCC Compiler */ /* cppp replaced: elif */ #if defined(__ARM_ARCH_6__) inline static INT shiftRightSat(INT src, int scale) { INT result; asm( "ssat %0,%2,%0;\n" : "=&r"(result) : "r"(src>>scale), "M"(SAMPLE_BITS) ); return result; } #define SATURATE_INT_PCM_RIGHT_SHIFT(src, scale) shiftRightSat(src, scale) inline static INT shiftLeftSat(INT src, int scale) { INT result; asm( "ssat %0,%2,%0;\n" : "=&r"(result) : "r"(src<= 0) *value <<= newscale; else *value >>= -newscale; } #define SATURATE_RIGHT_SHIFT(src, scale, dBits) \ ( (((LONG)(src) ^ ((LONG)(src) >> (DFRACT_BITS-1)))>>(scale)) > (LONG)(((1U)<<((dBits)-1))-1)) \ ? ((LONG)(src) >> (DFRACT_BITS-1)) ^ (LONG)(((1U)<<((dBits)-1))-1) \ : ((LONG)(src) >> (scale)) #define SATURATE_LEFT_SHIFT(src, scale, dBits) \ ( ((LONG)(src) ^ ((LONG)(src) >> (DFRACT_BITS-1))) > ((LONG)(((1U)<<((dBits)-1))-1) >> (scale)) ) \ ? ((LONG)(src) >> (DFRACT_BITS-1)) ^ (LONG)(((1U)<<((dBits)-1))-1) \ : ((LONG)(src) << (scale)) fdk-aac-0.1.3/libFDK/include/arm/fixmul_arm.h0000644000175000017500000001407612372261464021233 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__arm__) #if defined(__GNUC__) && defined(__arm__) /* cppp replaced: elif */ /* ARM with GNU compiler */ #define FUNCTION_fixmuldiv2_DD #define FUNCTION_fixmuldiv2BitExact_DD #define fixmuldiv2BitExact_DD(a,b) fixmuldiv2_DD(a,b) #define FUNCTION_fixmulBitExact_DD #define fixmulBitExact_DD(a,b) fixmul_DD(a,b) #define FUNCTION_fixmuldiv2BitExact_DS #define fixmuldiv2BitExact_DS(a,b) fixmuldiv2_DS(a,b) #define FUNCTION_fixmulBitExact_DS #define fixmulBitExact_DS(a,b) fixmul_DS(a,b) #if defined(__ARM_ARCH_6__) || defined(__TARGET_ARCH_7E_M) inline INT fixmuldiv2_DD (const INT a, const INT b) { INT result ; __asm__ ("smmul %0, %1, %2" : "=r" (result) : "r" (a), "r" (b)) ; return result ; } #else inline INT fixmuldiv2_DD (const INT a, const INT b) { INT discard, result ; __asm__ ("smull %0, %1, %2, %3" : "=&r" (discard), "=r" (result) : "r" (a), "r" (b)) ; return result ; } #endif #if defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_6__) #define FUNCTION_fixmuldiv2_SD inline INT fixmuldiv2_SD (const SHORT a, const INT b) { INT result ; __asm__ ("smulwb %0, %1, %2" : "=r" (result) : "r" (b), "r" (a)) ; return result ; } #endif #endif /* defined(__GNUC__) && defined(__arm__) */ #endif /* __arm__ */ fdk-aac-0.1.3/libFDK/include/arm/scramble.h0000644000175000017500000001647112372261464020661 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: bitreversal of input data ******************************************************************************/ #if defined(FUNCTION_scramble) #if defined(__GNUC__) /* cppp replaced: elif */ #define FUNCTION_scramble #if defined(__ARM_ARCH_5TE__) #define USE_LDRD_STRD /* LDRD requires 8 byte data alignment. */ #endif inline void scramble(FIXP_DBL x [], INT n) { FDK_ASSERT(!(((INT)x)&(ALIGNMENT_DEFAULT-1))); asm("mov r2, #1;\n" /* r2(m) = 1; */ "sub r3, %1, #1;\n" /* r3 = n-1; */ "mov r4, #0;\n" /* r4(j) = 0; */ "scramble_m_loop%=:\n" /* { */ "mov r5, %1;\n" /* r5(k) = 1; */ "scramble_k_loop%=:\n" /* { */ "mov r5, r5, lsr #1;\n" /* k >>= 1; */ "eor r4, r4, r5;\n" /* j ^=k; */ "ands r10, r4, r5;\n" /* r10 = r4 & r5; */ "beq scramble_k_loop%=;\n" /* } while (r10 == 0); */ "cmp r4, r2;\n" /* if (r4 < r2) break; */ "bcc scramble_m_loop_end%=;\n" #ifdef USE_LDRD_STRD "mov r5, r2, lsl #3;\n" /* m(r5) = r2*4*2 */ "ldrd r10, [%0, r5];\n" /* r10 = x[r5], x7 = x[r5+1] */ "mov r6, r4, lsl #3;\n" /* j(r6) = r4*4*2 */ "ldrd r8, [%0, r6];\n" /* r8 = x[r6], r9 = x[r6+1]; */ "strd r10, [%0, r6];\n" /* x[r6,r6+1] = r10,r11; */ "strd r8, [%0, r5];\n" /* x[r5,r5+1] = r8,r9; */ #else "mov r5, r2, lsl #3;\n" /* m(r5) = r2*4*2 */ "ldr r10, [%0, r5];\n" "mov r6, r4, lsl #3;\n" /* j(r6) = r4*4*2 */ "ldr r11, [%0, r6];\n" "str r10, [%0, r6];\n" "str r11, [%0, r5];\n" "add r5, r5, #4;" "ldr r10, [%0, r5];\n" "add r6, r6, #4;" "ldr r11, [%0, r6];\n" "str r10, [%0, r6];\n" "str r11, [%0, r5];\n" #endif "scramble_m_loop_end%=:\n" "add r2, r2, #1;\n" /* r2++; */ "cmp r2, r3;\n" "bcc scramble_m_loop%=;\n" /* } while (r2(m) < r3(n-1)); */ : : "r"(x), "r"(n) #ifdef USE_LDRD_STRD : "r2","r3", "r4","r5", "r10","r11", "r8","r9", "r6" ); #else : "r2","r3", "r4","r5", "r10","r11", "r6" ); #endif } #else /* Force C implementation if no assembler version available. */ #undef FUNCTION_scramble #endif /* Toolchain selection. */ #endif /* defined(FUNCTION_scramble) */ fdk-aac-0.1.3/libFDK/include/arm/clz_arm.h0000644000175000017500000001251312372261464020511 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: fixed point intrinsics ******************************************************************************/ #if defined(__arm__) #if defined(__GNUC__) && defined(__ARM_ARCH_5TE__) /* cppp replaced: elif */ /* ARM gcc*/ #define FUNCTION_fixnormz_D #define FUNCTION_fixnorm_D inline INT fixnormz_D(LONG value) { INT result; asm("clz %0, %1 ": "=r"(result) : "r"(value) ); return result; } inline INT fixnorm_D(LONG value) { INT result; if (value == 0) { return 0; } if (value < 0) { value = ~value; } result = fixnormz_D(value); return result - 1; } #endif /* arm toolchain */ #endif /* __arm__ */ fdk-aac-0.1.3/libFDK/src/0000755000175000017500000000000012372262444015273 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/src/fixpoint_math.cpp0000644000175000017500000007210412372261464020655 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Gayer Description: Fixed point specific mathematical functions ******************************************************************************/ #include "fixpoint_math.h" #define MAX_LD_PRECISION 10 #define LD_PRECISION 10 /* Taylor series coeffcients for ln(1-x), centered at 0 (MacLaurin polinomial). */ #ifndef LDCOEFF_16BIT LNK_SECTION_CONSTDATA_L1 static const FIXP_DBL ldCoeff[MAX_LD_PRECISION] = { FL2FXCONST_DBL(-1.0), FL2FXCONST_DBL(-1.0/2.0), FL2FXCONST_DBL(-1.0/3.0), FL2FXCONST_DBL(-1.0/4.0), FL2FXCONST_DBL(-1.0/5.0), FL2FXCONST_DBL(-1.0/6.0), FL2FXCONST_DBL(-1.0/7.0), FL2FXCONST_DBL(-1.0/8.0), FL2FXCONST_DBL(-1.0/9.0), FL2FXCONST_DBL(-1.0/10.0) }; #else LNK_SECTION_CONSTDATA_L1 static const FIXP_SGL ldCoeff[MAX_LD_PRECISION] = { FL2FXCONST_SGL(-1.0), FL2FXCONST_SGL(-1.0/2.0), FL2FXCONST_SGL(-1.0/3.0), FL2FXCONST_SGL(-1.0/4.0), FL2FXCONST_SGL(-1.0/5.0), FL2FXCONST_SGL(-1.0/6.0), FL2FXCONST_SGL(-1.0/7.0), FL2FXCONST_SGL(-1.0/8.0), FL2FXCONST_SGL(-1.0/9.0), FL2FXCONST_SGL(-1.0/10.0) }; #endif /***************************************************************************** functionname: CalcLdData description: Delivers the Logarithm Dualis ld(op)/LD_DATA_SCALING with polynomial approximation. input: Input op is assumed to be double precision fractional 0 < op < 1.0 This function does not accept negative values. output: For op == 0, the result is saturated to -1.0 This function does not return positive values since input values are treated as fractional values. It does not make sense to input an integer value into this function (and expect a positive output value) since input values are treated as fractional values. *****************************************************************************/ LNK_SECTION_CODE_L1 FIXP_DBL CalcLdData(FIXP_DBL op) { return fLog2(op, 0); } /***************************************************************************** functionname: LdDataVector *****************************************************************************/ LNK_SECTION_CODE_L1 void LdDataVector( FIXP_DBL *srcVector, FIXP_DBL *destVector, INT n) { INT i; for ( i=0; i>1)) >> (FRACT_BITS-1); /* round */ LONG high = u * ((v>>FRACT_BITS)<<1); prod = (LONG)(high+low); return((FIXP_DBL)prod); } /***************************************************************************** functionname: CalcInvLdData description: Delivers the inverse of function CalcLdData(). Delivers 2^(op*LD_DATA_SCALING) input: Input op is assumed to be fractional -1.0 < op < 1.0 output: For op == 0, the result is MAXVAL_DBL (almost 1.0). For negative input values the output should be treated as a positive fractional value. For positive input values the output should be treated as a positive integer value. This function does not output negative values. *****************************************************************************/ LNK_SECTION_CODE_L1 /* This table is used for lookup 2^x with */ /* x in range [0...1.0[ in steps of 1/32 */ LNK_SECTION_DATA_L1 static const UINT exp2_tab_long[32]={ 0x40000000,0x4166C34C,0x42D561B4,0x444C0740, 0x45CAE0F2,0x47521CC6,0x48E1E9BA,0x4A7A77D4, 0x4C1BF829,0x4DC69CDD,0x4F7A9930,0x51382182, 0x52FF6B55,0x54D0AD5A,0x56AC1F75,0x5891FAC1, 0x5A82799A,0x5C7DD7A4,0x5E8451D0,0x60962665, 0x62B39509,0x64DCDEC3,0x6712460B,0x69540EC9, 0x6BA27E65,0x6DFDDBCC,0x70666F76,0x72DC8374, 0x75606374,0x77F25CCE,0x7A92BE8B,0x7D41D96E // 0x80000000 }; /* This table is used for lookup 2^x with */ /* x in range [0...1/32[ in steps of 1/1024 */ LNK_SECTION_DATA_L1 static const UINT exp2w_tab_long[32]={ 0x40000000,0x400B1818,0x4016321B,0x40214E0C, 0x402C6BE9,0x40378BB4,0x4042AD6D,0x404DD113, 0x4058F6A8,0x40641E2B,0x406F479E,0x407A7300, 0x4085A051,0x4090CF92,0x409C00C4,0x40A733E6, 0x40B268FA,0x40BD9FFF,0x40C8D8F5,0x40D413DD, 0x40DF50B8,0x40EA8F86,0x40F5D046,0x410112FA, 0x410C57A2,0x41179E3D,0x4122E6CD,0x412E3152, 0x41397DCC,0x4144CC3B,0x41501CA0,0x415B6EFB, // 0x4166C34C, }; /* This table is used for lookup 2^x with */ /* x in range [0...1/1024[ in steps of 1/32768 */ LNK_SECTION_DATA_L1 static const UINT exp2x_tab_long[32]={ 0x40000000,0x400058B9,0x4000B173,0x40010A2D, 0x400162E8,0x4001BBA3,0x4002145F,0x40026D1B, 0x4002C5D8,0x40031E95,0x40037752,0x4003D011, 0x400428CF,0x4004818E,0x4004DA4E,0x4005330E, 0x40058BCE,0x4005E48F,0x40063D51,0x40069613, 0x4006EED5,0x40074798,0x4007A05B,0x4007F91F, 0x400851E4,0x4008AAA8,0x4009036E,0x40095C33, 0x4009B4FA,0x400A0DC0,0x400A6688,0x400ABF4F, //0x400B1818 }; LNK_SECTION_CODE_L1 FIXP_DBL CalcInvLdData(FIXP_DBL x) { int set_zero = (x < FL2FXCONST_DBL(-31.0/64.0))? 0 : 1; int set_max = (x >= FL2FXCONST_DBL( 31.0/64.0)) | (x == FL2FXCONST_DBL(0.0)); FIXP_SGL frac = (FIXP_SGL)(LONG)(x & 0x3FF); UINT index3 = (UINT)(LONG)(x >> 10) & 0x1F; UINT index2 = (UINT)(LONG)(x >> 15) & 0x1F; UINT index1 = (UINT)(LONG)(x >> 20) & 0x1F; int exp = (x > FL2FXCONST_DBL(0.0f)) ? (31 - (int)(x>>25)) : (int)(-(x>>25)); UINT lookup1 = exp2_tab_long[index1]*set_zero; UINT lookup2 = exp2w_tab_long[index2]; UINT lookup3 = exp2x_tab_long[index3]; UINT lookup3f = lookup3 + (UINT)(LONG)fMultDiv2((FIXP_DBL)(0x0016302F),(FIXP_SGL)frac); UINT lookup12 = (UINT)(LONG)fMult((FIXP_DBL)lookup1, (FIXP_DBL) lookup2); UINT lookup = (UINT)(LONG)fMult((FIXP_DBL)lookup12, (FIXP_DBL) lookup3f); FIXP_DBL retVal = (lookup<<3) >> exp; if (set_max) retVal=FL2FXCONST_DBL(1.0f); return retVal; } /***************************************************************************** functionname: InitLdInt and CalcLdInt description: Create and access table with integer LdData (0 to 193) *****************************************************************************/ LNK_SECTION_CONSTDATA_L1 static const FIXP_DBL ldIntCoeff[] = { 0x80000001, 0x00000000, 0x02000000, 0x032b8034, 0x04000000, 0x04a4d3c2, 0x052b8034, 0x059d5da0, 0x06000000, 0x06570069, 0x06a4d3c2, 0x06eb3a9f, 0x072b8034, 0x0766a009, 0x079d5da0, 0x07d053f7, 0x08000000, 0x082cc7ee, 0x08570069, 0x087ef05b, 0x08a4d3c2, 0x08c8ddd4, 0x08eb3a9f, 0x090c1050, 0x092b8034, 0x0949a785, 0x0966a009, 0x0982809d, 0x099d5da0, 0x09b74949, 0x09d053f7, 0x09e88c6b, 0x0a000000, 0x0a16bad3, 0x0a2cc7ee, 0x0a423162, 0x0a570069, 0x0a6b3d79, 0x0a7ef05b, 0x0a92203d, 0x0aa4d3c2, 0x0ab7110e, 0x0ac8ddd4, 0x0ada3f60, 0x0aeb3a9f, 0x0afbd42b, 0x0b0c1050, 0x0b1bf312, 0x0b2b8034, 0x0b3abb40, 0x0b49a785, 0x0b584822, 0x0b66a009, 0x0b74b1fd, 0x0b82809d, 0x0b900e61, 0x0b9d5da0, 0x0baa708f, 0x0bb74949, 0x0bc3e9ca, 0x0bd053f7, 0x0bdc899b, 0x0be88c6b, 0x0bf45e09, 0x0c000000, 0x0c0b73cb, 0x0c16bad3, 0x0c21d671, 0x0c2cc7ee, 0x0c379085, 0x0c423162, 0x0c4caba8, 0x0c570069, 0x0c6130af, 0x0c6b3d79, 0x0c7527b9, 0x0c7ef05b, 0x0c88983f, 0x0c92203d, 0x0c9b8926, 0x0ca4d3c2, 0x0cae00d2, 0x0cb7110e, 0x0cc0052b, 0x0cc8ddd4, 0x0cd19bb0, 0x0cda3f60, 0x0ce2c97d, 0x0ceb3a9f, 0x0cf39355, 0x0cfbd42b, 0x0d03fda9, 0x0d0c1050, 0x0d140ca0, 0x0d1bf312, 0x0d23c41d, 0x0d2b8034, 0x0d3327c7, 0x0d3abb40, 0x0d423b08, 0x0d49a785, 0x0d510118, 0x0d584822, 0x0d5f7cff, 0x0d66a009, 0x0d6db197, 0x0d74b1fd, 0x0d7ba190, 0x0d82809d, 0x0d894f75, 0x0d900e61, 0x0d96bdad, 0x0d9d5da0, 0x0da3ee7f, 0x0daa708f, 0x0db0e412, 0x0db74949, 0x0dbda072, 0x0dc3e9ca, 0x0dca258e, 0x0dd053f7, 0x0dd6753e, 0x0ddc899b, 0x0de29143, 0x0de88c6b, 0x0dee7b47, 0x0df45e09, 0x0dfa34e1, 0x0e000000, 0x0e05bf94, 0x0e0b73cb, 0x0e111cd2, 0x0e16bad3, 0x0e1c4dfb, 0x0e21d671, 0x0e275460, 0x0e2cc7ee, 0x0e323143, 0x0e379085, 0x0e3ce5d8, 0x0e423162, 0x0e477346, 0x0e4caba8, 0x0e51daa8, 0x0e570069, 0x0e5c1d0b, 0x0e6130af, 0x0e663b74, 0x0e6b3d79, 0x0e7036db, 0x0e7527b9, 0x0e7a1030, 0x0e7ef05b, 0x0e83c857, 0x0e88983f, 0x0e8d602e, 0x0e92203d, 0x0e96d888, 0x0e9b8926, 0x0ea03232, 0x0ea4d3c2, 0x0ea96df0, 0x0eae00d2, 0x0eb28c7f, 0x0eb7110e, 0x0ebb8e96, 0x0ec0052b, 0x0ec474e4, 0x0ec8ddd4, 0x0ecd4012, 0x0ed19bb0, 0x0ed5f0c4, 0x0eda3f60, 0x0ede8797, 0x0ee2c97d, 0x0ee70525, 0x0eeb3a9f, 0x0eef69ff, 0x0ef39355, 0x0ef7b6b4, 0x0efbd42b, 0x0effebcd, 0x0f03fda9, 0x0f0809cf, 0x0f0c1050, 0x0f10113b, 0x0f140ca0, 0x0f18028d, 0x0f1bf312, 0x0f1fde3d, 0x0f23c41d, 0x0f27a4c0, 0x0f2b8034 }; LNK_SECTION_INITCODE void InitLdInt() { /* nothing to do! Use preinitialized logarithm table */ } LNK_SECTION_CODE_L1 FIXP_DBL CalcLdInt(INT i) { /* calculates ld(op)/LD_DATA_SCALING */ /* op is assumed to be an integer value between 1 and 193 */ FDK_ASSERT((193>0) && ((FIXP_DBL)ldIntCoeff[0]==(FIXP_DBL)0x80000001)); /* tab has to be initialized */ if ((i>0)&&(i<193)) return ldIntCoeff[i]; else { return (0); } } /***************************************************************************** functionname: invSqrtNorm2 description: delivers 1/sqrt(op) normalized to .5...1 and the shift value of the OUTPUT *****************************************************************************/ #define SQRT_BITS 7 #define SQRT_VALUES 128 #define SQRT_BITS_MASK 0x7f LNK_SECTION_CONSTDATA_L1 static const FIXP_DBL invSqrtTab[SQRT_VALUES] = { 0x5a827999, 0x5a287e03, 0x59cf8cbb, 0x5977a0ab, 0x5920b4de, 0x58cac480, 0x5875cade, 0x5821c364, 0x57cea99c, 0x577c792f, 0x572b2ddf, 0x56dac38d, 0x568b3631, 0x563c81df, 0x55eea2c3, 0x55a19521, 0x55555555, 0x5509dfd0, 0x54bf311a, 0x547545d0, 0x542c1aa3, 0x53e3ac5a, 0x539bf7cc, 0x5354f9e6, 0x530eafa4, 0x52c91617, 0x52842a5e, 0x523fe9ab, 0x51fc513f, 0x51b95e6b, 0x51770e8e, 0x51355f19, 0x50f44d88, 0x50b3d768, 0x5073fa4f, 0x5034b3e6, 0x4ff601df, 0x4fb7e1f9, 0x4f7a5201, 0x4f3d4fce, 0x4f00d943, 0x4ec4ec4e, 0x4e8986e9, 0x4e4ea718, 0x4e144ae8, 0x4dda7072, 0x4da115d9, 0x4d683948, 0x4d2fd8f4, 0x4cf7f31b, 0x4cc08604, 0x4c898fff, 0x4c530f64, 0x4c1d0293, 0x4be767f5, 0x4bb23df9, 0x4b7d8317, 0x4b4935ce, 0x4b1554a6, 0x4ae1de2a, 0x4aaed0f0, 0x4a7c2b92, 0x4a49ecb3, 0x4a1812fa, 0x49e69d16, 0x49b589bb, 0x4984d7a4, 0x49548591, 0x49249249, 0x48f4fc96, 0x48c5c34a, 0x4896e53c, 0x48686147, 0x483a364c, 0x480c6331, 0x47dee6e0, 0x47b1c049, 0x4784ee5f, 0x4758701c, 0x472c447c, 0x47006a80, 0x46d4e130, 0x46a9a793, 0x467ebcb9, 0x46541fb3, 0x4629cf98, 0x45ffcb80, 0x45d61289, 0x45aca3d5, 0x45837e88, 0x455aa1ca, 0x45320cc8, 0x4509beb0, 0x44e1b6b4, 0x44b9f40b, 0x449275ec, 0x446b3b95, 0x44444444, 0x441d8f3b, 0x43f71bbe, 0x43d0e917, 0x43aaf68e, 0x43854373, 0x435fcf14, 0x433a98c5, 0x43159fdb, 0x42f0e3ae, 0x42cc6397, 0x42a81ef5, 0x42841527, 0x4260458d, 0x423caf8c, 0x4219528b, 0x41f62df1, 0x41d3412a, 0x41b08ba1, 0x418e0cc7, 0x416bc40d, 0x4149b0e4, 0x4127d2c3, 0x41062920, 0x40e4b374, 0x40c3713a, 0x40a261ef, 0x40818511, 0x4060da21, 0x404060a1, 0x40201814 }; LNK_SECTION_INITCODE void InitInvSqrtTab() { /* nothing to do ! use preinitialized square root table */ } #if !defined(FUNCTION_invSqrtNorm2) /***************************************************************************** delivers 1/sqrt(op) normalized to .5...1 and the shift value of the OUTPUT, i.e. the denormalized result is 1/sqrt(op) = invSqrtNorm(op) * 2^(shift) uses Newton-iteration for approximation Q(n+1) = Q(n) + Q(n) * (0.5 - 2 * V * Q(n)^2) with Q = 0.5* V ^-0.5; 0.5 <= V < 1.0 *****************************************************************************/ FIXP_DBL invSqrtNorm2(FIXP_DBL op, INT *shift) { FIXP_DBL val = op ; FIXP_DBL reg1, reg2, regtmp ; if (val == FL2FXCONST_DBL(0.0)) { *shift = 1 ; return((LONG)1); /* minimum positive value */ } /* normalize input, calculate shift value */ FDK_ASSERT(val > FL2FXCONST_DBL(0.0)); *shift = fNormz(val) - 1; /* CountLeadingBits() is not necessary here since test value is always > 0 */ val <<=*shift ; /* normalized input V */ *shift+=2 ; /* bias for exponent */ /* Newton iteration of 1/sqrt(V) */ reg1 = invSqrtTab[ (INT)(val>>(DFRACT_BITS-1-(SQRT_BITS+1))) & SQRT_BITS_MASK ]; reg2 = FL2FXCONST_DBL(0.0625f); /* 0.5 >> 3 */ regtmp= fPow2Div2(reg1); /* a = Q^2 */ regtmp= reg2 - fMultDiv2(regtmp, val); /* b = 0.5 - 2 * V * Q^2 */ reg1 += (fMultDiv2(regtmp, reg1)<<4); /* Q = Q + Q*b */ /* calculate the output exponent = input exp/2 */ if (*shift & 0x00000001) { /* odd shift values ? */ reg2 = FL2FXCONST_DBL(0.707106781186547524400844362104849f); /* 1/sqrt(2); */ reg1 = fMultDiv2(reg1, reg2) << 2; } *shift = *shift>>1; return(reg1); } #endif /* !defined(FUNCTION_invSqrtNorm2) */ /***************************************************************************** functionname: sqrtFixp description: delivers sqrt(op) *****************************************************************************/ FIXP_DBL sqrtFixp(FIXP_DBL op) { INT tmp_exp = 0; FIXP_DBL tmp_inv = invSqrtNorm2(op, &tmp_exp); FDK_ASSERT(tmp_exp > 0) ; return( (FIXP_DBL) ( fMultDiv2( (op<<(tmp_exp-1)), tmp_inv ) << 2 )); } #if !defined(FUNCTION_schur_div) /***************************************************************************** functionname: schur_div description: delivers op1/op2 with op3-bit accuracy *****************************************************************************/ FIXP_DBL schur_div(FIXP_DBL num, FIXP_DBL denum, INT count) { INT L_num = (LONG)num>>1; INT L_denum = (LONG)denum>>1; INT div = 0; INT k = count; FDK_ASSERT (num>=(FIXP_DBL)0); FDK_ASSERT (denum>(FIXP_DBL)0); FDK_ASSERT (num <= denum); if (L_num != 0) while (--k) { div <<= 1; L_num <<= 1; if (L_num >= L_denum) { L_num -= L_denum; div++; } } return (FIXP_DBL)(div << (DFRACT_BITS - count)); } #endif /* !defined(FUNCTION_schur_div) */ #ifndef FUNCTION_fMultNorm FIXP_DBL fMultNorm(FIXP_DBL f1, FIXP_DBL f2, INT *result_e) { INT product = 0; INT norm_f1, norm_f2; if ( (f1 == (FIXP_DBL)0) || (f2 == (FIXP_DBL)0) ) { *result_e = 0; return (FIXP_DBL)0; } norm_f1 = CountLeadingBits(f1); f1 = f1 << norm_f1; norm_f2 = CountLeadingBits(f2); f2 = f2 << norm_f2; product = fMult(f1, f2); *result_e = - (norm_f1 + norm_f2); return (FIXP_DBL)product; } #endif #ifndef FUNCTION_fDivNorm FIXP_DBL fDivNorm(FIXP_DBL L_num, FIXP_DBL L_denum, INT *result_e) { FIXP_DBL div; INT norm_num, norm_den; FDK_ASSERT (L_num >= (FIXP_DBL)0); FDK_ASSERT (L_denum > (FIXP_DBL)0); if(L_num == (FIXP_DBL)0) { *result_e = 0; return ((FIXP_DBL)0); } norm_num = CountLeadingBits(L_num); L_num = L_num << norm_num; L_num = L_num >> 1; *result_e = - norm_num + 1; norm_den = CountLeadingBits(L_denum); L_denum = L_denum << norm_den; *result_e -= - norm_den; div = schur_div(L_num, L_denum, FRACT_BITS); return div; } #endif /* !FUNCTION_fDivNorm */ #ifndef FUNCTION_fDivNorm FIXP_DBL fDivNorm(FIXP_DBL num, FIXP_DBL denom) { INT e; FIXP_DBL res; FDK_ASSERT (denom >= num); res = fDivNorm(num, denom, &e); /* Avoid overflow since we must output a value with exponent 0 there is no other choice than saturating to almost 1.0f */ if(res == (FIXP_DBL)(1<<(DFRACT_BITS-2)) && e == 1) { res = (FIXP_DBL)MAXVAL_DBL; } else { res = scaleValue(res, e); } return res; } #endif /* !FUNCTION_fDivNorm */ #ifndef FUNCTION_fDivNormHighPrec FIXP_DBL fDivNormHighPrec(FIXP_DBL num, FIXP_DBL denom, INT *result_e) { FIXP_DBL div; INT norm_num, norm_den; FDK_ASSERT (num >= (FIXP_DBL)0); FDK_ASSERT (denom > (FIXP_DBL)0); if(num == (FIXP_DBL)0) { *result_e = 0; return ((FIXP_DBL)0); } norm_num = CountLeadingBits(num); num = num << norm_num; num = num >> 1; *result_e = - norm_num + 1; norm_den = CountLeadingBits(denom); denom = denom << norm_den; *result_e -= - norm_den; div = schur_div(num, denom, 31); return div; } #endif /* !FUNCTION_fDivNormHighPrec */ FIXP_DBL CalcLog2(FIXP_DBL base_m, INT base_e, INT *result_e) { return fLog2(base_m, base_e, result_e); } FIXP_DBL f2Pow( const FIXP_DBL exp_m, const INT exp_e, INT *result_e ) { FIXP_DBL frac_part, result_m; INT int_part; if (exp_e > 0) { INT exp_bits = DFRACT_BITS-1 - exp_e; int_part = exp_m >> exp_bits; frac_part = exp_m - (FIXP_DBL)(int_part << exp_bits); frac_part = frac_part << exp_e; } else { int_part = 0; frac_part = exp_m >> -exp_e; } /* Best accuracy is around 0, so try to get there with the fractional part. */ if( frac_part > FL2FXCONST_DBL(0.5f) ) { int_part = int_part + 1; frac_part = frac_part + FL2FXCONST_DBL(-1.0f); } if( frac_part < FL2FXCONST_DBL(-0.5f) ) { int_part = int_part - 1; frac_part = -(FL2FXCONST_DBL(-1.0f) - frac_part); } /* Evaluate taylor polynomial which approximates 2^x */ { FIXP_DBL p; /* result_m ~= 2^frac_part */ p = frac_part; /* First taylor series coefficient a_0 = 1.0, scaled by 0.5 due to fMultDiv2(). */ result_m = FL2FXCONST_DBL(1.0f/2.0f); for (INT i = 0; i < POW2_PRECISION; i++) { /* next taylor series term: a_i * x^i, x=0 */ result_m = fMultAddDiv2(result_m, pow2Coeff[i], p); p = fMult(p, frac_part); } } /* "+ 1" compensates fMultAddDiv2() of the polynomial evaluation above. */ *result_e = int_part + 1; return result_m; } FIXP_DBL f2Pow( const FIXP_DBL exp_m, const INT exp_e ) { FIXP_DBL result_m; INT result_e; result_m = f2Pow(exp_m, exp_e, &result_e); result_e = fixMin(DFRACT_BITS-1,fixMax(-(DFRACT_BITS-1),result_e)); return scaleValue(result_m, result_e); } FIXP_DBL fPow( FIXP_DBL base_m, INT base_e, FIXP_DBL exp_m, INT exp_e, INT *result_e ) { INT ans_lg2_e, baselg2_e; FIXP_DBL base_lg2, ans_lg2, result; /* Calc log2 of base */ base_lg2 = fLog2(base_m, base_e, &baselg2_e); /* Prepare exp */ { INT leadingBits; leadingBits = CountLeadingBits(fAbs(exp_m)); exp_m = exp_m << leadingBits; exp_e -= leadingBits; } /* Calc base pow exp */ ans_lg2 = fMult(base_lg2, exp_m); ans_lg2_e = exp_e + baselg2_e; /* Calc antilog */ result = f2Pow(ans_lg2, ans_lg2_e, result_e); return result; } FIXP_DBL fLdPow( FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e, INT *result_e ) { INT ans_lg2_e; FIXP_DBL ans_lg2, result; /* Prepare exp */ { INT leadingBits; leadingBits = CountLeadingBits(fAbs(exp_m)); exp_m = exp_m << leadingBits; exp_e -= leadingBits; } /* Calc base pow exp */ ans_lg2 = fMult(baseLd_m, exp_m); ans_lg2_e = exp_e + baseLd_e; /* Calc antilog */ result = f2Pow(ans_lg2, ans_lg2_e, result_e); return result; } FIXP_DBL fLdPow( FIXP_DBL baseLd_m, INT baseLd_e, FIXP_DBL exp_m, INT exp_e ) { FIXP_DBL result_m; int result_e; result_m = fLdPow(baseLd_m, baseLd_e, exp_m, exp_e, &result_e); return SATURATE_SHIFT(result_m, -result_e, DFRACT_BITS); } FIXP_DBL fPowInt( FIXP_DBL base_m, INT base_e, INT exp, INT *pResult_e ) { FIXP_DBL result; if (exp != 0) { INT result_e = 0; if (base_m != (FIXP_DBL)0) { { INT leadingBits; leadingBits = CountLeadingBits( base_m ); base_m <<= leadingBits; base_e -= leadingBits; } result = base_m; { int i; for (i = 1; i < fAbs(exp); i++) { result = fMult(result, base_m); } } if (exp < 0) { /* 1.0 / ans */ result = fDivNorm( FL2FXCONST_DBL(0.5f), result, &result_e ); result_e++; } else { int ansScale = CountLeadingBits( result ); result <<= ansScale; result_e -= ansScale; } result_e += exp * base_e; } else { result = (FIXP_DBL)0; } *pResult_e = result_e; } else { result = FL2FXCONST_DBL(0.5f); *pResult_e = 1; } return result; } FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e, INT *result_e) { FIXP_DBL result_m; /* Short cut for zero and negative numbers. */ if ( x_m <= FL2FXCONST_DBL(0.0f) ) { *result_e = DFRACT_BITS-1; return FL2FXCONST_DBL(-1.0f); } /* Calculate log2() */ { FIXP_DBL px2_m, x2_m; /* Move input value x_m * 2^x_e toward 1.0, where the taylor approximation of the function log(1-x) centered at 0 is most accurate. */ { INT b_norm; b_norm = fNormz(x_m)-1; x2_m = x_m << b_norm; x_e = x_e - b_norm; } /* map x from log(x) domain to log(1-x) domain. */ x2_m = - (x2_m + FL2FXCONST_DBL(-1.0) ); /* Taylor polinomial approximation of ln(1-x) */ result_m = FL2FXCONST_DBL(0.0); px2_m = x2_m; for (int i=0; i> (enorm-1)) + ((FIXP_DBL)x_e << (DFRACT_BITS-1-enorm)); *result_e = enorm; } else { /* 1 compensates the fMultDiv2() above in the taylor polinomial evaluation loop.*/ *result_e = 1; } } return result_m; } FIXP_DBL fLog2(FIXP_DBL x_m, INT x_e) { if ( x_m <= FL2FXCONST_DBL(0.0f) ) { x_m = FL2FXCONST_DBL(-1.0f); } else { INT result_e; x_m = fLog2(x_m, x_e, &result_e); x_m = scaleValue(x_m, result_e-LD_DATA_SHIFT); } return x_m; } fdk-aac-0.1.3/libFDK/src/FDK_bitbuffer.cpp0000644000175000017500000004212712372261464020442 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): M. Lohwasser Description: common bitbuffer read/write routines ******************************************************************************/ #include "FDK_bitbuffer.h" #include "genericStds.h" #include "common_fix.h" #include "fixminmax.h" const UINT BitMask [32+1] = { 0x0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff }; const UINT *const RESTRICT pBitMask = BitMask; void FDK_CreateBitBuffer (HANDLE_FDK_BITBUF *hBitBuf, UCHAR *pBuffer, UINT bufSize) { FDK_InitBitBuffer (*hBitBuf, pBuffer, bufSize, 0); FDKmemclear((*hBitBuf)->Buffer, bufSize*sizeof(UCHAR)); } void FDK_DeleteBitBuffer (HANDLE_FDK_BITBUF hBitBuf) { ; } void FDK_InitBitBuffer (HANDLE_FDK_BITBUF hBitBuf, UCHAR *pBuffer, UINT bufSize, UINT validBits) { hBitBuf->ValidBits = validBits ; hBitBuf->ReadOffset = 0 ; hBitBuf->WriteOffset = 0 ; hBitBuf->BitCnt = 0 ; hBitBuf->BitNdx = 0 ; hBitBuf->Buffer = pBuffer ; hBitBuf->bufSize = bufSize ; hBitBuf->bufBits = (bufSize << 3) ; #if defined(FDK_DEBUG) || defined(DEBUG) /*assure bufsize (2^n) */ if (bufSize!=0) { UINT x = 0, n=bufSize; for (x=0; n>0; x++,n>>=1) {} if ( bufSize != (1<<(x-1)) ) { FDKprintfErr("Error: bufSizein FDK_InitBitBuffer() != (2^n), %d\n", bufSize); } } #endif } void FDK_ResetBitBuffer ( HANDLE_FDK_BITBUF hBitBuf ) { hBitBuf->ValidBits = 0 ; hBitBuf->ReadOffset = 0 ; hBitBuf->WriteOffset = 0 ; hBitBuf->BitCnt = 0 ; hBitBuf->BitNdx = 0 ; } INT FDK_get (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits) { UINT byteOffset = hBitBuf->BitNdx >> 3 ; UINT bitOffset = hBitBuf->BitNdx & 0x07 ; hBitBuf->BitNdx = (hBitBuf->BitNdx + numberOfBits) & (hBitBuf->bufBits - 1) ; hBitBuf->BitCnt += numberOfBits ; hBitBuf->ValidBits -= numberOfBits ; UINT byteMask = hBitBuf->bufSize - 1 ; UINT tx = (hBitBuf->Buffer [ byteOffset & byteMask] << 24) | (hBitBuf->Buffer [(byteOffset+1) & byteMask] << 16) | (hBitBuf->Buffer [(byteOffset+2) & byteMask] << 8) | hBitBuf->Buffer [(byteOffset+3) & byteMask]; if (bitOffset) { tx <<= bitOffset; tx |= hBitBuf->Buffer [(byteOffset+4) & byteMask] >> (8-bitOffset); } return (tx >> (32 - numberOfBits)) ; } INT FDK_get32 (HANDLE_FDK_BITBUF hBitBuf) { UINT BitNdx = hBitBuf->BitNdx + 32; if (BitNdx <= hBitBuf->bufBits) { hBitBuf->BitNdx = BitNdx; hBitBuf->BitCnt += 32; hBitBuf->ValidBits -= 32; UINT byteOffset = (BitNdx-1) >> 3; UINT cache = (hBitBuf->Buffer[(byteOffset-3)] << 24) | (hBitBuf->Buffer[(byteOffset-2)] << 16) | (hBitBuf->Buffer[(byteOffset-1)] << 8) | hBitBuf->Buffer[(byteOffset-0)]; if ( (BitNdx = (BitNdx&7)) != 0 ) { cache = (cache >> (8-BitNdx)) | ((UINT)hBitBuf->Buffer [byteOffset-4] << (24+BitNdx)); } return (cache) ; } else { /* exotic path, used only at the end of the buffer, when wrapping around */ int nBits = (INT)hBitBuf->bufBits-(INT)hBitBuf->BitNdx; UINT cache = FDK_get (hBitBuf,nBits)<< (32-nBits); cache |= (FDK_get (hBitBuf,32-nBits)); return (cache); } } INT FDK_getBwd (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits) { UINT byteOffset = hBitBuf->BitNdx >> 3 ; UINT bitOffset = hBitBuf->BitNdx & 0x07 ; UINT byteMask = hBitBuf->bufSize - 1 ; int i; hBitBuf->BitNdx = (hBitBuf->BitNdx - numberOfBits) & (hBitBuf->bufBits - 1) ; hBitBuf->BitCnt -= numberOfBits ; hBitBuf->ValidBits += numberOfBits ; UINT tx = hBitBuf->Buffer [(byteOffset-3) & byteMask] << 24 | hBitBuf->Buffer [(byteOffset-2) & byteMask] << 16 | hBitBuf->Buffer [(byteOffset-1) & byteMask] << 8 | hBitBuf->Buffer [ byteOffset & byteMask] ; UINT txa = 0x0; tx >>= (8 - bitOffset) ; if (bitOffset && numberOfBits > 24) { tx |= hBitBuf->Buffer [(byteOffset-4) & byteMask] << (24 + bitOffset) ; } /* in place turn around */ for (i = 0; i < 16; i++) { UINT bitMaskR = 0x00000001 << i; UINT bitMaskL = 0x80000000 >> i; txa |= (tx & bitMaskR) << (31 - (i<<1)); txa |= (tx & bitMaskL) >> (31 - (i<<1)); } return (txa >> (32 - numberOfBits)) ; } void FDK_put (HANDLE_FDK_BITBUF hBitBuf, UINT value, const UINT numberOfBits) { UINT byteOffset = hBitBuf->BitNdx >> 3 ; UINT bitOffset = hBitBuf->BitNdx & 0x07 ; hBitBuf->BitNdx = (hBitBuf->BitNdx + numberOfBits) & (hBitBuf->bufBits - 1) ; hBitBuf->BitCnt += numberOfBits ; hBitBuf->ValidBits += numberOfBits ; UINT byteMask = hBitBuf->bufSize - 1 ; UINT tmp = value<<(32-numberOfBits)>>bitOffset; UINT mask = ~BitMask[(32-bitOffset)] | (BitMask [(32-numberOfBits)] >> bitOffset) ; hBitBuf->Buffer [ byteOffset & byteMask] = (hBitBuf->Buffer [ byteOffset & byteMask]&(mask>>24)) | (UCHAR)(tmp>>24); hBitBuf->Buffer [(byteOffset+1) & byteMask] = (hBitBuf->Buffer [(byteOffset+1) & byteMask]&(mask>>16)) | (UCHAR)(tmp>>16); hBitBuf->Buffer [(byteOffset+2) & byteMask] = (hBitBuf->Buffer [(byteOffset+2) & byteMask]&(mask>>8)) | (UCHAR)(tmp>>8); hBitBuf->Buffer [(byteOffset+3) & byteMask] = (hBitBuf->Buffer [(byteOffset+3) & byteMask]&(mask)) | (UCHAR)(tmp); if (bitOffset && numberOfBits > 24) { hBitBuf->Buffer [(byteOffset+4) & byteMask] = (UCHAR)(value<<(40-numberOfBits)>>bitOffset) | ( hBitBuf->Buffer [(byteOffset+4) & byteMask] & BitMask[(40-numberOfBits-bitOffset)] ) ; } } void FDK_putBwd (HANDLE_FDK_BITBUF hBitBuf, UINT value, const UINT numberOfBits) { UINT byteOffset = hBitBuf->BitNdx >> 3 ; UINT bitOffset = 7 - (hBitBuf->BitNdx & 0x07) ; UINT byteMask = hBitBuf->bufSize - 1 ; UINT mask = ~(BitMask[numberOfBits] << bitOffset) ; UINT tmp = 0x0000; int i; hBitBuf->BitNdx = (hBitBuf->BitNdx - numberOfBits) & (hBitBuf->bufBits - 1) ; hBitBuf->BitCnt -= numberOfBits ; hBitBuf->ValidBits -= numberOfBits ; /* in place turn around */ for (i = 0; i < 16; i++) { UINT bitMaskR = 0x00000001 << i; UINT bitMaskL = 0x80000000 >> i; tmp |= (value & bitMaskR) << (31 - (i<<1)); tmp |= (value & bitMaskL) >> (31 - (i<<1)); } value = tmp; tmp = value>>(32-numberOfBits)<Buffer [ byteOffset & byteMask] = (hBitBuf->Buffer [ byteOffset & byteMask]&(mask)) | (UCHAR)(tmp); hBitBuf->Buffer [(byteOffset-1) & byteMask] = (hBitBuf->Buffer [(byteOffset-1) & byteMask]&(mask>>8)) | (UCHAR)(tmp>>8); hBitBuf->Buffer [(byteOffset-2) & byteMask] = (hBitBuf->Buffer [(byteOffset-2) & byteMask]&(mask>>16)) | (UCHAR)(tmp>>16); hBitBuf->Buffer [(byteOffset-3) & byteMask] = (hBitBuf->Buffer [(byteOffset-3) & byteMask]&(mask>>24)) | (UCHAR)(tmp>>24); if ((bitOffset + numberOfBits) > 32) { hBitBuf->Buffer [(byteOffset-4) & byteMask] = (UCHAR)(value>>(64-numberOfBits-bitOffset)) | ( hBitBuf->Buffer [(byteOffset-4) & byteMask] & ~(BitMask[bitOffset] >> (32-numberOfBits)) ) ; } } void FDK_pushBack (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits, UCHAR config) { hBitBuf->BitCnt -= numberOfBits ; hBitBuf->ValidBits += (config==0) ? numberOfBits : (-(INT)numberOfBits) ; hBitBuf->BitNdx = (hBitBuf->BitNdx - numberOfBits) & (hBitBuf->bufBits - 1) ; } void FDK_pushForward (HANDLE_FDK_BITBUF hBitBuf, const UINT numberOfBits, UCHAR config) { hBitBuf->BitCnt += numberOfBits ; hBitBuf->ValidBits -= (config==0) ? numberOfBits : (-(INT)numberOfBits) ; hBitBuf->BitNdx = (hBitBuf->BitNdx + numberOfBits) & (hBitBuf->bufBits - 1) ; } void FDK_byteAlign (HANDLE_FDK_BITBUF hBitBuf, UCHAR config) { INT alignment = hBitBuf->BitCnt & 0x07 ; if (alignment) { if (config==0) FDK_pushForward (hBitBuf, 8 - alignment, config) ; /* BS_READER */ else FDK_put (hBitBuf,0 , 8 - alignment) ; /* BS_WRITER */ } hBitBuf->BitCnt = 0 ; } UINT FDK_getValidBits (HANDLE_FDK_BITBUF hBitBuf) { return hBitBuf->ValidBits; } INT FDK_getFreeBits (HANDLE_FDK_BITBUF hBitBuf) { return (hBitBuf->bufBits - hBitBuf->ValidBits) ; } void FDK_setBitCnt (HANDLE_FDK_BITBUF hBitBuf, const UINT value) { hBitBuf->BitCnt = value ; } INT FDK_getBitCnt (HANDLE_FDK_BITBUF hBitBuf) { return hBitBuf->BitCnt ; } void FDK_Feed(HANDLE_FDK_BITBUF hBitBuf, UCHAR *RESTRICT inputBuffer, const UINT bufferSize, UINT *bytesValid) { inputBuffer = &inputBuffer [bufferSize - *bytesValid] ; UINT bTotal = 0 ; UINT bToRead = (hBitBuf->bufBits - hBitBuf->ValidBits) >> 3 ; UINT noOfBytes = fMin(bToRead, *bytesValid); //(bToRead < *bytesValid) ? bToRead : *bytesValid ; while (noOfBytes > 0) { /* split read to buffer size */ bToRead = hBitBuf->bufSize - hBitBuf->ReadOffset ; bToRead = fMin(bToRead, noOfBytes); //(bToRead < noOfBytes) ? bToRead : noOfBytes ; /* copy 'bToRead' bytes from 'ptr' to inputbuffer */ FDKmemcpy(&hBitBuf->Buffer[hBitBuf->ReadOffset], inputBuffer, bToRead*sizeof(UCHAR)); /* add noOfBits to number of valid bits in buffer */ hBitBuf->ValidBits += bToRead << 3 ; bTotal += bToRead ; inputBuffer += bToRead ; hBitBuf->ReadOffset = (hBitBuf->ReadOffset + bToRead) & (hBitBuf->bufSize - 1) ; noOfBytes -= bToRead ; } *bytesValid -= bTotal ; } void CopyAlignedBlock (HANDLE_FDK_BITBUF h_BitBufSrc, UCHAR *RESTRICT dstBuffer, UINT bToRead) { UINT byteOffset = h_BitBufSrc->BitNdx >> 3 ; const UINT byteMask = h_BitBufSrc->bufSize - 1 ; UCHAR *RESTRICT pBBB = h_BitBufSrc->Buffer; for (UINT i = 0 ; i < bToRead ; i++) { dstBuffer[i] = pBBB[(byteOffset+i) & byteMask] ; } bToRead <<= 3 ; h_BitBufSrc->BitNdx = (h_BitBufSrc->BitNdx + bToRead) & (h_BitBufSrc->bufBits - 1) ; h_BitBufSrc->BitCnt += bToRead ; h_BitBufSrc->ValidBits -= bToRead ; } void FDK_Copy (HANDLE_FDK_BITBUF h_BitBufDst, HANDLE_FDK_BITBUF h_BitBufSrc, UINT *bytesValid) { INT bTotal = 0; /* limit noOfBytes to valid bytes in src buffer and available bytes in dst buffer */ UINT bToRead = h_BitBufSrc->ValidBits >> 3 ; UINT noOfBytes = fMin(bToRead, *bytesValid); //(*bytesValid < bToRead) ? *bytesValid : bToRead ; bToRead = FDK_getFreeBits(h_BitBufDst); noOfBytes = fMin(bToRead, noOfBytes); //(bToRead < noOfBytes) ? bToRead : noOfBytes; while (noOfBytes > 0) { /* Split Read to buffer size */ bToRead = h_BitBufDst->bufSize - h_BitBufDst->ReadOffset ; bToRead = fMin(noOfBytes, bToRead); //(noOfBytes < bToRead) ? noOfBytes : bToRead ; /* copy 'bToRead' bytes from buffer to buffer */ if (!(h_BitBufSrc->BitNdx & 0x07)) { CopyAlignedBlock (h_BitBufSrc, h_BitBufDst->Buffer + h_BitBufDst->ReadOffset, bToRead) ; } else { for (UINT i = 0; i < bToRead; i++) { h_BitBufDst->Buffer [h_BitBufDst->ReadOffset + i] = (UCHAR)FDK_get(h_BitBufSrc,8); } } /* add noOfBits to number of valid bits in buffer */ h_BitBufDst->ValidBits += bToRead << 3 ; bTotal += bToRead; h_BitBufDst->ReadOffset = (h_BitBufDst->ReadOffset + bToRead) & (h_BitBufDst->bufSize-1); noOfBytes -= bToRead; } *bytesValid -=bTotal; } void FDK_Fetch (HANDLE_FDK_BITBUF hBitBuf, UCHAR *outBuf, UINT *writeBytes) { UCHAR *RESTRICT outputBuffer = outBuf; UINT bTotal = 0 ; UINT bToWrite = (hBitBuf->ValidBits) >> 3 ; UINT noOfBytes = fMin(bToWrite, *writeBytes); //(bToWrite < *writeBytes) ? bToWrite : *writeBytes ; while (noOfBytes > 0) { /* split write to buffer size */ bToWrite = hBitBuf->bufSize - hBitBuf->WriteOffset ; bToWrite = fMin(bToWrite, noOfBytes); //(bToWrite < noOfBytes) ? bToWrite : noOfBytes ; /* copy 'bToWrite' bytes from bitbuffer to outputbuffer */ FDKmemcpy(outputBuffer, &hBitBuf->Buffer[hBitBuf->WriteOffset], bToWrite*sizeof(UCHAR)); /* sub noOfBits from number of valid bits in buffer */ hBitBuf->ValidBits -= bToWrite << 3 ; bTotal += bToWrite ; outputBuffer += bToWrite ; hBitBuf->WriteOffset = (hBitBuf->WriteOffset + bToWrite) & (hBitBuf->bufSize - 1) ; noOfBytes -= bToWrite ; } *writeBytes = bTotal ; } fdk-aac-0.1.3/libFDK/src/mips/0000755000175000017500000000000012372262446016245 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/src/mips/fft_rad2_mips.cpp0000644000175000017500000001401612372261464021471 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: dit_fft MIPS assembler replacements. ******************************************************************************/ #if defined(MIPS_DSP_LIB) #include "dsplib_util.h" #include "dsplib_dsp.h" #define FUNCTION_dit_fft #ifdef FUNCTION_dit_fft #include "mips_fft_twiddles.cpp" void dit_fft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) { int i; int32c *din = (int32c*)x; int32c *dout = (int32c*)x; int32c scratch[1024]; int32c *twiddles; switch (ldn) { case 4: twiddles = (int32c*)__twiddles_mips_fft32_16; break; case 5: twiddles = (int32c*)__twiddles_mips_fft32_32; break; case 6: twiddles = (int32c*)__twiddles_mips_fft32_64; break; case 7: twiddles = (int32c*)__twiddles_mips_fft32_128; break; case 8: twiddles = (int32c*)__twiddles_mips_fft32_256; break; case 9: twiddles = (int32c*)__twiddles_mips_fft32_512; break; case 10: twiddles = (int32c*)__twiddles_mips_fft32_1024; break; //case 11: twiddles = (int32c*)__twiddles_mips_fft32_2048; break; default: FDK_ASSERT(0); break; } mips_fft32(dout, din, twiddles, scratch, ldn); for(i=0;i<(1<overlap.freq = overlap; //FDKmemclear(overlap, overlapBufferSize*sizeof(FIXP_DBL)); hMdct->prev_fr = 0; hMdct->prev_nr = 0; hMdct->prev_tl = 0; hMdct->ov_size = overlapBufferSize; } void imdct_gain(FIXP_DBL *pGain_m, int *pGain_e, int tl) { FIXP_DBL gain_m = *pGain_m; int gain_e = *pGain_e; int log2_tl; log2_tl = DFRACT_BITS-1-fNormz((FIXP_DBL)tl); gain_e += -MDCT_OUTPUT_GAIN - log2_tl - MDCT_OUT_HEADROOM + 1; /* Detect non-radix 2 transform length and add amplitude compensation factor which cannot be included into the exponent above */ switch ( (tl) >> (log2_tl - 2) ) { case 0x7: /* 10 ms, 1/tl = 1.0/(FDKpow(2.0, -log2_tl) * 0.53333333333333333333) */ if (gain_m == (FIXP_DBL)0) { gain_m = FL2FXCONST_DBL(0.53333333333333333333f); } else { gain_m = fMult(gain_m, FL2FXCONST_DBL(0.53333333333333333333f)); } break; case 0x6: /* 3/4 of radix 2, 1/tl = 1.0/(FDKpow(2.0, -log2_tl) * 2.0/3.0) */ if (gain_m == (FIXP_DBL)0) { gain_m = FL2FXCONST_DBL(2.0/3.0f); } else { gain_m = fMult(gain_m, FL2FXCONST_DBL(2.0/3.0f)); } break; case 0x4: /* radix 2, nothing to do. */ break; default: /* unsupported */ FDK_ASSERT(0); break; } *pGain_m = gain_m; *pGain_e = gain_e; } INT imdct_drain( H_MDCT hMdct, FIXP_DBL *output, INT nrSamplesRoom ) { int buffered_samples = 0; if (nrSamplesRoom > 0) { buffered_samples = hMdct->ov_offset; FDK_ASSERT(buffered_samples <= nrSamplesRoom); if (buffered_samples > 0) { FDKmemcpy(output, hMdct->overlap.time, buffered_samples*sizeof(FIXP_DBL)); hMdct->ov_offset = 0; } } return buffered_samples; } INT imdct_copy_ov_and_nr( H_MDCT hMdct, FIXP_DBL * pTimeData, INT nrSamples ) { FIXP_DBL *pOvl; int nt, nf, i; nt = fMin(hMdct->ov_offset, nrSamples); nrSamples -= nt; nf = fMin(hMdct->prev_nr, nrSamples); nrSamples -= nf; FDKmemcpy(pTimeData, hMdct->overlap.time, nt*sizeof(FIXP_DBL)); pTimeData += nt; pOvl = hMdct->overlap.freq + hMdct->ov_size - 1; for (i=0; iprev_tl == 0) { hMdct->prev_wrs = wls; hMdct->prev_fr = fl; hMdct->prev_nr = (noOutSamples-fl)>>1; hMdct->prev_tl = noOutSamples; hMdct->ov_offset = 0; use_current = 1; } window_diff = (hMdct->prev_fr - fl)>>1; /* check if the previous window slope can be adjusted to match the current window slope */ if (hMdct->prev_nr + window_diff > 0) { use_current = 1; } /* check if the current window slope can be adjusted to match the previous window slope */ if (nl - window_diff > 0 ) { use_previous = 1; } /* if both is possible choose the larger of both window slope lengths */ if (use_current && use_previous) { if (fl < hMdct->prev_fr) { use_current = 0; } else { use_previous = 0; } } /* * If the previous transform block is big enough, enlarge previous window overlap, * if not, then shrink current window overlap. */ if (use_current) { hMdct->prev_nr += window_diff; hMdct->prev_fr = fl; hMdct->prev_wrs = wls; } else { nl -= window_diff; fl = hMdct->prev_fr; } *pfl = fl; *pnl = nl; } INT imdct_block( H_MDCT hMdct, FIXP_DBL *output, FIXP_DBL *spectrum, const SHORT scalefactor[], const INT nSpec, const INT noOutSamples, const INT tl, const FIXP_WTP *wls, INT fl, const FIXP_WTP *wrs, const INT fr, FIXP_DBL gain ) { FIXP_DBL *pOvl; FIXP_DBL *pOut0 = output, *pOut1; INT nl, nr; int w, i, nrSamples = 0, specShiftScale, transform_gain_e = 0; /* Derive NR and NL */ nr = (tl - fr)>>1; nl = (tl - fl)>>1; /* Include 2/N IMDCT gain into gain factor and exponent. */ imdct_gain(&gain, &transform_gain_e, tl); /* Detect FRprevious / FL mismatches and override parameters accordingly */ if (hMdct->prev_fr != fl) { imdct_adapt_parameters(hMdct, &fl, &nl, tl, wls, noOutSamples); } pOvl = hMdct->overlap.freq + hMdct->ov_size - 1; if ( noOutSamples > nrSamples ) { /* Purge buffered output. */ for (i=0; iov_offset; i++) { *pOut0 = hMdct->overlap.time[i]; pOut0 ++; } nrSamples = hMdct->ov_offset; hMdct->ov_offset = 0; } for (w=0; wprev_wrs; /* Current spectrum */ pSpec = spectrum+w*tl; /* DCT IV of current spectrum. */ dct_IV(pSpec, tl, &specShiftScale); /* Optional scaling of time domain - no yet windowed - of current spectrum */ /* and de-scale current spectrum signal (time domain, no yet windowed) */ if (gain != (FIXP_DBL)0) { scaleValuesWithFactor(pSpec, gain, tl, scalefactor[w] + specShiftScale); } else { scaleValues(pSpec, tl, scalefactor[w] + specShiftScale); } if ( noOutSamples <= nrSamples ) { /* Divert output first half to overlap buffer if we already got enough output samples. */ pOut0 = hMdct->overlap.time + hMdct->ov_offset; hMdct->ov_offset += hMdct->prev_nr + fl/2; } else { /* Account output samples */ nrSamples += hMdct->prev_nr + fl/2; } /* NR output samples 0 .. NR. -overlap[TL/2..TL/2-NR] */ for (i=0; iprev_nr; i++) { FIXP_DBL x = - (*pOvl--); *pOut0 = IMDCT_SCALE_DBL(x); pOut0 ++; } if ( noOutSamples <= nrSamples ) { /* Divert output second half to overlap buffer if we already got enough output samples. */ pOut1 = hMdct->overlap.time + hMdct->ov_offset + fl/2 - 1; hMdct->ov_offset += fl/2 + nl; } else { pOut1 = pOut0 + (fl - 1); nrSamples += fl/2 + nl; } /* output samples before window crossing point NR .. TL/2. -overlap[TL/2-NR..TL/2-NR-FL/2] + current[NR..TL/2] */ /* output samples after window crossing point TL/2 .. TL/2+FL/2. -overlap[0..FL/2] - current[TL/2..FL/2] */ pCurr = pSpec + tl - fl/2; for (i=0; iprev_nr = nr; hMdct->prev_fr = fr; hMdct->prev_tl = tl; hMdct->prev_wrs = wrs; } /* Save overlap */ pOvl = hMdct->overlap.freq + hMdct->ov_size - tl/2; FDK_ASSERT(pOvl >= hMdct->overlap.time + hMdct->ov_offset); FDK_ASSERT(tl/2 <= hMdct->ov_size); for (i=0; i> (SHIFT_FACTOR) #if defined(__CC_ARM) || defined(__arm__) #include "arm/autocorr2nd.cpp" #endif /*! * * \brief Calculate second order autocorrelation using 2 accumulators * */ #if !defined(FUNCTION_autoCorr2nd_real) INT autoCorr2nd_real (ACORR_COEFS *ac, /*!< Pointer to autocorrelation coeffs */ const FIXP_DBL *reBuffer, /*!< Pointer to to real part of input samples */ const int len /*!< Number input samples */ ) { int j, autoCorrScaling, mScale; FIXP_DBL accu1, accu2, accu3, accu4, accu5; const FIXP_DBL *pReBuf; const FIXP_DBL *realBuf = reBuffer; /* r11r,r22r r01r,r12r r02r */ pReBuf = realBuf-2; accu5 = ( (fMultDiv2(pReBuf[0], pReBuf[2]) + fMultDiv2(pReBuf[1], pReBuf[3])) SHIFT); pReBuf++; //len must be even accu1 = fPow2Div2(pReBuf[0]) SHIFT; accu3 = fMultDiv2(pReBuf[0], pReBuf[1]) SHIFT; pReBuf++; for ( j = (len - 2)>>1; j != 0; j--,pReBuf+=2 ) { accu1 += ( (fPow2Div2(pReBuf[0]) + fPow2Div2(pReBuf[1])) SHIFT); accu3 += ( (fMultDiv2(pReBuf[0], pReBuf[1]) + fMultDiv2(pReBuf[1], pReBuf[2])) SHIFT); accu5 += ( (fMultDiv2(pReBuf[0], pReBuf[2]) + fMultDiv2(pReBuf[1], pReBuf[3])) SHIFT); } accu2 = (fPow2Div2(realBuf[-2]) SHIFT); accu2 += accu1; accu1 += (fPow2Div2(realBuf[len - 2]) SHIFT); accu4 = (fMultDiv2(realBuf[-1],realBuf[-2]) SHIFT); accu4 += accu3; accu3 += (fMultDiv2(realBuf[len - 1],realBuf[len - 2]) SHIFT); mScale = CntLeadingZeros( (accu1 | accu2 | fAbs(accu3) | fAbs(accu4) | fAbs(accu5)) ) - 1; autoCorrScaling = mScale - 1 - SHIFT_FACTOR; /* -1 because of fMultDiv2*/ /* Scale to common scale factor */ ac->r11r = accu1 << mScale; ac->r22r = accu2 << mScale; ac->r01r = accu3 << mScale; ac->r12r = accu4 << mScale; ac->r02r = accu5 << mScale; ac->det = (fMultDiv2(ac->r11r,ac->r22r) - fMultDiv2(ac->r12r,ac->r12r)) ; mScale = CountLeadingBits(fAbs(ac->det)); ac->det <<= mScale; ac->det_scale = mScale - 1; return autoCorrScaling; } #endif #ifndef LOW_POWER_SBR_ONLY #if !defined(FUNCTION_autoCorr2nd_cplx) INT autoCorr2nd_cplx (ACORR_COEFS *ac, /*!< Pointer to autocorrelation coeffs */ const FIXP_DBL *reBuffer, /*!< Pointer to real part of input samples */ const FIXP_DBL *imBuffer, /*!< Pointer to imag part of input samples */ const int len /*!< Number of input samples */ ) { int j, autoCorrScaling, mScale, len_scale; FIXP_DBL accu0, accu1,accu2, accu3, accu4, accu5, accu6, accu7, accu8; const FIXP_DBL *pReBuf, *pImBuf; const FIXP_DBL *realBuf = reBuffer; const FIXP_DBL *imagBuf = imBuffer; (len>64) ? (len_scale = 6) : (len_scale = 5); /* r00r, r11r,r22r r01r,r12r r01i,r12i r02r,r02i */ accu1 = accu3 = accu5 = accu7 = accu8 = FL2FXCONST_DBL(0.0f); pReBuf = realBuf-2, pImBuf = imagBuf-2; accu7 += ( (fMultDiv2(pReBuf[2], pReBuf[0]) + fMultDiv2(pImBuf[2], pImBuf[0])) >> len_scale); accu8 += ( (fMultDiv2(pImBuf[2], pReBuf[0]) - fMultDiv2(pReBuf[2], pImBuf[0])) >> len_scale); pReBuf = realBuf-1, pImBuf = imagBuf-1; for ( j = (len - 1); j != 0; j--,pReBuf++,pImBuf++ ){ accu1 += ( (fPow2Div2(pReBuf[0] ) + fPow2Div2(pImBuf[0] )) >> len_scale); accu3 += ( (fMultDiv2(pReBuf[0], pReBuf[1]) + fMultDiv2(pImBuf[0], pImBuf[1])) >> len_scale); accu5 += ( (fMultDiv2(pImBuf[1], pReBuf[0]) - fMultDiv2(pReBuf[1], pImBuf[0])) >> len_scale); accu7 += ( (fMultDiv2(pReBuf[2], pReBuf[0]) + fMultDiv2(pImBuf[2], pImBuf[0])) >> len_scale); accu8 += ( (fMultDiv2(pImBuf[2], pReBuf[0]) - fMultDiv2(pReBuf[2], pImBuf[0])) >> len_scale); } accu2 = ( (fPow2Div2(realBuf[-2]) + fPow2Div2(imagBuf[-2])) >> len_scale); accu2 += accu1; accu1 += ( (fPow2Div2(realBuf[len-2]) + fPow2Div2(imagBuf[len-2])) >> len_scale); accu0 = ( (fPow2Div2(realBuf[len-1]) + fPow2Div2(imagBuf[len-1])) >> len_scale) - ( (fPow2Div2(realBuf[-1]) + fPow2Div2(imagBuf[-1])) >> len_scale); accu0 += accu1; accu4 = ( (fMultDiv2(realBuf[-1], realBuf[-2]) + fMultDiv2(imagBuf[-1], imagBuf[-2])) >> len_scale); accu4 += accu3; accu3 += ( (fMultDiv2(realBuf[len-1], realBuf[len-2]) + fMultDiv2(imagBuf[len-1], imagBuf[len-2])) >> len_scale); accu6 = ( (fMultDiv2(imagBuf[-1], realBuf[-2]) - fMultDiv2(realBuf[-1], imagBuf[-2])) >> len_scale); accu6 += accu5; accu5 += ( (fMultDiv2(imagBuf[len - 1], realBuf[len - 2]) - fMultDiv2(realBuf[len - 1], imagBuf[len - 2])) >> len_scale); mScale = CntLeadingZeros( (accu0 | accu1 | accu2 | fAbs(accu3) | fAbs(accu4) | fAbs(accu5) | fAbs(accu6) | fAbs(accu7) | fAbs(accu8)) ) - 1; autoCorrScaling = mScale - 1 - len_scale; /* -1 because of fMultDiv2*/ /* Scale to common scale factor */ ac->r00r = (FIXP_DBL)accu0 << mScale; ac->r11r = (FIXP_DBL)accu1 << mScale; ac->r22r = (FIXP_DBL)accu2 << mScale; ac->r01r = (FIXP_DBL)accu3 << mScale; ac->r12r = (FIXP_DBL)accu4 << mScale; ac->r01i = (FIXP_DBL)accu5 << mScale; ac->r12i = (FIXP_DBL)accu6 << mScale; ac->r02r = (FIXP_DBL)accu7 << mScale; ac->r02i = (FIXP_DBL)accu8 << mScale; ac->det = ( fMultDiv2(ac->r11r,ac->r22r) >> 1 ) - ( (fMultDiv2(ac->r12r,ac->r12r) + fMultDiv2(ac->r12i,ac->r12i)) >> 1 ); mScale = CountLeadingBits(fAbs(ac->det)); ac->det <<= mScale; ac->det_scale = mScale - 2; return autoCorrScaling; } #endif /* FUNCTION_autoCorr2nd_cplx */ #endif /* LOW_POWER_SBR_ONLY */ fdk-aac-0.1.3/libFDK/src/dct.cpp0000644000175000017500000003715012372261464016560 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! \file dct.cpp \brief DCT Implementations Library functions to calculate standard DCTs. This will most likely be replaced by hand-optimized functions for the specific target processor. Three different implementations of the dct type II and the dct type III transforms are provided. By default implementations which are based on a single, standard complex FFT-kernel are used (dctII_f() and dctIII_f()). These are specifically helpful in cases where optimized FFT libraries are already available. The FFT used in these implementation is FFT rad2 from FDK_tools. Of course, one might also use DCT-libraries should they be available. The DCT and DST type IV implementations are only available in a version based on a complex FFT kernel. */ #include "dct.h" #include "FDK_tools_rom.h" #include "fft.h" #if defined(__arm__) #include "arm/dct_arm.cpp" #endif #if !defined(FUNCTION_dct_III) void dct_III(FIXP_DBL *pDat, /*!< pointer to input/output */ FIXP_DBL *tmp, /*!< pointer to temporal working buffer */ int L, /*!< lenght of transform */ int *pDat_e ) { FDK_ASSERT(L == 64 || L == 32); int i; FIXP_DBL xr, accu1, accu2; int inc; int M = L>>1; int ld_M; if (L == 64) ld_M = 5; else ld_M = 4; /* This loop performs multiplication for index i (i*inc) */ inc = (64/2) >> ld_M; /* 64/L */ FIXP_DBL *pTmp_0 = &tmp[2]; FIXP_DBL *pTmp_1 = &tmp[(M-1)*2]; for(i=1; i>1; i++,pTmp_0+=2,pTmp_1-=2) { FIXP_DBL accu3,accu4,accu5,accu6; cplxMultDiv2(&accu2, &accu1, pDat[L - i], pDat[i], sin_twiddle_L64[i*inc]); cplxMultDiv2(&accu4, &accu3, pDat[M+i], pDat[M-i], sin_twiddle_L64[(M-i)*inc]); accu3 >>= 1; accu4 >>= 1; /* This method is better for ARM926, that uses operand2 shifted right by 1 always */ cplxMultDiv2(&accu6, &accu5, (accu3 - (accu1>>1)), ((accu2>>1) + accu4), sin_twiddle_L64[(4*i)*inc]); xr = (accu1>>1) + accu3; pTmp_0[0] = (xr>>1) - accu5; pTmp_1[0] = (xr>>1) + accu5; xr = (accu2>>1) - accu4; pTmp_0[1] = (xr>>1) - accu6; pTmp_1[1] = -((xr>>1) + accu6); } xr = fMultDiv2(pDat[M], sin_twiddle_L64[64/2].v.re );/* cos((PI/(2*L))*M); */ tmp[0] = ((pDat[0]>>1) + xr)>>1; tmp[1] = ((pDat[0]>>1) - xr)>>1; cplxMultDiv2(&accu2, &accu1, pDat[L - (M/2)], pDat[M/2], sin_twiddle_L64[64/4]); tmp[M] = accu1>>1; tmp[M+1] = accu2>>1; /* dit_fft expects 1 bit scaled input values */ fft(M, tmp, pDat_e); /* ARM926: 12 cycles per 2-iteration, no overhead code by compiler */ pTmp_1 = &tmp[L]; for (i = M>>1; i--;) { FIXP_DBL tmp1, tmp2, tmp3, tmp4; tmp1 = *tmp++; tmp2 = *tmp++; tmp3 = *--pTmp_1; tmp4 = *--pTmp_1; *pDat++ = tmp1; *pDat++ = tmp3; *pDat++ = tmp2; *pDat++ = tmp4; } *pDat_e += 2; } #endif #if !defined(FUNCTION_dct_II) void dct_II(FIXP_DBL *pDat, /*!< pointer to input/output */ FIXP_DBL *tmp, /*!< pointer to temporal working buffer */ int L, /*!< lenght of transform */ int *pDat_e ) { FDK_ASSERT(L == 64 || L == 32); FIXP_DBL accu1,accu2; FIXP_DBL *pTmp_0, *pTmp_1; int i; int inc; int M = L>>1; int ld_M; FDK_ASSERT(L == 64 || L == 32); ld_M = 4 + (L >> 6); /* L=64: 5, L=32: 4 */ inc = (64/2) >> ld_M; /* L=64: 1, L=32: 2 */ FIXP_DBL *pdat = &pDat[0]; FIXP_DBL accu3, accu4; pTmp_0 = &tmp[0]; pTmp_1 = &tmp[L-1]; for (i = M>>1; i--; ) { accu1 = *pdat++; accu2 = *pdat++; accu3 = *pdat++; accu4 = *pdat++; accu1 >>= 1; accu2 >>= 1; accu3 >>= 1; accu4 >>= 1; *pTmp_0++ = accu1; *pTmp_0++ = accu3; *pTmp_1-- = accu2; *pTmp_1-- = accu4; } fft(M, tmp, pDat_e); pTmp_0 = &tmp[2]; pTmp_1 = &tmp[(M-1)*2]; for (i=1; i>1; i++,pTmp_0+=2,pTmp_1-=2) { FIXP_DBL a1,a2; FIXP_DBL accu3, accu4; a1 = ((pTmp_0[1]>>1) + (pTmp_1[1]>>1)); a2 = ((pTmp_1[0]>>1) - (pTmp_0[0]>>1)); cplxMultDiv2(&accu1, &accu2, a2, a1, sin_twiddle_L64[(4*i)*inc]); accu1<<=1; accu2<<=1; a1 = ((pTmp_0[0]>>1) + (pTmp_1[0]>>1)); a2 = ((pTmp_0[1]>>1) - (pTmp_1[1]>>1)); cplxMultDiv2(&accu3, &accu4, (a1 + accu2), -(accu1 + a2), sin_twiddle_L64[i*inc]); pDat[L - i] = accu4; pDat[i] = accu3; cplxMultDiv2(&accu3, &accu4, (a1 - accu2), -(accu1 - a2), sin_twiddle_L64[(M-i)*inc]); pDat[M + i] = accu4; pDat[M - i] = accu3; } cplxMultDiv2(&accu1, &accu2, tmp[M], tmp[M+1], sin_twiddle_L64[(M/2)*inc]); pDat[L - (M/2)] = accu2; pDat[M/2] = accu1; pDat[0] = (tmp[0]>>1)+(tmp[1]>>1); pDat[M] = fMult(((tmp[0]>>1)-(tmp[1]>>1)), sin_twiddle_L64[64/2].v.re);/* cos((PI/(2*L))*M); */ *pDat_e += 2; } #endif static void getTables(const FIXP_WTP **twiddle, const FIXP_STP **sin_twiddle, int *sin_step, int length) { int ld2_length; /* Get ld2 of length - 2 + 1 -2: because first table entry is window of size 4 +1: because we already include +1 because of ceil(log2(length)) */ ld2_length = DFRACT_BITS-1-fNormz((FIXP_DBL)length) - 1; /* Extract sort of "eigenvalue" (the 4 left most bits) of length. */ switch ( (length) >> (ld2_length-1) ) { case 0x4: /* radix 2 */ *sin_twiddle = SineTable512; *sin_step = 1<<(9 - ld2_length); *twiddle = windowSlopes[0][0][ld2_length-1]; break; case 0x7: /* 10 ms */ *sin_twiddle = SineTable480; *sin_step = 1<<(8 - ld2_length); *twiddle = windowSlopes[0][1][ld2_length]; break; default: *sin_twiddle = NULL; *sin_step = 0; *twiddle = NULL; break; } FDK_ASSERT(*twiddle != NULL); FDK_ASSERT(*sin_step > 0); } #if !defined(FUNCTION_dct_IV) void dct_IV(FIXP_DBL *pDat, int L, int *pDat_e) { int sin_step = 0; int M = L >> 1; const FIXP_WTP *twiddle; const FIXP_STP *sin_twiddle; FDK_ASSERT(L >= 4); getTables(&twiddle, &sin_twiddle, &sin_step, L); #ifdef FUNCTION_dct_IV_func1 if (M>=4 && (M&3) == 0) { /* ARM926: 44 cycles for 2 iterations = 22 cycles/iteration */ dct_IV_func1(M>>2, twiddle, &pDat[0], &pDat[L-1]); } else #endif /* FUNCTION_dct_IV_func1 */ { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; register int i; /* 29 cycles on ARM926 */ for (i = 0; i < M-1; i+=2,pDat_0+=2,pDat_1-=2) { register FIXP_DBL accu1,accu2,accu3,accu4; accu1 = pDat_1[1]; accu2 = pDat_0[0]; accu3 = pDat_0[1]; accu4 = pDat_1[0]; cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i+1]); pDat_0[0] = accu2; pDat_0[1] = accu1; pDat_1[0] = accu4; pDat_1[1] = -accu3; } if (M&1) { register FIXP_DBL accu1,accu2; accu1 = pDat_1[1]; accu2 = pDat_0[0]; cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); pDat_0[0] = accu2; pDat_0[1] = accu1; } } fft(M, pDat, pDat_e); #ifdef FUNCTION_dct_IV_func2 if (M>=4 && (M&3) == 0) { /* ARM926: 42 cycles for 2 iterations = 21 cycles/iteration */ dct_IV_func2(M>>2, sin_twiddle, &pDat[0], &pDat[L], sin_step); } else #endif /* FUNCTION_dct_IV_func2 */ { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; register FIXP_DBL accu1,accu2,accu3,accu4; int idx, i; /* Sin and Cos values are 0.0f and 1.0f */ accu1 = pDat_1[0]; accu2 = pDat_1[1]; pDat_1[1] = -(pDat_0[1]>>1); pDat_0[0] = (pDat_0[0]>>1); /* 28 cycles for ARM926 */ for (idx = sin_step,i=1; i<(M+1)>>1; i++, idx+=sin_step) { FIXP_STP twd = sin_twiddle[idx]; cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd); pDat_0[1] = accu3; pDat_1[0] = accu4; pDat_0+=2; pDat_1-=2; cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); accu1 = pDat_1[0]; accu2 = pDat_1[1]; pDat_1[1] = -accu3; pDat_0[0] = accu4; } if ( (M&1) == 0 ) { /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); pDat_1[0] = accu1 + accu2; pDat_0[1] = accu1 - accu2; } } /* Add twiddeling scale. */ *pDat_e += 2; } #endif /* defined (FUNCTION_dct_IV) */ #if !defined(FUNCTION_dst_IV) void dst_IV(FIXP_DBL *pDat, int L, int *pDat_e ) { int sin_step = 0; int M = L >> 1; const FIXP_WTP *twiddle; const FIXP_STP *sin_twiddle; #ifdef DSTIV2_ENABLE if (L == 2) { const FIXP_STP tab = STCP(0x7641AF3D, 0x30FB9452); FIXP_DBL tmp1, tmp2; cplxMultDiv2(&tmp2, &tmp1, pDat[0], pDat[1], tab); pDat[0] = tmp1; pDat[1] = tmp2; *pDat_e += 1; return; } #else FDK_ASSERT(L >= 4); #endif getTables(&twiddle, &sin_twiddle, &sin_step, L); #ifdef FUNCTION_dst_IV_func1 if ( (M>=4) && ((M&3) == 0) ) { dst_IV_func1(M, twiddle, &pDat[0], &pDat[L]); } else #endif { FIXP_DBL *RESTRICT pDat_0 = &pDat[0]; FIXP_DBL *RESTRICT pDat_1 = &pDat[L - 2]; register int i; /* 34 cycles on ARM926 */ for (i = 0; i < M-1; i+=2,pDat_0+=2,pDat_1-=2) { register FIXP_DBL accu1,accu2,accu3,accu4; accu1 = pDat_1[1]; accu2 = -pDat_0[0]; accu3 = pDat_0[1]; accu4 = -pDat_1[0]; cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i+1]); pDat_0[0] = accu2; pDat_0[1] = accu1; pDat_1[0] = accu4; pDat_1[1] = -accu3; } if (M&1) { register FIXP_DBL accu1,accu2; accu1 = pDat_1[1]; accu2 = -pDat_0[0]; cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); pDat_0[0] = accu2; pDat_0[1] = accu1; } } fft(M, pDat, pDat_e); #ifdef FUNCTION_dst_IV_func2 if ( (M>=4) && ((M&3) == 0) ) { dst_IV_func2(M>>2, sin_twiddle + sin_step, &pDat[0], &pDat[L - 1], sin_step); } else #endif /* FUNCTION_dst_IV_func2 */ { FIXP_DBL *RESTRICT pDat_0; FIXP_DBL *RESTRICT pDat_1; register FIXP_DBL accu1,accu2,accu3,accu4; int idx, i; pDat_0 = &pDat[0]; pDat_1 = &pDat[L - 2]; /* Sin and Cos values are 0.0f and 1.0f */ accu1 = pDat_1[0]; accu2 = pDat_1[1]; pDat_1[1] = -(pDat_0[0]>>1); pDat_0[0] = (pDat_0[1]>>1); for (idx = sin_step,i=1; i<(M+1)>>1; i++, idx+=sin_step) { FIXP_STP twd = sin_twiddle[idx]; cplxMultDiv2(&accu3, &accu4, accu1, accu2, twd); pDat_1[0] = -accu3; pDat_0[1] = -accu4; pDat_0+=2; pDat_1-=2; cplxMultDiv2(&accu3, &accu4, pDat_0[1], pDat_0[0], twd); accu1 = pDat_1[0]; accu2 = pDat_1[1]; pDat_0[0] = accu3; pDat_1[1] = -accu4; } if ( (M&1) == 0 ) { /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); pDat_0[1] = - accu1 - accu2; pDat_1[0] = accu2 - accu1; } } /* Add twiddeling scale. */ *pDat_e += 2; } #endif /* !defined(FUNCTION_dst_IV) */ fdk-aac-0.1.3/libFDK/src/fft.cpp0000644000175000017500000011612412372261464016564 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Josef Hoepfl, DSP Solutions Description: Fix point FFT ******************************************************************************/ #include "fft.h" #include "fft_rad2.h" #include "FDK_tools_rom.h" #define F3C(x) STC(x) #define C31 (F3C(0x91261468)) /* FL2FXCONST_DBL(-0.86602540) */ /* Performs the FFT of length 3 according to the algorithm after winograd. No scaling of the input vector because the scaling is already done in the rotation vector. */ static FORCEINLINE void fft3(FIXP_DBL *RESTRICT pDat) { FIXP_DBL r1,r2; FIXP_DBL s1,s2; /* real part */ r1 = pDat[2] + pDat[4]; r2 = fMult((pDat[2] - pDat[4]), C31); pDat[0] = pDat[0] + r1; r1 = pDat[0] - r1 - (r1>>1); /* imaginary part */ s1 = pDat[3] + pDat[5]; s2 = fMult((pDat[3] - pDat[5]), C31); pDat[1] = pDat[1] + s1; s1 = pDat[1] - s1 - (s1>>1); /* combination */ pDat[2] = r1 - s2; pDat[4] = r1 + s2; pDat[3] = s1 + r2; pDat[5] = s1 - r2; } #define F5C(x) STC(x) #define C51 (F5C(0x79bc3854)) /* FL2FXCONST_DBL( 0.95105652) */ #define C52 (F5C(0x9d839db0)) /* FL2FXCONST_DBL(-1.53884180/2) */ #define C53 (F5C(0xd18053ce)) /* FL2FXCONST_DBL(-0.36327126) */ #define C54 (F5C(0x478dde64)) /* FL2FXCONST_DBL( 0.55901699) */ #define C55 (F5C(0xb0000001)) /* FL2FXCONST_DBL(-1.25/2) */ /* performs the FFT of length 5 according to the algorithm after winograd */ static FORCEINLINE void fft5(FIXP_DBL *RESTRICT pDat) { FIXP_DBL r1,r2,r3,r4; FIXP_DBL s1,s2,s3,s4; FIXP_DBL t; /* real part */ r1 = pDat[2] + pDat[8]; r4 = pDat[2] - pDat[8]; r3 = pDat[4] + pDat[6]; r2 = pDat[4] - pDat[6]; t = fMult((r1-r3), C54); r1 = r1 + r3; pDat[0] = pDat[0] + r1; /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of the values as fracts */ r1 = pDat[0] + (fMultDiv2(r1, C55) <<(2)); r3 = r1 - t; r1 = r1 + t; t = fMult((r4 + r2), C51); /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of the values as fracts */ r4 = t + (fMultDiv2(r4, C52) <<(2)); r2 = t + fMult(r2, C53); /* imaginary part */ s1 = pDat[3] + pDat[9]; s4 = pDat[3] - pDat[9]; s3 = pDat[5] + pDat[7]; s2 = pDat[5] - pDat[7]; t = fMult((s1 - s3), C54); s1 = s1 + s3; pDat[1] = pDat[1] + s1; /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of the values as fracts */ s1 = pDat[1] + (fMultDiv2(s1, C55) <<(2)); s3 = s1 - t; s1 = s1 + t; t = fMult((s4 + s2), C51); /* Bit shift left because of the constant C55 which was scaled with the factor 0.5 because of the representation of the values as fracts */ s4 = t + (fMultDiv2(s4, C52) <<(2)); s2 = t + fMult(s2, C53); /* combination */ pDat[2] = r1 + s2; pDat[8] = r1 - s2; pDat[4] = r3 - s4; pDat[6] = r3 + s4; pDat[3] = s1 - r2; pDat[9] = s1 + r2; pDat[5] = s3 + r4; pDat[7] = s3 - r4; } #define N3 3 #define N5 5 #define N6 6 #define N15 15 /* Performs the FFT of length 15. It is split into FFTs of length 3 and length 5. */ static inline void fft15(FIXP_DBL *pInput) { FIXP_DBL aDst[2*N15]; FIXP_DBL aDst1[2*N15]; int i,k,l; /* Sort input vector for fft's of length 3 input3(0:2) = [input(0) input(5) input(10)]; input3(3:5) = [input(3) input(8) input(13)]; input3(6:8) = [input(6) input(11) input(1)]; input3(9:11) = [input(9) input(14) input(4)]; input3(12:14) = [input(12) input(2) input(7)]; */ { const FIXP_DBL *pSrc = pInput; FIXP_DBL *RESTRICT pDst = aDst; /* Merge 3 loops into one, skip call of fft3 */ for(i=0,l=0,k=0; i= (2*N15)) l -= (2*N15); pDst[k+2] = pSrc[l]; pDst[k+3] = pSrc[l+1]; l += 2*N5; if (l >= (2*N15)) l -= (2*N15); pDst[k+4] = pSrc[l]; pDst[k+5] = pSrc[l+1]; l += (2*N5) + (2*N3); if (l >= (2*N15)) l -= (2*N15); /* fft3 merged with shift right by 2 loop */ FIXP_DBL r1,r2,r3; FIXP_DBL s1,s2; /* real part */ r1 = pDst[k+2] + pDst[k+4]; r2 = fMult((pDst[k+2] - pDst[k+4]), C31); s1 = pDst[k+0]; pDst[k+0] = (s1 + r1)>>2; r1 = s1 - (r1>>1); /* imaginary part */ s1 = pDst[k+3] + pDst[k+5]; s2 = fMult((pDst[k+3] - pDst[k+5]), C31); r3 = pDst[k+1]; pDst[k+1] = (r3 + s1)>>2; s1 = r3 - (s1>>1); /* combination */ pDst[k+2] = (r1 - s2)>>2; pDst[k+4] = (r1 + s2)>>2; pDst[k+3] = (s1 + r2)>>2; pDst[k+5] = (s1 - r2)>>2; } } /* Sort input vector for fft's of length 5 input5(0:4) = [output3(0) output3(3) output3(6) output3(9) output3(12)]; input5(5:9) = [output3(1) output3(4) output3(7) output3(10) output3(13)]; input5(10:14) = [output3(2) output3(5) output3(8) output3(11) output3(14)]; */ /* Merge 2 loops into one, brings about 10% */ { const FIXP_DBL *pSrc = aDst; FIXP_DBL *RESTRICT pDst = aDst1; for(i=0,l=0,k=0; i= (2*N15)) l -= (2*N15); pDst[k+2] = pSrc[l]; pDst[k+3] = pSrc[l+1]; l += (2*N6); if (l >= (2*N15)) l -= (2*N15); pDst[k+4] = pSrc[l]; pDst[k+5] = pSrc[l+1]; l += (2*N6); if (l >= (2*N15)) l -= (2*N15); pDst[k+6] = pSrc[l]; pDst[k+7] = pSrc[l+1]; l += (2*N6); if (l >= (2*N15)) l -= (2*N15); pDst[k+8] = pSrc[l]; pDst[k+9] = pSrc[l+1]; l += 2; /* no modulo check needed, it cannot occur */ } } } #define W_PiFOURTH STC(0x5a82799a) #ifndef SUMDIFF_PIFOURTH #define SUMDIFF_PIFOURTH(diff,sum,a,b) \ { \ FIXP_DBL wa, wb;\ wa = fMultDiv2(a, W_PiFOURTH);\ wb = fMultDiv2(b, W_PiFOURTH);\ diff = wb - wa;\ sum = wb + wa;\ } #endif /* This version is more overflow save, but less cycle optimal. */ #define SUMDIFF_EIGTH(x, y, ix, iy, vr, vi, ur, ui) \ vr = (x[ 0 + ix]>>1) + (x[16 + ix]>>1); /* Re A + Re B */ \ vi = (x[ 8 + ix]>>1) + (x[24 + ix]>>1); /* Re C + Re D */ \ ur = (x[ 1 + ix]>>1) + (x[17 + ix]>>1); /* Im A + Im B */ \ ui = (x[ 9 + ix]>>1) + (x[25 + ix]>>1); /* Im C + Im D */ \ y[ 0 + iy] = vr + vi; /* Re A' = ReA + ReB +ReC + ReD */ \ y[ 4 + iy] = vr - vi; /* Re C' = -(ReC+ReD) + (ReA+ReB) */ \ y[ 1 + iy] = ur + ui; /* Im A' = sum of imag values */ \ y[ 5 + iy] = ur - ui; /* Im C' = -Im C -Im D +Im A +Im B */ \ vr -= x[16 + ix]; /* Re A - Re B */ \ vi = vi - x[24 + ix]; /* Re C - Re D */ \ ur -= x[17 + ix]; /* Im A - Im B */ \ ui = ui - x[25 + ix]; /* Im C - Im D */ \ y[ 2 + iy] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ \ y[ 6 + iy] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ \ y[ 3 + iy] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ \ y[ 7 + iy] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ static const FIXP_STP fft16_w16[2] = { STCP(0x7641af3d, 0x30fbc54d), STCP(0x30fbc54d, 0x7641af3d) }; LNK_SECTION_CODE_L1 inline void fft_16(FIXP_DBL *RESTRICT x) { FIXP_DBL vr, vi, ur, ui; FIXP_DBL y[32]; SUMDIFF_EIGTH(x, y, 0, 0, vr, vi, ur, ui); SUMDIFF_EIGTH(x, y, 4, 8, vr, vi, ur, ui); SUMDIFF_EIGTH(x, y, 2, 16, vr, vi, ur, ui); SUMDIFF_EIGTH(x, y, 6, 24, vr, vi, ur, ui); // xt1 = 0 // xt2 = 8 vr = y[ 8]; vi = y[ 9]; ur = y[ 0]>>1; ui = y[ 1]>>1; x[ 0] = ur + (vr>>1); x[ 1] = ui + (vi>>1); x[ 8] = ur - (vr>>1); x[ 9] = ui - (vi>>1); // xt1 = 4 // xt2 = 12 vr = y[13]; vi = y[12]; ur = y[ 4]>>1; ui = y[ 5]>>1; x[ 4] = ur + (vr>>1); x[ 5] = ui - (vi>>1); x[12] = ur - (vr>>1); x[13] = ui + (vi>>1); // xt1 = 16 // xt2 = 24 vr = y[24]; vi = y[25]; ur = y[16]>>1; ui = y[17]>>1; x[16] = ur + (vr>>1); x[17] = ui + (vi>>1); x[24] = ur - (vr>>1); x[25] = ui - (vi>>1); // xt1 = 20 // xt2 = 28 vr = y[29]; vi = y[28]; ur = y[20]>>1; ui = y[21]>>1; x[20] = ur + (vr>>1); x[21] = ui - (vi>>1); x[28] = ur - (vr>>1); x[29] = ui + (vi>>1); // xt1 = 2 // xt2 = 10 SUMDIFF_PIFOURTH(vi, vr, y[10], y[11]) //vr = fMultDiv2((y[11] + y[10]),W_PiFOURTH); //vi = fMultDiv2((y[11] - y[10]),W_PiFOURTH); ur = y[ 2]; ui = y[ 3]; x[ 2] = (ur>>1) + vr; x[ 3] = (ui>>1) + vi; x[10] = (ur>>1) - vr; x[11] = (ui>>1) - vi; // xt1 = 6 // xt2 = 14 SUMDIFF_PIFOURTH(vr, vi, y[14], y[15]) ur = y[ 6]; ui = y[ 7]; x[ 6] = (ur>>1) + vr; x[ 7] = (ui>>1) - vi; x[14] = (ur>>1) - vr; x[15] = (ui>>1) + vi; // xt1 = 18 // xt2 = 26 SUMDIFF_PIFOURTH(vi, vr, y[26], y[27]) ur = y[18]; ui = y[19]; x[18] = (ur>>1) + vr; x[19] = (ui>>1) + vi; x[26] = (ur>>1) - vr; x[27] = (ui>>1) - vi; // xt1 = 22 // xt2 = 30 SUMDIFF_PIFOURTH(vr, vi, y[30], y[31]) ur = y[22]; ui = y[23]; x[22] = (ur>>1) + vr; x[23] = (ui>>1) - vi; x[30] = (ur>>1) - vr; x[31] = (ui>>1) + vi; // xt1 = 0 // xt2 = 16 vr = x[16]; vi = x[17]; ur = x[ 0]>>1; ui = x[ 1]>>1; x[ 0] = ur + (vr>>1); x[ 1] = ui + (vi>>1); x[16] = ur - (vr>>1); x[17] = ui - (vi>>1); // xt1 = 8 // xt2 = 24 vi = x[24]; vr = x[25]; ur = x[ 8]>>1; ui = x[ 9]>>1; x[ 8] = ur + (vr>>1); x[ 9] = ui - (vi>>1); x[24] = ur - (vr>>1); x[25] = ui + (vi>>1); // xt1 = 2 // xt2 = 18 cplxMultDiv2(&vi, &vr, x[19], x[18], fft16_w16[0]); ur = x[ 2]; ui = x[ 3]; x[ 2] = (ur>>1) + vr; x[ 3] = (ui>>1) + vi; x[18] = (ur>>1) - vr; x[19] = (ui>>1) - vi; // xt1 = 10 // xt2 = 26 cplxMultDiv2(&vr, &vi, x[27], x[26], fft16_w16[0]); ur = x[10]; ui = x[11]; x[10] = (ur>>1) + vr; x[11] = (ui>>1) - vi; x[26] = (ur>>1) - vr; x[27] = (ui>>1) + vi; // xt1 = 4 // xt2 = 20 SUMDIFF_PIFOURTH(vi, vr, x[20], x[21]) ur = x[ 4]; ui = x[ 5]; x[ 4] = (ur>>1) + vr; x[ 5] = (ui>>1) + vi; x[20] = (ur>>1) - vr; x[21] = (ui>>1) - vi; // xt1 = 12 // xt2 = 28 SUMDIFF_PIFOURTH(vr, vi, x[28], x[29]) ur = x[12]; ui = x[13]; x[12] = (ur>>1) + vr; x[13] = (ui>>1) - vi; x[28] = (ur>>1) - vr; x[29] = (ui>>1) + vi; // xt1 = 6 // xt2 = 22 cplxMultDiv2(&vi, &vr, x[23], x[22], fft16_w16[1]); ur = x[ 6]; ui = x[ 7]; x[ 6] = (ur>>1) + vr; x[ 7] = (ui>>1) + vi; x[22] = (ur>>1) - vr; x[23] = (ui>>1) - vi; // xt1 = 14 // xt2 = 30 cplxMultDiv2(&vr, &vi, x[31], x[30], fft16_w16[1]); ur = x[14]; ui = x[15]; x[14] = (ur>>1) + vr; x[15] = (ui>>1) - vi; x[30] = (ur>>1) - vr; x[31] = (ui>>1) + vi; } #ifndef FUNCTION_fft_32 static const FIXP_STP fft32_w32[6] = { STCP (0x7641af3d, 0x30fbc54d), STCP(0x30fbc54d, 0x7641af3d), STCP(0x7d8a5f40, 0x18f8b83c), STCP (0x6a6d98a4, 0x471cece7), STCP(0x471cece7, 0x6a6d98a4), STCP(0x18f8b83c, 0x7d8a5f40) }; LNK_SECTION_CODE_L1 inline void fft_32(FIXP_DBL *x) { #define W_PiFOURTH STC(0x5a82799a) FIXP_DBL vr,vi,ur,ui; FIXP_DBL y[64]; /* * 1+2 stage radix 4 */ ///////////////////////////////////////////////////////////////////////////////////////// // i = 0 vr = (x[ 0] + x[32])>>1; /* Re A + Re B */ vi = (x[16] + x[48]); /* Re C + Re D */ ur = (x[ 1] + x[33])>>1; /* Im A + Im B */ ui = (x[17] + x[49]); /* Im C + Im D */ y[ 0] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[ 4] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[ 1] = ur + (ui>>1); /* Im A' = sum of imag values */ y[ 5] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[32]; /* Re A - Re B */ vi = (vi>>1) - x[48]; /* Re C - Re D */ ur -= x[33]; /* Im A - Im B */ ui = (ui>>1) - x[49]; /* Im C - Im D */ y[ 2] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[ 6] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[ 3] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[ 7] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=8 vr = (x[ 8] + x[40])>>1; /* Re A + Re B */ vi = (x[24] + x[56]); /* Re C + Re D */ ur = (x[ 9] + x[41])>>1; /* Im A + Im B */ ui = (x[25] + x[57]); /* Im C + Im D */ y[ 8] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[12] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[ 9] = ur + (ui>>1); /* Im A' = sum of imag values */ y[13] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[40]; /* Re A - Re B */ vi = (vi>>1) - x[56]; /* Re C - Re D */ ur -= x[41]; /* Im A - Im B */ ui = (ui>>1) - x[57]; /* Im C - Im D */ y[10] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[14] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[11] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[15] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=16 vr = (x[ 4] + x[36])>>1; /* Re A + Re B */ vi = (x[20] + x[52]); /* Re C + Re D */ ur = (x[ 5] + x[37])>>1; /* Im A + Im B */ ui = (x[21] + x[53]); /* Im C + Im D */ y[16] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[20] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[17] = ur + (ui>>1); /* Im A' = sum of imag values */ y[21] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[36]; /* Re A - Re B */ vi = (vi>>1) - x[52]; /* Re C - Re D */ ur -= x[37]; /* Im A - Im B */ ui = (ui>>1) - x[53]; /* Im C - Im D */ y[18] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[22] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[19] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[23] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=24 vr = (x[12] + x[44])>>1; /* Re A + Re B */ vi = (x[28] + x[60]); /* Re C + Re D */ ur = (x[13] + x[45])>>1; /* Im A + Im B */ ui = (x[29] + x[61]); /* Im C + Im D */ y[24] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[28] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[25] = ur + (ui>>1); /* Im A' = sum of imag values */ y[29] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[44]; /* Re A - Re B */ vi = (vi>>1) - x[60]; /* Re C - Re D */ ur -= x[45]; /* Im A - Im B */ ui = (ui>>1) - x[61]; /* Im C - Im D */ y[26] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[30] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[27] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[31] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ // i = 32 vr = (x[ 2] + x[34])>>1; /* Re A + Re B */ vi = (x[18] + x[50]); /* Re C + Re D */ ur = (x[ 3] + x[35])>>1; /* Im A + Im B */ ui = (x[19] + x[51]); /* Im C + Im D */ y[32] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[36] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[33] = ur + (ui>>1); /* Im A' = sum of imag values */ y[37] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[34]; /* Re A - Re B */ vi = (vi>>1) - x[50]; /* Re C - Re D */ ur -= x[35]; /* Im A - Im B */ ui = (ui>>1) - x[51]; /* Im C - Im D */ y[34] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[38] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[35] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[39] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=40 vr = (x[10] + x[42])>>1; /* Re A + Re B */ vi = (x[26] + x[58]); /* Re C + Re D */ ur = (x[11] + x[43])>>1; /* Im A + Im B */ ui = (x[27] + x[59]); /* Im C + Im D */ y[40] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[44] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[41] = ur + (ui>>1); /* Im A' = sum of imag values */ y[45] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[42]; /* Re A - Re B */ vi = (vi>>1) - x[58]; /* Re C - Re D */ ur -= x[43]; /* Im A - Im B */ ui = (ui>>1) - x[59]; /* Im C - Im D */ y[42] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[46] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[43] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[47] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=48 vr = (x[ 6] + x[38])>>1; /* Re A + Re B */ vi = (x[22] + x[54]); /* Re C + Re D */ ur = (x[ 7] + x[39])>>1; /* Im A + Im B */ ui = (x[23] + x[55]); /* Im C + Im D */ y[48] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[52] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[49] = ur + (ui>>1); /* Im A' = sum of imag values */ y[53] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[38]; /* Re A - Re B */ vi = (vi>>1) - x[54]; /* Re C - Re D */ ur -= x[39]; /* Im A - Im B */ ui = (ui>>1) - x[55]; /* Im C - Im D */ y[50] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[54] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[51] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[55] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ //i=56 vr = (x[14] + x[46])>>1; /* Re A + Re B */ vi = (x[30] + x[62]); /* Re C + Re D */ ur = (x[15] + x[47])>>1; /* Im A + Im B */ ui = (x[31] + x[63]); /* Im C + Im D */ y[56] = vr + (vi>>1); /* Re A' = ReA + ReB +ReC + ReD */ y[60] = vr - (vi>>1); /* Re C' = -(ReC+ReD) + (ReA+ReB) */ y[57] = ur + (ui>>1); /* Im A' = sum of imag values */ y[61] = ur - (ui>>1); /* Im C' = -Im C -Im D +Im A +Im B */ vr -= x[46]; /* Re A - Re B */ vi = (vi>>1) - x[62]; /* Re C - Re D */ ur -= x[47]; /* Im A - Im B */ ui = (ui>>1) - x[63]; /* Im C - Im D */ y[58] = ui + vr; /* Re B' = Im C - Im D + Re A - Re B */ y[62] = vr - ui; /* Re D' = -Im C + Im D + Re A - Re B */ y[59] = ur - vi; /* Im B'= -Re C + Re D + Im A - Im B */ y[63] = vi + ur; /* Im D'= Re C - Re D + Im A - Im B */ FIXP_DBL *xt = &x[0]; FIXP_DBL *yt = &y[0]; int j = 4; do { vr = yt[8]; vi = yt[9]; ur = yt[0]>>1; ui = yt[1]>>1; xt[ 0] = ur + (vr>>1); xt[ 1] = ui + (vi>>1); xt[ 8] = ur - (vr>>1); xt[ 9] = ui - (vi>>1); vr = yt[13]; vi = yt[12]; ur = yt[4]>>1; ui = yt[5]>>1; xt[ 4] = ur + (vr>>1); xt[ 5] = ui - (vi>>1); xt[12] = ur - (vr>>1); xt[13] = ui + (vi>>1); SUMDIFF_PIFOURTH(vi, vr, yt[10], yt[11]) ur = yt[2]; ui = yt[3]; xt[ 2] = (ur>>1) + vr; xt[ 3] = (ui>>1) + vi; xt[10] = (ur>>1) - vr; xt[11] = (ui>>1) - vi; SUMDIFF_PIFOURTH(vr, vi, yt[14], yt[15]) ur = yt[6]; ui = yt[7]; xt[ 6] = (ur>>1) + vr; xt[ 7] = (ui>>1) - vi; xt[14] = (ur>>1) - vr; xt[15] = (ui>>1) + vi; xt += 16; yt += 16; } while (--j != 0); vr = x[16]; vi = x[17]; ur = x[ 0]>>1; ui = x[ 1]>>1; x[ 0] = ur + (vr>>1); x[ 1] = ui + (vi>>1); x[16] = ur - (vr>>1); x[17] = ui - (vi>>1); vi = x[24]; vr = x[25]; ur = x[ 8]>>1; ui = x[ 9]>>1; x[ 8] = ur + (vr>>1); x[ 9] = ui - (vi>>1); x[24] = ur - (vr>>1); x[25] = ui + (vi>>1); vr = x[48]; vi = x[49]; ur = x[32]>>1; ui = x[33]>>1; x[32] = ur + (vr>>1); x[33] = ui + (vi>>1); x[48] = ur - (vr>>1); x[49] = ui - (vi>>1); vi = x[56]; vr = x[57]; ur = x[40]>>1; ui = x[41]>>1; x[40] = ur + (vr>>1); x[41] = ui - (vi>>1); x[56] = ur - (vr>>1); x[57] = ui + (vi>>1); cplxMultDiv2(&vi, &vr, x[19], x[18], fft32_w32[0]); ur = x[ 2]; ui = x[ 3]; x[ 2] = (ur>>1) + vr; x[ 3] = (ui>>1) + vi; x[18] = (ur>>1) - vr; x[19] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[27], x[26], fft32_w32[0]); ur = x[10]; ui = x[11]; x[10] = (ur>>1) + vr; x[11] = (ui>>1) - vi; x[26] = (ur>>1) - vr; x[27] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[51], x[50], fft32_w32[0]); ur = x[34]; ui = x[35]; x[34] = (ur>>1) + vr; x[35] = (ui>>1) + vi; x[50] = (ur>>1) - vr; x[51] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[0]); ur = x[42]; ui = x[43]; x[42] = (ur>>1) + vr; x[43] = (ui>>1) - vi; x[58] = (ur>>1) - vr; x[59] = (ui>>1) + vi; SUMDIFF_PIFOURTH(vi, vr, x[20], x[21]) ur = x[ 4]; ui = x[ 5]; x[ 4] = (ur>>1) + vr; x[ 5] = (ui>>1) + vi; x[20] = (ur>>1) - vr; x[21] = (ui>>1) - vi; SUMDIFF_PIFOURTH(vr, vi, x[28], x[29]) ur = x[12]; ui = x[13]; x[12] = (ur>>1) + vr; x[13] = (ui>>1) - vi; x[28] = (ur>>1) - vr; x[29] = (ui>>1) + vi; SUMDIFF_PIFOURTH(vi, vr, x[52], x[53]) ur = x[36]; ui = x[37]; x[36] = (ur>>1) + vr; x[37] = (ui>>1) + vi; x[52] = (ur>>1) - vr; x[53] = (ui>>1) - vi; SUMDIFF_PIFOURTH(vr, vi, x[60], x[61]) ur = x[44]; ui = x[45]; x[44] = (ur>>1) + vr; x[45] = (ui>>1) - vi; x[60] = (ur>>1) - vr; x[61] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[23], x[22], fft32_w32[1]); ur = x[ 6]; ui = x[ 7]; x[ 6] = (ur>>1) + vr; x[ 7] = (ui>>1) + vi; x[22] = (ur>>1) - vr; x[23] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[31], x[30], fft32_w32[1]); ur = x[14]; ui = x[15]; x[14] = (ur>>1) + vr; x[15] = (ui>>1) - vi; x[30] = (ur>>1) - vr; x[31] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[55], x[54], fft32_w32[1]); ur = x[38]; ui = x[39]; x[38] = (ur>>1) + vr; x[39] = (ui>>1) + vi; x[54] = (ur>>1) - vr; x[55] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[1]); ur = x[46]; ui = x[47]; x[46] = (ur>>1) + vr; x[47] = (ui>>1) - vi; x[62] = (ur>>1) - vr; x[63] = (ui>>1) + vi; vr = x[32]; vi = x[33]; ur = x[ 0]>>1; ui = x[ 1]>>1; x[ 0] = ur + (vr>>1); x[ 1] = ui + (vi>>1); x[32] = ur - (vr>>1); x[33] = ui - (vi>>1); vi = x[48]; vr = x[49]; ur = x[16]>>1; ui = x[17]>>1; x[16] = ur + (vr>>1); x[17] = ui - (vi>>1); x[48] = ur - (vr>>1); x[49] = ui + (vi>>1); cplxMultDiv2(&vi, &vr, x[35], x[34], fft32_w32[2]); ur = x[ 2]; ui = x[ 3]; x[ 2] = (ur>>1) + vr; x[ 3] = (ui>>1) + vi; x[34] = (ur>>1) - vr; x[35] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[51], x[50], fft32_w32[2]); ur = x[18]; ui = x[19]; x[18] = (ur>>1) + vr; x[19] = (ui>>1) - vi; x[50] = (ur>>1) - vr; x[51] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[37], x[36], fft32_w32[0]); ur = x[ 4]; ui = x[ 5]; x[ 4] = (ur>>1) + vr; x[ 5] = (ui>>1) + vi; x[36] = (ur>>1) - vr; x[37] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[53], x[52], fft32_w32[0]); ur = x[20]; ui = x[21]; x[20] = (ur>>1) + vr; x[21] = (ui>>1) - vi; x[52] = (ur>>1) - vr; x[53] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[39], x[38], fft32_w32[3]); ur = x[ 6]; ui = x[ 7]; x[ 6] = (ur>>1) + vr; x[ 7] = (ui>>1) + vi; x[38] = (ur>>1) - vr; x[39] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[55], x[54], fft32_w32[3]); ur = x[22]; ui = x[23]; x[22] = (ur>>1) + vr; x[23] = (ui>>1) - vi; x[54] = (ur>>1) - vr; x[55] = (ui>>1) + vi; SUMDIFF_PIFOURTH(vi, vr, x[40], x[41]) ur = x[ 8]; ui = x[ 9]; x[ 8] = (ur>>1) + vr; x[ 9] = (ui>>1) + vi; x[40] = (ur>>1) - vr; x[41] = (ui>>1) - vi; SUMDIFF_PIFOURTH(vr, vi, x[56], x[57]) ur = x[24]; ui = x[25]; x[24] = (ur>>1) + vr; x[25] = (ui>>1) - vi; x[56] = (ur>>1) - vr; x[57] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[43], x[42], fft32_w32[4]); ur = x[10]; ui = x[11]; x[10] = (ur>>1) + vr; x[11] = (ui>>1) + vi; x[42] = (ur>>1) - vr; x[43] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[59], x[58], fft32_w32[4]); ur = x[26]; ui = x[27]; x[26] = (ur>>1) + vr; x[27] = (ui>>1) - vi; x[58] = (ur>>1) - vr; x[59] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[45], x[44], fft32_w32[1]); ur = x[12]; ui = x[13]; x[12] = (ur>>1) + vr; x[13] = (ui>>1) + vi; x[44] = (ur>>1) - vr; x[45] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[61], x[60], fft32_w32[1]); ur = x[28]; ui = x[29]; x[28] = (ur>>1) + vr; x[29] = (ui>>1) - vi; x[60] = (ur>>1) - vr; x[61] = (ui>>1) + vi; cplxMultDiv2(&vi, &vr, x[47], x[46], fft32_w32[5]); ur = x[14]; ui = x[15]; x[14] = (ur>>1) + vr; x[15] = (ui>>1) + vi; x[46] = (ur>>1) - vr; x[47] = (ui>>1) - vi; cplxMultDiv2(&vr, &vi, x[63], x[62], fft32_w32[5]); ur = x[30]; ui = x[31]; x[30] = (ur>>1) + vr; x[31] = (ui>>1) - vi; x[62] = (ur>>1) - vr; x[63] = (ui>>1) + vi; } #endif /* #ifndef FUNCTION_fft_32 */ /** * \brief Apply rotation vectors to a data buffer. * \param cl length of each row of input data. * \param l total length of input data. * \param pVecRe real part of rotation ceofficient vector. * \param pVecIm imaginary part of rotation ceofficient vector. */ static inline void fft_apply_rot_vector(FIXP_DBL *RESTRICT pData, const int cl, const int l, const FIXP_STB *pVecRe, const FIXP_STB *pVecIm) { FIXP_DBL re, im; FIXP_STB vre, vim; int i, c; for(i=0; i>2; /* * 0.25 */ pData[2*i+1] = im>>2; /* * 0.25 */ } for(; i>2; /* * 0.25 */ pData[2*i+1] = im>>2; /* * 0.25 */ for (c=i+1; c>1; im = pData[2*c+1]>>1; vre = *pVecRe++; vim = *pVecIm++; cplxMultDiv2(&pData[2*c+1], &pData[2*c], im, re, vre, vim); } } } #define FFT_TWO_STAGE_MACRO_ENABLE #ifdef FFT_TWO_STAGE_MACRO_ENABLE #define fftN2(pInput, length, dim1, dim2, fft_func1, fft_func2, RotVectorReal, RotVectorImag) \ { \ int i, j; \ \ C_ALLOC_SCRATCH_START(aDst, FIXP_DBL, length*2); \ C_ALLOC_SCRATCH_START(aDst2, FIXP_DBL, dim2*2); \ \ FDK_ASSERT(length == dim1*dim2); \ \ /* Perform dim2 times the fft of length dim1. The input samples are at the address of pSrc and the \ output samples are at the address of pDst. The input vector for the fft of length dim1 is built \ of the interleaved samples in pSrc, the output samples are stored consecutively. \ */ \ { \ const FIXP_DBL* pSrc = pInput; \ FIXP_DBL *RESTRICT pDst = aDst; \ \ for(i=0; iversionStr, "%d.%d.%d", ((v >> 24) & 0xff), ((v >> 16) & 0xff), ((v >> 8 ) & 0xff)); info->module_id = FDK_TOOLS; info->version = v; info->build_date = (char *)FDK_TOOLS_LIB_BUILD_DATE; info->build_time = (char *)FDK_TOOLS_LIB_BUILD_TIME; info->title = (char *)FDK_TOOLS_LIB_TITLE; info->flags = 0; return 0; } fdk-aac-0.1.3/libFDK/src/FDK_hybrid.cpp0000644000175000017500000007423012372261464017753 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Markus Lohwasser Description: FDK Tools Hybrid Filterbank ******************************************************************************/ #include "FDK_hybrid.h" #include "fft.h" /*--------------- defines -----------------------------*/ #define FFT_IDX_R(a) (2*a) #define FFT_IDX_I(a) (2*a+1) #define HYB_COEF8_0 ( 0.00746082949812f ) #define HYB_COEF8_1 ( 0.02270420949825f ) #define HYB_COEF8_2 ( 0.04546865930473f ) #define HYB_COEF8_3 ( 0.07266113929591f ) #define HYB_COEF8_4 ( 0.09885108575264f ) #define HYB_COEF8_5 ( 0.11793710567217f ) #define HYB_COEF8_6 ( 0.12500000000000f ) #define HYB_COEF8_7 ( HYB_COEF8_5 ) #define HYB_COEF8_8 ( HYB_COEF8_4 ) #define HYB_COEF8_9 ( HYB_COEF8_3 ) #define HYB_COEF8_10 ( HYB_COEF8_2 ) #define HYB_COEF8_11 ( HYB_COEF8_1 ) #define HYB_COEF8_12 ( HYB_COEF8_0 ) /*--------------- structure definitions ---------------*/ #if defined(ARCH_PREFER_MULT_32x16) #define FIXP_HTB FIXP_SGL /* SGL data type. */ #define FIXP_HTP FIXP_SPK /* Packed SGL data type. */ #define HTC(a) (FX_DBL2FXCONST_SGL(a)) /* Cast to SGL */ #define FL2FXCONST_HTB FL2FXCONST_SGL #else #define FIXP_HTB FIXP_DBL /* SGL data type. */ #define FIXP_HTP FIXP_DPK /* Packed DBL data type. */ #define HTC(a) ((FIXP_DBL)(LONG)(a)) /* Cast to DBL */ #define FL2FXCONST_HTB FL2FXCONST_DBL #endif #define HTCP(real,imag) { { HTC(real), HTC(imag) } } /* How to arrange the packed values. */ struct FDK_HYBRID_SETUP { UCHAR nrQmfBands; /*!< Number of QMF bands to be converted to hybrid. */ UCHAR nHybBands[3]; /*!< Number of Hybrid bands generated by nrQmfBands. */ SCHAR kHybrid[3]; /*!< Filter configuration of each QMF band. */ UCHAR protoLen; /*!< Prototype filter length. */ UCHAR filterDelay; /*!< Delay caused by hybrid filter. */ const INT *pReadIdxTable; /*!< Helper table to access input data ringbuffer. */ }; /*--------------- constants ---------------------------*/ static const INT ringbuffIdxTab[2*13] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; static const FDK_HYBRID_SETUP setup_3_16 = { 3, { 8, 4, 4}, { 8, 4, 4}, 13, (13-1)/2, ringbuffIdxTab}; static const FDK_HYBRID_SETUP setup_3_12 = { 3, { 8, 2, 2}, { 8, 2, 2}, 13, (13-1)/2, ringbuffIdxTab}; static const FDK_HYBRID_SETUP setup_3_10 = { 3, { 6, 2, 2}, { -8, -2, 2}, 13, (13-1)/2, ringbuffIdxTab}; static const FIXP_HTP HybFilterCoef8[] = { HTCP(0x10000000, 0x00000000), HTCP(0x0df26407, 0xfa391882), HTCP(0xff532109, 0x00acdef7), HTCP(0x08f26d36, 0xf70d92ca), HTCP(0xfee34b5f, 0x02af570f), HTCP(0x038f276e, 0xf7684793), HTCP(0x00000000, 0x05d1eac2), HTCP(0x00000000, 0x05d1eac2), HTCP(0x038f276e, 0x0897b86d), HTCP(0xfee34b5f, 0xfd50a8f1), HTCP(0x08f26d36, 0x08f26d36), HTCP(0xff532109, 0xff532109), HTCP(0x0df26407, 0x05c6e77e) }; static const FIXP_HTB HybFilterCoef2[13] = { FL2FXCONST_HTB( 0.00000000000000f), FL2FXCONST_HTB( 0.01899487526049f), FL2FXCONST_HTB( 0.00000000000000f), FL2FXCONST_HTB(-0.07293139167538f), FL2FXCONST_HTB( 0.00000000000000f), FL2FXCONST_HTB( 0.30596630545168f), FL2FXCONST_HTB( 0.50000000000000f), FL2FXCONST_HTB( 0.30596630545168f), FL2FXCONST_HTB( 0.00000000000000f), FL2FXCONST_HTB(-0.07293139167538f), FL2FXCONST_HTB( 0.00000000000000f), FL2FXCONST_HTB( 0.01899487526049f), FL2FXCONST_HTB( 0.00000000000000f) }; static const FIXP_HTB HybFilterCoef4[13] = { FL2FXCONST_HTB(-0.00305151927305f), FL2FXCONST_HTB(-0.00794862316203f), FL2FXCONST_HTB( 0.0f), FL2FXCONST_HTB( 0.04318924038756f), FL2FXCONST_HTB( 0.12542448210445f), FL2FXCONST_HTB( 0.21227807049160f), FL2FXCONST_HTB( 0.25f), FL2FXCONST_HTB( 0.21227807049160f), FL2FXCONST_HTB( 0.12542448210445f), FL2FXCONST_HTB( 0.04318924038756f), FL2FXCONST_HTB( 0.0f), FL2FXCONST_HTB(-0.00794862316203f), FL2FXCONST_HTB(-0.00305151927305f) }; /*--------------- function declarations ---------------*/ static INT kChannelFiltering( const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, const INT *const pReadIdx, FIXP_DBL *const mHybridReal, FIXP_DBL *const mHybridImag, const SCHAR hybridConfig ); /*--------------- function definitions ----------------*/ INT FDKhybridAnalysisOpen( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, FIXP_DBL *const pLFmemory, const UINT LFmemorySize, FIXP_DBL *const pHFmemory, const UINT HFmemorySize ) { INT err = 0; /* Save pointer to extern memory. */ hAnalysisHybFilter->pLFmemory = pLFmemory; hAnalysisHybFilter->LFmemorySize = LFmemorySize; hAnalysisHybFilter->pHFmemory = pHFmemory; hAnalysisHybFilter->HFmemorySize = HFmemorySize; return err; } INT FDKhybridAnalysisInit( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const FDK_HYBRID_MODE mode, const INT qmfBands, const INT cplxBands, const INT initStatesFlag ) { int k; INT err = 0; FIXP_DBL *pMem = NULL; HANDLE_FDK_HYBRID_SETUP setup = NULL; switch (mode) { case THREE_TO_TEN: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_10; break; case THREE_TO_TWELVE: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_12; break; case THREE_TO_SIXTEEN: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_16; break; default: err = -1; goto bail; } /* Initialize handle. */ hAnalysisHybFilter->pSetup = setup; hAnalysisHybFilter->bufferLFpos = setup->protoLen-1; hAnalysisHybFilter->bufferHFpos = 0; hAnalysisHybFilter->nrBands = qmfBands; hAnalysisHybFilter->cplxBands = cplxBands; hAnalysisHybFilter->hfMode = 0; /* Check available memory. */ if ( ((2*setup->nrQmfBands*setup->protoLen*sizeof(FIXP_DBL)) > hAnalysisHybFilter->LFmemorySize) || ((setup->filterDelay*((qmfBands-setup->nrQmfBands)+(cplxBands-setup->nrQmfBands))*sizeof(FIXP_DBL)) > hAnalysisHybFilter->HFmemorySize) ) { err = -2; goto bail; } /* Distribut LF memory. */ pMem = hAnalysisHybFilter->pLFmemory; for (k=0; knrQmfBands; k++) { hAnalysisHybFilter->bufferLFReal[k] = pMem; pMem += setup->protoLen; hAnalysisHybFilter->bufferLFImag[k] = pMem; pMem += setup->protoLen; } /* Distribut HF memory. */ pMem = hAnalysisHybFilter->pHFmemory; for (k=0; kfilterDelay; k++) { hAnalysisHybFilter->bufferHFReal[k] = pMem; pMem += (qmfBands-setup->nrQmfBands); hAnalysisHybFilter->bufferHFImag[k] = pMem; pMem += (cplxBands-setup->nrQmfBands); } if (initStatesFlag) { /* Clear LF buffer */ for (k=0; knrQmfBands; k++) { FDKmemclear(hAnalysisHybFilter->bufferLFReal[k], setup->protoLen*sizeof(FIXP_DBL)); FDKmemclear(hAnalysisHybFilter->bufferLFImag[k], setup->protoLen*sizeof(FIXP_DBL)); } if (qmfBands > setup->nrQmfBands) { /* Clear HF buffer */ for (k=0; kfilterDelay; k++) { FDKmemclear(hAnalysisHybFilter->bufferHFReal[k], (qmfBands-setup->nrQmfBands)*sizeof(FIXP_DBL)); FDKmemclear(hAnalysisHybFilter->bufferHFImag[k], (cplxBands-setup->nrQmfBands)*sizeof(FIXP_DBL)); } } } bail: return err; } INT FDKhybridAnalysisScaleStates( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const INT scalingValue ) { INT err = 0; if (hAnalysisHybFilter==NULL) { err = 1; /* invalid handle */ } else { int k; HANDLE_FDK_HYBRID_SETUP setup = hAnalysisHybFilter->pSetup; /* Scale LF buffer */ for (k=0; knrQmfBands; k++) { scaleValues(hAnalysisHybFilter->bufferLFReal[k], setup->protoLen, scalingValue); scaleValues(hAnalysisHybFilter->bufferLFImag[k], setup->protoLen, scalingValue); } if (hAnalysisHybFilter->nrBands > setup->nrQmfBands) { /* Scale HF buffer */ for (k=0; kfilterDelay; k++) { scaleValues(hAnalysisHybFilter->bufferHFReal[k], (hAnalysisHybFilter->nrBands-setup->nrQmfBands), scalingValue); scaleValues(hAnalysisHybFilter->bufferHFImag[k], (hAnalysisHybFilter->cplxBands-setup->nrQmfBands), scalingValue); } } } return err; } INT FDKhybridAnalysisApply( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter, const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, FIXP_DBL *const pHybridReal, FIXP_DBL *const pHybridImag) { int k, hybOffset = 0; INT err = 0; const int nrQmfBandsLF = hAnalysisHybFilter->pSetup->nrQmfBands; /* number of QMF bands to be converted to hybrid */ const int writIndex = hAnalysisHybFilter->bufferLFpos; int readIndex = hAnalysisHybFilter->bufferLFpos; if (++readIndex>=hAnalysisHybFilter->pSetup->protoLen) readIndex = 0; const INT* pBufferLFreadIdx = &hAnalysisHybFilter->pSetup->pReadIdxTable[readIndex]; /* * LF buffer. */ for (k=0; kbufferLFReal[k][writIndex] = pQmfReal[k]; hAnalysisHybFilter->bufferLFImag[k][writIndex] = pQmfImag[k]; /* Perform hybrid filtering. */ kChannelFiltering( hAnalysisHybFilter->bufferLFReal[k], hAnalysisHybFilter->bufferLFImag[k], pBufferLFreadIdx, pHybridReal+hybOffset, pHybridImag+hybOffset, hAnalysisHybFilter->pSetup->kHybrid[k]); hybOffset += hAnalysisHybFilter->pSetup->nHybBands[k]; } hAnalysisHybFilter->bufferLFpos = readIndex; /* Index where to write next input sample. */ if (hAnalysisHybFilter->nrBands > nrQmfBandsLF) { /* * HF buffer. */ if (hAnalysisHybFilter->hfMode!=0) { /* HF delay compensation was applied outside. */ FDKmemcpy(pHybridReal+hybOffset, &pQmfReal[nrQmfBandsLF], (hAnalysisHybFilter->nrBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); FDKmemcpy(pHybridImag+hybOffset, &pQmfImag[nrQmfBandsLF], (hAnalysisHybFilter->cplxBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); } else { /* HF delay compensation, filterlength/2. */ FDKmemcpy(pHybridReal+hybOffset, hAnalysisHybFilter->bufferHFReal[hAnalysisHybFilter->bufferHFpos], (hAnalysisHybFilter->nrBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); FDKmemcpy(pHybridImag+hybOffset, hAnalysisHybFilter->bufferHFImag[hAnalysisHybFilter->bufferHFpos], (hAnalysisHybFilter->cplxBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); FDKmemcpy(hAnalysisHybFilter->bufferHFReal[hAnalysisHybFilter->bufferHFpos], &pQmfReal[nrQmfBandsLF], (hAnalysisHybFilter->nrBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); FDKmemcpy(hAnalysisHybFilter->bufferHFImag[hAnalysisHybFilter->bufferHFpos], &pQmfImag[nrQmfBandsLF], (hAnalysisHybFilter->cplxBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); if (++hAnalysisHybFilter->bufferHFpos>=hAnalysisHybFilter->pSetup->filterDelay) hAnalysisHybFilter->bufferHFpos = 0; } } /* process HF part*/ return err; } INT FDKhybridAnalysisClose( HANDLE_FDK_ANA_HYB_FILTER hAnalysisHybFilter ) { INT err = 0; if (hAnalysisHybFilter != NULL) { hAnalysisHybFilter->pLFmemory = NULL; hAnalysisHybFilter->pHFmemory = NULL; hAnalysisHybFilter->LFmemorySize = 0; hAnalysisHybFilter->HFmemorySize = 0; } return err; } INT FDKhybridSynthesisInit( HANDLE_FDK_SYN_HYB_FILTER hSynthesisHybFilter, const FDK_HYBRID_MODE mode, const INT qmfBands, const INT cplxBands ) { INT err = 0; HANDLE_FDK_HYBRID_SETUP setup = NULL; switch (mode) { case THREE_TO_TEN: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_10; break; case THREE_TO_TWELVE: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_12; break; case THREE_TO_SIXTEEN: setup = (HANDLE_FDK_HYBRID_SETUP)&setup_3_16; break; default: err = -1; goto bail; } hSynthesisHybFilter->pSetup = setup; hSynthesisHybFilter->nrBands = qmfBands; hSynthesisHybFilter->cplxBands = cplxBands; bail: return err; } INT FDKhybridSynthesisApply( HANDLE_FDK_SYN_HYB_FILTER hSynthesisHybFilter, const FIXP_DBL *const pHybridReal, const FIXP_DBL *const pHybridImag, FIXP_DBL *const pQmfReal, FIXP_DBL *const pQmfImag ) { int k, n, hybOffset=0; INT err = 0; const INT nrQmfBandsLF = hSynthesisHybFilter->pSetup->nrQmfBands; /* * LF buffer. */ for (k=0; kpSetup->nHybBands[k]; FIXP_DBL accu1 = FL2FXCONST_DBL(0.f); FIXP_DBL accu2 = FL2FXCONST_DBL(0.f); /* Perform hybrid filtering. */ for (n=0; nnrBands > nrQmfBandsLF) { /* * HF buffer. */ FDKmemcpy(&pQmfReal[nrQmfBandsLF], &pHybridReal[hybOffset], (hSynthesisHybFilter->nrBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); FDKmemcpy(&pQmfImag[nrQmfBandsLF], &pHybridImag[hybOffset], (hSynthesisHybFilter->cplxBands-nrQmfBandsLF)*sizeof(FIXP_DBL)); } return err; } static void dualChannelFiltering( const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, const INT *const pReadIdx, FIXP_DBL *const mHybridReal, FIXP_DBL *const mHybridImag, const INT invert ) { const FIXP_HTB *p = HybFilterCoef2; FIXP_DBL r1, r6; FIXP_DBL i1, i6; /* symmetric filter coefficients */ r1 = fMultDiv2(p[1], pQmfReal[pReadIdx[1]]) + fMultDiv2(p[1], pQmfReal[pReadIdx[11]]) ; i1 = fMultDiv2(p[1], pQmfImag[pReadIdx[1]]) + fMultDiv2(p[1], pQmfImag[pReadIdx[11]]) ; r1 += fMultDiv2(p[3], pQmfReal[pReadIdx[3]]) + fMultDiv2(p[3], pQmfReal[pReadIdx[ 9]]) ; i1 += fMultDiv2(p[3], pQmfImag[pReadIdx[3]]) + fMultDiv2(p[3], pQmfImag[pReadIdx[ 9]]) ; r1 += fMultDiv2(p[5], pQmfReal[pReadIdx[5]]) + fMultDiv2(p[5], pQmfReal[pReadIdx[ 7]]) ; i1 += fMultDiv2(p[5], pQmfImag[pReadIdx[5]]) + fMultDiv2(p[5], pQmfImag[pReadIdx[ 7]]) ; r6 = fMultDiv2(p[6], pQmfReal[pReadIdx[6]]) ; i6 = fMultDiv2(p[6], pQmfImag[pReadIdx[6]]) ; if (invert) { mHybridReal[1] = (r1 + r6) << 1; mHybridImag[1] = (i1 + i6) << 1; mHybridReal[0] = (r6 - r1) << 1; mHybridImag[0] = (i6 - i1) << 1; } else { mHybridReal[0] = (r1 + r6) << 1; mHybridImag[0] = (i1 + i6) << 1; mHybridReal[1] = (r6 - r1) << 1; mHybridImag[1] = (i6 - i1) << 1; } } static void fourChannelFiltering( const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, const INT *const pReadIdx, FIXP_DBL *const mHybridReal, FIXP_DBL *const mHybridImag, const INT invert ) { const FIXP_HTB *p = HybFilterCoef4; FIXP_DBL fft[8]; static const FIXP_DBL cr[13] = { FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( -1.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL( 0.70710678118655f), FL2FXCONST_DBL( 1.f), FL2FXCONST_DBL( 0.70710678118655f), FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( -1.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( 0.f) }; static const FIXP_DBL ci[13] = { FL2FXCONST_DBL( -1.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL( 0.70710678118655f), FL2FXCONST_DBL( 1.f), FL2FXCONST_DBL( 0.70710678118655f), FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( -1.f), FL2FXCONST_DBL(-0.70710678118655f), FL2FXCONST_DBL( 0.f), FL2FXCONST_DBL( 0.70710678118655f), FL2FXCONST_DBL( 1.f) }; /* FIR filter. */ /* pre twiddeling with pre-twiddling coefficients c[n] */ /* multiplication with filter coefficients p[n] */ /* hint: (a + ib)*(c + id) = (a*c - b*d) + i(a*d + b*c) */ /* write to fft coefficient n' */ fft[FFT_IDX_R(0)] = ( fMult(p[10], ( fMultSub(fMultDiv2(cr[ 2], pQmfReal[pReadIdx[ 2]]), ci[ 2], pQmfImag[pReadIdx[ 2]]))) + fMult(p[ 6], ( fMultSub(fMultDiv2(cr[ 6], pQmfReal[pReadIdx[ 6]]), ci[ 6], pQmfImag[pReadIdx[ 6]]))) + fMult(p[ 2], ( fMultSub(fMultDiv2(cr[10], pQmfReal[pReadIdx[10]]), ci[10], pQmfImag[pReadIdx[10]]))) ); fft[FFT_IDX_I(0)] = ( fMult(p[10], ( fMultAdd(fMultDiv2(ci[ 2], pQmfReal[pReadIdx[ 2]]), cr[ 2], pQmfImag[pReadIdx[ 2]]))) + fMult(p[ 6], ( fMultAdd(fMultDiv2(ci[ 6], pQmfReal[pReadIdx[ 6]]), cr[ 6], pQmfImag[pReadIdx[ 6]]))) + fMult(p[ 2], ( fMultAdd(fMultDiv2(ci[10], pQmfReal[pReadIdx[10]]), cr[10], pQmfImag[pReadIdx[10]]))) ); /* twiddle dee dum */ fft[FFT_IDX_R(1)] = ( fMult(p[ 9], ( fMultSub(fMultDiv2(cr[ 3], pQmfReal[pReadIdx[ 3]]), ci[ 3], pQmfImag[pReadIdx[ 3]]))) + fMult(p[ 5], ( fMultSub(fMultDiv2(cr[ 7], pQmfReal[pReadIdx[ 7]]), ci[ 7], pQmfImag[pReadIdx[ 7]]))) + fMult(p[ 1], ( fMultSub(fMultDiv2(cr[11], pQmfReal[pReadIdx[11]]), ci[11], pQmfImag[pReadIdx[11]]))) ); fft[FFT_IDX_I(1)] = ( fMult(p[ 9], ( fMultAdd(fMultDiv2(ci[ 3], pQmfReal[pReadIdx[ 3]]), cr[ 3], pQmfImag[pReadIdx[ 3]]))) + fMult(p[ 5], ( fMultAdd(fMultDiv2(ci[ 7], pQmfReal[pReadIdx[ 7]]), cr[ 7], pQmfImag[pReadIdx[ 7]]))) + fMult(p[ 1], ( fMultAdd(fMultDiv2(ci[11], pQmfReal[pReadIdx[11]]), cr[11], pQmfImag[pReadIdx[11]]))) ); /* twiddle dee dee */ fft[FFT_IDX_R(2)] = ( fMult(p[12], ( fMultSub(fMultDiv2(cr[ 0], pQmfReal[pReadIdx[ 0]]), ci[ 0], pQmfImag[pReadIdx[ 0]]))) + fMult(p[ 8], ( fMultSub(fMultDiv2(cr[ 4], pQmfReal[pReadIdx[ 4]]), ci[ 4], pQmfImag[pReadIdx[ 4]]))) + fMult(p[ 4], ( fMultSub(fMultDiv2(cr[ 8], pQmfReal[pReadIdx[ 8]]), ci[ 8], pQmfImag[pReadIdx[ 8]]))) + fMult(p[ 0], ( fMultSub(fMultDiv2(cr[12], pQmfReal[pReadIdx[12]]), ci[12], pQmfImag[pReadIdx[12]]))) ); fft[FFT_IDX_I(2)] = ( fMult(p[12], ( fMultAdd(fMultDiv2(ci[ 0], pQmfReal[pReadIdx[ 0]]), cr[ 0], pQmfImag[pReadIdx[ 0]]))) + fMult(p[ 8], ( fMultAdd(fMultDiv2(ci[ 4], pQmfReal[pReadIdx[ 4]]), cr[ 4], pQmfImag[pReadIdx[ 4]]))) + fMult(p[ 4], ( fMultAdd(fMultDiv2(ci[ 8], pQmfReal[pReadIdx[ 8]]), cr[ 8], pQmfImag[pReadIdx[ 8]]))) + fMult(p[ 0], ( fMultAdd(fMultDiv2(ci[12], pQmfReal[pReadIdx[12]]), cr[12], pQmfImag[pReadIdx[12]]))) ); fft[FFT_IDX_R(3)] = ( fMult(p[11], ( fMultSub(fMultDiv2(cr[ 1], pQmfReal[pReadIdx[ 1]]), ci[ 1], pQmfImag[pReadIdx[ 1]]))) + fMult(p[ 7], ( fMultSub(fMultDiv2(cr[ 5], pQmfReal[pReadIdx[ 5]]), ci[ 5], pQmfImag[pReadIdx[ 5]]))) + fMult(p[ 3], ( fMultSub(fMultDiv2(cr[ 9], pQmfReal[pReadIdx[ 9]]), ci[ 9], pQmfImag[pReadIdx[ 9]]))) ); fft[FFT_IDX_I(3)] = ( fMult(p[11], ( fMultAdd(fMultDiv2(ci[ 1], pQmfReal[pReadIdx[ 1]]), cr[ 1], pQmfImag[pReadIdx[ 1]]))) + fMult(p[ 7], ( fMultAdd(fMultDiv2(ci[ 5], pQmfReal[pReadIdx[ 5]]), cr[ 5], pQmfImag[pReadIdx[ 5]]))) + fMult(p[ 3], ( fMultAdd(fMultDiv2(ci[ 9], pQmfReal[pReadIdx[ 9]]), cr[ 9], pQmfImag[pReadIdx[ 9]]))) ); /* fft modulation */ /* here: fast manual fft modulation for a fft of length M=4 */ /* fft_4{x[n]} = x[0]*exp(-i*2*pi/4*m*0) + x[1]*exp(-i*2*pi/4*m*1) + x[2]*exp(-i*2*pi/4*m*2) + x[3]*exp(-i*2*pi/4*m*3) */ /* fft bin m=0: X[0, n] = x[0] + x[1] + x[2] + x[3] */ mHybridReal[0] = fft[FFT_IDX_R(0)] + fft[FFT_IDX_R(1)] + fft[FFT_IDX_R(2)] + fft[FFT_IDX_R(3)]; mHybridImag[0] = fft[FFT_IDX_I(0)] + fft[FFT_IDX_I(1)] + fft[FFT_IDX_I(2)] + fft[FFT_IDX_I(3)]; /* fft bin m=1: X[1, n] = x[0] - i*x[1] - x[2] + i*x[3] */ mHybridReal[1] = fft[FFT_IDX_R(0)] + fft[FFT_IDX_I(1)] - fft[FFT_IDX_R(2)] - fft[FFT_IDX_I(3)]; mHybridImag[1] = fft[FFT_IDX_I(0)] - fft[FFT_IDX_R(1)] - fft[FFT_IDX_I(2)] + fft[FFT_IDX_R(3)]; /* fft bin m=2: X[2, n] = x[0] - x[1] + x[2] - x[3] */ mHybridReal[2] = fft[FFT_IDX_R(0)] - fft[FFT_IDX_R(1)] + fft[FFT_IDX_R(2)] - fft[FFT_IDX_R(3)]; mHybridImag[2] = fft[FFT_IDX_I(0)] - fft[FFT_IDX_I(1)] + fft[FFT_IDX_I(2)] - fft[FFT_IDX_I(3)]; /* fft bin m=3: X[3, n] = x[0] + j*x[1] - x[2] - j*x[3] */ mHybridReal[3] = fft[FFT_IDX_R(0)] - fft[FFT_IDX_I(1)] - fft[FFT_IDX_R(2)] + fft[FFT_IDX_I(3)]; mHybridImag[3] = fft[FFT_IDX_I(0)] + fft[FFT_IDX_R(1)] - fft[FFT_IDX_I(2)] - fft[FFT_IDX_R(3)]; } static void eightChannelFiltering( const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, const INT *const pReadIdx, FIXP_DBL *const mHybridReal, FIXP_DBL *const mHybridImag, const INT invert ) { const FIXP_HTP *p = HybFilterCoef8; INT k, sc; FIXP_DBL mfft[16+ALIGNMENT_DEFAULT]; FIXP_DBL *pfft = (FIXP_DBL*)ALIGN_PTR(mfft); FIXP_DBL accu1, accu2, accu3, accu4; /* pre twiddeling */ pfft[FFT_IDX_R(0)] = fMultDiv2(p[0].v.re, pQmfReal[pReadIdx[6]]); pfft[FFT_IDX_I(0)] = fMultDiv2(p[0].v.re, pQmfImag[pReadIdx[6]]); cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[7]], pQmfImag[pReadIdx[7]], p[1]); pfft[FFT_IDX_R(1)] = accu1; pfft[FFT_IDX_I(1)] = accu2; cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[0]], pQmfImag[pReadIdx[0]], p[2]); cplxMultDiv2(&accu3, &accu4, pQmfReal[pReadIdx[8]], pQmfImag[pReadIdx[8]], p[3]); pfft[FFT_IDX_R(2)] = accu1 + accu3; pfft[FFT_IDX_I(2)] = accu2 + accu4; cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[1]], pQmfImag[pReadIdx[1]], p[4]); cplxMultDiv2(&accu3, &accu4, pQmfReal[pReadIdx[9]], pQmfImag[pReadIdx[9]], p[5]); pfft[FFT_IDX_R(3)] = accu1 + accu3; pfft[FFT_IDX_I(3)] = accu2 + accu4; pfft[FFT_IDX_R(4)] = fMultDiv2(pQmfImag[pReadIdx[10]], p[7].v.im) - fMultDiv2(pQmfImag[pReadIdx[ 2]], p[6].v.im); pfft[FFT_IDX_I(4)] = fMultDiv2(pQmfReal[pReadIdx[ 2]], p[6].v.im) - fMultDiv2(pQmfReal[pReadIdx[10]], p[7].v.im); cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[ 3]], pQmfImag[pReadIdx[ 3]], p[8]); cplxMultDiv2(&accu3, &accu4, pQmfReal[pReadIdx[11]], pQmfImag[pReadIdx[11]], p[9]); pfft[FFT_IDX_R(5)] = accu1 + accu3; pfft[FFT_IDX_I(5)] = accu2 + accu4; cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[ 4]], pQmfImag[pReadIdx[ 4]], p[10]); cplxMultDiv2(&accu3, &accu4, pQmfReal[pReadIdx[12]], pQmfImag[pReadIdx[12]], p[11]); pfft[FFT_IDX_R(6)] = accu1 + accu3; pfft[FFT_IDX_I(6)] = accu2 + accu4; cplxMultDiv2(&accu1, &accu2, pQmfReal[pReadIdx[ 5]], pQmfImag[pReadIdx[ 5]], p[12]); pfft[FFT_IDX_R(7)] = accu1; pfft[FFT_IDX_I(7)] = accu2; /* fft modulation */ fft_8 (pfft); sc = 1 + 2; if (invert) { mHybridReal[0] = pfft[FFT_IDX_R(7)] << sc; mHybridImag[0] = pfft[FFT_IDX_I(7)] << sc; mHybridReal[1] = pfft[FFT_IDX_R(0)] << sc; mHybridImag[1] = pfft[FFT_IDX_I(0)] << sc; mHybridReal[2] = pfft[FFT_IDX_R(6)] << sc; mHybridImag[2] = pfft[FFT_IDX_I(6)] << sc; mHybridReal[3] = pfft[FFT_IDX_R(1)] << sc; mHybridImag[3] = pfft[FFT_IDX_I(1)] << sc; mHybridReal[4] = pfft[FFT_IDX_R(2)] << sc; mHybridReal[4] += pfft[FFT_IDX_R(5)] << sc; mHybridImag[4] = pfft[FFT_IDX_I(2)] << sc; mHybridImag[4] += pfft[FFT_IDX_I(5)] << sc; mHybridReal[5] = pfft[FFT_IDX_R(3)] << sc; mHybridReal[5] += pfft[FFT_IDX_R(4)] << sc; mHybridImag[5] = pfft[FFT_IDX_I(3)] << sc; mHybridImag[5] += pfft[FFT_IDX_I(4)] << sc; } else { for(k=0; k<8;k++ ) { mHybridReal[k] = pfft[FFT_IDX_R(k)] << sc; mHybridImag[k] = pfft[FFT_IDX_I(k)] << sc; } } } static INT kChannelFiltering( const FIXP_DBL *const pQmfReal, const FIXP_DBL *const pQmfImag, const INT *const pReadIdx, FIXP_DBL *const mHybridReal, FIXP_DBL *const mHybridImag, const SCHAR hybridConfig ) { INT err = 0; switch (hybridConfig) { case 2: case -2: dualChannelFiltering(pQmfReal, pQmfImag, pReadIdx, mHybridReal, mHybridImag, (hybridConfig<0) ? 1 : 0 ); break; case 4: case -4: fourChannelFiltering(pQmfReal, pQmfImag, pReadIdx, mHybridReal, mHybridImag, (hybridConfig<0) ? 1 : 0 ); break; case 8: case -8: eightChannelFiltering(pQmfReal, pQmfImag, pReadIdx, mHybridReal, mHybridImag, (hybridConfig<0) ? 1 : 0 ); break; default: err = -1; } return err; } fdk-aac-0.1.3/libFDK/src/qmf.cpp0000644000175000017500000012711312372261464016570 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /******************************** Fraunhofer IIS *************************** Author(s): Markus Lohwasser, Josef Hoepfl, Manuel Jander Description: QMF filterbank ******************************************************************************/ /*! \file \brief Complex qmf analysis/synthesis, This module contains the qmf filterbank for analysis [ cplxAnalysisQmfFiltering() ] and synthesis [ cplxSynthesisQmfFiltering() ]. It is a polyphase implementation of a complex exponential modulated filter bank. The analysis part usually runs at half the sample rate than the synthesis part. (So called "dual-rate" mode.) The coefficients of the prototype filter are specified in #sbr_qmf_64_640 (in sbr_rom.cpp). Thus only a 64 channel version (32 on the analysis side) with a 640 tap prototype filter are used. \anchor PolyphaseFiltering

About polyphase filtering

The polyphase implementation of a filterbank requires filtering at the input and output. This is implemented as part of cplxAnalysisQmfFiltering() and cplxSynthesisQmfFiltering(). The implementation requires the filter coefficients in a specific structure as described in #sbr_qmf_64_640_qmf (in sbr_rom.cpp). This module comprises the computationally most expensive functions of the SBR decoder. The accuracy of computations is also important and has a direct impact on the overall sound quality. Therefore a special test program is available which can be used to only test the filterbank: main_audio.cpp This modules also uses scaling of data to provide better SNR on fixed-point processors. See #QMF_SCALE_FACTOR (in sbr_scale.h) for details. An interesting note: The function getScalefactor() can constitute a significant amount of computational complexity - very much depending on the bitrate. Since it is a rather small function, effective assembler optimization might be possible. */ #include "qmf.h" #include "fixpoint_math.h" #include "dct.h" #ifdef QMFSYN_STATES_16BIT #define QSSCALE (7) #define FX_DBL2FX_QSS(x) ((FIXP_QSS) ((x)>>(DFRACT_BITS-QSS_BITS-QSSCALE) )) #define FX_QSS2FX_DBL(x) ((FIXP_DBL)((LONG)x)<<(DFRACT_BITS-QSS_BITS-QSSCALE)) #else #define QSSCALE (0) #define FX_DBL2FX_QSS(x) (x) #define FX_QSS2FX_DBL(x) (x) #endif #if defined(__arm__) #include "arm/qmf_arm.cpp" #endif /*! * \brief Algorithmic scaling in sbrForwardModulation() * * The scaling in sbrForwardModulation() is caused by: * * \li 1 R_SHIFT in sbrForwardModulation() * \li 5/6 R_SHIFT in dct3() if using 32/64 Bands * \li 1 ommited gain of 2.0 in qmfForwardModulation() */ #define ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK 7 /*! * \brief Algorithmic scaling in cplxSynthesisQmfFiltering() * * The scaling in cplxSynthesisQmfFiltering() is caused by: * * \li 5/6 R_SHIFT in dct2() if using 32/64 Bands * \li 1 ommited gain of 2.0 in qmfInverseModulation() * \li -6 division by 64 in synthesis filterbank * \li x bits external influence */ #define ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK 1 /*! \brief Perform Synthesis Prototype Filtering on a single slot of input data. The filter takes 2 * qmf->no_channels of input data and generates qmf->no_channels time domain output samples. */ static #ifndef FUNCTION_qmfSynPrototypeFirSlot void qmfSynPrototypeFirSlot( #else void qmfSynPrototypeFirSlot_fallback( #endif HANDLE_QMF_FILTER_BANK qmf, FIXP_QMF *RESTRICT realSlot, /*!< Input: Pointer to real Slot */ FIXP_QMF *RESTRICT imagSlot, /*!< Input: Pointer to imag Slot */ INT_PCM *RESTRICT timeOut, /*!< Time domain data */ int stride ) { FIXP_QSS* FilterStates = (FIXP_QSS*)qmf->FilterStates; int no_channels = qmf->no_channels; const FIXP_PFT *p_Filter = qmf->p_filter; int p_stride = qmf->p_stride; int j; FIXP_QSS *RESTRICT sta = FilterStates; const FIXP_PFT *RESTRICT p_flt, *RESTRICT p_fltm; int scale = ((DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor); p_flt = p_Filter+p_stride*QMF_NO_POLY; /* 5-ter von 330 */ p_fltm = p_Filter+(qmf->FilterSize/2)-p_stride*QMF_NO_POLY; /* 5 + (320 - 2*5) = 315-ter von 330 */ FDK_ASSERT(SAMPLE_BITS-1-qmf->outScalefactor >= 0); // (DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor >= 0); for (j = no_channels-1; j >= 0; j--) { /* ---- läuft ueber alle Linien eines Slots ---- */ FIXP_QMF imag = imagSlot[j]; // no_channels-1 .. 0 FIXP_QMF real = realSlot[j]; // ~~"~~ { INT_PCM tmp; FIXP_DBL Are = FX_QSS2FX_DBL(sta[0]) + fMultDiv2( p_fltm[0] , real); if (qmf->outGain!=(FIXP_DBL)0x80000000) { Are = fMult(Are,qmf->outGain); } #if SAMPLE_BITS > 16 tmp = (INT_PCM)(SATURATE_SHIFT(fAbs(Are), scale, SAMPLE_BITS)); #else tmp = (INT_PCM)(SATURATE_RIGHT_SHIFT(fAbs(Are), scale, SAMPLE_BITS)); #endif if (Are < (FIXP_QMF)0) { tmp = -tmp; } timeOut[ (j)*stride ] = tmp; } sta[0] = sta[1] + FX_DBL2FX_QSS(fMultDiv2( p_flt [4] , imag )); sta[1] = sta[2] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[1] , real )); sta[2] = sta[3] + FX_DBL2FX_QSS(fMultDiv2( p_flt [3] , imag )); sta[3] = sta[4] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[2] , real )); sta[4] = sta[5] + FX_DBL2FX_QSS(fMultDiv2( p_flt [2] , imag )); sta[5] = sta[6] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[3] , real )); sta[6] = sta[7] + FX_DBL2FX_QSS(fMultDiv2( p_flt [1] , imag )); sta[7] = sta[8] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[4] , real )); sta[8] = FX_DBL2FX_QSS(fMultDiv2( p_flt [0] , imag )); p_flt += (p_stride*QMF_NO_POLY); p_fltm -= (p_stride*QMF_NO_POLY); sta += 9; // = (2*QMF_NO_POLY-1); } } #ifndef FUNCTION_qmfSynPrototypeFirSlot_NonSymmetric /*! \brief Perform Synthesis Prototype Filtering on a single slot of input data. The filter takes 2 * qmf->no_channels of input data and generates qmf->no_channels time domain output samples. */ static void qmfSynPrototypeFirSlot_NonSymmetric( HANDLE_QMF_FILTER_BANK qmf, FIXP_QMF *RESTRICT realSlot, /*!< Input: Pointer to real Slot */ FIXP_QMF *RESTRICT imagSlot, /*!< Input: Pointer to imag Slot */ INT_PCM *RESTRICT timeOut, /*!< Time domain data */ int stride ) { FIXP_QSS* FilterStates = (FIXP_QSS*)qmf->FilterStates; int no_channels = qmf->no_channels; const FIXP_PFT *p_Filter = qmf->p_filter; int p_stride = qmf->p_stride; int j; FIXP_QSS *RESTRICT sta = FilterStates; const FIXP_PFT *RESTRICT p_flt, *RESTRICT p_fltm; int scale = ((DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor); p_flt = p_Filter; /*!< Pointer to first half of filter coefficients */ p_fltm = &p_flt[qmf->FilterSize/2]; /* at index 320, overall 640 coefficients */ FDK_ASSERT(SAMPLE_BITS-1-qmf->outScalefactor >= 0); // (DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor >= 0); for (j = no_channels-1; j >= 0; j--) { /* ---- läuft ueber alle Linien eines Slots ---- */ FIXP_QMF imag = imagSlot[j]; // no_channels-1 .. 0 FIXP_QMF real = realSlot[j]; // ~~"~~ { INT_PCM tmp; FIXP_QMF Are = sta[0] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[4] , real )); #if SAMPLE_BITS > 16 tmp = (INT_PCM)(SATURATE_SHIFT(fAbs(Are), scale, SAMPLE_BITS)); #else tmp = (INT_PCM)(SATURATE_RIGHT_SHIFT(fAbs(Are), scale, SAMPLE_BITS)); #endif if (Are < (FIXP_QMF)0) { tmp = -tmp; } timeOut[j*stride] = tmp; } sta[0] = sta[1] + FX_DBL2FX_QSS(fMultDiv2( p_flt [4] , imag )); sta[1] = sta[2] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[3] , real )); sta[2] = sta[3] + FX_DBL2FX_QSS(fMultDiv2( p_flt [3] , imag )); sta[3] = sta[4] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[2] , real )); sta[4] = sta[5] + FX_DBL2FX_QSS(fMultDiv2( p_flt [2] , imag )); sta[5] = sta[6] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[1] , real )); sta[6] = sta[7] + FX_DBL2FX_QSS(fMultDiv2( p_flt [1] , imag )); sta[7] = sta[8] + FX_DBL2FX_QSS(fMultDiv2( p_fltm[0] , real )); sta[8] = FX_DBL2FX_QSS(fMultDiv2( p_flt [0] , imag )); p_flt += (p_stride*QMF_NO_POLY); p_fltm += (p_stride*QMF_NO_POLY); sta += 9; // = (2*QMF_NO_POLY-1); } } #endif /* FUNCTION_qmfSynPrototypeFirSlot_NonSymmetric */ #ifndef FUNCTION_qmfAnaPrototypeFirSlot /*! \brief Perform Analysis Prototype Filtering on a single slot of input data. */ static void qmfAnaPrototypeFirSlot( FIXP_QMF *analysisBuffer, int no_channels, /*!< Number channels of analysis filter */ const FIXP_PFT *p_filter, int p_stride, /*!< Stide of analysis filter */ FIXP_QAS *RESTRICT pFilterStates ) { int k; FIXP_DBL accu; const FIXP_PFT *RESTRICT p_flt = p_filter; FIXP_QMF *RESTRICT pData_0 = analysisBuffer + 2*no_channels - 1; FIXP_QMF *RESTRICT pData_1 = analysisBuffer; FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates; FIXP_QAS *RESTRICT sta_1 = (FIXP_QAS *)pFilterStates + (2*QMF_NO_POLY*no_channels) - 1; int pfltStep = QMF_NO_POLY * (p_stride); int staStep1 = no_channels<<1; int staStep2 = (no_channels<<3) - 1; /* Rewind one less */ /* FIR filter 0 */ accu = fMultDiv2( p_flt[0], *sta_1); sta_1 -= staStep1; accu += fMultDiv2( p_flt[1], *sta_1); sta_1 -= staStep1; accu += fMultDiv2( p_flt[2], *sta_1); sta_1 -= staStep1; accu += fMultDiv2( p_flt[3], *sta_1); sta_1 -= staStep1; accu += fMultDiv2( p_flt[4], *sta_1); *pData_1++ = FX_DBL2FX_QMF(accu<<1); sta_1 += staStep2; p_flt += pfltStep; /* FIR filters 1..63 127..65 */ for (k=0; kno_channels; int M = L>>1; int scale; FIXP_QMF accu; const FIXP_QMF *timeInTmp1 = (FIXP_QMF *) &timeIn[3 * M]; const FIXP_QMF *timeInTmp2 = timeInTmp1; FIXP_QMF *rSubbandTmp = rSubband; rSubband[0] = timeIn[3 * M] >> 1; for (i = M-1; i != 0; i--) { accu = ((*--timeInTmp1) >> 1) + ((*++timeInTmp2) >> 1); *++rSubbandTmp = accu; } timeInTmp1 = &timeIn[2 * M]; timeInTmp2 = &timeIn[0]; rSubbandTmp = &rSubband[M]; for (i = L-M; i != 0; i--) { accu = ((*timeInTmp1--) >> 1) - ((*timeInTmp2++) >> 1); *rSubbandTmp++ = accu; } dct_III(rSubband, timeIn, L, &scale); } #if !defined(FUNCTION_qmfForwardModulationLP_odd) static void qmfForwardModulationLP_odd( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ const FIXP_QMF *timeIn, /*!< Time Signal */ FIXP_QMF *rSubband ) /*!< Real Output */ { int i; int L = anaQmf->no_channels; int M = L>>1; int shift = (anaQmf->no_channels>>6) + 1; for (i = 0; i < M; i++) { rSubband[M + i] = (timeIn[L - 1 - i]>>1) - (timeIn[i]>>shift); rSubband[M - 1 - i] = (timeIn[L + i]>>1) + (timeIn[2 * L - 1 - i]>>shift); } dct_IV(rSubband, L, &shift); } #endif /* !defined(FUNCTION_qmfForwardModulationLP_odd) */ /*! * * \brief Perform complex-valued forward modulation of the time domain * data of timeIn and stores the real part of the subband * samples in rSubband, and the imaginary part in iSubband * * Only the lower bands are obtained (upto anaQmf->lsb). For * a full bandwidth analysis it is required to set both anaQmf->lsb * and anaQmf->usb to the amount of QMF bands. * */ static void qmfForwardModulationHQ( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ const FIXP_QMF *RESTRICT timeIn, /*!< Time Signal */ FIXP_QMF *RESTRICT rSubband, /*!< Real Output */ FIXP_QMF *RESTRICT iSubband /*!< Imaginary Output */ ) { int i; int L = anaQmf->no_channels; int L2 = L<<1; int shift = 0; for (i = 0; i < L; i+=2) { FIXP_QMF x0, x1, y0, y1; x0 = timeIn[i] >> 1; x1 = timeIn[i+1] >> 1; y0 = timeIn[L2 - 1 - i] >> 1; y1 = timeIn[L2 - 2 - i] >> 1; rSubband[i] = x0 - y0; rSubband[i+1] = x1 - y1; iSubband[i] = x0 + y0; iSubband[i+1] = x1 + y1; } dct_IV(rSubband, L, &shift); dst_IV(iSubband, L, &shift); { { const FIXP_QTW *RESTRICT sbr_t_cos; const FIXP_QTW *RESTRICT sbr_t_sin; sbr_t_cos = anaQmf->t_cos; sbr_t_sin = anaQmf->t_sin; for (i = 0; i < anaQmf->lsb; i++) { cplxMult(&iSubband[i], &rSubband[i], iSubband[i], rSubband[i], sbr_t_cos[i], sbr_t_sin[i]); } } } } /* * \brief Perform one QMF slot analysis of the time domain data of timeIn * with specified stride and stores the real part of the subband * samples in rSubband, and the imaginary part in iSubband * * Only the lower bands are obtained (upto anaQmf->lsb). For * a full bandwidth analysis it is required to set both anaQmf->lsb * and anaQmf->usb to the amount of QMF bands. */ void qmfAnalysisFilteringSlot( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_QMF *qmfReal, /*!< Low and High band, real */ FIXP_QMF *qmfImag, /*!< Low and High band, imag */ const INT_PCM *RESTRICT timeIn, /*!< Pointer to input */ const int stride, /*!< stride factor of input */ FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ) { int i; int offset = anaQmf->no_channels*(QMF_NO_POLY*2-1); /* Feed time signal into oldest anaQmf->no_channels states */ { FIXP_QAS *RESTRICT FilterStatesAnaTmp = ((FIXP_QAS*)anaQmf->FilterStates)+offset; /* Feed and scale actual time in slot */ for(i=anaQmf->no_channels>>1; i!=0; i--) { /* Place INT_PCM value left aligned in scaledTimeIn */ #if (QAS_BITS==SAMPLE_BITS) *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; timeIn += stride; *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; timeIn += stride; #elif (QAS_BITS>SAMPLE_BITS) *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn)<<(QAS_BITS-SAMPLE_BITS)); timeIn += stride; *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn)<<(QAS_BITS-SAMPLE_BITS)); timeIn += stride; #else *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn)>>(SAMPLE_BITS-QAS_BITS)); timeIn += stride; *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn)>>(SAMPLE_BITS-QAS_BITS)); timeIn += stride; #endif } } if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) { qmfAnaPrototypeFirSlot_NonSymmetric( pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter, anaQmf->p_stride, (FIXP_QAS*)anaQmf->FilterStates ); } else { qmfAnaPrototypeFirSlot( pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter, anaQmf->p_stride, (FIXP_QAS*)anaQmf->FilterStates ); } if (anaQmf->flags & QMF_FLAG_LP) { if (anaQmf->flags & QMF_FLAG_CLDFB) qmfForwardModulationLP_odd( anaQmf, pWorkBuffer, qmfReal ); else qmfForwardModulationLP_even( anaQmf, pWorkBuffer, qmfReal ); } else { qmfForwardModulationHQ( anaQmf, pWorkBuffer, qmfReal, qmfImag ); } /* Shift filter states Should be realized with modulo adressing on a DSP instead of a true buffer shift */ FDKmemmove ((FIXP_QAS*)anaQmf->FilterStates, (FIXP_QAS*)anaQmf->FilterStates+anaQmf->no_channels, offset*sizeof(FIXP_QAS)); } /*! * * \brief Perform complex-valued subband filtering of the time domain * data of timeIn and stores the real part of the subband * samples in rAnalysis, and the imaginary part in iAnalysis * The qmf coefficient table is symmetric. The symmetry is expoited by * shrinking the coefficient table to half the size. The addressing mode * takes care of the symmetries. * * Only the lower bands are obtained (upto anaQmf->lsb). For * a full bandwidth analysis it is required to set both anaQmf->lsb * and anaQmf->usb to the amount of QMF bands. * * \sa PolyphaseFiltering */ void qmfAnalysisFiltering( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ FIXP_QMF **qmfReal, /*!< Pointer to real subband slots */ FIXP_QMF **qmfImag, /*!< Pointer to imag subband slots */ QMF_SCALE_FACTOR *scaleFactor, const INT_PCM *timeIn, /*!< Time signal */ const int stride, FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ) { int i; int no_channels = anaQmf->no_channels; scaleFactor->lb_scale = -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK; scaleFactor->lb_scale -= anaQmf->filterScale; for (i = 0; i < anaQmf->no_col; i++) { FIXP_QMF *qmfImagSlot = NULL; if (!(anaQmf->flags & QMF_FLAG_LP)) { qmfImagSlot = qmfImag[i]; } qmfAnalysisFilteringSlot( anaQmf, qmfReal[i], qmfImagSlot, timeIn , stride, pWorkBuffer ); timeIn += no_channels*stride; } /* no_col loop i */ } /*! * * \brief Perform low power inverse modulation of the subband * samples stored in rSubband (real part) and iSubband (imaginary * part) and stores the result in pWorkBuffer. * */ inline static void qmfInverseModulationLP_even( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ const FIXP_QMF *qmfReal, /*!< Pointer to qmf real subband slot (input) */ const int scaleFactorLowBand, /*!< Scalefactor for Low band */ const int scaleFactorHighBand, /*!< Scalefactor for High band */ FIXP_QMF *pTimeOut /*!< Pointer to qmf subband slot (output)*/ ) { int i; int L = synQmf->no_channels; int M = L>>1; int scale; FIXP_QMF tmp; FIXP_QMF *RESTRICT tReal = pTimeOut; FIXP_QMF *RESTRICT tImag = pTimeOut + L; /* Move input to output vector with offset */ scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, scaleFactorLowBand); scaleValues(&tReal[0+synQmf->lsb], &qmfReal[0+synQmf->lsb], synQmf->usb-synQmf->lsb, scaleFactorHighBand); FDKmemclear(&tReal[0+synQmf->usb], (L-synQmf->usb)*sizeof(FIXP_QMF)); /* Dct type-2 transform */ dct_II(tReal, tImag, L, &scale); /* Expand output and replace inplace the output buffers */ tImag[0] = tReal[M]; tImag[M] = (FIXP_QMF)0; tmp = tReal [0]; tReal [0] = tReal[M]; tReal [M] = tmp; for (i = 1; i < M/2; i++) { /* Imag */ tmp = tReal[L - i]; tImag[M - i] = tmp; tImag[i + M] = -tmp; tmp = tReal[M + i]; tImag[i] = tmp; tImag[L - i] = -tmp; /* Real */ tReal [M + i] = tReal[i]; tReal [L - i] = tReal[M - i]; tmp = tReal[i]; tReal[i] = tReal [M - i]; tReal [M - i] = tmp; } /* Remaining odd terms */ tmp = tReal[M + M/2]; tImag[M/2] = tmp; tImag[M/2 + M] = -tmp; tReal [M + M/2] = tReal[M/2]; } inline static void qmfInverseModulationLP_odd( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ const FIXP_QMF *qmfReal, /*!< Pointer to qmf real subband slot (input) */ const int scaleFactorLowBand, /*!< Scalefactor for Low band */ const int scaleFactorHighBand, /*!< Scalefactor for High band */ FIXP_QMF *pTimeOut /*!< Pointer to qmf subband slot (output)*/ ) { int i; int L = synQmf->no_channels; int M = L>>1; int shift = 0; /* Move input to output vector with offset */ scaleValues(pTimeOut+M, qmfReal, synQmf->lsb, scaleFactorLowBand); scaleValues(pTimeOut+M+synQmf->lsb, qmfReal+synQmf->lsb, synQmf->usb-synQmf->lsb, scaleFactorHighBand); FDKmemclear(pTimeOut+M+synQmf->usb, (L-synQmf->usb)*sizeof(FIXP_QMF)); dct_IV(pTimeOut+M, L, &shift); for (i = 0; i < M; i++) { pTimeOut[i] = pTimeOut[L - 1 - i]; pTimeOut[2 * L - 1 - i] = -pTimeOut[L + i]; } } /*! * * \brief Perform complex-valued inverse modulation of the subband * samples stored in rSubband (real part) and iSubband (imaginary * part) and stores the result in pWorkBuffer. * */ inline static void qmfInverseModulationHQ( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ const FIXP_QMF *qmfReal, /*!< Pointer to qmf real subband slot */ const FIXP_QMF *qmfImag, /*!< Pointer to qmf imag subband slot */ const int scaleFactorLowBand, /*!< Scalefactor for Low band */ const int scaleFactorHighBand,/*!< Scalefactor for High band */ FIXP_QMF *pWorkBuffer /*!< WorkBuffer (output) */ ) { int i; int L = synQmf->no_channels; int M = L>>1; int shift = 0; FIXP_QMF *RESTRICT tReal = pWorkBuffer; FIXP_QMF *RESTRICT tImag = pWorkBuffer+L; if (synQmf->flags & QMF_FLAG_CLDFB){ for (i = 0; i < synQmf->lsb; i++) { cplxMult(&tImag[i], &tReal[i], scaleValue(qmfImag[i],scaleFactorLowBand), scaleValue(qmfReal[i],scaleFactorLowBand), synQmf->t_cos[i], synQmf->t_sin[i]); } for (; i < synQmf->usb; i++) { cplxMult(&tImag[i], &tReal[i], scaleValue(qmfImag[i],scaleFactorHighBand), scaleValue(qmfReal[i],scaleFactorHighBand), synQmf->t_cos[i], synQmf->t_sin[i]); } } if ( (synQmf->flags & QMF_FLAG_CLDFB) == 0) { scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, scaleFactorLowBand); scaleValues(&tReal[0+synQmf->lsb], &qmfReal[0+synQmf->lsb], synQmf->usb-synQmf->lsb, scaleFactorHighBand); scaleValues(&tImag[0], &qmfImag[0], synQmf->lsb, scaleFactorLowBand); scaleValues(&tImag[0+synQmf->lsb], &qmfImag[0+synQmf->lsb], synQmf->usb-synQmf->lsb, scaleFactorHighBand); } FDKmemclear(&tReal[synQmf->usb], (synQmf->no_channels-synQmf->usb)*sizeof(FIXP_QMF)); FDKmemclear(&tImag[synQmf->usb], (synQmf->no_channels-synQmf->usb)*sizeof(FIXP_QMF)); dct_IV(tReal, L, &shift); dst_IV(tImag, L, &shift); if (synQmf->flags & QMF_FLAG_CLDFB){ for (i = 0; i < M; i++) { FIXP_QMF r1, i1, r2, i2; r1 = tReal[i]; i2 = tImag[L - 1 - i]; r2 = tReal[L - i - 1]; i1 = tImag[i]; tReal[i] = (r1 - i1)>>1; tImag[L - 1 - i] = -(r1 + i1)>>1; tReal[L - i - 1] = (r2 - i2)>>1; tImag[i] = -(r2 + i2)>>1; } } else { /* The array accesses are negative to compensate the missing minus sign in the low and hi band gain. */ /* 26 cycles on ARM926 */ for (i = 0; i < M; i++) { FIXP_QMF r1, i1, r2, i2; r1 = -tReal[i]; i2 = -tImag[L - 1 - i]; r2 = -tReal[L - i - 1]; i1 = -tImag[i]; tReal[i] = (r1 - i1)>>1; tImag[L - 1 - i] = -(r1 + i1)>>1; tReal[L - i - 1] = (r2 - i2)>>1; tImag[i] = -(r2 + i2)>>1; } } } void qmfSynthesisFilteringSlot( HANDLE_QMF_FILTER_BANK synQmf, const FIXP_QMF *realSlot, const FIXP_QMF *imagSlot, const int scaleFactorLowBand, const int scaleFactorHighBand, INT_PCM *timeOut, const int stride, FIXP_QMF *pWorkBuffer) { if (!(synQmf->flags & QMF_FLAG_LP)) qmfInverseModulationHQ ( synQmf, realSlot, imagSlot, scaleFactorLowBand, scaleFactorHighBand, pWorkBuffer ); else { if (synQmf->flags & QMF_FLAG_CLDFB) { qmfInverseModulationLP_odd ( synQmf, realSlot, scaleFactorLowBand, scaleFactorHighBand, pWorkBuffer ); } else { qmfInverseModulationLP_even ( synQmf, realSlot, scaleFactorLowBand, scaleFactorHighBand, pWorkBuffer ); } } if (synQmf->flags & QMF_FLAG_NONSYMMETRIC) { qmfSynPrototypeFirSlot_NonSymmetric ( synQmf, pWorkBuffer, pWorkBuffer+synQmf->no_channels, timeOut, stride ); } else { qmfSynPrototypeFirSlot ( synQmf, pWorkBuffer, pWorkBuffer+synQmf->no_channels, timeOut, stride ); } } /*! * * * \brief Perform complex-valued subband synthesis of the * low band and the high band and store the * time domain data in timeOut * * First step: Calculate the proper scaling factor of current * spectral data in qmfReal/qmfImag, old spectral data in the overlap * range and filter states. * * Second step: Perform Frequency-to-Time mapping with inverse * Modulation slot-wise. * * Third step: Perform FIR-filter slot-wise. To save space for filter * states, the MAC operations are executed directly on the filter states * instead of accumulating several products in the accumulator. The * buffer shift at the end of the function should be replaced by a * modulo operation, which is available on some DSPs. * * Last step: Copy the upper part of the spectral data to the overlap buffer. * * The qmf coefficient table is symmetric. The symmetry is exploited by * shrinking the coefficient table to half the size. The addressing mode * takes care of the symmetries. If the #define #QMFTABLE_FULL is set, * coefficient addressing works on the full table size. The code will be * slightly faster and slightly more compact. * * Workbuffer requirement: 2 x sizeof(**QmfBufferReal) * synQmf->no_channels */ void qmfSynthesisFiltering( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_QMF **QmfBufferReal, /*!< Low and High band, real */ FIXP_QMF **QmfBufferImag, /*!< Low and High band, imag */ const QMF_SCALE_FACTOR *scaleFactor, const INT ov_len, /*!< split Slot of overlap and actual slots */ INT_PCM *timeOut, /*!< Pointer to output */ const INT stride, /*!< stride factor of output */ FIXP_QMF *pWorkBuffer /*!< pointer to temporal working buffer */ ) { int i; int L = synQmf->no_channels; SCHAR scaleFactorHighBand; SCHAR scaleFactorLowBand_ov, scaleFactorLowBand_no_ov; /* adapt scaling */ scaleFactorHighBand = -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - scaleFactor->hb_scale; scaleFactorLowBand_ov = - ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - scaleFactor->ov_lb_scale; scaleFactorLowBand_no_ov = - ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - scaleFactor->lb_scale; for (i = 0; i < synQmf->no_col; i++) /* ----- no_col loop ----- */ { const FIXP_DBL *QmfBufferImagSlot = NULL; SCHAR scaleFactorLowBand = (iflags & QMF_FLAG_LP)) QmfBufferImagSlot = QmfBufferImag[i]; qmfSynthesisFilteringSlot( synQmf, QmfBufferReal[i], QmfBufferImagSlot, scaleFactorLowBand, scaleFactorHighBand, timeOut+(i*L*stride), stride, pWorkBuffer); } /* no_col loop i */ } /*! * * \brief Create QMF filter bank instance * * \return 0 if successful * */ static int qmfInitFilterBank (HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Handle to return */ void *pFilterStates, /*!< Handle to filter states */ int noCols, /*!< Number of timeslots per frame */ int lsb, /*!< Lower end of QMF frequency range */ int usb, /*!< Upper end of QMF frequency range */ int no_channels, /*!< Number of channels (bands) */ UINT flags) /*!< flags */ { FDKmemclear(h_Qmf,sizeof(QMF_FILTER_BANK)); if (flags & QMF_FLAG_MPSLDFB) { return -1; } if ( !(flags & QMF_FLAG_MPSLDFB) && (flags & QMF_FLAG_CLDFB) ) { flags |= QMF_FLAG_NONSYMMETRIC; h_Qmf->filterScale = QMF_CLDFB_PFT_SCALE; h_Qmf->p_stride = 1; switch (no_channels) { case 64: h_Qmf->t_cos = qmf_phaseshift_cos64_cldfb; h_Qmf->t_sin = qmf_phaseshift_sin64_cldfb; h_Qmf->p_filter = qmf_cldfb_640; h_Qmf->FilterSize = 640; break; case 32: h_Qmf->t_cos = qmf_phaseshift_cos32_cldfb; h_Qmf->t_sin = qmf_phaseshift_sin32_cldfb; h_Qmf->p_filter = qmf_cldfb_320; h_Qmf->FilterSize = 320; break; default: return -1; } } if ( !(flags & QMF_FLAG_MPSLDFB) && ((flags & QMF_FLAG_CLDFB) == 0) ) { switch (no_channels) { case 64: h_Qmf->p_filter = qmf_64; h_Qmf->t_cos = qmf_phaseshift_cos64; h_Qmf->t_sin = qmf_phaseshift_sin64; h_Qmf->p_stride = 1; h_Qmf->FilterSize = 640; h_Qmf->filterScale = 0; break; case 32: h_Qmf->p_filter = qmf_64; if (flags & QMF_FLAG_DOWNSAMPLED) { h_Qmf->t_cos = qmf_phaseshift_cos_downsamp32; h_Qmf->t_sin = qmf_phaseshift_sin_downsamp32; } else { h_Qmf->t_cos = qmf_phaseshift_cos32; h_Qmf->t_sin = qmf_phaseshift_sin32; } h_Qmf->p_stride = 2; h_Qmf->FilterSize = 640; h_Qmf->filterScale = 0; break; default: return -1; } } h_Qmf->flags = flags; h_Qmf->no_channels = no_channels; h_Qmf->no_col = noCols; h_Qmf->lsb = lsb; h_Qmf->usb = fMin(usb, h_Qmf->no_channels); h_Qmf->FilterStates = (void*)pFilterStates; h_Qmf->outScalefactor = ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + h_Qmf->filterScale; if ( (h_Qmf->p_stride == 2) || ((flags & QMF_FLAG_CLDFB) && (no_channels == 32)) ) { h_Qmf->outScalefactor -= 1; } h_Qmf->outGain = (FIXP_DBL)0x80000000; /* default init value will be not applied */ return (0); } /*! * * \brief Adjust synthesis qmf filter states * * \return void * */ static inline void qmfAdaptFilterStates (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Filter Bank */ int scaleFactorDiff) /*!< Scale factor difference to be applied */ { if (synQmf == NULL || synQmf->FilterStates == NULL) { return; } scaleValues((FIXP_QSS*)synQmf->FilterStates, synQmf->no_channels*(QMF_NO_POLY*2 - 1), scaleFactorDiff); } /*! * * \brief Create QMF filter bank instance * * Only the lower bands are obtained (upto anaQmf->lsb). For * a full bandwidth analysis it is required to set both anaQmf->lsb * and anaQmf->usb to the amount of QMF bands. * * \return 0 if succesful * */ int qmfInitAnalysisFilterBank (HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */ FIXP_QAS *pFilterStates, /*!< Handle to filter states */ int noCols, /*!< Number of timeslots per frame */ int lsb, /*!< lower end of QMF */ int usb, /*!< upper end of QMF */ int no_channels, /*!< Number of channels (bands) */ int flags) /*!< Low Power flag */ { int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb, no_channels, flags); if ( !(flags & QMF_FLAG_KEEP_STATES) && (h_Qmf->FilterStates != NULL) ) { FDKmemclear(h_Qmf->FilterStates, (2*QMF_NO_POLY-1)*h_Qmf->no_channels*sizeof(FIXP_QAS)); } return err; } /*! * * \brief Create QMF filter bank instance * * Only the lower bands are obtained (upto anaQmf->lsb). For * a full bandwidth analysis it is required to set both anaQmf->lsb * and anaQmf->usb to the amount of QMF bands. * * \return 0 if succesful * */ int qmfInitSynthesisFilterBank (HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */ FIXP_QSS *pFilterStates, /*!< Handle to filter states */ int noCols, /*!< Number of timeslots per frame */ int lsb, /*!< lower end of QMF */ int usb, /*!< upper end of QMF */ int no_channels, /*!< Number of channels (bands) */ int flags) /*!< Low Power flag */ { int oldOutScale = h_Qmf->outScalefactor; int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb, no_channels, flags); if ( h_Qmf->FilterStates != NULL ) { if ( !(flags & QMF_FLAG_KEEP_STATES) ) { FDKmemclear(h_Qmf->FilterStates, (2*QMF_NO_POLY-1)*h_Qmf->no_channels*sizeof(FIXP_QSS)); } else { qmfAdaptFilterStates(h_Qmf, oldOutScale-h_Qmf->outScalefactor); } } return err; } /*! * * \brief Change scale factor for output data and adjust qmf filter states * * \return void * */ void qmfChangeOutScalefactor (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ int outScalefactor /*!< New scaling factor for output data */ ) { if (synQmf == NULL || synQmf->FilterStates == NULL) { return; } /* Add internal filterbank scale */ outScalefactor += ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK + ALGORITHMIC_SCALING_IN_SYNTHESIS_FILTERBANK + synQmf->filterScale; if ( (synQmf->p_stride == 2) || ((synQmf->flags & QMF_FLAG_CLDFB) && (synQmf->no_channels == 32)) ) { outScalefactor -= 1; } /* adjust filter states when scale factor has been changed */ if (synQmf->outScalefactor != outScalefactor) { int diff; if (outScalefactor > (SAMPLE_BITS - 1)) { outScalefactor = SAMPLE_BITS - 1; } else if (outScalefactor < (1 - SAMPLE_BITS)) { outScalefactor = 1 - SAMPLE_BITS; } diff = synQmf->outScalefactor - outScalefactor; qmfAdaptFilterStates(synQmf, diff); /* save new scale factor */ synQmf->outScalefactor = outScalefactor; } } /*! * * \brief Change gain for output data * * \return void * */ void qmfChangeOutGain (HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_DBL outputGain /*!< New gain for output data */ ) { synQmf->outGain = outputGain; } fdk-aac-0.1.3/libFDK/src/fft_rad2.cpp0000644000175000017500000003726412372261464017503 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): M. Lohwasser, M. Gayer Description: ******************************************************************************/ #include "fft_rad2.h" #include "scramble.h" #define __FFT_RAD2_CPP__ #if defined(__arm__) /* cppp replaced: elif */ #include "arm/fft_rad2_arm.cpp" #elif defined(__GNUC__) && defined(__mips__) && defined(__mips_dsp) /* cppp replaced: elif */ #include "mips/fft_rad2_mips.cpp" #endif /***************************************************************************** functionname: dit_fft (analysis) description: dit-tukey-algorithm scrambles data at entry i.e. loop is made with scrambled data returns: input: output: *****************************************************************************/ #ifndef FUNCTION_dit_fft void dit_fft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) { const INT n=1<>1; /* Re A + Re B */ a10 = (x[i + 4] + x[i + 6])>>1; /* Re C + Re D */ a20 = (x[i + 1] + x[i + 3])>>1; /* Im A + Im B */ a30 = (x[i + 5] + x[i + 7])>>1; /* Im C + Im D */ x[i + 0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */ x[i + 4] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */ x[i + 1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */ x[i + 5] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */ a00 = a00 - x[i + 2]; /* Re A - Re B */ a10 = a10 - x[i + 6]; /* Re C - Re D */ a20 = a20 - x[i + 3]; /* Im A - Im B */ a30 = a30 - x[i + 7]; /* Im C - Im D */ x[i + 2] = a00 + a30; /* Re B' = Re A - Re B + Im C - Im D */ x[i + 6] = a00 - a30; /* Re D' = Re A - Re B - Im C + Im D */ x[i + 3] = a20 - a10; /* Im B' = Im A - Im B - Re C + Re D */ x[i + 7] = a20 + a10; /* Im D' = Im A - Im B + Re C - Re D */ } for(ldm=3; ldm<=ldn; ++ldm) { INT m=(1<>1); INT j,r; trigstep=((trigDataSize << 2)>>ldm); FDK_ASSERT(trigstep > 0); /* Do first iteration with c=1.0 and s=0.0 separately to avoid loosing to much precision. Beware: The impact on the overal FFT precision is rather large. */ { j = 0; for(r=0; r>1; vr = x[t2]>>1; ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); //cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], (FIXP_SGL)1.0, (FIXP_SGL)0.0); vr = x[t2+1]>>1; vi = x[t2]>>1; ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui-vi; x[t2] = ur-vr; x[t2+1] = ui+vi; } } for(j=1; j>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui-vi; x[t2] = ur-vr; x[t2+1] = ui+vi; /* Same as above but for t1,t2 with j>mh/4 and thus cs swapped */ t1 = (r+mh/2-j)<<1; t2 = t1 + (mh<<1); cplxMultDiv2(&vi, &vr, x[t2], x[t2+1], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui-vi; x[t2] = ur-vr; x[t2+1] = ui+vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vr, &vi, x[t2], x[t2+1], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui-vi; x[t2] = ur+vr; x[t2+1] = ui+vi; } } { j = mh/4; for(r=0; r>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], STC(0x5a82799a), STC(0x5a82799a)); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui-vi; x[t2] = ur-vr; x[t2+1] = ui+vi; } } } } #endif /***************************************************************************** functionname: dit_ifft (synthesis) description: dit-tukey-algorithm scrambles data at entry i.e. loop is made with scrambled data returns: input: output: *****************************************************************************/ #if !defined(FUNCTION_dit_ifft) void dit_ifft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) { const INT n=1<>1; /* Re A + Re B */ a10 = (x[i + 4] + x[i + 6])>>1; /* Re C + Re D */ a20 = (x[i + 1] + x[i + 3])>>1; /* Im A + Im B */ a30 = (x[i + 5] + x[i + 7])>>1; /* Im C + Im D */ a0 = (x[i + 0] - x[i + 2])>>1; /* Re A - Re B */ a2 = (x[i + 4] - x[i + 6])>>1; /* Re C - Re D */ a3 = (x[i + 1] - x[i + 3])>>1; /* Im A - Im B */ a1 = (x[i + 5] - x[i + 7])>>1; /* Im C - Im D */ x[i + 0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */ x[i + 4] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */ x[i + 1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */ x[i + 5] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */ x[i + 2] = a0 - a1; /* Re B' = Re A - Re B - Im C + Im D */ x[i + 6] = a0 + a1; /* Re D' = Re A - Re B + Im C - Im D */ x[i + 3] = a3 + a2; /* Im B' = Im A - Im B + Re C - Re D */ x[i + 7] = a3 - a2; /* Im D' = Im A - Im B - Re C + Re D */ } for(ldm=3; ldm<=ldn; ++ldm) { const INT m=(1<>1); INT j,r; trigstep=((trigDataSize << 2)>>ldm); { j = 0; for(r=0; r>1; vr = x[t2]>>1; ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); //cplxMultDiv2(&vi, &vr, x[t2], x[t2+1], FL2FXCONST_SGL(1.0), FL2FXCONST_SGL(0.0)); vr = x[t2+1]>>1; vi = x[t2]>>1; ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui+vi; x[t2] = ur+vr; x[t2+1] = ui-vi; } } for(j=1; j>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vi, &vr, x[t2], x[t2+1], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui+vi; x[t2] = ur+vr; x[t2+1] = ui-vi; /* Same as above but for t1,t2 with j>mh/4 and thus cs swapped */ t1 = (r+mh/2-j)<<1; t2 = t1 + (mh<<1); cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui+vi; x[t2] = ur+vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vi, &vr, x[t2+1], x[t2], cs); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui-vi; x[t2] = ur+vr; x[t2+1] = ui+vi; } } { j = mh/4; for(r=0; r>1; ui = x[t1+1]>>1; x[t1] = ur+vr; x[t1+1] = ui+vi; x[t2] = ur-vr; x[t2+1] = ui-vi; t1 += mh; t2 = t1+(mh<<1); cplxMultDiv2(&vi, &vr, x[t2], x[t2+1], STC(0x5a82799a), STC(0x5a82799a)); ur = x[t1]>>1; ui = x[t1+1]>>1; x[t1] = ur-vr; x[t1+1] = ui+vi; x[t2] = ur+vr; x[t2+1] = ui-vi; } } } } #endif fdk-aac-0.1.3/libFDK/src/FDK_tools_rom.cpp0000644000175000017500000056143612372262205020512 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools *********************** Author(s): Oliver Moser Description: ROM tables used by FDK tools ******************************************************************************/ #include "FDK_tools_rom.h" RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STP SineTable480[] = { STCP(0x7fffffff, 0x00000000), STCP(0x7fffd315, 0x006b3b9b), STCP(0x7fff4c54, 0x00d676eb), STCP(0x7ffe6bbf, 0x0141b1a5), STCP(0x7ffd3154, 0x01aceb7c), STCP(0x7ffb9d15, 0x02182427), STCP(0x7ff9af04, 0x02835b5a), STCP(0x7ff76721, 0x02ee90c8), STCP(0x7ff4c56f, 0x0359c428), STCP(0x7ff1c9ef, 0x03c4f52f), STCP(0x7fee74a2, 0x0430238f), STCP(0x7feac58d, 0x049b4f00), STCP(0x7fe6bcb0, 0x05067734), STCP(0x7fe25a0f, 0x05719be2), STCP(0x7fdd9dad, 0x05dcbcbe), STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd317b4, 0x06b2f1d2), STCP(0x7fcd4e24, 0x071e0575), STCP(0x7fc72ae2, 0x07891418), STCP(0x7fc0adf2, 0x07f41d72), STCP(0x7fb9d759, 0x085f2137), STCP(0x7fb2a71b, 0x08ca1f1b), STCP(0x7fab1d3d, 0x093516d4), STCP(0x7fa339c5, 0x09a00817), STCP(0x7f9afcb9, 0x0a0af299), STCP(0x7f92661d, 0x0a75d60e), STCP(0x7f8975f9, 0x0ae0b22c), STCP(0x7f802c52, 0x0b4b86a8), STCP(0x7f76892f, 0x0bb65336), STCP(0x7f6c8c96, 0x0c21178c), STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f578721, 0x0cf68662), STCP(0x7f4c7e54, 0x0d61304e), STCP(0x7f411c2f, 0x0dcbd0d5), STCP(0x7f3560b9, 0x0e3667ad), STCP(0x7f294bfd, 0x0ea0f48c), STCP(0x7f1cde01, 0x0f0b7727), STCP(0x7f1016ce, 0x0f75ef33), STCP(0x7f02f66f, 0x0fe05c64), STCP(0x7ef57cea, 0x104abe71), STCP(0x7ee7aa4c, 0x10b5150f), STCP(0x7ed97e9c, 0x111f5ff4), STCP(0x7ecaf9e5, 0x11899ed3), STCP(0x7ebc1c31, 0x11f3d164), STCP(0x7eace58a, 0x125df75b), STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8d6d91, 0x13321c53), STCP(0x7e7d2c54, 0x139c1abf), STCP(0x7e6c9251, 0x14060b68), STCP(0x7e5b9f93, 0x146fee03), STCP(0x7e4a5426, 0x14d9c245), STCP(0x7e38b017, 0x154387e6), STCP(0x7e26b371, 0x15ad3e9a), STCP(0x7e145e42, 0x1616e618), STCP(0x7e01b096, 0x16807e15), STCP(0x7deeaa7a, 0x16ea0646), STCP(0x7ddb4bfc, 0x17537e63), STCP(0x7dc79529, 0x17bce621), STCP(0x7db3860f, 0x18263d36), STCP(0x7d9f1ebd, 0x188f8357), STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d7547a7, 0x1961db9b), STCP(0x7d5fd801, 0x19caed29), STCP(0x7d4a105d, 0x1a33ec9c), STCP(0x7d33f0ca, 0x1a9cd9ac), STCP(0x7d1d7958, 0x1b05b40f), STCP(0x7d06aa16, 0x1b6e7b7a), STCP(0x7cef8315, 0x1bd72fa4), STCP(0x7cd80464, 0x1c3fd045), STCP(0x7cc02e15, 0x1ca85d12), STCP(0x7ca80038, 0x1d10d5c2), STCP(0x7c8f7ade, 0x1d793a0b), STCP(0x7c769e18, 0x1de189a6), STCP(0x7c5d69f7, 0x1e49c447), STCP(0x7c43de8e, 0x1eb1e9a7), STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c0fc22a, 0x1f81f37c), STCP(0x7bf53153, 0x1fe9d75f), STCP(0x7bda497d, 0x2051a4dd), STCP(0x7bbf0aba, 0x20b95bac), STCP(0x7ba3751d, 0x2120fb83), STCP(0x7b8788ba, 0x2188841a), STCP(0x7b6b45a5, 0x21eff528), STCP(0x7b4eabf1, 0x22574e65), STCP(0x7b31bbb2, 0x22be8f87), STCP(0x7b1474fd, 0x2325b847), STCP(0x7af6d7e6, 0x238cc85d), STCP(0x7ad8e482, 0x23f3bf7e), STCP(0x7aba9ae6, 0x245a9d65), STCP(0x7a9bfb27, 0x24c161c7), STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5db997, 0x258e9ce0), STCP(0x7a3e17f2, 0x25f51307), STCP(0x7a1e2082, 0x265b6e8a), STCP(0x79fdd35c, 0x26c1af22), STCP(0x79dd3098, 0x2727d486), STCP(0x79bc384d, 0x278dde6e), STCP(0x799aea92, 0x27f3cc94), STCP(0x7979477d, 0x28599eb0), STCP(0x79574f28, 0x28bf547b), STCP(0x793501a9, 0x2924edac), STCP(0x79125f19, 0x298a69fc), STCP(0x78ef678f, 0x29efc925), STCP(0x78cc1b26, 0x2a550adf), STCP(0x78a879f4, 0x2aba2ee4), STCP(0x78848414, 0x2b1f34eb), STCP(0x7860399e, 0x2b841caf), STCP(0x783b9aad, 0x2be8e5e8), STCP(0x7816a759, 0x2c4d9050), STCP(0x77f15fbc, 0x2cb21ba0), STCP(0x77cbc3f2, 0x2d168792), STCP(0x77a5d413, 0x2d7ad3de), STCP(0x777f903c, 0x2ddf0040), STCP(0x7758f886, 0x2e430c6f), STCP(0x77320d0d, 0x2ea6f827), STCP(0x770acdec, 0x2f0ac320), STCP(0x76e33b3f, 0x2f6e6d16), STCP(0x76bb5521, 0x2fd1f5c1), STCP(0x76931bae, 0x30355cdd), STCP(0x766a8f04, 0x3098a223), STCP(0x7641af3d, 0x30fbc54d), STCP(0x76187c77, 0x315ec617), STCP(0x75eef6ce, 0x31c1a43b), STCP(0x75c51e61, 0x32245f72), STCP(0x759af34c, 0x3286f779), STCP(0x757075ac, 0x32e96c09), STCP(0x7545a5a0, 0x334bbcde), STCP(0x751a8346, 0x33ade9b3), STCP(0x74ef0ebc, 0x340ff242), STCP(0x74c34820, 0x3471d647), STCP(0x74972f92, 0x34d3957e), STCP(0x746ac52f, 0x35352fa1), STCP(0x743e0918, 0x3596a46c), STCP(0x7410fb6b, 0x35f7f39c), STCP(0x73e39c49, 0x36591cea), STCP(0x73b5ebd1, 0x36ba2014), STCP(0x7387ea23, 0x371afcd5), STCP(0x73599760, 0x377bb2e9), STCP(0x732af3a7, 0x37dc420c), STCP(0x72fbff1b, 0x383ca9fb), STCP(0x72ccb9db, 0x389cea72), STCP(0x729d2409, 0x38fd032d), STCP(0x726d3dc6, 0x395cf3e9), STCP(0x723d0734, 0x39bcbc63), STCP(0x720c8075, 0x3a1c5c57), STCP(0x71dba9ab, 0x3a7bd382), STCP(0x71aa82f7, 0x3adb21a1), STCP(0x71790c7e, 0x3b3a4672), STCP(0x71474660, 0x3b9941b1), STCP(0x711530c2, 0x3bf8131c), STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b01790, 0x3cb5376b), STCP(0x707d1443, 0x3d1389cb), STCP(0x7049c203, 0x3d71b14d), STCP(0x701620f5, 0x3dcfadb0), STCP(0x6fe2313c, 0x3e2d7eb1), STCP(0x6fadf2fc, 0x3e8b240e), STCP(0x6f79665b, 0x3ee89d86), STCP(0x6f448b7e, 0x3f45ead8), STCP(0x6f0f6289, 0x3fa30bc1), STCP(0x6ed9eba1, 0x40000000), STCP(0x6ea426ed, 0x405cc754), STCP(0x6e6e1492, 0x40b9617d), STCP(0x6e37b4b6, 0x4115ce38), STCP(0x6e010780, 0x41720d46), STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d92c59b, 0x422a0154), STCP(0x6d5b313b, 0x4285b5d4), STCP(0x6d23501b, 0x42e13ba4), STCP(0x6ceb2261, 0x433c9283), STCP(0x6cb2a837, 0x4397ba32), STCP(0x6c79e1c2, 0x43f2b271), STCP(0x6c40cf2c, 0x444d7aff), STCP(0x6c07709b, 0x44a8139e), STCP(0x6bcdc639, 0x45027c0c), STCP(0x6b93d02e, 0x455cb40c), STCP(0x6b598ea3, 0x45b6bb5e), STCP(0x6b1f01c0, 0x461091c2), STCP(0x6ae429ae, 0x466a36f9), STCP(0x6aa90697, 0x46c3aac5), STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a31e000, 0x4775fd1f), STCP(0x69f5dcd3, 0x47cedb31), STCP(0x69b98f48, 0x482786dc), STCP(0x697cf78a, 0x487fffe4), STCP(0x694015c3, 0x48d84609), STCP(0x6902ea1d, 0x4930590f), STCP(0x68c574c4, 0x498838b6), STCP(0x6887b5e2, 0x49dfe4c2), STCP(0x6849ada3, 0x4a375cf5), STCP(0x680b5c33, 0x4a8ea111), STCP(0x67ccc1be, 0x4ae5b0da), STCP(0x678dde6e, 0x4b3c8c12), STCP(0x674eb271, 0x4b93327c), STCP(0x670f3df3, 0x4be9a3db), STCP(0x66cf8120, 0x4c3fdff4), STCP(0x668f7c25, 0x4c95e688), STCP(0x664f2f2e, 0x4cebb75c), STCP(0x660e9a6a, 0x4d415234), STCP(0x65cdbe05, 0x4d96b6d3), STCP(0x658c9a2d, 0x4debe4fe), STCP(0x654b2f10, 0x4e40dc79), STCP(0x65097cdb, 0x4e959d08), STCP(0x64c783bd, 0x4eea2670), STCP(0x648543e4, 0x4f3e7875), STCP(0x6442bd7e, 0x4f9292dc), STCP(0x63fff0ba, 0x4fe6756a), STCP(0x63bcddc7, 0x503a1fe5), STCP(0x637984d4, 0x508d9211), STCP(0x6335e611, 0x50e0cbb4), STCP(0x62f201ac, 0x5133cc94), STCP(0x62add7d6, 0x51869476), STCP(0x626968be, 0x51d92321), STCP(0x6224b495, 0x522b7859), STCP(0x61dfbb8a, 0x527d93e6), STCP(0x619a7dce, 0x52cf758f), STCP(0x6154fb91, 0x53211d18), STCP(0x610f3505, 0x53728a4a), STCP(0x60c92a5a, 0x53c3bcea), STCP(0x6082dbc1, 0x5414b4c1), STCP(0x603c496c, 0x54657194), STCP(0x5ff5738d, 0x54b5f32c), STCP(0x5fae5a55, 0x55063951), STCP(0x5f66fdf5, 0x555643c8), STCP(0x5f1f5ea1, 0x55a6125c), STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e8f57e2, 0x5644faf4), STCP(0x5e46f0dd, 0x5694148b), STCP(0x5dfe47ad, 0x56e2f15d), STCP(0x5db55c86, 0x57319135), STCP(0x5d6c2f99, 0x577ff3da), STCP(0x5d22c11c, 0x57ce1917), STCP(0x5cd91140, 0x581c00b3), STCP(0x5c8f203b, 0x5869aa79), STCP(0x5c44ee40, 0x58b71632), STCP(0x5bfa7b82, 0x590443a7), STCP(0x5bafc837, 0x595132a2), STCP(0x5b64d492, 0x599de2ee), STCP(0x5b19a0c8, 0x59ea5454), STCP(0x5ace2d0f, 0x5a36869f), STCP(0x5a82799a, 0x5a82799a) }; RAM_ALIGN LNK_SECTION_CONSTDATA LNK_SECTION_CONSTDATA_L1 const FIXP_STP SineTable512[] = { STCP(0x7fffffff, 0x00000000), STCP(0x7fffd886, 0x006487e3), STCP(0x7fff6216, 0x00c90f88), STCP(0x7ffe9cb2, 0x012d96b1), STCP(0x7ffd885a, 0x01921d20), STCP(0x7ffc250f, 0x01f6a297), STCP(0x7ffa72d1, 0x025b26d7), STCP(0x7ff871a2, 0x02bfa9a4), STCP(0x7ff62182, 0x03242abf), STCP(0x7ff38274, 0x0388a9ea), STCP(0x7ff09478, 0x03ed26e6), STCP(0x7fed5791, 0x0451a177), STCP(0x7fe9cbc0, 0x04b6195d), STCP(0x7fe5f108, 0x051a8e5c), STCP(0x7fe1c76b, 0x057f0035), STCP(0x7fdd4eec, 0x05e36ea9), STCP(0x7fd8878e, 0x0647d97c), STCP(0x7fd37153, 0x06ac406f), STCP(0x7fce0c3e, 0x0710a345), STCP(0x7fc85854, 0x077501be), STCP(0x7fc25596, 0x07d95b9e), STCP(0x7fbc040a, 0x083db0a7), STCP(0x7fb563b3, 0x08a2009a), STCP(0x7fae7495, 0x09064b3a), STCP(0x7fa736b4, 0x096a9049), STCP(0x7f9faa15, 0x09cecf89), STCP(0x7f97cebd, 0x0a3308bd), STCP(0x7f8fa4b0, 0x0a973ba5), STCP(0x7f872bf3, 0x0afb6805), STCP(0x7f7e648c, 0x0b5f8d9f), STCP(0x7f754e80, 0x0bc3ac35), STCP(0x7f6be9d4, 0x0c27c389), STCP(0x7f62368f, 0x0c8bd35e), STCP(0x7f5834b7, 0x0cefdb76), STCP(0x7f4de451, 0x0d53db92), STCP(0x7f434563, 0x0db7d376), STCP(0x7f3857f6, 0x0e1bc2e4), STCP(0x7f2d1c0e, 0x0e7fa99e), STCP(0x7f2191b4, 0x0ee38766), STCP(0x7f15b8ee, 0x0f475bff), STCP(0x7f0991c4, 0x0fab272b), STCP(0x7efd1c3c, 0x100ee8ad), STCP(0x7ef05860, 0x1072a048), STCP(0x7ee34636, 0x10d64dbd), STCP(0x7ed5e5c6, 0x1139f0cf), STCP(0x7ec8371a, 0x119d8941), STCP(0x7eba3a39, 0x120116d5), STCP(0x7eabef2c, 0x1264994e), STCP(0x7e9d55fc, 0x12c8106f), STCP(0x7e8e6eb2, 0x132b7bf9), STCP(0x7e7f3957, 0x138edbb1), STCP(0x7e6fb5f4, 0x13f22f58), STCP(0x7e5fe493, 0x145576b1), STCP(0x7e4fc53e, 0x14b8b17f), STCP(0x7e3f57ff, 0x151bdf86), STCP(0x7e2e9cdf, 0x157f0086), STCP(0x7e1d93ea, 0x15e21445), STCP(0x7e0c3d29, 0x16451a83), STCP(0x7dfa98a8, 0x16a81305), STCP(0x7de8a670, 0x170afd8d), STCP(0x7dd6668f, 0x176dd9de), STCP(0x7dc3d90d, 0x17d0a7bc), STCP(0x7db0fdf8, 0x183366e9), STCP(0x7d9dd55a, 0x18961728), STCP(0x7d8a5f40, 0x18f8b83c), STCP(0x7d769bb5, 0x195b49ea), STCP(0x7d628ac6, 0x19bdcbf3), STCP(0x7d4e2c7f, 0x1a203e1b), STCP(0x7d3980ec, 0x1a82a026), STCP(0x7d24881b, 0x1ae4f1d6), STCP(0x7d0f4218, 0x1b4732ef), STCP(0x7cf9aef0, 0x1ba96335), STCP(0x7ce3ceb2, 0x1c0b826a), STCP(0x7ccda169, 0x1c6d9053), STCP(0x7cb72724, 0x1ccf8cb3), STCP(0x7ca05ff1, 0x1d31774d), STCP(0x7c894bde, 0x1d934fe5), STCP(0x7c71eaf9, 0x1df5163f), STCP(0x7c5a3d50, 0x1e56ca1e), STCP(0x7c4242f2, 0x1eb86b46), STCP(0x7c29fbee, 0x1f19f97b), STCP(0x7c116853, 0x1f7b7481), STCP(0x7bf88830, 0x1fdcdc1b), STCP(0x7bdf5b94, 0x203e300d), STCP(0x7bc5e290, 0x209f701c), STCP(0x7bac1d31, 0x21009c0c), STCP(0x7b920b89, 0x2161b3a0), STCP(0x7b77ada8, 0x21c2b69c), STCP(0x7b5d039e, 0x2223a4c5), STCP(0x7b420d7a, 0x22847de0), STCP(0x7b26cb4f, 0x22e541af), STCP(0x7b0b3d2c, 0x2345eff8), STCP(0x7aef6323, 0x23a6887f), STCP(0x7ad33d45, 0x24070b08), STCP(0x7ab6cba4, 0x24677758), STCP(0x7a9a0e50, 0x24c7cd33), STCP(0x7a7d055b, 0x25280c5e), STCP(0x7a5fb0d8, 0x2588349d), STCP(0x7a4210d8, 0x25e845b6), STCP(0x7a24256f, 0x26483f6c), STCP(0x7a05eead, 0x26a82186), STCP(0x79e76ca7, 0x2707ebc7), STCP(0x79c89f6e, 0x27679df4), STCP(0x79a98715, 0x27c737d3), STCP(0x798a23b1, 0x2826b928), STCP(0x796a7554, 0x288621b9), STCP(0x794a7c12, 0x28e5714b), STCP(0x792a37fe, 0x2944a7a2), STCP(0x7909a92d, 0x29a3c485), STCP(0x78e8cfb2, 0x2a02c7b8), STCP(0x78c7aba2, 0x2a61b101), STCP(0x78a63d11, 0x2ac08026), STCP(0x78848414, 0x2b1f34eb), STCP(0x786280bf, 0x2b7dcf17), STCP(0x78403329, 0x2bdc4e6f), STCP(0x781d9b65, 0x2c3ab2b9), STCP(0x77fab989, 0x2c98fbba), STCP(0x77d78daa, 0x2cf72939), STCP(0x77b417df, 0x2d553afc), STCP(0x7790583e, 0x2db330c7), STCP(0x776c4edb, 0x2e110a62), STCP(0x7747fbce, 0x2e6ec792), STCP(0x77235f2d, 0x2ecc681e), STCP(0x76fe790e, 0x2f29ebcc), STCP(0x76d94989, 0x2f875262), STCP(0x76b3d0b4, 0x2fe49ba7), STCP(0x768e0ea6, 0x3041c761), STCP(0x76680376, 0x309ed556), STCP(0x7641af3d, 0x30fbc54d), STCP(0x761b1211, 0x3158970e), STCP(0x75f42c0b, 0x31b54a5e), STCP(0x75ccfd42, 0x3211df04), STCP(0x75a585cf, 0x326e54c7), STCP(0x757dc5ca, 0x32caab6f), STCP(0x7555bd4c, 0x3326e2c3), STCP(0x752d6c6c, 0x3382fa88), STCP(0x7504d345, 0x33def287), STCP(0x74dbf1ef, 0x343aca87), STCP(0x74b2c884, 0x34968250), STCP(0x7489571c, 0x34f219a8), STCP(0x745f9dd1, 0x354d9057), STCP(0x74359cbd, 0x35a8e625), STCP(0x740b53fb, 0x36041ad9), STCP(0x73e0c3a3, 0x365f2e3b), STCP(0x73b5ebd1, 0x36ba2014), STCP(0x738acc9e, 0x3714f02a), STCP(0x735f6626, 0x376f9e46), STCP(0x7333b883, 0x37ca2a30), STCP(0x7307c3d0, 0x382493b0), STCP(0x72db8828, 0x387eda8e), STCP(0x72af05a7, 0x38d8fe93), STCP(0x72823c67, 0x3932ff87), STCP(0x72552c85, 0x398cdd32), STCP(0x7227d61c, 0x39e6975e), STCP(0x71fa3949, 0x3a402dd2), STCP(0x71cc5626, 0x3a99a057), STCP(0x719e2cd2, 0x3af2eeb7), STCP(0x716fbd68, 0x3b4c18ba), STCP(0x71410805, 0x3ba51e29), STCP(0x71120cc5, 0x3bfdfecd), STCP(0x70e2cbc6, 0x3c56ba70), STCP(0x70b34525, 0x3caf50da), STCP(0x708378ff, 0x3d07c1d6), STCP(0x70536771, 0x3d600d2c), STCP(0x7023109a, 0x3db832a6), STCP(0x6ff27497, 0x3e10320d), STCP(0x6fc19385, 0x3e680b2c), STCP(0x6f906d84, 0x3ebfbdcd), STCP(0x6f5f02b2, 0x3f1749b8), STCP(0x6f2d532c, 0x3f6eaeb8), STCP(0x6efb5f12, 0x3fc5ec98), STCP(0x6ec92683, 0x401d0321), STCP(0x6e96a99d, 0x4073f21d), STCP(0x6e63e87f, 0x40cab958), STCP(0x6e30e34a, 0x4121589b), STCP(0x6dfd9a1c, 0x4177cfb1), STCP(0x6dca0d14, 0x41ce1e65), STCP(0x6d963c54, 0x42244481), STCP(0x6d6227fa, 0x427a41d0), STCP(0x6d2dd027, 0x42d0161e), STCP(0x6cf934fc, 0x4325c135), STCP(0x6cc45698, 0x437b42e1), STCP(0x6c8f351c, 0x43d09aed), STCP(0x6c59d0a9, 0x4425c923), STCP(0x6c242960, 0x447acd50), STCP(0x6bee3f62, 0x44cfa740), STCP(0x6bb812d1, 0x452456bd), STCP(0x6b81a3cd, 0x4578db93), STCP(0x6b4af279, 0x45cd358f), STCP(0x6b13fef5, 0x4621647d), STCP(0x6adcc964, 0x46756828), STCP(0x6aa551e9, 0x46c9405c), STCP(0x6a6d98a4, 0x471cece7), STCP(0x6a359db9, 0x47706d93), STCP(0x69fd614a, 0x47c3c22f), STCP(0x69c4e37a, 0x4816ea86), STCP(0x698c246c, 0x4869e665), STCP(0x69532442, 0x48bcb599), STCP(0x6919e320, 0x490f57ee), STCP(0x68e06129, 0x4961cd33), STCP(0x68a69e81, 0x49b41533), STCP(0x686c9b4b, 0x4a062fbd), STCP(0x683257ab, 0x4a581c9e), STCP(0x67f7d3c5, 0x4aa9dba2), STCP(0x67bd0fbd, 0x4afb6c98), STCP(0x67820bb7, 0x4b4ccf4d), STCP(0x6746c7d8, 0x4b9e0390), STCP(0x670b4444, 0x4bef092d), STCP(0x66cf8120, 0x4c3fdff4), STCP(0x66937e91, 0x4c9087b1), STCP(0x66573cbb, 0x4ce10034), STCP(0x661abbc5, 0x4d31494b), STCP(0x65ddfbd3, 0x4d8162c4), STCP(0x65a0fd0b, 0x4dd14c6e), STCP(0x6563bf92, 0x4e210617), STCP(0x6526438f, 0x4e708f8f), STCP(0x64e88926, 0x4ebfe8a5), STCP(0x64aa907f, 0x4f0f1126), STCP(0x646c59bf, 0x4f5e08e3), STCP(0x642de50d, 0x4faccfab), STCP(0x63ef3290, 0x4ffb654d), STCP(0x63b0426d, 0x5049c999), STCP(0x637114cc, 0x5097fc5e), STCP(0x6331a9d4, 0x50e5fd6d), STCP(0x62f201ac, 0x5133cc94), STCP(0x62b21c7b, 0x518169a5), STCP(0x6271fa69, 0x51ced46e), STCP(0x62319b9d, 0x521c0cc2), STCP(0x61f1003f, 0x5269126e), STCP(0x61b02876, 0x52b5e546), STCP(0x616f146c, 0x53028518), STCP(0x612dc447, 0x534ef1b5), STCP(0x60ec3830, 0x539b2af0), STCP(0x60aa7050, 0x53e73097), STCP(0x60686ccf, 0x5433027d), STCP(0x60262dd6, 0x547ea073), STCP(0x5fe3b38d, 0x54ca0a4b), STCP(0x5fa0fe1f, 0x55153fd4), STCP(0x5f5e0db3, 0x556040e2), STCP(0x5f1ae274, 0x55ab0d46), STCP(0x5ed77c8a, 0x55f5a4d2), STCP(0x5e93dc1f, 0x56400758), STCP(0x5e50015d, 0x568a34a9), STCP(0x5e0bec6e, 0x56d42c99), STCP(0x5dc79d7c, 0x571deefa), STCP(0x5d8314b1, 0x57677b9d), STCP(0x5d3e5237, 0x57b0d256), STCP(0x5cf95638, 0x57f9f2f8), STCP(0x5cb420e0, 0x5842dd54), STCP(0x5c6eb258, 0x588b9140), STCP(0x5c290acc, 0x58d40e8c), STCP(0x5be32a67, 0x591c550e), STCP(0x5b9d1154, 0x59646498), STCP(0x5b56bfbd, 0x59ac3cfd), STCP(0x5b1035cf, 0x59f3de12), STCP(0x5ac973b5, 0x5a3b47ab), STCP(0x5a82799a, 0x5a82799a) }; /* generate_fft_tables.m 4 15 */ RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorReal60[] = { STC(0x7f4c7e54), STC(0x7d33f0ca), STC(0x79bc384d), STC(0x7d33f0ca), STC(0x74ef0ebc), STC(0x678dde6e), STC(0x79bc384d), STC(0x678dde6e), STC(0x4b3c8c12), STC(0x74ef0ebc), STC(0x55a6125c), STC(0x278dde6e), STC(0x6ed9eba1), STC(0x40000000), STC(0x00000000), STC(0x678dde6e), STC(0x278dde6e), STC(0xd8722191), STC(0x5f1f5ea1), STC(0x0d61304e), STC(0xb4c373ed), STC(0x55a6125c), STC(0xf29ecfb1), STC(0x98722191), STC(0x4b3c8c12), STC(0xd8722191), STC(0x8643c7b2), STC(0x40000000), STC(0xbfffffff), STC(0x80000000), STC(0x340ff242), STC(0xaa59eda3), STC(0x8643c7b2), STC(0x278dde6e), STC(0x98722191), STC(0x98722191), STC(0x1a9cd9ac), STC(0x8b10f143), STC(0xb4c373ed), STC(0x0d61304e), STC(0x82cc0f35), STC(0xd8722191), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorImag60[] = { STC(0x0d61304e), STC(0x1a9cd9ac), STC(0x278dde6e), STC(0x1a9cd9ac), STC(0x340ff242), STC(0x4b3c8c12), STC(0x278dde6e), STC(0x4b3c8c12), STC(0x678dde6e), STC(0x340ff242), STC(0x5f1f5ea1), STC(0x79bc384d), STC(0x40000000), STC(0x6ed9eba1), STC(0x7fffffff), STC(0x4b3c8c12), STC(0x79bc384d), STC(0x79bc384d), STC(0x55a6125c), STC(0x7f4c7e54), STC(0x678dde6e), STC(0x5f1f5ea1), STC(0x7f4c7e54), STC(0x4b3c8c12), STC(0x678dde6e), STC(0x79bc384d), STC(0x278dde6e), STC(0x6ed9eba1), STC(0x6ed9eba1), STC(0x00000000), STC(0x74ef0ebc), STC(0x5f1f5ea1), STC(0xd8722191), STC(0x79bc384d), STC(0x4b3c8c12), STC(0xb4c373ed), STC(0x7d33f0ca), STC(0x340ff242), STC(0x98722191), STC(0x7f4c7e54), STC(0x1a9cd9ac), STC(0x8643c7b2), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorReal240[] = { STC(0x7ff4c56f), STC(0x7fd317b4), STC(0x7f9afcb9), STC(0x7f4c7e54), STC(0x7ee7aa4c), STC(0x7e6c9251), STC(0x7ddb4bfc), STC(0x7d33f0ca), STC(0x7c769e18), STC(0x7ba3751d), STC(0x7aba9ae6), STC(0x79bc384d), STC(0x78a879f4), STC(0x777f903c), STC(0x7641af3d), STC(0x7fd317b4), STC(0x7f4c7e54), STC(0x7e6c9251), STC(0x7d33f0ca), STC(0x7ba3751d), STC(0x79bc384d), STC(0x777f903c), STC(0x74ef0ebc), STC(0x720c8075), STC(0x6ed9eba1), STC(0x6b598ea3), STC(0x678dde6e), STC(0x637984d4), STC(0x5f1f5ea1), STC(0x5a82799a), STC(0x7f9afcb9), STC(0x7e6c9251), STC(0x7c769e18), STC(0x79bc384d), STC(0x7641af3d), STC(0x720c8075), STC(0x6d23501b), STC(0x678dde6e), STC(0x6154fb91), STC(0x5a82799a), STC(0x53211d18), STC(0x4b3c8c12), STC(0x42e13ba4), STC(0x3a1c5c57), STC(0x30fbc54d), STC(0x7f4c7e54), STC(0x7d33f0ca), STC(0x79bc384d), STC(0x74ef0ebc), STC(0x6ed9eba1), STC(0x678dde6e), STC(0x5f1f5ea1), STC(0x55a6125c), STC(0x4b3c8c12), STC(0x40000000), STC(0x340ff242), STC(0x278dde6e), STC(0x1a9cd9ac), STC(0x0d61304e), STC(0x00000000), STC(0x7ee7aa4c), STC(0x7ba3751d), STC(0x7641af3d), STC(0x6ed9eba1), STC(0x658c9a2d), STC(0x5a82799a), STC(0x4debe4fe), STC(0x40000000), STC(0x30fbc54d), STC(0x2120fb83), STC(0x10b5150f), STC(0x00000000), STC(0xef4aeaf0), STC(0xdedf047c), STC(0xcf043ab2), STC(0x7e6c9251), STC(0x79bc384d), STC(0x720c8075), STC(0x678dde6e), STC(0x5a82799a), STC(0x4b3c8c12), STC(0x3a1c5c57), STC(0x278dde6e), STC(0x14060b68), STC(0x00000000), STC(0xebf9f497), STC(0xd8722191), STC(0xc5e3a3a8), STC(0xb4c373ed), STC(0xa57d8665), STC(0x7ddb4bfc), STC(0x777f903c), STC(0x6d23501b), STC(0x5f1f5ea1), STC(0x4debe4fe), STC(0x3a1c5c57), STC(0x245a9d65), STC(0x0d61304e), STC(0xf5f50d66), STC(0xdedf047c), STC(0xc8e5032a), STC(0xb4c373ed), STC(0xa326eebf), STC(0x94a6715c), STC(0x89be50c2), STC(0x7d33f0ca), STC(0x74ef0ebc), STC(0x678dde6e), STC(0x55a6125c), STC(0x40000000), STC(0x278dde6e), STC(0x0d61304e), STC(0xf29ecfb1), STC(0xd8722191), STC(0xbfffffff), STC(0xaa59eda3), STC(0x98722191), STC(0x8b10f143), STC(0x82cc0f35), STC(0x80000000), STC(0x7c769e18), STC(0x720c8075), STC(0x6154fb91), STC(0x4b3c8c12), STC(0x30fbc54d), STC(0x14060b68), STC(0xf5f50d66), STC(0xd8722191), STC(0xbd1ec45b), STC(0xa57d8665), STC(0x92dcafe4), STC(0x8643c7b2), STC(0x80650346), STC(0x81936dae), STC(0x89be50c2), STC(0x7ba3751d), STC(0x6ed9eba1), STC(0x5a82799a), STC(0x40000000), STC(0x2120fb83), STC(0x00000000), STC(0xdedf047c), STC(0xbfffffff), STC(0xa57d8665), STC(0x9126145e), STC(0x845c8ae2), STC(0x80000000), STC(0x845c8ae2), STC(0x9126145e), STC(0xa57d8665), STC(0x7aba9ae6), STC(0x6b598ea3), STC(0x53211d18), STC(0x340ff242), STC(0x10b5150f), STC(0xebf9f497), STC(0xc8e5032a), STC(0xaa59eda3), STC(0x92dcafe4), STC(0x845c8ae2), STC(0x800b3a90), STC(0x8643c7b2), STC(0x96830875), STC(0xaf726dee), STC(0xcf043ab2), STC(0x79bc384d), STC(0x678dde6e), STC(0x4b3c8c12), STC(0x278dde6e), STC(0x00000000), STC(0xd8722191), STC(0xb4c373ed), STC(0x98722191), STC(0x8643c7b2), STC(0x80000000), STC(0x8643c7b2), STC(0x98722191), STC(0xb4c373ed), STC(0xd8722191), STC(0xffffffff), STC(0x78a879f4), STC(0x637984d4), STC(0x42e13ba4), STC(0x1a9cd9ac), STC(0xef4aeaf0), STC(0xc5e3a3a8), STC(0xa326eebf), STC(0x8b10f143), STC(0x80650346), STC(0x845c8ae2), STC(0x96830875), STC(0xb4c373ed), STC(0xdba5629a), STC(0x06b2f1d2), STC(0x30fbc54d), STC(0x777f903c), STC(0x5f1f5ea1), STC(0x3a1c5c57), STC(0x0d61304e), STC(0xdedf047c), STC(0xb4c373ed), STC(0x94a6715c), STC(0x82cc0f35), STC(0x81936dae), STC(0x9126145e), STC(0xaf726dee), STC(0xd8722191), STC(0x06b2f1d2), STC(0x340ff242), STC(0x5a82799a), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorImag240[] = { STC(0x0359c428), STC(0x06b2f1d2), STC(0x0a0af299), STC(0x0d61304e), STC(0x10b5150f), STC(0x14060b68), STC(0x17537e63), STC(0x1a9cd9ac), STC(0x1de189a6), STC(0x2120fb83), STC(0x245a9d65), STC(0x278dde6e), STC(0x2aba2ee4), STC(0x2ddf0040), STC(0x30fbc54d), STC(0x06b2f1d2), STC(0x0d61304e), STC(0x14060b68), STC(0x1a9cd9ac), STC(0x2120fb83), STC(0x278dde6e), STC(0x2ddf0040), STC(0x340ff242), STC(0x3a1c5c57), STC(0x40000000), STC(0x45b6bb5e), STC(0x4b3c8c12), STC(0x508d9211), STC(0x55a6125c), STC(0x5a82799a), STC(0x0a0af299), STC(0x14060b68), STC(0x1de189a6), STC(0x278dde6e), STC(0x30fbc54d), STC(0x3a1c5c57), STC(0x42e13ba4), STC(0x4b3c8c12), STC(0x53211d18), STC(0x5a82799a), STC(0x6154fb91), STC(0x678dde6e), STC(0x6d23501b), STC(0x720c8075), STC(0x7641af3d), STC(0x0d61304e), STC(0x1a9cd9ac), STC(0x278dde6e), STC(0x340ff242), STC(0x40000000), STC(0x4b3c8c12), STC(0x55a6125c), STC(0x5f1f5ea1), STC(0x678dde6e), STC(0x6ed9eba1), STC(0x74ef0ebc), STC(0x79bc384d), STC(0x7d33f0ca), STC(0x7f4c7e54), STC(0x7fffffff), STC(0x10b5150f), STC(0x2120fb83), STC(0x30fbc54d), STC(0x40000000), STC(0x4debe4fe), STC(0x5a82799a), STC(0x658c9a2d), STC(0x6ed9eba1), STC(0x7641af3d), STC(0x7ba3751d), STC(0x7ee7aa4c), STC(0x7fffffff), STC(0x7ee7aa4c), STC(0x7ba3751d), STC(0x7641af3d), STC(0x14060b68), STC(0x278dde6e), STC(0x3a1c5c57), STC(0x4b3c8c12), STC(0x5a82799a), STC(0x678dde6e), STC(0x720c8075), STC(0x79bc384d), STC(0x7e6c9251), STC(0x7fffffff), STC(0x7e6c9251), STC(0x79bc384d), STC(0x720c8075), STC(0x678dde6e), STC(0x5a82799a), STC(0x17537e63), STC(0x2ddf0040), STC(0x42e13ba4), STC(0x55a6125c), STC(0x658c9a2d), STC(0x720c8075), STC(0x7aba9ae6), STC(0x7f4c7e54), STC(0x7f9afcb9), STC(0x7ba3751d), STC(0x7387ea23), STC(0x678dde6e), STC(0x581c00b3), STC(0x45b6bb5e), STC(0x30fbc54d), STC(0x1a9cd9ac), STC(0x340ff242), STC(0x4b3c8c12), STC(0x5f1f5ea1), STC(0x6ed9eba1), STC(0x79bc384d), STC(0x7f4c7e54), STC(0x7f4c7e54), STC(0x79bc384d), STC(0x6ed9eba1), STC(0x5f1f5ea1), STC(0x4b3c8c12), STC(0x340ff242), STC(0x1a9cd9ac), STC(0x00000000), STC(0x1de189a6), STC(0x3a1c5c57), STC(0x53211d18), STC(0x678dde6e), STC(0x7641af3d), STC(0x7e6c9251), STC(0x7f9afcb9), STC(0x79bc384d), STC(0x6d23501b), STC(0x5a82799a), STC(0x42e13ba4), STC(0x278dde6e), STC(0x0a0af299), STC(0xebf9f497), STC(0xcf043ab2), STC(0x2120fb83), STC(0x40000000), STC(0x5a82799a), STC(0x6ed9eba1), STC(0x7ba3751d), STC(0x7fffffff), STC(0x7ba3751d), STC(0x6ed9eba1), STC(0x5a82799a), STC(0x40000000), STC(0x2120fb83), STC(0x00000000), STC(0xdedf047c), STC(0xbfffffff), STC(0xa57d8665), STC(0x245a9d65), STC(0x45b6bb5e), STC(0x6154fb91), STC(0x74ef0ebc), STC(0x7ee7aa4c), STC(0x7e6c9251), STC(0x7387ea23), STC(0x5f1f5ea1), STC(0x42e13ba4), STC(0x2120fb83), STC(0xfca63bd7), STC(0xd8722191), STC(0xb780001b), STC(0x9c867b2b), STC(0x89be50c2), STC(0x278dde6e), STC(0x4b3c8c12), STC(0x678dde6e), STC(0x79bc384d), STC(0x7fffffff), STC(0x79bc384d), STC(0x678dde6e), STC(0x4b3c8c12), STC(0x278dde6e), STC(0x00000000), STC(0xd8722191), STC(0xb4c373ed), STC(0x98722191), STC(0x8643c7b2), STC(0x80000000), STC(0x2aba2ee4), STC(0x508d9211), STC(0x6d23501b), STC(0x7d33f0ca), STC(0x7ee7aa4c), STC(0x720c8075), STC(0x581c00b3), STC(0x340ff242), STC(0x0a0af299), STC(0xdedf047c), STC(0xb780001b), STC(0x98722191), STC(0x85456519), STC(0x802ce84b), STC(0x89be50c2), STC(0x2ddf0040), STC(0x55a6125c), STC(0x720c8075), STC(0x7f4c7e54), STC(0x7ba3751d), STC(0x678dde6e), STC(0x45b6bb5e), STC(0x1a9cd9ac), STC(0xebf9f497), STC(0xbfffffff), STC(0x9c867b2b), STC(0x8643c7b2), STC(0x802ce84b), STC(0x8b10f143), STC(0xa57d8665), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorReal480[] = { STC(0x7ffd3154), STC(0x7ff4c56f), STC(0x7fe6bcb0), STC(0x7fd317b4), STC(0x7fb9d759), STC(0x7f9afcb9), STC(0x7f76892f), STC(0x7f4c7e54), STC(0x7f1cde01), STC(0x7ee7aa4c), STC(0x7eace58a), STC(0x7e6c9251), STC(0x7e26b371), STC(0x7ddb4bfc), STC(0x7d8a5f40), STC(0x7d33f0ca), STC(0x7cd80464), STC(0x7c769e18), STC(0x7c0fc22a), STC(0x7ba3751d), STC(0x7b31bbb2), STC(0x7aba9ae6), STC(0x7a3e17f2), STC(0x79bc384d), STC(0x793501a9), STC(0x78a879f4), STC(0x7816a759), STC(0x777f903c), STC(0x76e33b3f), STC(0x7641af3d), STC(0x759af34c), STC(0x7ff4c56f), STC(0x7fd317b4), STC(0x7f9afcb9), STC(0x7f4c7e54), STC(0x7ee7aa4c), STC(0x7e6c9251), STC(0x7ddb4bfc), STC(0x7d33f0ca), STC(0x7c769e18), STC(0x7ba3751d), STC(0x7aba9ae6), STC(0x79bc384d), STC(0x78a879f4), STC(0x777f903c), STC(0x7641af3d), STC(0x74ef0ebc), STC(0x7387ea23), STC(0x720c8075), STC(0x707d1443), STC(0x6ed9eba1), STC(0x6d23501b), STC(0x6b598ea3), STC(0x697cf78a), STC(0x678dde6e), STC(0x658c9a2d), STC(0x637984d4), STC(0x6154fb91), STC(0x5f1f5ea1), STC(0x5cd91140), STC(0x5a82799a), STC(0x581c00b3), STC(0x7fe6bcb0), STC(0x7f9afcb9), STC(0x7f1cde01), STC(0x7e6c9251), STC(0x7d8a5f40), STC(0x7c769e18), STC(0x7b31bbb2), STC(0x79bc384d), STC(0x7816a759), STC(0x7641af3d), STC(0x743e0918), STC(0x720c8075), STC(0x6fadf2fc), STC(0x6d23501b), STC(0x6a6d98a4), STC(0x678dde6e), STC(0x648543e4), STC(0x6154fb91), STC(0x5dfe47ad), STC(0x5a82799a), STC(0x56e2f15d), STC(0x53211d18), STC(0x4f3e7875), STC(0x4b3c8c12), STC(0x471cece7), STC(0x42e13ba4), STC(0x3e8b240e), STC(0x3a1c5c57), STC(0x3596a46c), STC(0x30fbc54d), STC(0x2c4d9050), STC(0x7fd317b4), STC(0x7f4c7e54), STC(0x7e6c9251), STC(0x7d33f0ca), STC(0x7ba3751d), STC(0x79bc384d), STC(0x777f903c), STC(0x74ef0ebc), STC(0x720c8075), STC(0x6ed9eba1), STC(0x6b598ea3), STC(0x678dde6e), STC(0x637984d4), STC(0x5f1f5ea1), STC(0x5a82799a), STC(0x55a6125c), STC(0x508d9211), STC(0x4b3c8c12), STC(0x45b6bb5e), STC(0x40000000), STC(0x3a1c5c57), STC(0x340ff242), STC(0x2ddf0040), STC(0x278dde6e), STC(0x2120fb83), STC(0x1a9cd9ac), STC(0x14060b68), STC(0x0d61304e), STC(0x06b2f1d2), STC(0x00000000), STC(0xf94d0e2d), STC(0x7fb9d759), STC(0x7ee7aa4c), STC(0x7d8a5f40), STC(0x7ba3751d), STC(0x793501a9), STC(0x7641af3d), STC(0x72ccb9db), STC(0x6ed9eba1), STC(0x6a6d98a4), STC(0x658c9a2d), STC(0x603c496c), STC(0x5a82799a), STC(0x54657194), STC(0x4debe4fe), STC(0x471cece7), STC(0x40000000), STC(0x389cea72), STC(0x30fbc54d), STC(0x2924edac), STC(0x2120fb83), STC(0x18f8b83c), STC(0x10b5150f), STC(0x085f2137), STC(0x00000000), STC(0xf7a0dec8), STC(0xef4aeaf0), STC(0xe70747c3), STC(0xdedf047c), STC(0xd6db1253), STC(0xcf043ab2), STC(0xc763158d), STC(0x7f9afcb9), STC(0x7e6c9251), STC(0x7c769e18), STC(0x79bc384d), STC(0x7641af3d), STC(0x720c8075), STC(0x6d23501b), STC(0x678dde6e), STC(0x6154fb91), STC(0x5a82799a), STC(0x53211d18), STC(0x4b3c8c12), STC(0x42e13ba4), STC(0x3a1c5c57), STC(0x30fbc54d), STC(0x278dde6e), STC(0x1de189a6), STC(0x14060b68), STC(0x0a0af299), STC(0x00000000), STC(0xf5f50d66), STC(0xebf9f497), STC(0xe21e7659), STC(0xd8722191), STC(0xcf043ab2), STC(0xc5e3a3a8), STC(0xbd1ec45b), STC(0xb4c373ed), STC(0xacdee2e7), STC(0xa57d8665), STC(0x9eab046e), STC(0x7f76892f), STC(0x7ddb4bfc), STC(0x7b31bbb2), STC(0x777f903c), STC(0x72ccb9db), STC(0x6d23501b), STC(0x668f7c25), STC(0x5f1f5ea1), STC(0x56e2f15d), STC(0x4debe4fe), STC(0x444d7aff), STC(0x3a1c5c57), STC(0x2f6e6d16), STC(0x245a9d65), STC(0x18f8b83c), STC(0x0d61304e), STC(0x01aceb7c), STC(0xf5f50d66), STC(0xea52c165), STC(0xdedf047c), STC(0xd3b26faf), STC(0xc8e5032a), STC(0xbe8df2b9), STC(0xb4c373ed), STC(0xab9a8e6b), STC(0xa326eebf), STC(0x9b7abc1b), STC(0x94a6715c), STC(0x8eb8b99f), STC(0x89be50c2), STC(0x85c1e80d), STC(0x7f4c7e54), STC(0x7d33f0ca), STC(0x79bc384d), STC(0x74ef0ebc), STC(0x6ed9eba1), STC(0x678dde6e), STC(0x5f1f5ea1), STC(0x55a6125c), STC(0x4b3c8c12), STC(0x40000000), STC(0x340ff242), STC(0x278dde6e), STC(0x1a9cd9ac), STC(0x0d61304e), STC(0x00000000), STC(0xf29ecfb1), STC(0xe5632653), STC(0xd8722191), STC(0xcbf00dbd), STC(0xbfffffff), STC(0xb4c373ed), STC(0xaa59eda3), STC(0xa0e0a15e), STC(0x98722191), STC(0x9126145e), STC(0x8b10f143), STC(0x8643c7b2), STC(0x82cc0f35), STC(0x80b381ab), STC(0x80000000), STC(0x80b381ab), STC(0x7f1cde01), STC(0x7c769e18), STC(0x7816a759), STC(0x720c8075), STC(0x6a6d98a4), STC(0x6154fb91), STC(0x56e2f15d), STC(0x4b3c8c12), STC(0x3e8b240e), STC(0x30fbc54d), STC(0x22be8f87), STC(0x14060b68), STC(0x05067734), STC(0xf5f50d66), STC(0xe70747c3), STC(0xd8722191), STC(0xca695b93), STC(0xbd1ec45b), STC(0xb0c1878a), STC(0xa57d8665), STC(0x9b7abc1b), STC(0x92dcafe4), STC(0x8bc1f6e7), STC(0x8643c7b2), STC(0x8275a0bf), STC(0x80650346), STC(0x8019434f), STC(0x81936dae), STC(0x84ce444d), STC(0x89be50c2), STC(0x90520d03), STC(0x7ee7aa4c), STC(0x7ba3751d), STC(0x7641af3d), STC(0x6ed9eba1), STC(0x658c9a2d), STC(0x5a82799a), STC(0x4debe4fe), STC(0x40000000), STC(0x30fbc54d), STC(0x2120fb83), STC(0x10b5150f), STC(0x00000000), STC(0xef4aeaf0), STC(0xdedf047c), STC(0xcf043ab2), STC(0xbfffffff), STC(0xb2141b01), STC(0xa57d8665), STC(0x9a7365d2), STC(0x9126145e), STC(0x89be50c2), STC(0x845c8ae2), STC(0x811855b3), STC(0x80000000), STC(0x811855b3), STC(0x845c8ae2), STC(0x89be50c2), STC(0x9126145e), STC(0x9a7365d2), STC(0xa57d8665), STC(0xb2141b01), STC(0x7eace58a), STC(0x7aba9ae6), STC(0x743e0918), STC(0x6b598ea3), STC(0x603c496c), STC(0x53211d18), STC(0x444d7aff), STC(0x340ff242), STC(0x22be8f87), STC(0x10b5150f), STC(0xfe531483), STC(0xebf9f497), STC(0xda0aecf8), STC(0xc8e5032a), STC(0xb8e31318), STC(0xaa59eda3), STC(0x9d969741), STC(0x92dcafe4), STC(0x8a650cb3), STC(0x845c8ae2), STC(0x80e321fe), STC(0x800b3a90), STC(0x81d94c8e), STC(0x8643c7b2), STC(0x8d334624), STC(0x96830875), STC(0xa201b852), STC(0xaf726dee), STC(0xbe8df2b9), STC(0xcf043ab2), STC(0xe07e0c83), STC(0x7e6c9251), STC(0x79bc384d), STC(0x720c8075), STC(0x678dde6e), STC(0x5a82799a), STC(0x4b3c8c12), STC(0x3a1c5c57), STC(0x278dde6e), STC(0x14060b68), STC(0x00000000), STC(0xebf9f497), STC(0xd8722191), STC(0xc5e3a3a8), STC(0xb4c373ed), STC(0xa57d8665), STC(0x98722191), STC(0x8df37f8a), STC(0x8643c7b2), STC(0x81936dae), STC(0x80000000), STC(0x81936dae), STC(0x8643c7b2), STC(0x8df37f8a), STC(0x98722191), STC(0xa57d8665), STC(0xb4c373ed), STC(0xc5e3a3a8), STC(0xd8722191), STC(0xebf9f497), STC(0xffffffff), STC(0x14060b68), STC(0x7e26b371), STC(0x78a879f4), STC(0x6fadf2fc), STC(0x637984d4), STC(0x54657194), STC(0x42e13ba4), STC(0x2f6e6d16), STC(0x1a9cd9ac), STC(0x05067734), STC(0xef4aeaf0), STC(0xda0aecf8), STC(0xc5e3a3a8), STC(0xb36a1977), STC(0xa326eebf), STC(0x9592675b), STC(0x8b10f143), STC(0x83f03dd5), STC(0x80650346), STC(0x808976d0), STC(0x845c8ae2), STC(0x8bc1f6e7), STC(0x96830875), STC(0xa45037c8), STC(0xb4c373ed), STC(0xc763158d), STC(0xdba5629a), STC(0xf0f488d8), STC(0x06b2f1d2), STC(0x1c3fd045), STC(0x30fbc54d), STC(0x444d7aff), STC(0x7ddb4bfc), STC(0x777f903c), STC(0x6d23501b), STC(0x5f1f5ea1), STC(0x4debe4fe), STC(0x3a1c5c57), STC(0x245a9d65), STC(0x0d61304e), STC(0xf5f50d66), STC(0xdedf047c), STC(0xc8e5032a), STC(0xb4c373ed), STC(0xa326eebf), STC(0x94a6715c), STC(0x89be50c2), STC(0x82cc0f35), STC(0x800b3a90), STC(0x81936dae), STC(0x8757860b), STC(0x9126145e), STC(0x9eab046e), STC(0xaf726dee), STC(0xc2ec7634), STC(0xd8722191), STC(0xef4aeaf0), STC(0x06b2f1d2), STC(0x1de189a6), STC(0x340ff242), STC(0x487fffe4), STC(0x5a82799a), STC(0x697cf78a), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_STB RotVectorImag480[] = { STC(0x01aceb7c), STC(0x0359c428), STC(0x05067734), STC(0x06b2f1d2), STC(0x085f2137), STC(0x0a0af299), STC(0x0bb65336), STC(0x0d61304e), STC(0x0f0b7727), STC(0x10b5150f), STC(0x125df75b), STC(0x14060b68), STC(0x15ad3e9a), STC(0x17537e63), STC(0x18f8b83c), STC(0x1a9cd9ac), STC(0x1c3fd045), STC(0x1de189a6), STC(0x1f81f37c), STC(0x2120fb83), STC(0x22be8f87), STC(0x245a9d65), STC(0x25f51307), STC(0x278dde6e), STC(0x2924edac), STC(0x2aba2ee4), STC(0x2c4d9050), STC(0x2ddf0040), STC(0x2f6e6d16), STC(0x30fbc54d), STC(0x3286f779), STC(0x0359c428), STC(0x06b2f1d2), STC(0x0a0af299), STC(0x0d61304e), STC(0x10b5150f), STC(0x14060b68), STC(0x17537e63), STC(0x1a9cd9ac), STC(0x1de189a6), STC(0x2120fb83), STC(0x245a9d65), STC(0x278dde6e), STC(0x2aba2ee4), STC(0x2ddf0040), STC(0x30fbc54d), STC(0x340ff242), STC(0x371afcd5), STC(0x3a1c5c57), STC(0x3d1389cb), STC(0x40000000), STC(0x42e13ba4), STC(0x45b6bb5e), STC(0x487fffe4), STC(0x4b3c8c12), STC(0x4debe4fe), STC(0x508d9211), STC(0x53211d18), STC(0x55a6125c), STC(0x581c00b3), STC(0x5a82799a), STC(0x5cd91140), STC(0x05067734), STC(0x0a0af299), STC(0x0f0b7727), STC(0x14060b68), STC(0x18f8b83c), STC(0x1de189a6), STC(0x22be8f87), STC(0x278dde6e), STC(0x2c4d9050), STC(0x30fbc54d), STC(0x3596a46c), STC(0x3a1c5c57), STC(0x3e8b240e), STC(0x42e13ba4), STC(0x471cece7), STC(0x4b3c8c12), STC(0x4f3e7875), STC(0x53211d18), STC(0x56e2f15d), STC(0x5a82799a), STC(0x5dfe47ad), STC(0x6154fb91), STC(0x648543e4), STC(0x678dde6e), STC(0x6a6d98a4), STC(0x6d23501b), STC(0x6fadf2fc), STC(0x720c8075), STC(0x743e0918), STC(0x7641af3d), STC(0x7816a759), STC(0x06b2f1d2), STC(0x0d61304e), STC(0x14060b68), STC(0x1a9cd9ac), STC(0x2120fb83), STC(0x278dde6e), STC(0x2ddf0040), STC(0x340ff242), STC(0x3a1c5c57), STC(0x40000000), STC(0x45b6bb5e), STC(0x4b3c8c12), STC(0x508d9211), STC(0x55a6125c), STC(0x5a82799a), STC(0x5f1f5ea1), STC(0x637984d4), STC(0x678dde6e), STC(0x6b598ea3), STC(0x6ed9eba1), STC(0x720c8075), STC(0x74ef0ebc), STC(0x777f903c), STC(0x79bc384d), STC(0x7ba3751d), STC(0x7d33f0ca), STC(0x7e6c9251), STC(0x7f4c7e54), STC(0x7fd317b4), STC(0x7fffffff), STC(0x7fd317b4), STC(0x085f2137), STC(0x10b5150f), STC(0x18f8b83c), STC(0x2120fb83), STC(0x2924edac), STC(0x30fbc54d), STC(0x389cea72), STC(0x40000000), STC(0x471cece7), STC(0x4debe4fe), STC(0x54657194), STC(0x5a82799a), STC(0x603c496c), STC(0x658c9a2d), STC(0x6a6d98a4), STC(0x6ed9eba1), STC(0x72ccb9db), STC(0x7641af3d), STC(0x793501a9), STC(0x7ba3751d), STC(0x7d8a5f40), STC(0x7ee7aa4c), STC(0x7fb9d759), STC(0x7fffffff), STC(0x7fb9d759), STC(0x7ee7aa4c), STC(0x7d8a5f40), STC(0x7ba3751d), STC(0x793501a9), STC(0x7641af3d), STC(0x72ccb9db), STC(0x0a0af299), STC(0x14060b68), STC(0x1de189a6), STC(0x278dde6e), STC(0x30fbc54d), STC(0x3a1c5c57), STC(0x42e13ba4), STC(0x4b3c8c12), STC(0x53211d18), STC(0x5a82799a), STC(0x6154fb91), STC(0x678dde6e), STC(0x6d23501b), STC(0x720c8075), STC(0x7641af3d), STC(0x79bc384d), STC(0x7c769e18), STC(0x7e6c9251), STC(0x7f9afcb9), STC(0x7fffffff), STC(0x7f9afcb9), STC(0x7e6c9251), STC(0x7c769e18), STC(0x79bc384d), STC(0x7641af3d), STC(0x720c8075), STC(0x6d23501b), STC(0x678dde6e), STC(0x6154fb91), STC(0x5a82799a), STC(0x53211d18), STC(0x0bb65336), STC(0x17537e63), STC(0x22be8f87), STC(0x2ddf0040), STC(0x389cea72), STC(0x42e13ba4), STC(0x4c95e688), STC(0x55a6125c), STC(0x5dfe47ad), STC(0x658c9a2d), STC(0x6c40cf2c), STC(0x720c8075), STC(0x76e33b3f), STC(0x7aba9ae6), STC(0x7d8a5f40), STC(0x7f4c7e54), STC(0x7ffd3154), STC(0x7f9afcb9), STC(0x7e26b371), STC(0x7ba3751d), STC(0x7816a759), STC(0x7387ea23), STC(0x6e010780), STC(0x678dde6e), STC(0x603c496c), STC(0x581c00b3), STC(0x4f3e7875), STC(0x45b6bb5e), STC(0x3b9941b1), STC(0x30fbc54d), STC(0x25f51307), STC(0x0d61304e), STC(0x1a9cd9ac), STC(0x278dde6e), STC(0x340ff242), STC(0x40000000), STC(0x4b3c8c12), STC(0x55a6125c), STC(0x5f1f5ea1), STC(0x678dde6e), STC(0x6ed9eba1), STC(0x74ef0ebc), STC(0x79bc384d), STC(0x7d33f0ca), STC(0x7f4c7e54), STC(0x7fffffff), STC(0x7f4c7e54), STC(0x7d33f0ca), STC(0x79bc384d), STC(0x74ef0ebc), STC(0x6ed9eba1), STC(0x678dde6e), STC(0x5f1f5ea1), STC(0x55a6125c), STC(0x4b3c8c12), STC(0x40000000), STC(0x340ff242), STC(0x278dde6e), STC(0x1a9cd9ac), STC(0x0d61304e), STC(0x00000000), STC(0xf29ecfb1), STC(0x0f0b7727), STC(0x1de189a6), STC(0x2c4d9050), STC(0x3a1c5c57), STC(0x471cece7), STC(0x53211d18), STC(0x5dfe47ad), STC(0x678dde6e), STC(0x6fadf2fc), STC(0x7641af3d), STC(0x7b31bbb2), STC(0x7e6c9251), STC(0x7fe6bcb0), STC(0x7f9afcb9), STC(0x7d8a5f40), STC(0x79bc384d), STC(0x743e0918), STC(0x6d23501b), STC(0x648543e4), STC(0x5a82799a), STC(0x4f3e7875), STC(0x42e13ba4), STC(0x3596a46c), STC(0x278dde6e), STC(0x18f8b83c), STC(0x0a0af299), STC(0xfaf988cb), STC(0xebf9f497), STC(0xdd417078), STC(0xcf043ab2), STC(0xc174dbf1), STC(0x10b5150f), STC(0x2120fb83), STC(0x30fbc54d), STC(0x40000000), STC(0x4debe4fe), STC(0x5a82799a), STC(0x658c9a2d), STC(0x6ed9eba1), STC(0x7641af3d), STC(0x7ba3751d), STC(0x7ee7aa4c), STC(0x7fffffff), STC(0x7ee7aa4c), STC(0x7ba3751d), STC(0x7641af3d), STC(0x6ed9eba1), STC(0x658c9a2d), STC(0x5a82799a), STC(0x4debe4fe), STC(0x40000000), STC(0x30fbc54d), STC(0x2120fb83), STC(0x10b5150f), STC(0x00000000), STC(0xef4aeaf0), STC(0xdedf047c), STC(0xcf043ab2), STC(0xbfffffff), STC(0xb2141b01), STC(0xa57d8665), STC(0x9a7365d2), STC(0x125df75b), STC(0x245a9d65), STC(0x3596a46c), STC(0x45b6bb5e), STC(0x54657194), STC(0x6154fb91), STC(0x6c40cf2c), STC(0x74ef0ebc), STC(0x7b31bbb2), STC(0x7ee7aa4c), STC(0x7ffd3154), STC(0x7e6c9251), STC(0x7a3e17f2), STC(0x7387ea23), STC(0x6a6d98a4), STC(0x5f1f5ea1), STC(0x51d92321), STC(0x42e13ba4), STC(0x3286f779), STC(0x2120fb83), STC(0x0f0b7727), STC(0xfca63bd7), STC(0xea52c165), STC(0xd8722191), STC(0xc763158d), STC(0xb780001b), STC(0xa91d0ea2), STC(0x9c867b2b), STC(0x91fef87f), STC(0x89be50c2), STC(0x83f03dd5), STC(0x14060b68), STC(0x278dde6e), STC(0x3a1c5c57), STC(0x4b3c8c12), STC(0x5a82799a), STC(0x678dde6e), STC(0x720c8075), STC(0x79bc384d), STC(0x7e6c9251), STC(0x7fffffff), STC(0x7e6c9251), STC(0x79bc384d), STC(0x720c8075), STC(0x678dde6e), STC(0x5a82799a), STC(0x4b3c8c12), STC(0x3a1c5c57), STC(0x278dde6e), STC(0x14060b68), STC(0x00000000), STC(0xebf9f497), STC(0xd8722191), STC(0xc5e3a3a8), STC(0xb4c373ed), STC(0xa57d8665), STC(0x98722191), STC(0x8df37f8a), STC(0x8643c7b2), STC(0x81936dae), STC(0x80000000), STC(0x81936dae), STC(0x15ad3e9a), STC(0x2aba2ee4), STC(0x3e8b240e), STC(0x508d9211), STC(0x603c496c), STC(0x6d23501b), STC(0x76e33b3f), STC(0x7d33f0ca), STC(0x7fe6bcb0), STC(0x7ee7aa4c), STC(0x7a3e17f2), STC(0x720c8075), STC(0x668f7c25), STC(0x581c00b3), STC(0x471cece7), STC(0x340ff242), STC(0x1f81f37c), STC(0x0a0af299), STC(0xf449acc9), STC(0xdedf047c), STC(0xca695b93), STC(0xb780001b), STC(0xa6aecd5d), STC(0x98722191), STC(0x8d334624), STC(0x85456519), STC(0x80e321fe), STC(0x802ce84b), STC(0x8327fb9b), STC(0x89be50c2), STC(0x93bf30d3), STC(0x17537e63), STC(0x2ddf0040), STC(0x42e13ba4), STC(0x55a6125c), STC(0x658c9a2d), STC(0x720c8075), STC(0x7aba9ae6), STC(0x7f4c7e54), STC(0x7f9afcb9), STC(0x7ba3751d), STC(0x7387ea23), STC(0x678dde6e), STC(0x581c00b3), STC(0x45b6bb5e), STC(0x30fbc54d), STC(0x1a9cd9ac), STC(0x0359c428), STC(0xebf9f497), STC(0xd545d11b), STC(0xbfffffff), STC(0xacdee2e7), STC(0x9c867b2b), STC(0x8f82ebbc), STC(0x8643c7b2), STC(0x811855b3), STC(0x802ce84b), STC(0x838961e7), STC(0x8b10f143), STC(0x96830875), STC(0xa57d8665), STC(0xb780001b), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow1024[] = { WTCP(0x7ffffd88, 0x001921fb), WTCP(0x7fffe9cb, 0x004b65ee), WTCP(0x7fffc251, 0x007da9d4), WTCP(0x7fff8719, 0x00afeda8), WTCP(0x7fff3824, 0x00e23160), WTCP(0x7ffed572, 0x011474f6), WTCP(0x7ffe5f03, 0x0146b860), WTCP(0x7ffdd4d7, 0x0178fb99), WTCP(0x7ffd36ee, 0x01ab3e97), WTCP(0x7ffc8549, 0x01dd8154), WTCP(0x7ffbbfe6, 0x020fc3c6), WTCP(0x7ffae6c7, 0x024205e8), WTCP(0x7ff9f9ec, 0x027447b0), WTCP(0x7ff8f954, 0x02a68917), WTCP(0x7ff7e500, 0x02d8ca16), WTCP(0x7ff6bcf0, 0x030b0aa4), WTCP(0x7ff58125, 0x033d4abb), WTCP(0x7ff4319d, 0x036f8a51), WTCP(0x7ff2ce5b, 0x03a1c960), WTCP(0x7ff1575d, 0x03d407df), WTCP(0x7fefcca4, 0x040645c7), WTCP(0x7fee2e30, 0x04388310), WTCP(0x7fec7c02, 0x046abfb3), WTCP(0x7feab61a, 0x049cfba7), WTCP(0x7fe8dc78, 0x04cf36e5), WTCP(0x7fe6ef1c, 0x05017165), WTCP(0x7fe4ee06, 0x0533ab20), WTCP(0x7fe2d938, 0x0565e40d), WTCP(0x7fe0b0b1, 0x05981c26), WTCP(0x7fde7471, 0x05ca5361), WTCP(0x7fdc247a, 0x05fc89b8), WTCP(0x7fd9c0ca, 0x062ebf22), WTCP(0x7fd74964, 0x0660f398), WTCP(0x7fd4be46, 0x06932713), WTCP(0x7fd21f72, 0x06c5598a), WTCP(0x7fcf6ce8, 0x06f78af6), WTCP(0x7fcca6a7, 0x0729bb4e), WTCP(0x7fc9ccb2, 0x075bea8c), WTCP(0x7fc6df08, 0x078e18a7), WTCP(0x7fc3dda9, 0x07c04598), WTCP(0x7fc0c896, 0x07f27157), WTCP(0x7fbd9fd0, 0x08249bdd), WTCP(0x7fba6357, 0x0856c520), WTCP(0x7fb7132b, 0x0888ed1b), WTCP(0x7fb3af4e, 0x08bb13c5), WTCP(0x7fb037bf, 0x08ed3916), WTCP(0x7facac7f, 0x091f5d06), WTCP(0x7fa90d8e, 0x09517f8f), WTCP(0x7fa55aee, 0x0983a0a7), WTCP(0x7fa1949e, 0x09b5c048), WTCP(0x7f9dbaa0, 0x09e7de6a), WTCP(0x7f99ccf4, 0x0a19fb04), WTCP(0x7f95cb9a, 0x0a4c1610), WTCP(0x7f91b694, 0x0a7e2f85), WTCP(0x7f8d8de1, 0x0ab0475c), WTCP(0x7f895182, 0x0ae25d8d), WTCP(0x7f850179, 0x0b147211), WTCP(0x7f809dc5, 0x0b4684df), WTCP(0x7f7c2668, 0x0b7895f0), WTCP(0x7f779b62, 0x0baaa53b), WTCP(0x7f72fcb4, 0x0bdcb2bb), WTCP(0x7f6e4a5e, 0x0c0ebe66), WTCP(0x7f698461, 0x0c40c835), WTCP(0x7f64aabf, 0x0c72d020), WTCP(0x7f5fbd77, 0x0ca4d620), WTCP(0x7f5abc8a, 0x0cd6da2d), WTCP(0x7f55a7fa, 0x0d08dc3f), WTCP(0x7f507fc7, 0x0d3adc4e), WTCP(0x7f4b43f2, 0x0d6cda53), WTCP(0x7f45f47b, 0x0d9ed646), WTCP(0x7f409164, 0x0dd0d01f), WTCP(0x7f3b1aad, 0x0e02c7d7), WTCP(0x7f359057, 0x0e34bd66), WTCP(0x7f2ff263, 0x0e66b0c3), WTCP(0x7f2a40d2, 0x0e98a1e9), WTCP(0x7f247ba5, 0x0eca90ce), WTCP(0x7f1ea2dc, 0x0efc7d6b), WTCP(0x7f18b679, 0x0f2e67b8), WTCP(0x7f12b67c, 0x0f604faf), WTCP(0x7f0ca2e7, 0x0f923546), WTCP(0x7f067bba, 0x0fc41876), WTCP(0x7f0040f6, 0x0ff5f938), WTCP(0x7ef9f29d, 0x1027d784), WTCP(0x7ef390ae, 0x1059b352), WTCP(0x7eed1b2c, 0x108b8c9b), WTCP(0x7ee69217, 0x10bd6356), WTCP(0x7edff570, 0x10ef377d), WTCP(0x7ed94538, 0x11210907), WTCP(0x7ed28171, 0x1152d7ed), WTCP(0x7ecbaa1a, 0x1184a427), WTCP(0x7ec4bf36, 0x11b66dad), WTCP(0x7ebdc0c6, 0x11e83478), WTCP(0x7eb6aeca, 0x1219f880), WTCP(0x7eaf8943, 0x124bb9be), WTCP(0x7ea85033, 0x127d7829), WTCP(0x7ea1039b, 0x12af33ba), WTCP(0x7e99a37c, 0x12e0ec6a), WTCP(0x7e922fd6, 0x1312a230), WTCP(0x7e8aa8ac, 0x13445505), WTCP(0x7e830dff, 0x137604e2), WTCP(0x7e7b5fce, 0x13a7b1bf), WTCP(0x7e739e1d, 0x13d95b93), WTCP(0x7e6bc8eb, 0x140b0258), WTCP(0x7e63e03b, 0x143ca605), WTCP(0x7e5be40c, 0x146e4694), WTCP(0x7e53d462, 0x149fe3fc), WTCP(0x7e4bb13c, 0x14d17e36), WTCP(0x7e437a9c, 0x1503153a), WTCP(0x7e3b3083, 0x1534a901), WTCP(0x7e32d2f4, 0x15663982), WTCP(0x7e2a61ed, 0x1597c6b7), WTCP(0x7e21dd73, 0x15c95097), WTCP(0x7e194584, 0x15fad71b), WTCP(0x7e109a24, 0x162c5a3b), WTCP(0x7e07db52, 0x165dd9f0), WTCP(0x7dff0911, 0x168f5632), WTCP(0x7df62362, 0x16c0cef9), WTCP(0x7ded2a47, 0x16f2443e), WTCP(0x7de41dc0, 0x1723b5f9), WTCP(0x7ddafdce, 0x17552422), WTCP(0x7dd1ca75, 0x17868eb3), WTCP(0x7dc883b4, 0x17b7f5a3), WTCP(0x7dbf298d, 0x17e958ea), WTCP(0x7db5bc02, 0x181ab881), WTCP(0x7dac3b15, 0x184c1461), WTCP(0x7da2a6c6, 0x187d6c82), WTCP(0x7d98ff17, 0x18aec0db), WTCP(0x7d8f4409, 0x18e01167), WTCP(0x7d85759f, 0x19115e1c), WTCP(0x7d7b93da, 0x1942a6f3), WTCP(0x7d719eba, 0x1973ebe6), WTCP(0x7d679642, 0x19a52ceb), WTCP(0x7d5d7a74, 0x19d669fc), WTCP(0x7d534b50, 0x1a07a311), WTCP(0x7d4908d9, 0x1a38d823), WTCP(0x7d3eb30f, 0x1a6a0929), WTCP(0x7d3449f5, 0x1a9b361d), WTCP(0x7d29cd8c, 0x1acc5ef6), WTCP(0x7d1f3dd6, 0x1afd83ad), WTCP(0x7d149ad5, 0x1b2ea43a), WTCP(0x7d09e489, 0x1b5fc097), WTCP(0x7cff1af5, 0x1b90d8bb), WTCP(0x7cf43e1a, 0x1bc1ec9e), WTCP(0x7ce94dfb, 0x1bf2fc3a), WTCP(0x7cde4a98, 0x1c240786), WTCP(0x7cd333f3, 0x1c550e7c), WTCP(0x7cc80a0f, 0x1c861113), WTCP(0x7cbcccec, 0x1cb70f43), WTCP(0x7cb17c8d, 0x1ce80906), WTCP(0x7ca618f3, 0x1d18fe54), WTCP(0x7c9aa221, 0x1d49ef26), WTCP(0x7c8f1817, 0x1d7adb73), WTCP(0x7c837ad8, 0x1dabc334), WTCP(0x7c77ca65, 0x1ddca662), WTCP(0x7c6c06c0, 0x1e0d84f5), WTCP(0x7c602fec, 0x1e3e5ee5), WTCP(0x7c5445e9, 0x1e6f342c), WTCP(0x7c4848ba, 0x1ea004c1), WTCP(0x7c3c3860, 0x1ed0d09d), WTCP(0x7c3014de, 0x1f0197b8), WTCP(0x7c23de35, 0x1f325a0b), WTCP(0x7c179467, 0x1f63178f), WTCP(0x7c0b3777, 0x1f93d03c), WTCP(0x7bfec765, 0x1fc4840a), WTCP(0x7bf24434, 0x1ff532f2), WTCP(0x7be5ade6, 0x2025dcec), WTCP(0x7bd9047c, 0x205681f1), WTCP(0x7bcc47fa, 0x208721f9), WTCP(0x7bbf7860, 0x20b7bcfe), WTCP(0x7bb295b0, 0x20e852f6), WTCP(0x7ba59fee, 0x2118e3dc), WTCP(0x7b989719, 0x21496fa7), WTCP(0x7b8b7b36, 0x2179f64f), WTCP(0x7b7e4c45, 0x21aa77cf), WTCP(0x7b710a49, 0x21daf41d), WTCP(0x7b63b543, 0x220b6b32), WTCP(0x7b564d36, 0x223bdd08), WTCP(0x7b48d225, 0x226c4996), WTCP(0x7b3b4410, 0x229cb0d5), WTCP(0x7b2da2fa, 0x22cd12bd), WTCP(0x7b1feee5, 0x22fd6f48), WTCP(0x7b1227d3, 0x232dc66d), WTCP(0x7b044dc7, 0x235e1826), WTCP(0x7af660c2, 0x238e646a), WTCP(0x7ae860c7, 0x23beab33), WTCP(0x7ada4dd8, 0x23eeec78), WTCP(0x7acc27f7, 0x241f2833), WTCP(0x7abdef25, 0x244f5e5c), WTCP(0x7aafa367, 0x247f8eec), WTCP(0x7aa144bc, 0x24afb9da), WTCP(0x7a92d329, 0x24dfdf20), WTCP(0x7a844eae, 0x250ffeb7), WTCP(0x7a75b74f, 0x25401896), WTCP(0x7a670d0d, 0x25702cb7), WTCP(0x7a584feb, 0x25a03b11), WTCP(0x7a497feb, 0x25d0439f), WTCP(0x7a3a9d0f, 0x26004657), WTCP(0x7a2ba75a, 0x26304333), WTCP(0x7a1c9ece, 0x26603a2c), WTCP(0x7a0d836d, 0x26902b39), WTCP(0x79fe5539, 0x26c01655), WTCP(0x79ef1436, 0x26effb76), WTCP(0x79dfc064, 0x271fda96), WTCP(0x79d059c8, 0x274fb3ae), WTCP(0x79c0e062, 0x277f86b5), WTCP(0x79b15435, 0x27af53a6), WTCP(0x79a1b545, 0x27df1a77), WTCP(0x79920392, 0x280edb23), WTCP(0x79823f20, 0x283e95a1), WTCP(0x797267f2, 0x286e49ea), WTCP(0x79627e08, 0x289df7f8), WTCP(0x79528167, 0x28cd9fc1), WTCP(0x79427210, 0x28fd4140), WTCP(0x79325006, 0x292cdc6d), WTCP(0x79221b4b, 0x295c7140), WTCP(0x7911d3e2, 0x298bffb2), WTCP(0x790179cd, 0x29bb87bc), WTCP(0x78f10d0f, 0x29eb0957), WTCP(0x78e08dab, 0x2a1a847b), WTCP(0x78cffba3, 0x2a49f920), WTCP(0x78bf56f9, 0x2a796740), WTCP(0x78ae9fb0, 0x2aa8ced3), WTCP(0x789dd5cb, 0x2ad82fd2), WTCP(0x788cf94c, 0x2b078a36), WTCP(0x787c0a36, 0x2b36ddf7), WTCP(0x786b088c, 0x2b662b0e), WTCP(0x7859f44f, 0x2b957173), WTCP(0x7848cd83, 0x2bc4b120), WTCP(0x7837942b, 0x2bf3ea0d), WTCP(0x78264849, 0x2c231c33), WTCP(0x7814e9df, 0x2c52478a), WTCP(0x780378f1, 0x2c816c0c), WTCP(0x77f1f581, 0x2cb089b1), WTCP(0x77e05f91, 0x2cdfa071), WTCP(0x77ceb725, 0x2d0eb046), WTCP(0x77bcfc3f, 0x2d3db928), WTCP(0x77ab2ee2, 0x2d6cbb10), WTCP(0x77994f11, 0x2d9bb5f6), WTCP(0x77875cce, 0x2dcaa9d5), WTCP(0x7775581d, 0x2df996a3), WTCP(0x776340ff, 0x2e287c5a), WTCP(0x77511778, 0x2e575af3), WTCP(0x773edb8b, 0x2e863267), WTCP(0x772c8d3a, 0x2eb502ae), WTCP(0x771a2c88, 0x2ee3cbc1), WTCP(0x7707b979, 0x2f128d99), WTCP(0x76f5340e, 0x2f41482e), WTCP(0x76e29c4b, 0x2f6ffb7a), WTCP(0x76cff232, 0x2f9ea775), WTCP(0x76bd35c7, 0x2fcd4c19), WTCP(0x76aa670d, 0x2ffbe95d), WTCP(0x76978605, 0x302a7f3a), WTCP(0x768492b4, 0x30590dab), WTCP(0x76718d1c, 0x308794a6), WTCP(0x765e7540, 0x30b61426), WTCP(0x764b4b23, 0x30e48c22), WTCP(0x76380ec8, 0x3112fc95), WTCP(0x7624c031, 0x31416576), WTCP(0x76115f63, 0x316fc6be), WTCP(0x75fdec60, 0x319e2067), WTCP(0x75ea672a, 0x31cc7269), WTCP(0x75d6cfc5, 0x31fabcbd), WTCP(0x75c32634, 0x3228ff5c), WTCP(0x75af6a7b, 0x32573a3f), WTCP(0x759b9c9b, 0x32856d5e), WTCP(0x7587bc98, 0x32b398b3), WTCP(0x7573ca75, 0x32e1bc36), WTCP(0x755fc635, 0x330fd7e1), WTCP(0x754bafdc, 0x333debab), WTCP(0x7537876c, 0x336bf78f), WTCP(0x75234ce8, 0x3399fb85), WTCP(0x750f0054, 0x33c7f785), WTCP(0x74faa1b3, 0x33f5eb89), WTCP(0x74e63108, 0x3423d78a), WTCP(0x74d1ae55, 0x3451bb81), WTCP(0x74bd199f, 0x347f9766), WTCP(0x74a872e8, 0x34ad6b32), WTCP(0x7493ba34, 0x34db36df), WTCP(0x747eef85, 0x3508fa66), WTCP(0x746a12df, 0x3536b5be), WTCP(0x74552446, 0x356468e2), WTCP(0x744023bc, 0x359213c9), WTCP(0x742b1144, 0x35bfb66e), WTCP(0x7415ece2, 0x35ed50c9), WTCP(0x7400b69a, 0x361ae2d3), WTCP(0x73eb6e6e, 0x36486c86), WTCP(0x73d61461, 0x3675edd9), WTCP(0x73c0a878, 0x36a366c6), WTCP(0x73ab2ab4, 0x36d0d746), WTCP(0x73959b1b, 0x36fe3f52), WTCP(0x737ff9ae, 0x372b9ee3), WTCP(0x736a4671, 0x3758f5f2), WTCP(0x73548168, 0x37864477), WTCP(0x733eaa96, 0x37b38a6d), WTCP(0x7328c1ff, 0x37e0c7cc), WTCP(0x7312c7a5, 0x380dfc8d), WTCP(0x72fcbb8c, 0x383b28a9), WTCP(0x72e69db7, 0x38684c19), WTCP(0x72d06e2b, 0x389566d6), WTCP(0x72ba2cea, 0x38c278d9), WTCP(0x72a3d9f7, 0x38ef821c), WTCP(0x728d7557, 0x391c8297), WTCP(0x7276ff0d, 0x39497a43), WTCP(0x7260771b, 0x39766919), WTCP(0x7249dd86, 0x39a34f13), WTCP(0x72333251, 0x39d02c2a), WTCP(0x721c7580, 0x39fd0056), WTCP(0x7205a716, 0x3a29cb91), WTCP(0x71eec716, 0x3a568dd4), WTCP(0x71d7d585, 0x3a834717), WTCP(0x71c0d265, 0x3aaff755), WTCP(0x71a9bdba, 0x3adc9e86), WTCP(0x71929789, 0x3b093ca3), WTCP(0x717b5fd3, 0x3b35d1a5), WTCP(0x7164169d, 0x3b625d86), WTCP(0x714cbbeb, 0x3b8ee03e), WTCP(0x71354fc0, 0x3bbb59c7), WTCP(0x711dd220, 0x3be7ca1a), WTCP(0x7106430e, 0x3c143130), WTCP(0x70eea28e, 0x3c408f03), WTCP(0x70d6f0a4, 0x3c6ce38a), WTCP(0x70bf2d53, 0x3c992ec0), WTCP(0x70a7589f, 0x3cc5709e), WTCP(0x708f728b, 0x3cf1a91c), WTCP(0x70777b1c, 0x3d1dd835), WTCP(0x705f7255, 0x3d49fde1), WTCP(0x70475839, 0x3d761a19), WTCP(0x702f2ccd, 0x3da22cd7), WTCP(0x7016f014, 0x3dce3614), WTCP(0x6ffea212, 0x3dfa35c8), WTCP(0x6fe642ca, 0x3e262bee), WTCP(0x6fcdd241, 0x3e52187f), WTCP(0x6fb5507a, 0x3e7dfb73), WTCP(0x6f9cbd79, 0x3ea9d4c3), WTCP(0x6f841942, 0x3ed5a46b), WTCP(0x6f6b63d8, 0x3f016a61), WTCP(0x6f529d40, 0x3f2d26a0), WTCP(0x6f39c57d, 0x3f58d921), WTCP(0x6f20dc92, 0x3f8481dd), WTCP(0x6f07e285, 0x3fb020ce), WTCP(0x6eeed758, 0x3fdbb5ec), WTCP(0x6ed5bb10, 0x40074132), WTCP(0x6ebc8db0, 0x4032c297), WTCP(0x6ea34f3d, 0x405e3a16), WTCP(0x6e89ffb9, 0x4089a7a8), WTCP(0x6e709f2a, 0x40b50b46), WTCP(0x6e572d93, 0x40e064ea), WTCP(0x6e3daaf8, 0x410bb48c), WTCP(0x6e24175c, 0x4136fa27), WTCP(0x6e0a72c5, 0x416235b2), WTCP(0x6df0bd35, 0x418d6729), WTCP(0x6dd6f6b1, 0x41b88e84), WTCP(0x6dbd1f3c, 0x41e3abbc), WTCP(0x6da336dc, 0x420ebecb), WTCP(0x6d893d93, 0x4239c7aa), WTCP(0x6d6f3365, 0x4264c653), WTCP(0x6d551858, 0x428fbabe), WTCP(0x6d3aec6e, 0x42baa4e6), WTCP(0x6d20afac, 0x42e584c3), WTCP(0x6d066215, 0x43105a50), WTCP(0x6cec03af, 0x433b2585), WTCP(0x6cd1947c, 0x4365e65b), WTCP(0x6cb71482, 0x43909ccd), WTCP(0x6c9c83c3, 0x43bb48d4), WTCP(0x6c81e245, 0x43e5ea68), WTCP(0x6c67300b, 0x44108184), WTCP(0x6c4c6d1a, 0x443b0e21), WTCP(0x6c319975, 0x44659039), WTCP(0x6c16b521, 0x449007c4), WTCP(0x6bfbc021, 0x44ba74bd), WTCP(0x6be0ba7b, 0x44e4d71c), WTCP(0x6bc5a431, 0x450f2edb), WTCP(0x6baa7d49, 0x45397bf4), WTCP(0x6b8f45c7, 0x4563be60), WTCP(0x6b73fdae, 0x458df619), WTCP(0x6b58a503, 0x45b82318), WTCP(0x6b3d3bcb, 0x45e24556), WTCP(0x6b21c208, 0x460c5cce), WTCP(0x6b0637c1, 0x46366978), WTCP(0x6aea9cf8, 0x46606b4e), WTCP(0x6acef1b2, 0x468a624a), WTCP(0x6ab335f4, 0x46b44e65), WTCP(0x6a9769c1, 0x46de2f99), WTCP(0x6a7b8d1e, 0x470805df), WTCP(0x6a5fa010, 0x4731d131), WTCP(0x6a43a29a, 0x475b9188), WTCP(0x6a2794c1, 0x478546de), WTCP(0x6a0b7689, 0x47aef12c), WTCP(0x69ef47f6, 0x47d8906d), WTCP(0x69d3090e, 0x48022499), WTCP(0x69b6b9d3, 0x482badab), WTCP(0x699a5a4c, 0x48552b9b), WTCP(0x697dea7b, 0x487e9e64), WTCP(0x69616a65, 0x48a805ff), WTCP(0x6944da10, 0x48d16265), WTCP(0x6928397e, 0x48fab391), WTCP(0x690b88b5, 0x4923f97b), WTCP(0x68eec7b9, 0x494d341e), WTCP(0x68d1f68f, 0x49766373), WTCP(0x68b5153a, 0x499f8774), WTCP(0x689823bf, 0x49c8a01b), WTCP(0x687b2224, 0x49f1ad61), WTCP(0x685e106c, 0x4a1aaf3f), WTCP(0x6840ee9b, 0x4a43a5b0), WTCP(0x6823bcb7, 0x4a6c90ad), WTCP(0x68067ac3, 0x4a957030), WTCP(0x67e928c5, 0x4abe4433), WTCP(0x67cbc6c0, 0x4ae70caf), WTCP(0x67ae54ba, 0x4b0fc99d), WTCP(0x6790d2b6, 0x4b387af9), WTCP(0x677340ba, 0x4b6120bb), WTCP(0x67559eca, 0x4b89badd), WTCP(0x6737ecea, 0x4bb24958), WTCP(0x671a2b20, 0x4bdacc28), WTCP(0x66fc596f, 0x4c034345), WTCP(0x66de77dc, 0x4c2baea9), WTCP(0x66c0866d, 0x4c540e4e), WTCP(0x66a28524, 0x4c7c622d), WTCP(0x66847408, 0x4ca4aa41), WTCP(0x6666531d, 0x4ccce684), WTCP(0x66482267, 0x4cf516ee), WTCP(0x6629e1ec, 0x4d1d3b7a), WTCP(0x660b91af, 0x4d455422), WTCP(0x65ed31b5, 0x4d6d60df), WTCP(0x65cec204, 0x4d9561ac), WTCP(0x65b0429f, 0x4dbd5682), WTCP(0x6591b38c, 0x4de53f5a), WTCP(0x657314cf, 0x4e0d1c30), WTCP(0x6554666d, 0x4e34ecfc), WTCP(0x6535a86b, 0x4e5cb1b9), WTCP(0x6516dacd, 0x4e846a60), WTCP(0x64f7fd98, 0x4eac16eb), WTCP(0x64d910d1, 0x4ed3b755), WTCP(0x64ba147d, 0x4efb4b96), WTCP(0x649b08a0, 0x4f22d3aa), WTCP(0x647bed3f, 0x4f4a4f89), WTCP(0x645cc260, 0x4f71bf2e), WTCP(0x643d8806, 0x4f992293), WTCP(0x641e3e38, 0x4fc079b1), WTCP(0x63fee4f8, 0x4fe7c483), WTCP(0x63df7c4d, 0x500f0302), WTCP(0x63c0043b, 0x50363529), WTCP(0x63a07cc7, 0x505d5af1), WTCP(0x6380e5f6, 0x50847454), WTCP(0x63613fcd, 0x50ab814d), WTCP(0x63418a50, 0x50d281d5), WTCP(0x6321c585, 0x50f975e6), WTCP(0x6301f171, 0x51205d7b), WTCP(0x62e20e17, 0x5147388c), WTCP(0x62c21b7e, 0x516e0715), WTCP(0x62a219aa, 0x5194c910), WTCP(0x628208a1, 0x51bb7e75), WTCP(0x6261e866, 0x51e22740), WTCP(0x6241b8ff, 0x5208c36a), WTCP(0x62217a72, 0x522f52ee), WTCP(0x62012cc2, 0x5255d5c5), WTCP(0x61e0cff5, 0x527c4bea), WTCP(0x61c06410, 0x52a2b556), WTCP(0x619fe918, 0x52c91204), WTCP(0x617f5f12, 0x52ef61ee), WTCP(0x615ec603, 0x5315a50e), WTCP(0x613e1df0, 0x533bdb5d), WTCP(0x611d66de, 0x536204d7), WTCP(0x60fca0d2, 0x53882175), WTCP(0x60dbcbd1, 0x53ae3131), WTCP(0x60bae7e1, 0x53d43406), WTCP(0x6099f505, 0x53fa29ed), WTCP(0x6078f344, 0x542012e1), WTCP(0x6057e2a2, 0x5445eedb), WTCP(0x6036c325, 0x546bbdd7), WTCP(0x601594d1, 0x54917fce), WTCP(0x5ff457ad, 0x54b734ba), WTCP(0x5fd30bbc, 0x54dcdc96), WTCP(0x5fb1b104, 0x5502775c), WTCP(0x5f90478a, 0x55280505), WTCP(0x5f6ecf53, 0x554d858d), WTCP(0x5f4d4865, 0x5572f8ed), WTCP(0x5f2bb2c5, 0x55985f20), WTCP(0x5f0a0e77, 0x55bdb81f), WTCP(0x5ee85b82, 0x55e303e6), WTCP(0x5ec699e9, 0x5608426e), WTCP(0x5ea4c9b3, 0x562d73b2), WTCP(0x5e82eae5, 0x565297ab), WTCP(0x5e60fd84, 0x5677ae54), WTCP(0x5e3f0194, 0x569cb7a8), WTCP(0x5e1cf71c, 0x56c1b3a1), WTCP(0x5dfade20, 0x56e6a239), WTCP(0x5dd8b6a7, 0x570b8369), WTCP(0x5db680b4, 0x5730572e), WTCP(0x5d943c4e, 0x57551d80), WTCP(0x5d71e979, 0x5779d65b), WTCP(0x5d4f883b, 0x579e81b8), WTCP(0x5d2d189a, 0x57c31f92), WTCP(0x5d0a9a9a, 0x57e7afe4), WTCP(0x5ce80e41, 0x580c32a7), WTCP(0x5cc57394, 0x5830a7d6), WTCP(0x5ca2ca99, 0x58550f6c), WTCP(0x5c801354, 0x58796962), WTCP(0x5c5d4dcc, 0x589db5b3), WTCP(0x5c3a7a05, 0x58c1f45b), WTCP(0x5c179806, 0x58e62552), WTCP(0x5bf4a7d2, 0x590a4893), WTCP(0x5bd1a971, 0x592e5e19), WTCP(0x5bae9ce7, 0x595265df), WTCP(0x5b8b8239, 0x59765fde), WTCP(0x5b68596d, 0x599a4c12), WTCP(0x5b452288, 0x59be2a74), WTCP(0x5b21dd90, 0x59e1faff), WTCP(0x5afe8a8b, 0x5a05bdae), WTCP(0x5adb297d, 0x5a29727b), WTCP(0x5ab7ba6c, 0x5a4d1960), WTCP(0x5a943d5e, 0x5a70b258), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP KBDWindow1024[] = { WTCP(0x7fffffa4, 0x0009962f), WTCP(0x7fffff39, 0x000e16fb), WTCP(0x7ffffebf, 0x0011ea65), WTCP(0x7ffffe34, 0x0015750e), WTCP(0x7ffffd96, 0x0018dc74), WTCP(0x7ffffce5, 0x001c332e), WTCP(0x7ffffc1f, 0x001f83f5), WTCP(0x7ffffb43, 0x0022d59a), WTCP(0x7ffffa4f, 0x00262cc2), WTCP(0x7ffff942, 0x00298cc4), WTCP(0x7ffff81a, 0x002cf81f), WTCP(0x7ffff6d6, 0x003070c4), WTCP(0x7ffff573, 0x0033f840), WTCP(0x7ffff3f1, 0x00378fd9), WTCP(0x7ffff24d, 0x003b38a1), WTCP(0x7ffff085, 0x003ef381), WTCP(0x7fffee98, 0x0042c147), WTCP(0x7fffec83, 0x0046a2a8), WTCP(0x7fffea44, 0x004a9847), WTCP(0x7fffe7d8, 0x004ea2b7), WTCP(0x7fffe53f, 0x0052c283), WTCP(0x7fffe274, 0x0056f829), WTCP(0x7fffdf76, 0x005b4422), WTCP(0x7fffdc43, 0x005fa6dd), WTCP(0x7fffd8d6, 0x006420c8), WTCP(0x7fffd52f, 0x0068b249), WTCP(0x7fffd149, 0x006d5bc4), WTCP(0x7fffcd22, 0x00721d9a), WTCP(0x7fffc8b6, 0x0076f828), WTCP(0x7fffc404, 0x007bebca), WTCP(0x7fffbf06, 0x0080f8d9), WTCP(0x7fffb9bb, 0x00861fae), WTCP(0x7fffb41e, 0x008b609e), WTCP(0x7fffae2c, 0x0090bbff), WTCP(0x7fffa7e1, 0x00963224), WTCP(0x7fffa13a, 0x009bc362), WTCP(0x7fff9a32, 0x00a17009), WTCP(0x7fff92c5, 0x00a7386c), WTCP(0x7fff8af0, 0x00ad1cdc), WTCP(0x7fff82ad, 0x00b31da8), WTCP(0x7fff79f9, 0x00b93b21), WTCP(0x7fff70cf, 0x00bf7596), WTCP(0x7fff672a, 0x00c5cd57), WTCP(0x7fff5d05, 0x00cc42b1), WTCP(0x7fff525c, 0x00d2d5f3), WTCP(0x7fff4729, 0x00d9876c), WTCP(0x7fff3b66, 0x00e05769), WTCP(0x7fff2f10, 0x00e74638), WTCP(0x7fff221f, 0x00ee5426), WTCP(0x7fff148e, 0x00f58182), WTCP(0x7fff0658, 0x00fcce97), WTCP(0x7ffef776, 0x01043bb3), WTCP(0x7ffee7e2, 0x010bc923), WTCP(0x7ffed795, 0x01137733), WTCP(0x7ffec68a, 0x011b4631), WTCP(0x7ffeb4ba, 0x01233669), WTCP(0x7ffea21d, 0x012b4827), WTCP(0x7ffe8eac, 0x01337bb8), WTCP(0x7ffe7a61, 0x013bd167), WTCP(0x7ffe6533, 0x01444982), WTCP(0x7ffe4f1c, 0x014ce454), WTCP(0x7ffe3813, 0x0155a229), WTCP(0x7ffe2011, 0x015e834d), WTCP(0x7ffe070d, 0x0167880c), WTCP(0x7ffdecff, 0x0170b0b2), WTCP(0x7ffdd1df, 0x0179fd8b), WTCP(0x7ffdb5a2, 0x01836ee1), WTCP(0x7ffd9842, 0x018d0500), WTCP(0x7ffd79b3, 0x0196c035), WTCP(0x7ffd59ee, 0x01a0a0ca), WTCP(0x7ffd38e8, 0x01aaa70a), WTCP(0x7ffd1697, 0x01b4d341), WTCP(0x7ffcf2f2, 0x01bf25b9), WTCP(0x7ffccdee, 0x01c99ebd), WTCP(0x7ffca780, 0x01d43e99), WTCP(0x7ffc7f9e, 0x01df0597), WTCP(0x7ffc563d, 0x01e9f401), WTCP(0x7ffc2b51, 0x01f50a22), WTCP(0x7ffbfecf, 0x02004844), WTCP(0x7ffbd0ab, 0x020baeb1), WTCP(0x7ffba0da, 0x02173db4), WTCP(0x7ffb6f4f, 0x0222f596), WTCP(0x7ffb3bfd, 0x022ed6a1), WTCP(0x7ffb06d8, 0x023ae11f), WTCP(0x7ffacfd3, 0x02471558), WTCP(0x7ffa96e0, 0x02537397), WTCP(0x7ffa5bf2, 0x025ffc25), WTCP(0x7ffa1efc, 0x026caf4a), WTCP(0x7ff9dfee, 0x02798d4f), WTCP(0x7ff99ebb, 0x0286967c), WTCP(0x7ff95b55, 0x0293cb1b), WTCP(0x7ff915ab, 0x02a12b72), WTCP(0x7ff8cdaf, 0x02aeb7cb), WTCP(0x7ff88351, 0x02bc706d), WTCP(0x7ff83682, 0x02ca559f), WTCP(0x7ff7e731, 0x02d867a9), WTCP(0x7ff7954e, 0x02e6a6d2), WTCP(0x7ff740c8, 0x02f51361), WTCP(0x7ff6e98e, 0x0303ad9c), WTCP(0x7ff68f8f, 0x031275ca), WTCP(0x7ff632ba, 0x03216c30), WTCP(0x7ff5d2fb, 0x03309116), WTCP(0x7ff57042, 0x033fe4bf), WTCP(0x7ff50a7a, 0x034f6773), WTCP(0x7ff4a192, 0x035f1975), WTCP(0x7ff43576, 0x036efb0a), WTCP(0x7ff3c612, 0x037f0c78), WTCP(0x7ff35353, 0x038f4e02), WTCP(0x7ff2dd24, 0x039fbfeb), WTCP(0x7ff26370, 0x03b06279), WTCP(0x7ff1e623, 0x03c135ed), WTCP(0x7ff16527, 0x03d23a8b), WTCP(0x7ff0e067, 0x03e37095), WTCP(0x7ff057cc, 0x03f4d84e), WTCP(0x7fefcb40, 0x040671f7), WTCP(0x7fef3aad, 0x04183dd3), WTCP(0x7feea5fa, 0x042a3c22), WTCP(0x7fee0d11, 0x043c6d25), WTCP(0x7fed6fda, 0x044ed11d), WTCP(0x7fecce3d, 0x04616849), WTCP(0x7fec2821, 0x047432eb), WTCP(0x7feb7d6c, 0x04873140), WTCP(0x7feace07, 0x049a6388), WTCP(0x7fea19d6, 0x04adca01), WTCP(0x7fe960c0, 0x04c164ea), WTCP(0x7fe8a2aa, 0x04d53481), WTCP(0x7fe7df79, 0x04e93902), WTCP(0x7fe71712, 0x04fd72aa), WTCP(0x7fe6495a, 0x0511e1b6), WTCP(0x7fe57634, 0x05268663), WTCP(0x7fe49d83, 0x053b60eb), WTCP(0x7fe3bf2b, 0x05507189), WTCP(0x7fe2db0f, 0x0565b879), WTCP(0x7fe1f110, 0x057b35f4), WTCP(0x7fe10111, 0x0590ea35), WTCP(0x7fe00af3, 0x05a6d574), WTCP(0x7fdf0e97, 0x05bcf7ea), WTCP(0x7fde0bdd, 0x05d351cf), WTCP(0x7fdd02a6, 0x05e9e35c), WTCP(0x7fdbf2d2, 0x0600acc8), WTCP(0x7fdadc40, 0x0617ae48), WTCP(0x7fd9becf, 0x062ee814), WTCP(0x7fd89a5e, 0x06465a62), WTCP(0x7fd76eca, 0x065e0565), WTCP(0x7fd63bf1, 0x0675e954), WTCP(0x7fd501b0, 0x068e0662), WTCP(0x7fd3bfe4, 0x06a65cc3), WTCP(0x7fd2766a, 0x06beecaa), WTCP(0x7fd1251e, 0x06d7b648), WTCP(0x7fcfcbda, 0x06f0b9d1), WTCP(0x7fce6a7a, 0x0709f775), WTCP(0x7fcd00d8, 0x07236f65), WTCP(0x7fcb8ecf, 0x073d21d2), WTCP(0x7fca1439, 0x07570eea), WTCP(0x7fc890ed, 0x077136dd), WTCP(0x7fc704c7, 0x078b99da), WTCP(0x7fc56f9d, 0x07a6380d), WTCP(0x7fc3d147, 0x07c111a4), WTCP(0x7fc2299e, 0x07dc26cc), WTCP(0x7fc07878, 0x07f777b1), WTCP(0x7fbebdac, 0x0813047d), WTCP(0x7fbcf90f, 0x082ecd5b), WTCP(0x7fbb2a78, 0x084ad276), WTCP(0x7fb951bc, 0x086713f7), WTCP(0x7fb76eaf, 0x08839206), WTCP(0x7fb58126, 0x08a04ccb), WTCP(0x7fb388f4, 0x08bd446e), WTCP(0x7fb185ee, 0x08da7915), WTCP(0x7faf77e5, 0x08f7eae7), WTCP(0x7fad5ead, 0x09159a09), WTCP(0x7fab3a17, 0x0933869f), WTCP(0x7fa909f6, 0x0951b0cd), WTCP(0x7fa6ce1a, 0x097018b7), WTCP(0x7fa48653, 0x098ebe7f), WTCP(0x7fa23273, 0x09ada248), WTCP(0x7f9fd249, 0x09ccc431), WTCP(0x7f9d65a4, 0x09ec245b), WTCP(0x7f9aec53, 0x0a0bc2e7), WTCP(0x7f986625, 0x0a2b9ff3), WTCP(0x7f95d2e7, 0x0a4bbb9e), WTCP(0x7f933267, 0x0a6c1604), WTCP(0x7f908472, 0x0a8caf43), WTCP(0x7f8dc8d5, 0x0aad8776), WTCP(0x7f8aff5c, 0x0ace9eb9), WTCP(0x7f8827d3, 0x0aeff526), WTCP(0x7f854204, 0x0b118ad8), WTCP(0x7f824dbb, 0x0b335fe6), WTCP(0x7f7f4ac3, 0x0b557469), WTCP(0x7f7c38e4, 0x0b77c879), WTCP(0x7f7917e9, 0x0b9a5c2b), WTCP(0x7f75e79b, 0x0bbd2f97), WTCP(0x7f72a7c3, 0x0be042d0), WTCP(0x7f6f5828, 0x0c0395ec), WTCP(0x7f6bf892, 0x0c2728fd), WTCP(0x7f6888c9, 0x0c4afc16), WTCP(0x7f650894, 0x0c6f0f4a), WTCP(0x7f6177b9, 0x0c9362a8), WTCP(0x7f5dd5ff, 0x0cb7f642), WTCP(0x7f5a232a, 0x0cdcca26), WTCP(0x7f565f00, 0x0d01de63), WTCP(0x7f528947, 0x0d273307), WTCP(0x7f4ea1c2, 0x0d4cc81f), WTCP(0x7f4aa835, 0x0d729db7), WTCP(0x7f469c65, 0x0d98b3da), WTCP(0x7f427e13, 0x0dbf0a92), WTCP(0x7f3e4d04, 0x0de5a1e9), WTCP(0x7f3a08f9, 0x0e0c79e7), WTCP(0x7f35b1b4, 0x0e339295), WTCP(0x7f3146f8, 0x0e5aebfa), WTCP(0x7f2cc884, 0x0e82861a), WTCP(0x7f28361b, 0x0eaa60fd), WTCP(0x7f238f7c, 0x0ed27ca5), WTCP(0x7f1ed467, 0x0efad917), WTCP(0x7f1a049d, 0x0f237656), WTCP(0x7f151fdc, 0x0f4c5462), WTCP(0x7f1025e3, 0x0f75733d), WTCP(0x7f0b1672, 0x0f9ed2e6), WTCP(0x7f05f146, 0x0fc8735e), WTCP(0x7f00b61d, 0x0ff254a1), WTCP(0x7efb64b4, 0x101c76ae), WTCP(0x7ef5fcca, 0x1046d981), WTCP(0x7ef07e19, 0x10717d15), WTCP(0x7eeae860, 0x109c6165), WTCP(0x7ee53b5b, 0x10c7866a), WTCP(0x7edf76c4, 0x10f2ec1e), WTCP(0x7ed99a58, 0x111e9279), WTCP(0x7ed3a5d1, 0x114a7971), WTCP(0x7ecd98eb, 0x1176a0fc), WTCP(0x7ec77360, 0x11a30910), WTCP(0x7ec134eb, 0x11cfb1a1), WTCP(0x7ebadd44, 0x11fc9aa2), WTCP(0x7eb46c27, 0x1229c406), WTCP(0x7eade14c, 0x12572dbf), WTCP(0x7ea73c6c, 0x1284d7bc), WTCP(0x7ea07d41, 0x12b2c1ed), WTCP(0x7e99a382, 0x12e0ec42), WTCP(0x7e92aee7, 0x130f56a8), WTCP(0x7e8b9f2a, 0x133e010b), WTCP(0x7e847402, 0x136ceb59), WTCP(0x7e7d2d25, 0x139c157b), WTCP(0x7e75ca4c, 0x13cb7f5d), WTCP(0x7e6e4b2d, 0x13fb28e6), WTCP(0x7e66af7f, 0x142b1200), WTCP(0x7e5ef6f8, 0x145b3a92), WTCP(0x7e572150, 0x148ba281), WTCP(0x7e4f2e3b, 0x14bc49b4), WTCP(0x7e471d70, 0x14ed300f), WTCP(0x7e3eeea5, 0x151e5575), WTCP(0x7e36a18e, 0x154fb9c9), WTCP(0x7e2e35e2, 0x15815ced), WTCP(0x7e25ab56, 0x15b33ec1), WTCP(0x7e1d019e, 0x15e55f25), WTCP(0x7e14386e, 0x1617bdf9), WTCP(0x7e0b4f7d, 0x164a5b19), WTCP(0x7e02467e, 0x167d3662), WTCP(0x7df91d25, 0x16b04fb2), WTCP(0x7defd327, 0x16e3a6e2), WTCP(0x7de66837, 0x17173bce), WTCP(0x7ddcdc0a, 0x174b0e4d), WTCP(0x7dd32e53, 0x177f1e39), WTCP(0x7dc95ec6, 0x17b36b69), WTCP(0x7dbf6d17, 0x17e7f5b3), WTCP(0x7db558f9, 0x181cbcec), WTCP(0x7dab221f, 0x1851c0e9), WTCP(0x7da0c83c, 0x1887017d), WTCP(0x7d964b05, 0x18bc7e7c), WTCP(0x7d8baa2b, 0x18f237b6), WTCP(0x7d80e563, 0x19282cfd), WTCP(0x7d75fc5e, 0x195e5e20), WTCP(0x7d6aeed0, 0x1994caee), WTCP(0x7d5fbc6d, 0x19cb7335), WTCP(0x7d5464e6, 0x1a0256c2), WTCP(0x7d48e7ef, 0x1a397561), WTCP(0x7d3d453b, 0x1a70cede), WTCP(0x7d317c7c, 0x1aa86301), WTCP(0x7d258d65, 0x1ae03195), WTCP(0x7d1977aa, 0x1b183a63), WTCP(0x7d0d3afc, 0x1b507d30), WTCP(0x7d00d710, 0x1b88f9c5), WTCP(0x7cf44b97, 0x1bc1afe6), WTCP(0x7ce79846, 0x1bfa9f58), WTCP(0x7cdabcce, 0x1c33c7e0), WTCP(0x7ccdb8e4, 0x1c6d293f), WTCP(0x7cc08c39, 0x1ca6c337), WTCP(0x7cb33682, 0x1ce0958a), WTCP(0x7ca5b772, 0x1d1a9ff8), WTCP(0x7c980ebd, 0x1d54e240), WTCP(0x7c8a3c14, 0x1d8f5c21), WTCP(0x7c7c3f2e, 0x1dca0d56), WTCP(0x7c6e17bc, 0x1e04f59f), WTCP(0x7c5fc573, 0x1e4014b4), WTCP(0x7c514807, 0x1e7b6a53), WTCP(0x7c429f2c, 0x1eb6f633), WTCP(0x7c33ca96, 0x1ef2b80f), WTCP(0x7c24c9fa, 0x1f2eaf9e), WTCP(0x7c159d0d, 0x1f6adc98), WTCP(0x7c064383, 0x1fa73eb2), WTCP(0x7bf6bd11, 0x1fe3d5a3), WTCP(0x7be7096c, 0x2020a11e), WTCP(0x7bd7284a, 0x205da0d8), WTCP(0x7bc71960, 0x209ad483), WTCP(0x7bb6dc65, 0x20d83bd1), WTCP(0x7ba6710d, 0x2115d674), WTCP(0x7b95d710, 0x2153a41b), WTCP(0x7b850e24, 0x2191a476), WTCP(0x7b7415ff, 0x21cfd734), WTCP(0x7b62ee59, 0x220e3c02), WTCP(0x7b5196e9, 0x224cd28d), WTCP(0x7b400f67, 0x228b9a82), WTCP(0x7b2e578a, 0x22ca938a), WTCP(0x7b1c6f0b, 0x2309bd52), WTCP(0x7b0a55a1, 0x23491783), WTCP(0x7af80b07, 0x2388a1c4), WTCP(0x7ae58ef5, 0x23c85bbf), WTCP(0x7ad2e124, 0x2408451a), WTCP(0x7ac0014e, 0x24485d7c), WTCP(0x7aacef2e, 0x2488a48a), WTCP(0x7a99aa7e, 0x24c919e9), WTCP(0x7a8632f8, 0x2509bd3d), WTCP(0x7a728858, 0x254a8e29), WTCP(0x7a5eaa5a, 0x258b8c50), WTCP(0x7a4a98b9, 0x25ccb753), WTCP(0x7a365333, 0x260e0ed3), WTCP(0x7a21d983, 0x264f9271), WTCP(0x7a0d2b68, 0x269141cb), WTCP(0x79f8489e, 0x26d31c80), WTCP(0x79e330e4, 0x2715222f), WTCP(0x79cde3f8, 0x27575273), WTCP(0x79b8619a, 0x2799acea), WTCP(0x79a2a989, 0x27dc3130), WTCP(0x798cbb85, 0x281ededf), WTCP(0x7976974e, 0x2861b591), WTCP(0x79603ca5, 0x28a4b4e0), WTCP(0x7949ab4c, 0x28e7dc65), WTCP(0x7932e304, 0x292b2bb8), WTCP(0x791be390, 0x296ea270), WTCP(0x7904acb3, 0x29b24024), WTCP(0x78ed3e30, 0x29f6046b), WTCP(0x78d597cc, 0x2a39eed8), WTCP(0x78bdb94a, 0x2a7dff02), WTCP(0x78a5a270, 0x2ac2347c), WTCP(0x788d5304, 0x2b068eda), WTCP(0x7874cacb, 0x2b4b0dae), WTCP(0x785c098d, 0x2b8fb08a), WTCP(0x78430f11, 0x2bd47700), WTCP(0x7829db1f, 0x2c1960a1), WTCP(0x78106d7f, 0x2c5e6cfd), WTCP(0x77f6c5fb, 0x2ca39ba3), WTCP(0x77dce45c, 0x2ce8ec23), WTCP(0x77c2c86e, 0x2d2e5e0b), WTCP(0x77a871fa, 0x2d73f0e8), WTCP(0x778de0cd, 0x2db9a449), WTCP(0x777314b2, 0x2dff77b8), WTCP(0x77580d78, 0x2e456ac4), WTCP(0x773ccaeb, 0x2e8b7cf6), WTCP(0x77214cdb, 0x2ed1addb), WTCP(0x77059315, 0x2f17fcfb), WTCP(0x76e99d69, 0x2f5e69e2), WTCP(0x76cd6ba9, 0x2fa4f419), WTCP(0x76b0fda4, 0x2feb9b27), WTCP(0x7694532e, 0x30325e96), WTCP(0x76776c17, 0x30793dee), WTCP(0x765a4834, 0x30c038b5), WTCP(0x763ce759, 0x31074e72), WTCP(0x761f4959, 0x314e7eab), WTCP(0x76016e0b, 0x3195c8e6), WTCP(0x75e35545, 0x31dd2ca9), WTCP(0x75c4fedc, 0x3224a979), WTCP(0x75a66aab, 0x326c3ed8), WTCP(0x75879887, 0x32b3ec4d), WTCP(0x7568884b, 0x32fbb159), WTCP(0x754939d1, 0x33438d81), WTCP(0x7529acf4, 0x338b8045), WTCP(0x7509e18e, 0x33d3892a), WTCP(0x74e9d77d, 0x341ba7b1), WTCP(0x74c98e9e, 0x3463db5a), WTCP(0x74a906cd, 0x34ac23a7), WTCP(0x74883fec, 0x34f48019), WTCP(0x746739d8, 0x353cf02f), WTCP(0x7445f472, 0x3585736a), WTCP(0x74246f9c, 0x35ce0949), WTCP(0x7402ab37, 0x3616b14c), WTCP(0x73e0a727, 0x365f6af0), WTCP(0x73be6350, 0x36a835b5), WTCP(0x739bdf95, 0x36f11118), WTCP(0x73791bdd, 0x3739fc98), WTCP(0x7356180e, 0x3782f7b2), WTCP(0x7332d410, 0x37cc01e3), WTCP(0x730f4fc9, 0x38151aa8), WTCP(0x72eb8b24, 0x385e417e), WTCP(0x72c7860a, 0x38a775e1), WTCP(0x72a34066, 0x38f0b74d), WTCP(0x727eba24, 0x393a053e), WTCP(0x7259f331, 0x39835f30), WTCP(0x7234eb79, 0x39ccc49e), WTCP(0x720fa2eb, 0x3a163503), WTCP(0x71ea1977, 0x3a5fafda), WTCP(0x71c44f0c, 0x3aa9349e), WTCP(0x719e439d, 0x3af2c2ca), WTCP(0x7177f71a, 0x3b3c59d7), WTCP(0x71516978, 0x3b85f940), WTCP(0x712a9aaa, 0x3bcfa07e), WTCP(0x71038aa4, 0x3c194f0d), WTCP(0x70dc395e, 0x3c630464), WTCP(0x70b4a6cd, 0x3cacbfff), WTCP(0x708cd2e9, 0x3cf68155), WTCP(0x7064bdab, 0x3d4047e1), WTCP(0x703c670d, 0x3d8a131c), WTCP(0x7013cf0a, 0x3dd3e27e), WTCP(0x6feaf59c, 0x3e1db580), WTCP(0x6fc1dac1, 0x3e678b9b), WTCP(0x6f987e76, 0x3eb16449), WTCP(0x6f6ee0b9, 0x3efb3f01), WTCP(0x6f45018b, 0x3f451b3d), WTCP(0x6f1ae0eb, 0x3f8ef874), WTCP(0x6ef07edb, 0x3fd8d620), WTCP(0x6ec5db5d, 0x4022b3b9), WTCP(0x6e9af675, 0x406c90b7), WTCP(0x6e6fd027, 0x40b66c93), WTCP(0x6e446879, 0x410046c5), WTCP(0x6e18bf71, 0x414a1ec6), WTCP(0x6decd517, 0x4193f40d), WTCP(0x6dc0a972, 0x41ddc615), WTCP(0x6d943c8d, 0x42279455), WTCP(0x6d678e71, 0x42715e45), WTCP(0x6d3a9f2a, 0x42bb235f), WTCP(0x6d0d6ec5, 0x4304e31a), WTCP(0x6cdffd4f, 0x434e9cf1), WTCP(0x6cb24ad6, 0x4398505b), WTCP(0x6c84576b, 0x43e1fcd1), WTCP(0x6c56231c, 0x442ba1cd), WTCP(0x6c27adfd, 0x44753ec7), WTCP(0x6bf8f81e, 0x44bed33a), WTCP(0x6bca0195, 0x45085e9d), WTCP(0x6b9aca75, 0x4551e06b), WTCP(0x6b6b52d5, 0x459b581e), WTCP(0x6b3b9ac9, 0x45e4c52f), WTCP(0x6b0ba26b, 0x462e2717), WTCP(0x6adb69d3, 0x46777d52), WTCP(0x6aaaf11b, 0x46c0c75a), WTCP(0x6a7a385c, 0x470a04a9), WTCP(0x6a493fb3, 0x475334b9), WTCP(0x6a18073d, 0x479c5707), WTCP(0x69e68f17, 0x47e56b0c), WTCP(0x69b4d761, 0x482e7045), WTCP(0x6982e039, 0x4877662c), WTCP(0x6950a9c0, 0x48c04c3f), WTCP(0x691e341a, 0x490921f8), WTCP(0x68eb7f67, 0x4951e6d5), WTCP(0x68b88bcd, 0x499a9a51), WTCP(0x68855970, 0x49e33beb), WTCP(0x6851e875, 0x4a2bcb1f), WTCP(0x681e3905, 0x4a74476b), WTCP(0x67ea4b47, 0x4abcb04c), WTCP(0x67b61f63, 0x4b050541), WTCP(0x6781b585, 0x4b4d45c9), WTCP(0x674d0dd6, 0x4b957162), WTCP(0x67182883, 0x4bdd878c), WTCP(0x66e305b8, 0x4c2587c6), WTCP(0x66ada5a5, 0x4c6d7190), WTCP(0x66780878, 0x4cb5446a), WTCP(0x66422e60, 0x4cfcffd5), WTCP(0x660c1790, 0x4d44a353), WTCP(0x65d5c439, 0x4d8c2e64), WTCP(0x659f348e, 0x4dd3a08c), WTCP(0x656868c3, 0x4e1af94b), WTCP(0x6531610d, 0x4e623825), WTCP(0x64fa1da3, 0x4ea95c9d), WTCP(0x64c29ebb, 0x4ef06637), WTCP(0x648ae48d, 0x4f375477), WTCP(0x6452ef53, 0x4f7e26e1), WTCP(0x641abf46, 0x4fc4dcfb), WTCP(0x63e254a2, 0x500b7649), WTCP(0x63a9afa2, 0x5051f253), WTCP(0x6370d083, 0x5098509f), WTCP(0x6337b784, 0x50de90b3), WTCP(0x62fe64e3, 0x5124b218), WTCP(0x62c4d8e0, 0x516ab455), WTCP(0x628b13bc, 0x51b096f3), WTCP(0x625115b8, 0x51f6597b), WTCP(0x6216df18, 0x523bfb78), WTCP(0x61dc701f, 0x52817c72), WTCP(0x61a1c912, 0x52c6dbf5), WTCP(0x6166ea36, 0x530c198d), WTCP(0x612bd3d2, 0x535134c5), WTCP(0x60f0862d, 0x53962d2a), WTCP(0x60b50190, 0x53db024a), WTCP(0x60794644, 0x541fb3b1), WTCP(0x603d5494, 0x546440ef), WTCP(0x60012cca, 0x54a8a992), WTCP(0x5fc4cf33, 0x54eced2b), WTCP(0x5f883c1c, 0x55310b48), WTCP(0x5f4b73d2, 0x5575037c), WTCP(0x5f0e76a5, 0x55b8d558), WTCP(0x5ed144e5, 0x55fc806f), WTCP(0x5e93dee1, 0x56400452), WTCP(0x5e5644ec, 0x56836096), WTCP(0x5e187757, 0x56c694cf), WTCP(0x5dda7677, 0x5709a092), WTCP(0x5d9c429f, 0x574c8374), WTCP(0x5d5ddc24, 0x578f3d0d), WTCP(0x5d1f435d, 0x57d1ccf2), WTCP(0x5ce078a0, 0x581432bd), WTCP(0x5ca17c45, 0x58566e04), WTCP(0x5c624ea4, 0x58987e63), WTCP(0x5c22f016, 0x58da6372), WTCP(0x5be360f6, 0x591c1ccc), WTCP(0x5ba3a19f, 0x595daa0d), WTCP(0x5b63b26c, 0x599f0ad1), WTCP(0x5b2393ba, 0x59e03eb6), WTCP(0x5ae345e7, 0x5a214558), WTCP(0x5aa2c951, 0x5a621e56), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow128[] = { WTCP(0x7fff6216, 0x00c90f88), WTCP(0x7ffa72d1, 0x025b26d7), WTCP(0x7ff09478, 0x03ed26e6), WTCP(0x7fe1c76b, 0x057f0035), WTCP(0x7fce0c3e, 0x0710a345), WTCP(0x7fb563b3, 0x08a2009a), WTCP(0x7f97cebd, 0x0a3308bd), WTCP(0x7f754e80, 0x0bc3ac35), WTCP(0x7f4de451, 0x0d53db92), WTCP(0x7f2191b4, 0x0ee38766), WTCP(0x7ef05860, 0x1072a048), WTCP(0x7eba3a39, 0x120116d5), WTCP(0x7e7f3957, 0x138edbb1), WTCP(0x7e3f57ff, 0x151bdf86), WTCP(0x7dfa98a8, 0x16a81305), WTCP(0x7db0fdf8, 0x183366e9), WTCP(0x7d628ac6, 0x19bdcbf3), WTCP(0x7d0f4218, 0x1b4732ef), WTCP(0x7cb72724, 0x1ccf8cb3), WTCP(0x7c5a3d50, 0x1e56ca1e), WTCP(0x7bf88830, 0x1fdcdc1b), WTCP(0x7b920b89, 0x2161b3a0), WTCP(0x7b26cb4f, 0x22e541af), WTCP(0x7ab6cba4, 0x24677758), WTCP(0x7a4210d8, 0x25e845b6), WTCP(0x79c89f6e, 0x27679df4), WTCP(0x794a7c12, 0x28e5714b), WTCP(0x78c7aba2, 0x2a61b101), WTCP(0x78403329, 0x2bdc4e6f), WTCP(0x77b417df, 0x2d553afc), WTCP(0x77235f2d, 0x2ecc681e), WTCP(0x768e0ea6, 0x3041c761), WTCP(0x75f42c0b, 0x31b54a5e), WTCP(0x7555bd4c, 0x3326e2c3), WTCP(0x74b2c884, 0x34968250), WTCP(0x740b53fb, 0x36041ad9), WTCP(0x735f6626, 0x376f9e46), WTCP(0x72af05a7, 0x38d8fe93), WTCP(0x71fa3949, 0x3a402dd2), WTCP(0x71410805, 0x3ba51e29), WTCP(0x708378ff, 0x3d07c1d6), WTCP(0x6fc19385, 0x3e680b2c), WTCP(0x6efb5f12, 0x3fc5ec98), WTCP(0x6e30e34a, 0x4121589b), WTCP(0x6d6227fa, 0x427a41d0), WTCP(0x6c8f351c, 0x43d09aed), WTCP(0x6bb812d1, 0x452456bd), WTCP(0x6adcc964, 0x46756828), WTCP(0x69fd614a, 0x47c3c22f), WTCP(0x6919e320, 0x490f57ee), WTCP(0x683257ab, 0x4a581c9e), WTCP(0x6746c7d8, 0x4b9e0390), WTCP(0x66573cbb, 0x4ce10034), WTCP(0x6563bf92, 0x4e210617), WTCP(0x646c59bf, 0x4f5e08e3), WTCP(0x637114cc, 0x5097fc5e), WTCP(0x6271fa69, 0x51ced46e), WTCP(0x616f146c, 0x53028518), WTCP(0x60686ccf, 0x5433027d), WTCP(0x5f5e0db3, 0x556040e2), WTCP(0x5e50015d, 0x568a34a9), WTCP(0x5d3e5237, 0x57b0d256), WTCP(0x5c290acc, 0x58d40e8c), WTCP(0x5b1035cf, 0x59f3de12), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP KBDWindow128[] = { WTCP(0x7ffffffe, 0x00016f63), WTCP(0x7ffffff1, 0x0003e382), WTCP(0x7fffffc7, 0x00078f64), WTCP(0x7fffff5d, 0x000cc323), WTCP(0x7ffffe76, 0x0013d9ed), WTCP(0x7ffffcaa, 0x001d3a9d), WTCP(0x7ffff953, 0x0029581f), WTCP(0x7ffff372, 0x0038b1bd), WTCP(0x7fffe98b, 0x004bd34d), WTCP(0x7fffd975, 0x00635538), WTCP(0x7fffc024, 0x007fdc64), WTCP(0x7fff995b, 0x00a219f1), WTCP(0x7fff5f5b, 0x00cacad0), WTCP(0x7fff0a75, 0x00fab72d), WTCP(0x7ffe9091, 0x0132b1af), WTCP(0x7ffde49e, 0x01739689), WTCP(0x7ffcf5ef, 0x01be4a63), WTCP(0x7ffbaf84, 0x0213b910), WTCP(0x7ff9f73a, 0x0274d41e), WTCP(0x7ff7acf1, 0x02e2913a), WTCP(0x7ff4a99a, 0x035de86c), WTCP(0x7ff0be3d, 0x03e7d233), WTCP(0x7febb2f1, 0x0481457c), WTCP(0x7fe545d4, 0x052b357c), WTCP(0x7fdd2a02, 0x05e68f77), WTCP(0x7fd30695, 0x06b4386f), WTCP(0x7fc675b4, 0x07950acb), WTCP(0x7fb703be, 0x0889d3ef), WTCP(0x7fa42e89, 0x099351e0), WTCP(0x7f8d64d8, 0x0ab230e0), WTCP(0x7f7205f8, 0x0be70923), WTCP(0x7f516195, 0x0d325c93), WTCP(0x7f2ab7d0, 0x0e9494ae), WTCP(0x7efd3997, 0x100e0085), WTCP(0x7ec8094a, 0x119ed2ef), WTCP(0x7e8a3ba7, 0x134720d8), WTCP(0x7e42d906, 0x1506dfdc), WTCP(0x7df0dee4, 0x16dde50b), WTCP(0x7d9341b4, 0x18cbe3f7), WTCP(0x7d28ef02, 0x1ad06e07), WTCP(0x7cb0cfcc, 0x1ceaf215), WTCP(0x7c29cb20, 0x1f1abc4f), WTCP(0x7b92c8eb, 0x215ef677), WTCP(0x7aeab4ec, 0x23b6a867), WTCP(0x7a3081d0, 0x2620b8ec), WTCP(0x79632c5a, 0x289beef5), WTCP(0x7881be95, 0x2b26f30b), WTCP(0x778b5304, 0x2dc0511f), WTCP(0x767f17c0, 0x30667aa2), WTCP(0x755c5178, 0x3317c8dd), WTCP(0x74225e50, 0x35d27f98), WTCP(0x72d0b887, 0x3894cff3), WTCP(0x7166f8e7, 0x3b5cdb7b), WTCP(0x6fe4d8e8, 0x3e28b770), WTCP(0x6e4a3491, 0x40f6702a), WTCP(0x6c970bfc, 0x43c40caa), WTCP(0x6acb8483, 0x468f9231), WTCP(0x68e7e994, 0x495707f5), WTCP(0x66ecad1c, 0x4c187ac7), WTCP(0x64da6797, 0x4ed200c5), WTCP(0x62b1d7b7, 0x5181bcea), WTCP(0x6073e1ae, 0x5425e28e), WTCP(0x5e218e16, 0x56bcb8c2), WTCP(0x5bbc0875, 0x59449d76), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow960[] = { WTCP(0x7ffffd31, 0x001aceea), WTCP(0x7fffe6bc, 0x00506cb9), WTCP(0x7fffb9d1, 0x00860a79), WTCP(0x7fff7671, 0x00bba822), WTCP(0x7fff1c9b, 0x00f145ab), WTCP(0x7ffeac50, 0x0126e309), WTCP(0x7ffe2590, 0x015c8033), WTCP(0x7ffd885a, 0x01921d20), WTCP(0x7ffcd4b0, 0x01c7b9c6), WTCP(0x7ffc0a91, 0x01fd561d), WTCP(0x7ffb29fd, 0x0232f21a), WTCP(0x7ffa32f4, 0x02688db4), WTCP(0x7ff92577, 0x029e28e2), WTCP(0x7ff80186, 0x02d3c39b), WTCP(0x7ff6c720, 0x03095dd5), WTCP(0x7ff57647, 0x033ef786), WTCP(0x7ff40efa, 0x037490a5), WTCP(0x7ff2913a, 0x03aa292a), WTCP(0x7ff0fd07, 0x03dfc109), WTCP(0x7fef5260, 0x0415583b), WTCP(0x7fed9148, 0x044aeeb5), WTCP(0x7febb9bd, 0x0480846e), WTCP(0x7fe9cbc0, 0x04b6195d), WTCP(0x7fe7c752, 0x04ebad79), WTCP(0x7fe5ac72, 0x052140b7), WTCP(0x7fe37b22, 0x0556d30f), WTCP(0x7fe13361, 0x058c6478), WTCP(0x7fded530, 0x05c1f4e7), WTCP(0x7fdc608f, 0x05f78453), WTCP(0x7fd9d57f, 0x062d12b4), WTCP(0x7fd73401, 0x06629ffe), WTCP(0x7fd47c14, 0x06982c2b), WTCP(0x7fd1adb9, 0x06cdb72f), WTCP(0x7fcec8f1, 0x07034101), WTCP(0x7fcbcdbc, 0x0738c998), WTCP(0x7fc8bc1b, 0x076e50eb), WTCP(0x7fc5940e, 0x07a3d6f0), WTCP(0x7fc25596, 0x07d95b9e), WTCP(0x7fbf00b3, 0x080edeec), WTCP(0x7fbb9567, 0x084460cf), WTCP(0x7fb813b0, 0x0879e140), WTCP(0x7fb47b91, 0x08af6033), WTCP(0x7fb0cd0a, 0x08e4dda0), WTCP(0x7fad081b, 0x091a597e), WTCP(0x7fa92cc5, 0x094fd3c3), WTCP(0x7fa53b09, 0x09854c66), WTCP(0x7fa132e8, 0x09bac35d), WTCP(0x7f9d1461, 0x09f0389f), WTCP(0x7f98df77, 0x0a25ac23), WTCP(0x7f949429, 0x0a5b1dde), WTCP(0x7f903279, 0x0a908dc9), WTCP(0x7f8bba66, 0x0ac5fbd9), WTCP(0x7f872bf3, 0x0afb6805), WTCP(0x7f82871f, 0x0b30d244), WTCP(0x7f7dcbec, 0x0b663a8c), WTCP(0x7f78fa5b, 0x0b9ba0d5), WTCP(0x7f74126b, 0x0bd10513), WTCP(0x7f6f141f, 0x0c066740), WTCP(0x7f69ff76, 0x0c3bc74f), WTCP(0x7f64d473, 0x0c71253a), WTCP(0x7f5f9315, 0x0ca680f5), WTCP(0x7f5a3b5e, 0x0cdbda79), WTCP(0x7f54cd4f, 0x0d1131ba), WTCP(0x7f4f48e8, 0x0d4686b1), WTCP(0x7f49ae2a, 0x0d7bd954), WTCP(0x7f43fd18, 0x0db12999), WTCP(0x7f3e35b0, 0x0de67776), WTCP(0x7f3857f6, 0x0e1bc2e4), WTCP(0x7f3263e9, 0x0e510bd8), WTCP(0x7f2c598a, 0x0e865248), WTCP(0x7f2638db, 0x0ebb962c), WTCP(0x7f2001dd, 0x0ef0d77b), WTCP(0x7f19b491, 0x0f26162a), WTCP(0x7f1350f8, 0x0f5b5231), WTCP(0x7f0cd712, 0x0f908b86), WTCP(0x7f0646e2, 0x0fc5c220), WTCP(0x7effa069, 0x0ffaf5f6), WTCP(0x7ef8e3a6, 0x103026fe), WTCP(0x7ef2109d, 0x1065552e), WTCP(0x7eeb274d, 0x109a807e), WTCP(0x7ee427b9, 0x10cfa8e5), WTCP(0x7edd11e1, 0x1104ce58), WTCP(0x7ed5e5c6, 0x1139f0cf), WTCP(0x7ecea36b, 0x116f1040), WTCP(0x7ec74acf, 0x11a42ca2), WTCP(0x7ebfdbf5, 0x11d945eb), WTCP(0x7eb856de, 0x120e5c13), WTCP(0x7eb0bb8a, 0x12436f10), WTCP(0x7ea909fc, 0x12787ed8), WTCP(0x7ea14235, 0x12ad8b63), WTCP(0x7e996436, 0x12e294a7), WTCP(0x7e917000, 0x13179a9b), WTCP(0x7e896595, 0x134c9d34), WTCP(0x7e8144f6, 0x13819c6c), WTCP(0x7e790e25, 0x13b69836), WTCP(0x7e70c124, 0x13eb908c), WTCP(0x7e685df2, 0x14208563), WTCP(0x7e5fe493, 0x145576b1), WTCP(0x7e575508, 0x148a646e), WTCP(0x7e4eaf51, 0x14bf4e91), WTCP(0x7e45f371, 0x14f43510), WTCP(0x7e3d2169, 0x152917e1), WTCP(0x7e34393b, 0x155df6fc), WTCP(0x7e2b3ae8, 0x1592d257), WTCP(0x7e222672, 0x15c7a9ea), WTCP(0x7e18fbda, 0x15fc7daa), WTCP(0x7e0fbb22, 0x16314d8e), WTCP(0x7e06644c, 0x1666198d), WTCP(0x7dfcf759, 0x169ae19f), WTCP(0x7df3744b, 0x16cfa5b9), WTCP(0x7de9db23, 0x170465d2), WTCP(0x7de02be4, 0x173921e2), WTCP(0x7dd6668f, 0x176dd9de), WTCP(0x7dcc8b25, 0x17a28dbe), WTCP(0x7dc299a9, 0x17d73d79), WTCP(0x7db8921c, 0x180be904), WTCP(0x7dae747f, 0x18409058), WTCP(0x7da440d6, 0x1875336a), WTCP(0x7d99f721, 0x18a9d231), WTCP(0x7d8f9762, 0x18de6ca5), WTCP(0x7d85219c, 0x191302bc), WTCP(0x7d7a95cf, 0x1947946c), WTCP(0x7d6ff3fe, 0x197c21ad), WTCP(0x7d653c2b, 0x19b0aa75), WTCP(0x7d5a6e57, 0x19e52ebb), WTCP(0x7d4f8a85, 0x1a19ae76), WTCP(0x7d4490b6, 0x1a4e299d), WTCP(0x7d3980ec, 0x1a82a026), WTCP(0x7d2e5b2a, 0x1ab71208), WTCP(0x7d231f70, 0x1aeb7f3a), WTCP(0x7d17cdc2, 0x1b1fe7b3), WTCP(0x7d0c6621, 0x1b544b6a), WTCP(0x7d00e88f, 0x1b88aa55), WTCP(0x7cf5550e, 0x1bbd046c), WTCP(0x7ce9aba1, 0x1bf159a4), WTCP(0x7cddec48, 0x1c25a9f6), WTCP(0x7cd21707, 0x1c59f557), WTCP(0x7cc62bdf, 0x1c8e3bbe), WTCP(0x7cba2ad3, 0x1cc27d23), WTCP(0x7cae13e4, 0x1cf6b97c), WTCP(0x7ca1e715, 0x1d2af0c1), WTCP(0x7c95a467, 0x1d5f22e7), WTCP(0x7c894bde, 0x1d934fe5), WTCP(0x7c7cdd7b, 0x1dc777b3), WTCP(0x7c705940, 0x1dfb9a48), WTCP(0x7c63bf2f, 0x1e2fb79a), WTCP(0x7c570f4b, 0x1e63cfa0), WTCP(0x7c4a4996, 0x1e97e251), WTCP(0x7c3d6e13, 0x1ecbefa4), WTCP(0x7c307cc2, 0x1efff78f), WTCP(0x7c2375a8, 0x1f33fa0a), WTCP(0x7c1658c5, 0x1f67f70b), WTCP(0x7c09261d, 0x1f9bee8a), WTCP(0x7bfbddb1, 0x1fcfe07d), WTCP(0x7bee7f85, 0x2003ccdb), WTCP(0x7be10b99, 0x2037b39b), WTCP(0x7bd381f1, 0x206b94b4), WTCP(0x7bc5e290, 0x209f701c), WTCP(0x7bb82d76, 0x20d345cc), WTCP(0x7baa62a8, 0x210715b8), WTCP(0x7b9c8226, 0x213adfda), WTCP(0x7b8e8bf5, 0x216ea426), WTCP(0x7b808015, 0x21a26295), WTCP(0x7b725e8a, 0x21d61b1e), WTCP(0x7b642756, 0x2209cdb6), WTCP(0x7b55da7c, 0x223d7a55), WTCP(0x7b4777fe, 0x227120f3), WTCP(0x7b38ffde, 0x22a4c185), WTCP(0x7b2a721f, 0x22d85c04), WTCP(0x7b1bcec4, 0x230bf065), WTCP(0x7b0d15d0, 0x233f7ea0), WTCP(0x7afe4744, 0x237306ab), WTCP(0x7aef6323, 0x23a6887f), WTCP(0x7ae06971, 0x23da0411), WTCP(0x7ad15a2f, 0x240d7958), WTCP(0x7ac23561, 0x2440e84d), WTCP(0x7ab2fb09, 0x247450e4), WTCP(0x7aa3ab29, 0x24a7b317), WTCP(0x7a9445c5, 0x24db0edb), WTCP(0x7a84cade, 0x250e6427), WTCP(0x7a753a79, 0x2541b2f3), WTCP(0x7a659496, 0x2574fb36), WTCP(0x7a55d93a, 0x25a83ce6), WTCP(0x7a460867, 0x25db77fa), WTCP(0x7a362220, 0x260eac6a), WTCP(0x7a262668, 0x2641da2d), WTCP(0x7a161540, 0x26750139), WTCP(0x7a05eead, 0x26a82186), WTCP(0x79f5b2b1, 0x26db3b0a), WTCP(0x79e5614f, 0x270e4dbd), WTCP(0x79d4fa89, 0x27415996), WTCP(0x79c47e63, 0x27745e8c), WTCP(0x79b3ece0, 0x27a75c95), WTCP(0x79a34602, 0x27da53a9), WTCP(0x799289cc, 0x280d43bf), WTCP(0x7981b841, 0x28402cce), WTCP(0x7970d165, 0x28730ecd), WTCP(0x795fd53a, 0x28a5e9b4), WTCP(0x794ec3c3, 0x28d8bd78), WTCP(0x793d9d03, 0x290b8a12), WTCP(0x792c60fe, 0x293e4f78), WTCP(0x791b0fb5, 0x29710da1), WTCP(0x7909a92d, 0x29a3c485), WTCP(0x78f82d68, 0x29d6741b), WTCP(0x78e69c69, 0x2a091c59), WTCP(0x78d4f634, 0x2a3bbd37), WTCP(0x78c33acb, 0x2a6e56ac), WTCP(0x78b16a32, 0x2aa0e8b0), WTCP(0x789f846b, 0x2ad37338), WTCP(0x788d897b, 0x2b05f63d), WTCP(0x787b7963, 0x2b3871b5), WTCP(0x78695428, 0x2b6ae598), WTCP(0x785719cc, 0x2b9d51dd), WTCP(0x7844ca53, 0x2bcfb67b), WTCP(0x783265c0, 0x2c021369), WTCP(0x781fec15, 0x2c34689e), WTCP(0x780d5d57, 0x2c66b611), WTCP(0x77fab989, 0x2c98fbba), WTCP(0x77e800ad, 0x2ccb3990), WTCP(0x77d532c7, 0x2cfd6f8a), WTCP(0x77c24fdb, 0x2d2f9d9f), WTCP(0x77af57eb, 0x2d61c3c7), WTCP(0x779c4afc, 0x2d93e1f8), WTCP(0x77892910, 0x2dc5f829), WTCP(0x7775f22a, 0x2df80653), WTCP(0x7762a64f, 0x2e2a0c6c), WTCP(0x774f4581, 0x2e5c0a6b), WTCP(0x773bcfc4, 0x2e8e0048), WTCP(0x7728451c, 0x2ebfedfa), WTCP(0x7714a58b, 0x2ef1d377), WTCP(0x7700f115, 0x2f23b0b9), WTCP(0x76ed27be, 0x2f5585b5), WTCP(0x76d94989, 0x2f875262), WTCP(0x76c55679, 0x2fb916b9), WTCP(0x76b14e93, 0x2fead2b0), WTCP(0x769d31d9, 0x301c863f), WTCP(0x76890050, 0x304e315d), WTCP(0x7674b9fa, 0x307fd401), WTCP(0x76605edb, 0x30b16e23), WTCP(0x764beef8, 0x30e2ffb9), WTCP(0x76376a52, 0x311488bc), WTCP(0x7622d0ef, 0x31460922), WTCP(0x760e22d1, 0x317780e2), WTCP(0x75f95ffc, 0x31a8eff5), WTCP(0x75e48874, 0x31da5651), WTCP(0x75cf9c3d, 0x320bb3ee), WTCP(0x75ba9b5a, 0x323d08c3), WTCP(0x75a585cf, 0x326e54c7), WTCP(0x75905ba0, 0x329f97f3), WTCP(0x757b1ccf, 0x32d0d23c), WTCP(0x7565c962, 0x3302039b), WTCP(0x7550615c, 0x33332c06), WTCP(0x753ae4c0, 0x33644b76), WTCP(0x75255392, 0x339561e1), WTCP(0x750fadd7, 0x33c66f40), WTCP(0x74f9f391, 0x33f77388), WTCP(0x74e424c5, 0x34286eb3), WTCP(0x74ce4177, 0x345960b7), WTCP(0x74b849aa, 0x348a498b), WTCP(0x74a23d62, 0x34bb2927), WTCP(0x748c1ca4, 0x34ebff83), WTCP(0x7475e772, 0x351ccc96), WTCP(0x745f9dd1, 0x354d9057), WTCP(0x74493fc5, 0x357e4abe), WTCP(0x7432cd51, 0x35aefbc2), WTCP(0x741c467b, 0x35dfa35a), WTCP(0x7405ab45, 0x3610417f), WTCP(0x73eefbb3, 0x3640d627), WTCP(0x73d837ca, 0x3671614b), WTCP(0x73c15f8d, 0x36a1e2e0), WTCP(0x73aa7301, 0x36d25ae0), WTCP(0x7393722a, 0x3702c942), WTCP(0x737c5d0b, 0x37332dfd), WTCP(0x736533a9, 0x37638908), WTCP(0x734df607, 0x3793da5b), WTCP(0x7336a42b, 0x37c421ee), WTCP(0x731f3e17, 0x37f45fb7), WTCP(0x7307c3d0, 0x382493b0), WTCP(0x72f0355a, 0x3854bdcf), WTCP(0x72d892ba, 0x3884de0b), WTCP(0x72c0dbf3, 0x38b4f45d), WTCP(0x72a91109, 0x38e500bc), WTCP(0x72913201, 0x3915031f), WTCP(0x72793edf, 0x3944fb7e), WTCP(0x726137a8, 0x3974e9d0), WTCP(0x72491c5e, 0x39a4ce0e), WTCP(0x7230ed07, 0x39d4a82f), WTCP(0x7218a9a7, 0x3a04782a), WTCP(0x72005242, 0x3a343df7), WTCP(0x71e7e6dc, 0x3a63f98d), WTCP(0x71cf677a, 0x3a93aae5), WTCP(0x71b6d420, 0x3ac351f6), WTCP(0x719e2cd2, 0x3af2eeb7), WTCP(0x71857195, 0x3b228120), WTCP(0x716ca26c, 0x3b52092a), WTCP(0x7153bf5d, 0x3b8186ca), WTCP(0x713ac86b, 0x3bb0f9fa), WTCP(0x7121bd9c, 0x3be062b0), WTCP(0x71089ef2, 0x3c0fc0e6), WTCP(0x70ef6c74, 0x3c3f1491), WTCP(0x70d62625, 0x3c6e5daa), WTCP(0x70bccc09, 0x3c9d9c28), WTCP(0x70a35e25, 0x3cccd004), WTCP(0x7089dc7e, 0x3cfbf935), WTCP(0x70704718, 0x3d2b17b3), WTCP(0x70569df8, 0x3d5a2b75), WTCP(0x703ce122, 0x3d893474), WTCP(0x7023109a, 0x3db832a6), WTCP(0x70092c65, 0x3de72604), WTCP(0x6fef3488, 0x3e160e85), WTCP(0x6fd52907, 0x3e44ec22), WTCP(0x6fbb09e7, 0x3e73bed2), WTCP(0x6fa0d72c, 0x3ea2868c), WTCP(0x6f8690db, 0x3ed14349), WTCP(0x6f6c36f8, 0x3efff501), WTCP(0x6f51c989, 0x3f2e9bab), WTCP(0x6f374891, 0x3f5d373e), WTCP(0x6f1cb416, 0x3f8bc7b4), WTCP(0x6f020c1c, 0x3fba4d03), WTCP(0x6ee750a8, 0x3fe8c724), WTCP(0x6ecc81be, 0x4017360e), WTCP(0x6eb19f64, 0x404599b9), WTCP(0x6e96a99d, 0x4073f21d), WTCP(0x6e7ba06f, 0x40a23f32), WTCP(0x6e6083de, 0x40d080f0), WTCP(0x6e4553ef, 0x40feb74f), WTCP(0x6e2a10a8, 0x412ce246), WTCP(0x6e0eba0c, 0x415b01ce), WTCP(0x6df35020, 0x418915de), WTCP(0x6dd7d2ea, 0x41b71e6f), WTCP(0x6dbc426e, 0x41e51b77), WTCP(0x6da09eb1, 0x42130cf0), WTCP(0x6d84e7b7, 0x4240f2d1), WTCP(0x6d691d87, 0x426ecd12), WTCP(0x6d4d4023, 0x429c9bab), WTCP(0x6d314f93, 0x42ca5e94), WTCP(0x6d154bd9, 0x42f815c5), WTCP(0x6cf934fc, 0x4325c135), WTCP(0x6cdd0b00, 0x435360de), WTCP(0x6cc0cdea, 0x4380f4b7), WTCP(0x6ca47dbf, 0x43ae7cb7), WTCP(0x6c881a84, 0x43dbf8d7), WTCP(0x6c6ba43e, 0x44096910), WTCP(0x6c4f1af2, 0x4436cd58), WTCP(0x6c327ea6, 0x446425a8), WTCP(0x6c15cf5d, 0x449171f8), WTCP(0x6bf90d1d, 0x44beb240), WTCP(0x6bdc37eb, 0x44ebe679), WTCP(0x6bbf4fcd, 0x45190e99), WTCP(0x6ba254c7, 0x45462a9a), WTCP(0x6b8546de, 0x45733a73), WTCP(0x6b682617, 0x45a03e1d), WTCP(0x6b4af279, 0x45cd358f), WTCP(0x6b2dac06, 0x45fa20c2), WTCP(0x6b1052c6, 0x4626ffae), WTCP(0x6af2e6bc, 0x4653d24b), WTCP(0x6ad567ef, 0x46809891), WTCP(0x6ab7d663, 0x46ad5278), WTCP(0x6a9a321d, 0x46d9fff8), WTCP(0x6a7c7b23, 0x4706a10a), WTCP(0x6a5eb17a, 0x473335a5), WTCP(0x6a40d527, 0x475fbdc3), WTCP(0x6a22e630, 0x478c395a), WTCP(0x6a04e499, 0x47b8a864), WTCP(0x69e6d067, 0x47e50ad8), WTCP(0x69c8a9a1, 0x481160ae), WTCP(0x69aa704c, 0x483da9e0), WTCP(0x698c246c, 0x4869e665), WTCP(0x696dc607, 0x48961635), WTCP(0x694f5523, 0x48c23949), WTCP(0x6930d1c4, 0x48ee4f98), WTCP(0x69123bf1, 0x491a591c), WTCP(0x68f393ae, 0x494655cc), WTCP(0x68d4d900, 0x497245a1), WTCP(0x68b60bee, 0x499e2892), WTCP(0x68972c7d, 0x49c9fe99), WTCP(0x68783ab1, 0x49f5c7ae), WTCP(0x68593691, 0x4a2183c8), WTCP(0x683a2022, 0x4a4d32e1), WTCP(0x681af76a, 0x4a78d4f0), WTCP(0x67fbbc6d, 0x4aa469ee), WTCP(0x67dc6f31, 0x4acff1d3), WTCP(0x67bd0fbd, 0x4afb6c98), WTCP(0x679d9e14, 0x4b26da35), WTCP(0x677e1a3e, 0x4b523aa2), WTCP(0x675e843e, 0x4b7d8dd8), WTCP(0x673edc1c, 0x4ba8d3cf), WTCP(0x671f21dc, 0x4bd40c80), WTCP(0x66ff5584, 0x4bff37e2), WTCP(0x66df771a, 0x4c2a55ef), WTCP(0x66bf86a3, 0x4c55669f), WTCP(0x669f8425, 0x4c8069ea), WTCP(0x667f6fa5, 0x4cab5fc9), WTCP(0x665f4929, 0x4cd64834), WTCP(0x663f10b7, 0x4d012324), WTCP(0x661ec654, 0x4d2bf091), WTCP(0x65fe6a06, 0x4d56b073), WTCP(0x65ddfbd3, 0x4d8162c4), WTCP(0x65bd7bc0, 0x4dac077b), WTCP(0x659ce9d4, 0x4dd69e92), WTCP(0x657c4613, 0x4e012800), WTCP(0x655b9083, 0x4e2ba3be), WTCP(0x653ac92b, 0x4e5611c5), WTCP(0x6519f010, 0x4e80720e), WTCP(0x64f90538, 0x4eaac490), WTCP(0x64d808a8, 0x4ed50945), WTCP(0x64b6fa66, 0x4eff4025), WTCP(0x6495da79, 0x4f296928), WTCP(0x6474a8e5, 0x4f538448), WTCP(0x645365b2, 0x4f7d917c), WTCP(0x643210e4, 0x4fa790be), WTCP(0x6410aa81, 0x4fd18206), WTCP(0x63ef3290, 0x4ffb654d), WTCP(0x63cda916, 0x50253a8b), WTCP(0x63ac0e19, 0x504f01ba), WTCP(0x638a619e, 0x5078bad1), WTCP(0x6368a3ad, 0x50a265c9), WTCP(0x6346d44b, 0x50cc029c), WTCP(0x6324f37d, 0x50f59141), WTCP(0x6303014a, 0x511f11b2), WTCP(0x62e0fdb8, 0x514883e7), WTCP(0x62bee8cc, 0x5171e7d9), WTCP(0x629cc28c, 0x519b3d80), WTCP(0x627a8b00, 0x51c484d6), WTCP(0x6258422c, 0x51edbdd4), WTCP(0x6235e816, 0x5216e871), WTCP(0x62137cc5, 0x524004a7), WTCP(0x61f1003f, 0x5269126e), WTCP(0x61ce7289, 0x529211c0), WTCP(0x61abd3ab, 0x52bb0295), WTCP(0x618923a9, 0x52e3e4e6), WTCP(0x61666289, 0x530cb8ac), WTCP(0x61439053, 0x53357ddf), WTCP(0x6120ad0d, 0x535e3479), WTCP(0x60fdb8bb, 0x5386dc72), WTCP(0x60dab365, 0x53af75c3), WTCP(0x60b79d10, 0x53d80065), WTCP(0x609475c3, 0x54007c51), WTCP(0x60713d84, 0x5428e980), WTCP(0x604df459, 0x545147eb), WTCP(0x602a9a48, 0x5479978a), WTCP(0x60072f57, 0x54a1d857), WTCP(0x5fe3b38d, 0x54ca0a4b), WTCP(0x5fc026f0, 0x54f22d5d), WTCP(0x5f9c8987, 0x551a4189), WTCP(0x5f78db56, 0x554246c6), WTCP(0x5f551c65, 0x556a3d0d), WTCP(0x5f314cba, 0x55922457), WTCP(0x5f0d6c5b, 0x55b9fc9e), WTCP(0x5ee97b4f, 0x55e1c5da), WTCP(0x5ec5799b, 0x56098005), WTCP(0x5ea16747, 0x56312b17), WTCP(0x5e7d4458, 0x5658c709), WTCP(0x5e5910d4, 0x568053d5), WTCP(0x5e34ccc3, 0x56a7d174), WTCP(0x5e10782b, 0x56cf3fde), WTCP(0x5dec1311, 0x56f69f0d), WTCP(0x5dc79d7c, 0x571deefa), WTCP(0x5da31773, 0x57452f9d), WTCP(0x5d7e80fc, 0x576c60f1), WTCP(0x5d59da1e, 0x579382ee), WTCP(0x5d3522de, 0x57ba958d), WTCP(0x5d105b44, 0x57e198c7), WTCP(0x5ceb8355, 0x58088c96), WTCP(0x5cc69b19, 0x582f70f3), WTCP(0x5ca1a295, 0x585645d7), WTCP(0x5c7c99d1, 0x587d0b3b), WTCP(0x5c5780d3, 0x58a3c118), WTCP(0x5c3257a0, 0x58ca6767), WTCP(0x5c0d1e41, 0x58f0fe23), WTCP(0x5be7d4ba, 0x59178543), WTCP(0x5bc27b14, 0x593dfcc2), WTCP(0x5b9d1154, 0x59646498), WTCP(0x5b779780, 0x598abcbe), WTCP(0x5b520da1, 0x59b1052f), WTCP(0x5b2c73bb, 0x59d73de3), WTCP(0x5b06c9d6, 0x59fd66d4), WTCP(0x5ae10ff9, 0x5a237ffa), WTCP(0x5abb4629, 0x5a498950), WTCP(0x5a956c6e, 0x5a6f82ce), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP KBDWindow960[] = { WTCP(0x7fffff9e, 0x0009e6ac), WTCP(0x7fffff2b, 0x000e96d5), WTCP(0x7ffffea6, 0x0012987e), WTCP(0x7ffffe0e, 0x001652b6), WTCP(0x7ffffd60, 0x0019ebce), WTCP(0x7ffffc9c, 0x001d76bf), WTCP(0x7ffffbbf, 0x0020fe79), WTCP(0x7ffffac9, 0x002489ef), WTCP(0x7ffff9b7, 0x00281de2), WTCP(0x7ffff887, 0x002bbdbb), WTCP(0x7ffff737, 0x002f6c0d), WTCP(0x7ffff5c6, 0x00332ad8), WTCP(0x7ffff431, 0x0036fbb9), WTCP(0x7ffff276, 0x003ae004), WTCP(0x7ffff092, 0x003ed8d8), WTCP(0x7fffee84, 0x0042e72f), WTCP(0x7fffec48, 0x00470be3), WTCP(0x7fffe9dd, 0x004b47b8), WTCP(0x7fffe73f, 0x004f9b5f), WTCP(0x7fffe46b, 0x0054077a), WTCP(0x7fffe15f, 0x00588ca1), WTCP(0x7fffde17, 0x005d2b61), WTCP(0x7fffda91, 0x0061e442), WTCP(0x7fffd6c9, 0x0066b7c2), WTCP(0x7fffd2bb, 0x006ba65c), WTCP(0x7fffce65, 0x0070b087), WTCP(0x7fffc9c2, 0x0075d6b5), WTCP(0x7fffc4cf, 0x007b1955), WTCP(0x7fffbf87, 0x008078d5), WTCP(0x7fffb9e7, 0x0085f5a0), WTCP(0x7fffb3ea, 0x008b901d), WTCP(0x7fffad8c, 0x009148b4), WTCP(0x7fffa6c9, 0x00971fcb), WTCP(0x7fff9f9c, 0x009d15c7), WTCP(0x7fff9800, 0x00a32b0b), WTCP(0x7fff8ff0, 0x00a95ff9), WTCP(0x7fff8767, 0x00afb4f4), WTCP(0x7fff7e5f, 0x00b62a5c), WTCP(0x7fff74d4, 0x00bcc093), WTCP(0x7fff6ac0, 0x00c377f8), WTCP(0x7fff601c, 0x00ca50eb), WTCP(0x7fff54e3, 0x00d14bcb), WTCP(0x7fff490e, 0x00d868f7), WTCP(0x7fff3c98, 0x00dfa8ce), WTCP(0x7fff2f79, 0x00e70bad), WTCP(0x7fff21ac, 0x00ee91f3), WTCP(0x7fff1328, 0x00f63bfe), WTCP(0x7fff03e7, 0x00fe0a2c), WTCP(0x7ffef3e1, 0x0105fcd9), WTCP(0x7ffee310, 0x010e1462), WTCP(0x7ffed16a, 0x01165126), WTCP(0x7ffebee9, 0x011eb381), WTCP(0x7ffeab83, 0x01273bd0), WTCP(0x7ffe9731, 0x012fea6f), WTCP(0x7ffe81ea, 0x0138bfbc), WTCP(0x7ffe6ba4, 0x0141bc12), WTCP(0x7ffe5457, 0x014adfce), WTCP(0x7ffe3bfa, 0x01542b4d), WTCP(0x7ffe2282, 0x015d9ee9), WTCP(0x7ffe07e6, 0x01673b01), WTCP(0x7ffdec1b, 0x0170ffee), WTCP(0x7ffdcf17, 0x017aee0e), WTCP(0x7ffdb0d0, 0x018505bc), WTCP(0x7ffd913b, 0x018f4754), WTCP(0x7ffd704b, 0x0199b330), WTCP(0x7ffd4df7, 0x01a449ad), WTCP(0x7ffd2a31, 0x01af0b25), WTCP(0x7ffd04ef, 0x01b9f7f4), WTCP(0x7ffcde23, 0x01c51074), WTCP(0x7ffcb5c1, 0x01d05501), WTCP(0x7ffc8bbc, 0x01dbc5f5), WTCP(0x7ffc6006, 0x01e763ab), WTCP(0x7ffc3293, 0x01f32e7d), WTCP(0x7ffc0354, 0x01ff26c5), WTCP(0x7ffbd23b, 0x020b4cde), WTCP(0x7ffb9f3a, 0x0217a120), WTCP(0x7ffb6a41, 0x022423e6), WTCP(0x7ffb3342, 0x0230d58a), WTCP(0x7ffafa2d, 0x023db664), WTCP(0x7ffabef2, 0x024ac6ce), WTCP(0x7ffa8180, 0x02580720), WTCP(0x7ffa41c9, 0x026577b3), WTCP(0x7ff9ffb9, 0x027318e0), WTCP(0x7ff9bb41, 0x0280eaff), WTCP(0x7ff9744e, 0x028eee68), WTCP(0x7ff92acf, 0x029d2371), WTCP(0x7ff8deb1, 0x02ab8a74), WTCP(0x7ff88fe2, 0x02ba23c7), WTCP(0x7ff83e4d, 0x02c8efc0), WTCP(0x7ff7e9e1, 0x02d7eeb7), WTCP(0x7ff79288, 0x02e72101), WTCP(0x7ff7382f, 0x02f686f5), WTCP(0x7ff6dac1, 0x030620e9), WTCP(0x7ff67a29, 0x0315ef31), WTCP(0x7ff61651, 0x0325f224), WTCP(0x7ff5af23, 0x03362a14), WTCP(0x7ff5448a, 0x03469758), WTCP(0x7ff4d66d, 0x03573a42), WTCP(0x7ff464b7, 0x03681327), WTCP(0x7ff3ef4f, 0x0379225a), WTCP(0x7ff3761d, 0x038a682e), WTCP(0x7ff2f90a, 0x039be4f4), WTCP(0x7ff277fb, 0x03ad9900), WTCP(0x7ff1f2d8, 0x03bf84a3), WTCP(0x7ff16986, 0x03d1a82e), WTCP(0x7ff0dbec, 0x03e403f3), WTCP(0x7ff049ef, 0x03f69840), WTCP(0x7fefb373, 0x04096568), WTCP(0x7fef185d, 0x041c6bb8), WTCP(0x7fee7890, 0x042fab81), WTCP(0x7fedd3f1, 0x04432510), WTCP(0x7fed2a61, 0x0456d8b4), WTCP(0x7fec7bc4, 0x046ac6ba), WTCP(0x7febc7fb, 0x047eef70), WTCP(0x7feb0ee8, 0x04935322), WTCP(0x7fea506b, 0x04a7f21d), WTCP(0x7fe98c65, 0x04bcccab), WTCP(0x7fe8c2b7, 0x04d1e318), WTCP(0x7fe7f33e, 0x04e735af), WTCP(0x7fe71ddb, 0x04fcc4ba), WTCP(0x7fe6426c, 0x05129081), WTCP(0x7fe560ce, 0x0528994d), WTCP(0x7fe478df, 0x053edf68), WTCP(0x7fe38a7c, 0x05556318), WTCP(0x7fe29581, 0x056c24a5), WTCP(0x7fe199ca, 0x05832455), WTCP(0x7fe09733, 0x059a626e), WTCP(0x7fdf8d95, 0x05b1df35), WTCP(0x7fde7ccb, 0x05c99aef), WTCP(0x7fdd64af, 0x05e195e0), WTCP(0x7fdc451a, 0x05f9d04b), WTCP(0x7fdb1de4, 0x06124a73), WTCP(0x7fd9eee5, 0x062b0499), WTCP(0x7fd8b7f5, 0x0643ff00), WTCP(0x7fd778ec, 0x065d39e7), WTCP(0x7fd6319e, 0x0676b58f), WTCP(0x7fd4e1e2, 0x06907237), WTCP(0x7fd3898d, 0x06aa701d), WTCP(0x7fd22873, 0x06c4af80), WTCP(0x7fd0be6a, 0x06df309c), WTCP(0x7fcf4b44, 0x06f9f3ad), WTCP(0x7fcdced4, 0x0714f8f0), WTCP(0x7fcc48ed, 0x0730409f), WTCP(0x7fcab960, 0x074bcaf5), WTCP(0x7fc91fff, 0x0767982a), WTCP(0x7fc77c9a, 0x0783a877), WTCP(0x7fc5cf02, 0x079ffc14), WTCP(0x7fc41705, 0x07bc9338), WTCP(0x7fc25474, 0x07d96e19), WTCP(0x7fc0871b, 0x07f68ced), WTCP(0x7fbeaeca, 0x0813efe7), WTCP(0x7fbccb4c, 0x0831973d), WTCP(0x7fbadc70, 0x084f8320), WTCP(0x7fb8e200, 0x086db3c3), WTCP(0x7fb6dbc8, 0x088c2957), WTCP(0x7fb4c993, 0x08aae40c), WTCP(0x7fb2ab2b, 0x08c9e412), WTCP(0x7fb0805a, 0x08e92997), WTCP(0x7fae48e9, 0x0908b4c9), WTCP(0x7fac04a0, 0x092885d6), WTCP(0x7fa9b347, 0x09489ce8), WTCP(0x7fa754a6, 0x0968fa2c), WTCP(0x7fa4e884, 0x09899dcb), WTCP(0x7fa26ea6, 0x09aa87ee), WTCP(0x7f9fe6d1, 0x09cbb8be), WTCP(0x7f9d50cc, 0x09ed3062), WTCP(0x7f9aac5a, 0x0a0eef00), WTCP(0x7f97f93f, 0x0a30f4bf), WTCP(0x7f95373e, 0x0a5341c2), WTCP(0x7f92661b, 0x0a75d62e), WTCP(0x7f8f8596, 0x0a98b224), WTCP(0x7f8c9572, 0x0abbd5c7), WTCP(0x7f89956f, 0x0adf4137), WTCP(0x7f86854d, 0x0b02f494), WTCP(0x7f8364cd, 0x0b26effd), WTCP(0x7f8033ae, 0x0b4b338f), WTCP(0x7f7cf1ae, 0x0b6fbf67), WTCP(0x7f799e8b, 0x0b9493a0), WTCP(0x7f763a03, 0x0bb9b056), WTCP(0x7f72c3d2, 0x0bdf15a2), WTCP(0x7f6f3bb5, 0x0c04c39c), WTCP(0x7f6ba168, 0x0c2aba5d), WTCP(0x7f67f4a6, 0x0c50f9fa), WTCP(0x7f643529, 0x0c77828a), WTCP(0x7f6062ac, 0x0c9e5420), WTCP(0x7f5c7ce8, 0x0cc56ed1), WTCP(0x7f588397, 0x0cecd2ae), WTCP(0x7f547670, 0x0d147fc8), WTCP(0x7f50552c, 0x0d3c7630), WTCP(0x7f4c1f83, 0x0d64b5f6), WTCP(0x7f47d52a, 0x0d8d3f26), WTCP(0x7f4375d9, 0x0db611ce), WTCP(0x7f3f0144, 0x0ddf2dfa), WTCP(0x7f3a7723, 0x0e0893b4), WTCP(0x7f35d729, 0x0e324306), WTCP(0x7f31210a, 0x0e5c3bf9), WTCP(0x7f2c547b, 0x0e867e94), WTCP(0x7f27712e, 0x0eb10add), WTCP(0x7f2276d8, 0x0edbe0da), WTCP(0x7f1d6529, 0x0f07008e), WTCP(0x7f183bd3, 0x0f3269fc), WTCP(0x7f12fa89, 0x0f5e1d27), WTCP(0x7f0da0fb, 0x0f8a1a0e), WTCP(0x7f082ed8, 0x0fb660b1), WTCP(0x7f02a3d2, 0x0fe2f10f), WTCP(0x7efcff98, 0x100fcb25), WTCP(0x7ef741d9, 0x103ceeee), WTCP(0x7ef16a42, 0x106a5c66), WTCP(0x7eeb7884, 0x10981386), WTCP(0x7ee56c4a, 0x10c61447), WTCP(0x7edf4543, 0x10f45ea0), WTCP(0x7ed9031b, 0x1122f288), WTCP(0x7ed2a57f, 0x1151cff3), WTCP(0x7ecc2c1a, 0x1180f6d5), WTCP(0x7ec59699, 0x11b06720), WTCP(0x7ebee4a6, 0x11e020c8), WTCP(0x7eb815ed, 0x121023ba), WTCP(0x7eb12a18, 0x12406fe8), WTCP(0x7eaa20d1, 0x1271053e), WTCP(0x7ea2f9c2, 0x12a1e3a9), WTCP(0x7e9bb494, 0x12d30b15), WTCP(0x7e9450f0, 0x13047b6c), WTCP(0x7e8cce7f, 0x13363497), WTCP(0x7e852ce9, 0x1368367f), WTCP(0x7e7d6bd6, 0x139a8109), WTCP(0x7e758aee, 0x13cd141b), WTCP(0x7e6d89d9, 0x13ffef99), WTCP(0x7e65683d, 0x14331368), WTCP(0x7e5d25c1, 0x14667f67), WTCP(0x7e54c20b, 0x149a3379), WTCP(0x7e4c3cc3, 0x14ce2f7c), WTCP(0x7e43958e, 0x1502734f), WTCP(0x7e3acc11, 0x1536fece), WTCP(0x7e31dff2, 0x156bd1d6), WTCP(0x7e28d0d7, 0x15a0ec41), WTCP(0x7e1f9e63, 0x15d64de9), WTCP(0x7e16483d, 0x160bf6a5), WTCP(0x7e0cce08, 0x1641e64c), WTCP(0x7e032f6a, 0x16781cb4), WTCP(0x7df96c05, 0x16ae99b2), WTCP(0x7def837e, 0x16e55d18), WTCP(0x7de57579, 0x171c66ba), WTCP(0x7ddb419a, 0x1753b667), WTCP(0x7dd0e784, 0x178b4bef), WTCP(0x7dc666d9, 0x17c32721), WTCP(0x7dbbbf3e, 0x17fb47ca), WTCP(0x7db0f056, 0x1833adb5), WTCP(0x7da5f9c3, 0x186c58ae), WTCP(0x7d9adb29, 0x18a5487d), WTCP(0x7d8f9429, 0x18de7cec), WTCP(0x7d842467, 0x1917f5c1), WTCP(0x7d788b86, 0x1951b2c2), WTCP(0x7d6cc927, 0x198bb3b4), WTCP(0x7d60dced, 0x19c5f85a), WTCP(0x7d54c67c, 0x1a008077), WTCP(0x7d488574, 0x1a3b4bcb), WTCP(0x7d3c1979, 0x1a765a17), WTCP(0x7d2f822d, 0x1ab1ab18), WTCP(0x7d22bf32, 0x1aed3e8d), WTCP(0x7d15d02b, 0x1b291432), WTCP(0x7d08b4ba, 0x1b652bc1), WTCP(0x7cfb6c82, 0x1ba184f5), WTCP(0x7cedf725, 0x1bde1f86), WTCP(0x7ce05445, 0x1c1afb2c), WTCP(0x7cd28386, 0x1c58179c), WTCP(0x7cc48489, 0x1c95748d), WTCP(0x7cb656f3, 0x1cd311b1), WTCP(0x7ca7fa65, 0x1d10eebd), WTCP(0x7c996e83, 0x1d4f0b60), WTCP(0x7c8ab2f0, 0x1d8d674c), WTCP(0x7c7bc74f, 0x1dcc0230), WTCP(0x7c6cab44, 0x1e0adbbb), WTCP(0x7c5d5e71, 0x1e49f398), WTCP(0x7c4de07c, 0x1e894973), WTCP(0x7c3e3108, 0x1ec8dcf8), WTCP(0x7c2e4fb9, 0x1f08add0), WTCP(0x7c1e3c34, 0x1f48bba3), WTCP(0x7c0df61d, 0x1f890618), WTCP(0x7bfd7d18, 0x1fc98cd6), WTCP(0x7becd0cc, 0x200a4f80), WTCP(0x7bdbf0dd, 0x204b4dbc), WTCP(0x7bcadcf1, 0x208c872c), WTCP(0x7bb994ae, 0x20cdfb71), WTCP(0x7ba817b9, 0x210faa2c), WTCP(0x7b9665bb, 0x215192fc), WTCP(0x7b847e58, 0x2193b57f), WTCP(0x7b726139, 0x21d61153), WTCP(0x7b600e05, 0x2218a614), WTCP(0x7b4d8463, 0x225b735d), WTCP(0x7b3ac3fc, 0x229e78c7), WTCP(0x7b27cc79, 0x22e1b5eb), WTCP(0x7b149d82, 0x23252a62), WTCP(0x7b0136c1, 0x2368d5c2), WTCP(0x7aed97df, 0x23acb7a0), WTCP(0x7ad9c087, 0x23f0cf92), WTCP(0x7ac5b063, 0x24351d2a), WTCP(0x7ab1671e, 0x24799ffc), WTCP(0x7a9ce464, 0x24be5799), WTCP(0x7a8827e1, 0x25034391), WTCP(0x7a733142, 0x25486375), WTCP(0x7a5e0033, 0x258db6d2), WTCP(0x7a489461, 0x25d33d35), WTCP(0x7a32ed7c, 0x2618f62c), WTCP(0x7a1d0b31, 0x265ee143), WTCP(0x7a06ed2f, 0x26a4fe02), WTCP(0x79f09327, 0x26eb4bf5), WTCP(0x79d9fcc8, 0x2731caa3), WTCP(0x79c329c2, 0x27787995), WTCP(0x79ac19c9, 0x27bf5850), WTCP(0x7994cc8d, 0x2806665c), WTCP(0x797d41c1, 0x284da33c), WTCP(0x79657918, 0x28950e74), WTCP(0x794d7247, 0x28dca788), WTCP(0x79352d01, 0x29246dfa), WTCP(0x791ca8fc, 0x296c614a), WTCP(0x7903e5ee, 0x29b480f9), WTCP(0x78eae38d, 0x29fccc87), WTCP(0x78d1a191, 0x2a454372), WTCP(0x78b81fb1, 0x2a8de537), WTCP(0x789e5da6, 0x2ad6b155), WTCP(0x78845b29, 0x2b1fa745), WTCP(0x786a17f5, 0x2b68c684), WTCP(0x784f93c4, 0x2bb20e8c), WTCP(0x7834ce53, 0x2bfb7ed7), WTCP(0x7819c75c, 0x2c4516dc), WTCP(0x77fe7e9e, 0x2c8ed615), WTCP(0x77e2f3d7, 0x2cd8bbf7), WTCP(0x77c726c5, 0x2d22c7fa), WTCP(0x77ab1728, 0x2d6cf993), WTCP(0x778ec4c0, 0x2db75037), WTCP(0x77722f4e, 0x2e01cb59), WTCP(0x77555695, 0x2e4c6a6d), WTCP(0x77383a58, 0x2e972ce6), WTCP(0x771ada5a, 0x2ee21235), WTCP(0x76fd3660, 0x2f2d19cc), WTCP(0x76df4e30, 0x2f78431a), WTCP(0x76c12190, 0x2fc38d91), WTCP(0x76a2b047, 0x300ef89d), WTCP(0x7683fa1e, 0x305a83af), WTCP(0x7664fede, 0x30a62e34), WTCP(0x7645be51, 0x30f1f798), WTCP(0x76263842, 0x313ddf49), WTCP(0x76066c7e, 0x3189e4b1), WTCP(0x75e65ad1, 0x31d6073d), WTCP(0x75c60309, 0x32224657), WTCP(0x75a564f6, 0x326ea168), WTCP(0x75848067, 0x32bb17da), WTCP(0x7563552d, 0x3307a917), WTCP(0x7541e31a, 0x33545486), WTCP(0x75202a02, 0x33a1198e), WTCP(0x74fe29b8, 0x33edf798), WTCP(0x74dbe211, 0x343aee09), WTCP(0x74b952e3, 0x3487fc48), WTCP(0x74967c06, 0x34d521bb), WTCP(0x74735d51, 0x35225dc7), WTCP(0x744ff69f, 0x356fafcf), WTCP(0x742c47c9, 0x35bd173a), WTCP(0x740850ab, 0x360a9369), WTCP(0x73e41121, 0x365823c1), WTCP(0x73bf8909, 0x36a5c7a4), WTCP(0x739ab842, 0x36f37e75), WTCP(0x73759eab, 0x37414796), WTCP(0x73503c26, 0x378f2268), WTCP(0x732a9095, 0x37dd0e4c), WTCP(0x73049bda, 0x382b0aa4), WTCP(0x72de5ddb, 0x387916d0), WTCP(0x72b7d67d, 0x38c73230), WTCP(0x729105a6, 0x39155c24), WTCP(0x7269eb3f, 0x3963940c), WTCP(0x72428730, 0x39b1d946), WTCP(0x721ad964, 0x3a002b31), WTCP(0x71f2e1c5, 0x3a4e892c), WTCP(0x71caa042, 0x3a9cf296), WTCP(0x71a214c7, 0x3aeb66cc), WTCP(0x71793f43, 0x3b39e52c), WTCP(0x71501fa6, 0x3b886d14), WTCP(0x7126b5e3, 0x3bd6fde1), WTCP(0x70fd01eb, 0x3c2596f1), WTCP(0x70d303b2, 0x3c74379f), WTCP(0x70a8bb2e, 0x3cc2df49), WTCP(0x707e2855, 0x3d118d4c), WTCP(0x70534b1e, 0x3d604103), WTCP(0x70282381, 0x3daef9cc), WTCP(0x6ffcb17a, 0x3dfdb702), WTCP(0x6fd0f504, 0x3e4c7800), WTCP(0x6fa4ee1a, 0x3e9b3c25), WTCP(0x6f789cbb, 0x3eea02ca), WTCP(0x6f4c00e5, 0x3f38cb4b), WTCP(0x6f1f1a9a, 0x3f879505), WTCP(0x6ef1e9da, 0x3fd65f53), WTCP(0x6ec46ea9, 0x40252990), WTCP(0x6e96a90b, 0x4073f318), WTCP(0x6e689905, 0x40c2bb46), WTCP(0x6e3a3e9d, 0x41118176), WTCP(0x6e0b99dd, 0x41604504), WTCP(0x6ddcaacc, 0x41af054a), WTCP(0x6dad7177, 0x41fdc1a5), WTCP(0x6d7dede8, 0x424c7970), WTCP(0x6d4e202e, 0x429b2c06), WTCP(0x6d1e0855, 0x42e9d8c4), WTCP(0x6ceda66f, 0x43387f05), WTCP(0x6cbcfa8d, 0x43871e26), WTCP(0x6c8c04c0, 0x43d5b581), WTCP(0x6c5ac51d, 0x44244474), WTCP(0x6c293bb8, 0x4472ca5a), WTCP(0x6bf768a8, 0x44c14690), WTCP(0x6bc54c06, 0x450fb873), WTCP(0x6b92e5e9, 0x455e1f5f), WTCP(0x6b60366c, 0x45ac7ab2), WTCP(0x6b2d3dab, 0x45fac9c8), WTCP(0x6af9fbc2, 0x46490bff), WTCP(0x6ac670d1, 0x469740b5), WTCP(0x6a929cf6, 0x46e56747), WTCP(0x6a5e8053, 0x47337f13), WTCP(0x6a2a1b0a, 0x47818779), WTCP(0x69f56d3e, 0x47cf7fd6), WTCP(0x69c07715, 0x481d678a), WTCP(0x698b38b4, 0x486b3df3), WTCP(0x6955b243, 0x48b90272), WTCP(0x691fe3ec, 0x4906b466), WTCP(0x68e9cdd8, 0x49545330), WTCP(0x68b37033, 0x49a1de30), WTCP(0x687ccb29, 0x49ef54c8), WTCP(0x6845dee9, 0x4a3cb657), WTCP(0x680eaba3, 0x4a8a0242), WTCP(0x67d73187, 0x4ad737e9), WTCP(0x679f70c7, 0x4b2456af), WTCP(0x67676997, 0x4b715df7), WTCP(0x672f1c2b, 0x4bbe4d25), WTCP(0x66f688ba, 0x4c0b239c), WTCP(0x66bdaf7b, 0x4c57e0c2), WTCP(0x668490a6, 0x4ca483fa), WTCP(0x664b2c76, 0x4cf10cac), WTCP(0x66118326, 0x4d3d7a3b), WTCP(0x65d794f3, 0x4d89cc0f), WTCP(0x659d621a, 0x4dd6018f), WTCP(0x6562eada, 0x4e221a22), WTCP(0x65282f74, 0x4e6e1530), WTCP(0x64ed302b, 0x4eb9f222), WTCP(0x64b1ed40, 0x4f05b061), WTCP(0x647666f8, 0x4f514f57), WTCP(0x643a9d99, 0x4f9cce6f), WTCP(0x63fe916a, 0x4fe82d13), WTCP(0x63c242b2, 0x50336aaf), WTCP(0x6385b1bc, 0x507e86b0), WTCP(0x6348ded1, 0x50c98082), WTCP(0x630bca3f, 0x51145793), WTCP(0x62ce7451, 0x515f0b51), WTCP(0x6290dd57, 0x51a99b2b), WTCP(0x625305a0, 0x51f40692), WTCP(0x6214ed7d, 0x523e4cf5), WTCP(0x61d69541, 0x52886dc5), WTCP(0x6197fd3e, 0x52d26875), WTCP(0x615925c9, 0x531c3c77), WTCP(0x611a0f39, 0x5365e93e), WTCP(0x60dab9e3, 0x53af6e3e), WTCP(0x609b2621, 0x53f8caed), WTCP(0x605b544c, 0x5441fec0), WTCP(0x601b44bf, 0x548b092e), WTCP(0x5fdaf7d5, 0x54d3e9ae), WTCP(0x5f9a6deb, 0x551c9fb7), WTCP(0x5f59a761, 0x55652ac3), WTCP(0x5f18a494, 0x55ad8a4d), WTCP(0x5ed765e6, 0x55f5bdcd), WTCP(0x5e95ebb8, 0x563dc4c1), WTCP(0x5e54366d, 0x56859ea3), WTCP(0x5e12466a, 0x56cd4af3), WTCP(0x5dd01c13, 0x5714c92d), WTCP(0x5d8db7cf, 0x575c18d0), WTCP(0x5d4b1a05, 0x57a3395e), WTCP(0x5d08431e, 0x57ea2a56), WTCP(0x5cc53384, 0x5830eb3a), WTCP(0x5c81eba0, 0x58777b8e), WTCP(0x5c3e6bdf, 0x58bddad5), WTCP(0x5bfab4af, 0x59040893), WTCP(0x5bb6c67c, 0x594a044f), WTCP(0x5b72a1b6, 0x598fcd8e), WTCP(0x5b2e46ce, 0x59d563d9), WTCP(0x5ae9b634, 0x5a1ac6b8), WTCP(0x5aa4f05a, 0x5a5ff5b5), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow120[] = { WTCP(0x7fff4c54, 0x00d676eb), WTCP(0x7ff9af04, 0x02835b5a), WTCP(0x7fee74a2, 0x0430238f), WTCP(0x7fdd9dad, 0x05dcbcbe), WTCP(0x7fc72ae2, 0x07891418), WTCP(0x7fab1d3d, 0x093516d4), WTCP(0x7f8975f9, 0x0ae0b22c), WTCP(0x7f62368f, 0x0c8bd35e), WTCP(0x7f3560b9, 0x0e3667ad), WTCP(0x7f02f66f, 0x0fe05c64), WTCP(0x7ecaf9e5, 0x11899ed3), WTCP(0x7e8d6d91, 0x13321c53), WTCP(0x7e4a5426, 0x14d9c245), WTCP(0x7e01b096, 0x16807e15), WTCP(0x7db3860f, 0x18263d36), WTCP(0x7d5fd801, 0x19caed29), WTCP(0x7d06aa16, 0x1b6e7b7a), WTCP(0x7ca80038, 0x1d10d5c2), WTCP(0x7c43de8e, 0x1eb1e9a7), WTCP(0x7bda497d, 0x2051a4dd), WTCP(0x7b6b45a5, 0x21eff528), WTCP(0x7af6d7e6, 0x238cc85d), WTCP(0x7a7d055b, 0x25280c5e), WTCP(0x79fdd35c, 0x26c1af22), WTCP(0x7979477d, 0x28599eb0), WTCP(0x78ef678f, 0x29efc925), WTCP(0x7860399e, 0x2b841caf), WTCP(0x77cbc3f2, 0x2d168792), WTCP(0x77320d0d, 0x2ea6f827), WTCP(0x76931bae, 0x30355cdd), WTCP(0x75eef6ce, 0x31c1a43b), WTCP(0x7545a5a0, 0x334bbcde), WTCP(0x74972f92, 0x34d3957e), WTCP(0x73e39c49, 0x36591cea), WTCP(0x732af3a7, 0x37dc420c), WTCP(0x726d3dc6, 0x395cf3e9), WTCP(0x71aa82f7, 0x3adb21a1), WTCP(0x70e2cbc6, 0x3c56ba70), WTCP(0x701620f5, 0x3dcfadb0), WTCP(0x6f448b7e, 0x3f45ead8), WTCP(0x6e6e1492, 0x40b9617d), WTCP(0x6d92c59b, 0x422a0154), WTCP(0x6cb2a837, 0x4397ba32), WTCP(0x6bcdc639, 0x45027c0c), WTCP(0x6ae429ae, 0x466a36f9), WTCP(0x69f5dcd3, 0x47cedb31), WTCP(0x6902ea1d, 0x4930590f), WTCP(0x680b5c33, 0x4a8ea111), WTCP(0x670f3df3, 0x4be9a3db), WTCP(0x660e9a6a, 0x4d415234), WTCP(0x65097cdb, 0x4e959d08), WTCP(0x63fff0ba, 0x4fe6756a), WTCP(0x62f201ac, 0x5133cc94), WTCP(0x61dfbb8a, 0x527d93e6), WTCP(0x60c92a5a, 0x53c3bcea), WTCP(0x5fae5a55, 0x55063951), WTCP(0x5e8f57e2, 0x5644faf4), WTCP(0x5d6c2f99, 0x577ff3da), WTCP(0x5c44ee40, 0x58b71632), WTCP(0x5b19a0c8, 0x59ea5454), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP KBDWindow120[] = { WTCP(0x7ffffffe, 0x00017b6f), WTCP(0x7fffffef, 0x00042d2f), WTCP(0x7fffffbb, 0x000849d0), WTCP(0x7fffff36, 0x000e3494), WTCP(0x7ffffe0c, 0x00165efd), WTCP(0x7ffffbac, 0x002149be), WTCP(0x7ffff72e, 0x002f854c), WTCP(0x7fffef24, 0x0041b235), WTCP(0x7fffe167, 0x0058814f), WTCP(0x7fffcacd, 0x0074b3af), WTCP(0x7fffa6d0, 0x00971a67), WTCP(0x7fff6f1e, 0x00c0960e), WTCP(0x7fff1b12, 0x00f21602), WTCP(0x7ffe9f0b, 0x012c9775), WTCP(0x7ffdebb2, 0x01712428), WTCP(0x7ffced1b, 0x01c0d0f7), WTCP(0x7ffb89c2, 0x021cbc12), WTCP(0x7ff9a17c, 0x02860b05), WTCP(0x7ff70c39, 0x02fde875), WTCP(0x7ff398bc, 0x038581b3), WTCP(0x7fef0b3b, 0x041e040c), WTCP(0x7fe91bf3, 0x04c899f4), WTCP(0x7fe175ba, 0x05866803), WTCP(0x7fd7b493, 0x065889d5), WTCP(0x7fcb6459, 0x07400ed4), WTCP(0x7fbbff82, 0x083df6e9), WTCP(0x7fa8ee09, 0x09532f37), WTCP(0x7f91849a, 0x0a808ed1), WTCP(0x7f7503f2, 0x0bc6d381), WTCP(0x7f52989a, 0x0d269eb0), WTCP(0x7f295af4, 0x0ea07270), WTCP(0x7ef84fb6, 0x1034aeb6), WTCP(0x7ebe68c5, 0x11e38ed2), WTCP(0x7e7a8686, 0x13ad2733), WTCP(0x7e2b79a3, 0x1591636d), WTCP(0x7dd0053c, 0x179004a7), WTCP(0x7d66e18b, 0x19a8a05f), WTCP(0x7ceebef0, 0x1bda9fa2), WTCP(0x7c664953, 0x1e253ea1), WTCP(0x7bcc2be8, 0x20878cce), WTCP(0x7b1f1526, 0x23006d5d), WTCP(0x7a5dbb01, 0x258e9848), WTCP(0x7986df3e, 0x28309bc6), WTCP(0x789953e0, 0x2ae4de3e), WTCP(0x7793ff88, 0x2da9a0a8), WTCP(0x7675e1cc, 0x307d0163), WTCP(0x753e1763, 0x335cff72), WTCP(0x73ebde10, 0x36477e1f), WTCP(0x727e984e, 0x393a48f1), WTCP(0x70f5d09b, 0x3c3317f9), WTCP(0x6f513c60, 0x3f2f945c), WTCP(0x6d90be61, 0x422d5d18), WTCP(0x6bb468b1, 0x452a0bf3), WTCP(0x69bc7e1e, 0x48233a81), WTCP(0x67a97317, 0x4b16873e), WTCP(0x657bedfa, 0x4e019a9d), WTCP(0x6334c6d2, 0x50e22c0b), WTCP(0x60d50689, 0x53b606cb), WTCP(0x5e5de588, 0x567b0ea7), WTCP(0x5bd0c9c6, 0x592f4460), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow512[] = { WTCP(0x7ffff621, 0x003243f5), WTCP(0x7fffa72c, 0x0096cbc1), WTCP(0x7fff0943, 0x00fb5330), WTCP(0x7ffe1c65, 0x015fda03), WTCP(0x7ffce093, 0x01c45ffe), WTCP(0x7ffb55ce, 0x0228e4e2), WTCP(0x7ff97c18, 0x028d6870), WTCP(0x7ff75370, 0x02f1ea6c), WTCP(0x7ff4dbd9, 0x03566a96), WTCP(0x7ff21553, 0x03bae8b2), WTCP(0x7feeffe1, 0x041f6480), WTCP(0x7feb9b85, 0x0483ddc3), WTCP(0x7fe7e841, 0x04e8543e), WTCP(0x7fe3e616, 0x054cc7b1), WTCP(0x7fdf9508, 0x05b137df), WTCP(0x7fdaf519, 0x0615a48b), WTCP(0x7fd6064c, 0x067a0d76), WTCP(0x7fd0c8a3, 0x06de7262), WTCP(0x7fcb3c23, 0x0742d311), WTCP(0x7fc560cf, 0x07a72f45), WTCP(0x7fbf36aa, 0x080b86c2), WTCP(0x7fb8bdb8, 0x086fd947), WTCP(0x7fb1f5fc, 0x08d42699), WTCP(0x7faadf7c, 0x09386e78), WTCP(0x7fa37a3c, 0x099cb0a7), WTCP(0x7f9bc640, 0x0a00ece8), WTCP(0x7f93c38c, 0x0a6522fe), WTCP(0x7f8b7227, 0x0ac952aa), WTCP(0x7f82d214, 0x0b2d7baf), WTCP(0x7f79e35a, 0x0b919dcf), WTCP(0x7f70a5fe, 0x0bf5b8cb), WTCP(0x7f671a05, 0x0c59cc68), WTCP(0x7f5d3f75, 0x0cbdd865), WTCP(0x7f531655, 0x0d21dc87), WTCP(0x7f489eaa, 0x0d85d88f), WTCP(0x7f3dd87c, 0x0de9cc40), WTCP(0x7f32c3d1, 0x0e4db75b), WTCP(0x7f2760af, 0x0eb199a4), WTCP(0x7f1baf1e, 0x0f1572dc), WTCP(0x7f0faf25, 0x0f7942c7), WTCP(0x7f0360cb, 0x0fdd0926), WTCP(0x7ef6c418, 0x1040c5bb), WTCP(0x7ee9d914, 0x10a4784b), WTCP(0x7edc9fc6, 0x11082096), WTCP(0x7ecf1837, 0x116bbe60), WTCP(0x7ec14270, 0x11cf516a), WTCP(0x7eb31e78, 0x1232d979), WTCP(0x7ea4ac58, 0x1296564d), WTCP(0x7e95ec1a, 0x12f9c7aa), WTCP(0x7e86ddc6, 0x135d2d53), WTCP(0x7e778166, 0x13c0870a), WTCP(0x7e67d703, 0x1423d492), WTCP(0x7e57dea7, 0x148715ae), WTCP(0x7e47985b, 0x14ea4a1f), WTCP(0x7e37042a, 0x154d71aa), WTCP(0x7e26221f, 0x15b08c12), WTCP(0x7e14f242, 0x16139918), WTCP(0x7e0374a0, 0x1676987f), WTCP(0x7df1a942, 0x16d98a0c), WTCP(0x7ddf9034, 0x173c6d80), WTCP(0x7dcd2981, 0x179f429f), WTCP(0x7dba7534, 0x1802092c), WTCP(0x7da77359, 0x1864c0ea), WTCP(0x7d9423fc, 0x18c7699b), WTCP(0x7d808728, 0x192a0304), WTCP(0x7d6c9ce9, 0x198c8ce7), WTCP(0x7d58654d, 0x19ef0707), WTCP(0x7d43e05e, 0x1a517128), WTCP(0x7d2f0e2b, 0x1ab3cb0d), WTCP(0x7d19eebf, 0x1b161479), WTCP(0x7d048228, 0x1b784d30), WTCP(0x7ceec873, 0x1bda74f6), WTCP(0x7cd8c1ae, 0x1c3c8b8c), WTCP(0x7cc26de5, 0x1c9e90b8), WTCP(0x7cabcd28, 0x1d00843d), WTCP(0x7c94df83, 0x1d6265dd), WTCP(0x7c7da505, 0x1dc4355e), WTCP(0x7c661dbc, 0x1e25f282), WTCP(0x7c4e49b7, 0x1e879d0d), WTCP(0x7c362904, 0x1ee934c3), WTCP(0x7c1dbbb3, 0x1f4ab968), WTCP(0x7c0501d2, 0x1fac2abf), WTCP(0x7bebfb70, 0x200d888d), WTCP(0x7bd2a89e, 0x206ed295), WTCP(0x7bb9096b, 0x20d0089c), WTCP(0x7b9f1de6, 0x21312a65), WTCP(0x7b84e61f, 0x219237b5), WTCP(0x7b6a6227, 0x21f3304f), WTCP(0x7b4f920e, 0x225413f8), WTCP(0x7b3475e5, 0x22b4e274), WTCP(0x7b190dbc, 0x23159b88), WTCP(0x7afd59a4, 0x23763ef7), WTCP(0x7ae159ae, 0x23d6cc87), WTCP(0x7ac50dec, 0x243743fa), WTCP(0x7aa8766f, 0x2497a517), WTCP(0x7a8b9348, 0x24f7efa2), WTCP(0x7a6e648a, 0x2558235f), WTCP(0x7a50ea47, 0x25b84012), WTCP(0x7a332490, 0x26184581), WTCP(0x7a151378, 0x26783370), WTCP(0x79f6b711, 0x26d809a5), WTCP(0x79d80f6f, 0x2737c7e3), WTCP(0x79b91ca4, 0x27976df1), WTCP(0x7999dec4, 0x27f6fb92), WTCP(0x797a55e0, 0x2856708d), WTCP(0x795a820e, 0x28b5cca5), WTCP(0x793a6361, 0x29150fa1), WTCP(0x7919f9ec, 0x29743946), WTCP(0x78f945c3, 0x29d34958), WTCP(0x78d846fb, 0x2a323f9e), WTCP(0x78b6fda8, 0x2a911bdc), WTCP(0x789569df, 0x2aefddd8), WTCP(0x78738bb3, 0x2b4e8558), WTCP(0x7851633b, 0x2bad1221), WTCP(0x782ef08b, 0x2c0b83fa), WTCP(0x780c33b8, 0x2c69daa6), WTCP(0x77e92cd9, 0x2cc815ee), WTCP(0x77c5dc01, 0x2d263596), WTCP(0x77a24148, 0x2d843964), WTCP(0x777e5cc3, 0x2de2211e), WTCP(0x775a2e89, 0x2e3fec8b), WTCP(0x7735b6af, 0x2e9d9b70), WTCP(0x7710f54c, 0x2efb2d95), WTCP(0x76ebea77, 0x2f58a2be), WTCP(0x76c69647, 0x2fb5fab2), WTCP(0x76a0f8d2, 0x30133539), WTCP(0x767b1231, 0x30705217), WTCP(0x7654e279, 0x30cd5115), WTCP(0x762e69c4, 0x312a31f8), WTCP(0x7607a828, 0x3186f487), WTCP(0x75e09dbd, 0x31e39889), WTCP(0x75b94a9c, 0x32401dc6), WTCP(0x7591aedd, 0x329c8402), WTCP(0x7569ca99, 0x32f8cb07), WTCP(0x75419de7, 0x3354f29b), WTCP(0x751928e0, 0x33b0fa84), WTCP(0x74f06b9e, 0x340ce28b), WTCP(0x74c7663a, 0x3468aa76), WTCP(0x749e18cd, 0x34c4520d), WTCP(0x74748371, 0x351fd918), WTCP(0x744aa63f, 0x357b3f5d), WTCP(0x74208150, 0x35d684a6), WTCP(0x73f614c0, 0x3631a8b8), WTCP(0x73cb60a8, 0x368cab5c), WTCP(0x73a06522, 0x36e78c5b), WTCP(0x73752249, 0x37424b7b), WTCP(0x73499838, 0x379ce885), WTCP(0x731dc70a, 0x37f76341), WTCP(0x72f1aed9, 0x3851bb77), WTCP(0x72c54fc1, 0x38abf0ef), WTCP(0x7298a9dd, 0x39060373), WTCP(0x726bbd48, 0x395ff2c9), WTCP(0x723e8a20, 0x39b9bebc), WTCP(0x7211107e, 0x3a136712), WTCP(0x71e35080, 0x3a6ceb96), WTCP(0x71b54a41, 0x3ac64c0f), WTCP(0x7186fdde, 0x3b1f8848), WTCP(0x71586b74, 0x3b78a007), WTCP(0x7129931f, 0x3bd19318), WTCP(0x70fa74fc, 0x3c2a6142), WTCP(0x70cb1128, 0x3c830a50), WTCP(0x709b67c0, 0x3cdb8e09), WTCP(0x706b78e3, 0x3d33ec39), WTCP(0x703b44ad, 0x3d8c24a8), WTCP(0x700acb3c, 0x3de4371f), WTCP(0x6fda0cae, 0x3e3c2369), WTCP(0x6fa90921, 0x3e93e950), WTCP(0x6f77c0b3, 0x3eeb889c), WTCP(0x6f463383, 0x3f430119), WTCP(0x6f1461b0, 0x3f9a5290), WTCP(0x6ee24b57, 0x3ff17cca), WTCP(0x6eaff099, 0x40487f94), WTCP(0x6e7d5193, 0x409f5ab6), WTCP(0x6e4a6e66, 0x40f60dfb), WTCP(0x6e174730, 0x414c992f), WTCP(0x6de3dc11, 0x41a2fc1a), WTCP(0x6db02d29, 0x41f93689), WTCP(0x6d7c3a98, 0x424f4845), WTCP(0x6d48047e, 0x42a5311b), WTCP(0x6d138afb, 0x42faf0d4), WTCP(0x6cdece2f, 0x4350873c), WTCP(0x6ca9ce3b, 0x43a5f41e), WTCP(0x6c748b3f, 0x43fb3746), WTCP(0x6c3f055d, 0x4450507e), WTCP(0x6c093cb6, 0x44a53f93), WTCP(0x6bd3316a, 0x44fa0450), WTCP(0x6b9ce39b, 0x454e9e80), WTCP(0x6b66536b, 0x45a30df0), WTCP(0x6b2f80fb, 0x45f7526b), WTCP(0x6af86c6c, 0x464b6bbe), WTCP(0x6ac115e2, 0x469f59b4), WTCP(0x6a897d7d, 0x46f31c1a), WTCP(0x6a51a361, 0x4746b2bc), WTCP(0x6a1987b0, 0x479a1d67), WTCP(0x69e12a8c, 0x47ed5be6), WTCP(0x69a88c19, 0x48406e08), WTCP(0x696fac78, 0x48935397), WTCP(0x69368bce, 0x48e60c62), WTCP(0x68fd2a3d, 0x49389836), WTCP(0x68c387e9, 0x498af6df), WTCP(0x6889a4f6, 0x49dd282a), WTCP(0x684f8186, 0x4a2f2be6), WTCP(0x68151dbe, 0x4a8101de), WTCP(0x67da79c3, 0x4ad2a9e2), WTCP(0x679f95b7, 0x4b2423be), WTCP(0x676471c0, 0x4b756f40), WTCP(0x67290e02, 0x4bc68c36), WTCP(0x66ed6aa1, 0x4c177a6e), WTCP(0x66b187c3, 0x4c6839b7), WTCP(0x6675658c, 0x4cb8c9dd), WTCP(0x66390422, 0x4d092ab0), WTCP(0x65fc63a9, 0x4d595bfe), WTCP(0x65bf8447, 0x4da95d96), WTCP(0x65826622, 0x4df92f46), WTCP(0x6545095f, 0x4e48d0dd), WTCP(0x65076e25, 0x4e984229), WTCP(0x64c99498, 0x4ee782fb), WTCP(0x648b7ce0, 0x4f369320), WTCP(0x644d2722, 0x4f857269), WTCP(0x640e9386, 0x4fd420a4), WTCP(0x63cfc231, 0x50229da1), WTCP(0x6390b34a, 0x5070e92f), WTCP(0x635166f9, 0x50bf031f), WTCP(0x6311dd64, 0x510ceb40), WTCP(0x62d216b3, 0x515aa162), WTCP(0x6292130c, 0x51a82555), WTCP(0x6251d298, 0x51f576ea), WTCP(0x6211557e, 0x524295f0), WTCP(0x61d09be5, 0x528f8238), WTCP(0x618fa5f7, 0x52dc3b92), WTCP(0x614e73da, 0x5328c1d0), WTCP(0x610d05b7, 0x537514c2), WTCP(0x60cb5bb7, 0x53c13439), WTCP(0x60897601, 0x540d2005), WTCP(0x604754bf, 0x5458d7f9), WTCP(0x6004f819, 0x54a45be6), WTCP(0x5fc26038, 0x54efab9c), WTCP(0x5f7f8d46, 0x553ac6ee), WTCP(0x5f3c7f6b, 0x5585adad), WTCP(0x5ef936d1, 0x55d05faa), WTCP(0x5eb5b3a2, 0x561adcb9), WTCP(0x5e71f606, 0x566524aa), WTCP(0x5e2dfe29, 0x56af3750), WTCP(0x5de9cc33, 0x56f9147e), WTCP(0x5da5604f, 0x5742bc06), WTCP(0x5d60baa7, 0x578c2dba), WTCP(0x5d1bdb65, 0x57d5696d), WTCP(0x5cd6c2b5, 0x581e6ef1), WTCP(0x5c9170bf, 0x58673e1b), WTCP(0x5c4be5b0, 0x58afd6bd), WTCP(0x5c0621b2, 0x58f838a9), WTCP(0x5bc024f0, 0x594063b5), WTCP(0x5b79ef96, 0x598857b2), WTCP(0x5b3381ce, 0x59d01475), WTCP(0x5aecdbc5, 0x5a1799d1), WTCP(0x5aa5fda5, 0x5a5ee79a), }; /* The window coefficients are calculated according to the formula: * N=FRAME_LEN_LONG_LD480 * win[n]=sin(pi*(n+0.5)/(2*N)) for n=0,..,N-1 */ RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_WTP SineWindow480[480] = { WTCP(0x7ffff4c5, 0x00359dd2), WTCP(0x7fff9aef, 0x00a0d951), WTCP(0x7ffee744, 0x010c1460), WTCP(0x7ffdd9c4, 0x01774eb2), WTCP(0x7ffc726f, 0x01e287fc), WTCP(0x7ffab147, 0x024dbff4), WTCP(0x7ff8964d, 0x02b8f64e), WTCP(0x7ff62182, 0x03242abf), WTCP(0x7ff352e8, 0x038f5cfb), WTCP(0x7ff02a82, 0x03fa8cb8), WTCP(0x7feca851, 0x0465b9aa), WTCP(0x7fe8cc57, 0x04d0e386), WTCP(0x7fe49698, 0x053c0a01), WTCP(0x7fe00716, 0x05a72ccf), WTCP(0x7fdb1dd5, 0x06124ba5), WTCP(0x7fd5dad8, 0x067d6639), WTCP(0x7fd03e23, 0x06e87c3f), WTCP(0x7fca47b9, 0x07538d6b), WTCP(0x7fc3f7a0, 0x07be9973), WTCP(0x7fbd4dda, 0x0829a00c), WTCP(0x7fb64a6e, 0x0894a0ea), WTCP(0x7faeed5f, 0x08ff9bc2), WTCP(0x7fa736b4, 0x096a9049), WTCP(0x7f9f2671, 0x09d57e35), WTCP(0x7f96bc9c, 0x0a40653a), WTCP(0x7f8df93c, 0x0aab450d), WTCP(0x7f84dc55, 0x0b161d63), WTCP(0x7f7b65ef, 0x0b80edf1), WTCP(0x7f719611, 0x0bebb66c), WTCP(0x7f676cc0, 0x0c56768a), WTCP(0x7f5cea05, 0x0cc12dff), WTCP(0x7f520de6, 0x0d2bdc80), WTCP(0x7f46d86c, 0x0d9681c2), WTCP(0x7f3b499d, 0x0e011d7c), WTCP(0x7f2f6183, 0x0e6baf61), WTCP(0x7f232026, 0x0ed63727), WTCP(0x7f16858e, 0x0f40b483), WTCP(0x7f0991c4, 0x0fab272b), WTCP(0x7efc44d0, 0x10158ed4), WTCP(0x7eee9ebe, 0x107feb33), WTCP(0x7ee09f95, 0x10ea3bfd), WTCP(0x7ed24761, 0x115480e9), WTCP(0x7ec3962a, 0x11beb9aa), WTCP(0x7eb48bfb, 0x1228e5f8), WTCP(0x7ea528e0, 0x12930586), WTCP(0x7e956ce1, 0x12fd180b), WTCP(0x7e85580c, 0x13671d3d), WTCP(0x7e74ea6a, 0x13d114d0), WTCP(0x7e642408, 0x143afe7b), WTCP(0x7e5304f2, 0x14a4d9f4), WTCP(0x7e418d32, 0x150ea6ef), WTCP(0x7e2fbcd6, 0x15786522), WTCP(0x7e1d93ea, 0x15e21445), WTCP(0x7e0b127a, 0x164bb40b), WTCP(0x7df83895, 0x16b5442b), WTCP(0x7de50646, 0x171ec45c), WTCP(0x7dd17b9c, 0x17883452), WTCP(0x7dbd98a4, 0x17f193c5), WTCP(0x7da95d6c, 0x185ae269), WTCP(0x7d94ca03, 0x18c41ff6), WTCP(0x7d7fde76, 0x192d4c21), WTCP(0x7d6a9ad5, 0x199666a0), WTCP(0x7d54ff2e, 0x19ff6f2a), WTCP(0x7d3f0b90, 0x1a686575), WTCP(0x7d28c00c, 0x1ad14938), WTCP(0x7d121cb0, 0x1b3a1a28), WTCP(0x7cfb218c, 0x1ba2d7fc), WTCP(0x7ce3ceb2, 0x1c0b826a), WTCP(0x7ccc2430, 0x1c74192a), WTCP(0x7cb42217, 0x1cdc9bf2), WTCP(0x7c9bc87a, 0x1d450a78), WTCP(0x7c831767, 0x1dad6473), WTCP(0x7c6a0ef2, 0x1e15a99a), WTCP(0x7c50af2b, 0x1e7dd9a4), WTCP(0x7c36f824, 0x1ee5f447), WTCP(0x7c1ce9ef, 0x1f4df93a), WTCP(0x7c02849f, 0x1fb5e836), WTCP(0x7be7c847, 0x201dc0ef), WTCP(0x7bccb4f8, 0x2085831f), WTCP(0x7bb14ac5, 0x20ed2e7b), WTCP(0x7b9589c3, 0x2154c2bb), WTCP(0x7b797205, 0x21bc3f97), WTCP(0x7b5d039e, 0x2223a4c5), WTCP(0x7b403ea2, 0x228af1fe), WTCP(0x7b232325, 0x22f226f8), WTCP(0x7b05b13d, 0x2359436c), WTCP(0x7ae7e8fc, 0x23c04710), WTCP(0x7ac9ca7a, 0x2427319d), WTCP(0x7aab55ca, 0x248e02cb), WTCP(0x7a8c8b01, 0x24f4ba50), WTCP(0x7a6d6a37, 0x255b57e6), WTCP(0x7a4df380, 0x25c1db44), WTCP(0x7a2e26f2, 0x26284422), WTCP(0x7a0e04a4, 0x268e9238), WTCP(0x79ed8cad, 0x26f4c53e), WTCP(0x79ccbf22, 0x275adcee), WTCP(0x79ab9c1c, 0x27c0d8fe), WTCP(0x798a23b1, 0x2826b928), WTCP(0x796855f9, 0x288c7d24), WTCP(0x7946330c, 0x28f224ab), WTCP(0x7923bb01, 0x2957af74), WTCP(0x7900edf2, 0x29bd1d3a), WTCP(0x78ddcbf5, 0x2a226db5), WTCP(0x78ba5524, 0x2a87a09d), WTCP(0x78968998, 0x2aecb5ac), WTCP(0x7872696a, 0x2b51ac9a), WTCP(0x784df4b3, 0x2bb68522), WTCP(0x78292b8d, 0x2c1b3efb), WTCP(0x78040e12, 0x2c7fd9e0), WTCP(0x77de9c5b, 0x2ce45589), WTCP(0x77b8d683, 0x2d48b1b1), WTCP(0x7792bca5, 0x2dacee11), WTCP(0x776c4edb, 0x2e110a62), WTCP(0x77458d40, 0x2e75065e), WTCP(0x771e77f0, 0x2ed8e1c0), WTCP(0x76f70f05, 0x2f3c9c40), WTCP(0x76cf529c, 0x2fa03599), WTCP(0x76a742d1, 0x3003ad85), WTCP(0x767edfbe, 0x306703bf), WTCP(0x76562982, 0x30ca3800), WTCP(0x762d2038, 0x312d4a03), WTCP(0x7603c3fd, 0x31903982), WTCP(0x75da14ef, 0x31f30638), WTCP(0x75b01329, 0x3255afe0), WTCP(0x7585becb, 0x32b83634), WTCP(0x755b17f2, 0x331a98ef), WTCP(0x75301ebb, 0x337cd7cd), WTCP(0x7504d345, 0x33def287), WTCP(0x74d935ae, 0x3440e8da), WTCP(0x74ad4615, 0x34a2ba81), WTCP(0x74810499, 0x35046736), WTCP(0x74547158, 0x3565eeb6), WTCP(0x74278c72, 0x35c750bc), WTCP(0x73fa5607, 0x36288d03), WTCP(0x73ccce36, 0x3689a348), WTCP(0x739ef51f, 0x36ea9346), WTCP(0x7370cae2, 0x374b5cb9), WTCP(0x73424fa0, 0x37abff5d), WTCP(0x73138379, 0x380c7aee), WTCP(0x72e4668f, 0x386ccf2a), WTCP(0x72b4f902, 0x38ccfbcb), WTCP(0x72853af3, 0x392d008f), WTCP(0x72552c85, 0x398cdd32), WTCP(0x7224cdd8, 0x39ec9172), WTCP(0x71f41f0f, 0x3a4c1d09), WTCP(0x71c3204c, 0x3aab7fb7), WTCP(0x7191d1b1, 0x3b0ab937), WTCP(0x71603361, 0x3b69c947), WTCP(0x712e457f, 0x3bc8afa5), WTCP(0x70fc082d, 0x3c276c0d), WTCP(0x70c97b90, 0x3c85fe3d), WTCP(0x70969fca, 0x3ce465f3), WTCP(0x706374ff, 0x3d42a2ec), WTCP(0x702ffb54, 0x3da0b4e7), WTCP(0x6ffc32eb, 0x3dfe9ba1), WTCP(0x6fc81bea, 0x3e5c56d8), WTCP(0x6f93b676, 0x3eb9e64b), WTCP(0x6f5f02b2, 0x3f1749b8), WTCP(0x6f2a00c4, 0x3f7480dd), WTCP(0x6ef4b0d1, 0x3fd18b7a), WTCP(0x6ebf12ff, 0x402e694c), WTCP(0x6e892772, 0x408b1a12), WTCP(0x6e52ee52, 0x40e79d8c), WTCP(0x6e1c67c4, 0x4143f379), WTCP(0x6de593ee, 0x41a01b97), WTCP(0x6dae72f7, 0x41fc15a6), WTCP(0x6d770506, 0x4257e166), WTCP(0x6d3f4a40, 0x42b37e96), WTCP(0x6d0742cf, 0x430eecf6), WTCP(0x6cceeed8, 0x436a2c45), WTCP(0x6c964e83, 0x43c53c44), WTCP(0x6c5d61f9, 0x44201cb2), WTCP(0x6c242960, 0x447acd50), WTCP(0x6beaa4e2, 0x44d54ddf), WTCP(0x6bb0d4a7, 0x452f9e1e), WTCP(0x6b76b8d6, 0x4589bdcf), WTCP(0x6b3c519a, 0x45e3acb1), WTCP(0x6b019f1a, 0x463d6a87), WTCP(0x6ac6a180, 0x4696f710), WTCP(0x6a8b58f6, 0x46f0520f), WTCP(0x6a4fc5a6, 0x47497b44), WTCP(0x6a13e7b8, 0x47a27271), WTCP(0x69d7bf57, 0x47fb3757), WTCP(0x699b4cad, 0x4853c9b9), WTCP(0x695e8fe5, 0x48ac2957), WTCP(0x69218929, 0x490455f4), WTCP(0x68e438a4, 0x495c4f52), WTCP(0x68a69e81, 0x49b41533), WTCP(0x6868baec, 0x4a0ba75b), WTCP(0x682a8e0f, 0x4a63058a), WTCP(0x67ec1817, 0x4aba2f84), WTCP(0x67ad592f, 0x4b11250c), WTCP(0x676e5183, 0x4b67e5e4), WTCP(0x672f013f, 0x4bbe71d1), WTCP(0x66ef6891, 0x4c14c894), WTCP(0x66af87a4, 0x4c6ae9f2), WTCP(0x666f5ea6, 0x4cc0d5ae), WTCP(0x662eedc3, 0x4d168b8b), WTCP(0x65ee3529, 0x4d6c0b4e), WTCP(0x65ad3505, 0x4dc154bb), WTCP(0x656bed84, 0x4e166795), WTCP(0x652a5ed6, 0x4e6b43a2), WTCP(0x64e88926, 0x4ebfe8a5), WTCP(0x64a66ca5, 0x4f145662), WTCP(0x6464097f, 0x4f688ca0), WTCP(0x64215fe5, 0x4fbc8b22), WTCP(0x63de7003, 0x501051ae), WTCP(0x639b3a0b, 0x5063e008), WTCP(0x6357be2a, 0x50b735f8), WTCP(0x6313fc90, 0x510a5340), WTCP(0x62cff56c, 0x515d37a9), WTCP(0x628ba8ef, 0x51afe2f6), WTCP(0x62471749, 0x520254ef), WTCP(0x620240a8, 0x52548d59), WTCP(0x61bd253f, 0x52a68bfb), WTCP(0x6177c53c, 0x52f8509b), WTCP(0x613220d2, 0x5349daff), WTCP(0x60ec3830, 0x539b2af0), WTCP(0x60a60b88, 0x53ec4032), WTCP(0x605f9b0b, 0x543d1a8e), WTCP(0x6018e6eb, 0x548db9cb), WTCP(0x5fd1ef59, 0x54de1db1), WTCP(0x5f8ab487, 0x552e4605), WTCP(0x5f4336a7, 0x557e3292), WTCP(0x5efb75ea, 0x55cde31e), WTCP(0x5eb37285, 0x561d5771), WTCP(0x5e6b2ca8, 0x566c8f55), WTCP(0x5e22a487, 0x56bb8a90), WTCP(0x5dd9da55, 0x570a48ec), WTCP(0x5d90ce45, 0x5758ca31), WTCP(0x5d47808a, 0x57a70e29), WTCP(0x5cfdf157, 0x57f5149d), WTCP(0x5cb420e0, 0x5842dd54), WTCP(0x5c6a0f59, 0x5890681a), WTCP(0x5c1fbcf6, 0x58ddb4b8), WTCP(0x5bd529eb, 0x592ac2f7), WTCP(0x5b8a566c, 0x597792a1), WTCP(0x5b3f42ae, 0x59c42381), WTCP(0x5af3eee6, 0x5a107561), WTCP(0x5aa85b48, 0x5a5c880a), }; /** * \brief Helper table containing the length, rasterand shape mapping to individual window slope tables. * [0: sine ][0: radix2 raster ][ceil(log2(length)) length 4 .. 1024 ] * [1: 10ms raster ][ceil(log2(length)) length 3.25 .. 960 ] * [2: 3/4 of radix 2 raster][ceil(log2(length)) length 3 .. 768 ] * [1: KBD ][0: radix2 raster ][ceil(log2(length)) length 128 .. 1024 ] * [1: 10ms raster ][ceil(log2(length)) length 120 .. 960 ] * [2: 3/4 of radix 2 raster][ceil(log2(length)) length 96 .. 768 ] */ const FIXP_WTP *const windowSlopes[2][3][9] = { { /* Sine */ { /* Radix 2 */ NULL, NULL, NULL, SineWindow32, SineWindow64, SineWindow128, NULL, SineWindow512, SineWindow1024 }, { /* 10ms raster */ NULL, /* 3.25 */ NULL, /* 7.5 */ NULL, NULL, NULL, SineWindow120, NULL, SineWindow480, SineWindow960 }, { /* 3/4 radix2 raster */ NULL, /* 3 */ NULL, /* 6 */ #ifdef INCLUDE_SineWindow12 SineWindow12, #else NULL, #endif NULL, NULL, NULL, NULL, NULL, NULL } }, { /* KBD */ { /* Radix 2 */ KBDWindow128, NULL, SineWindow512, KBDWindow1024 }, { /* 10ms raster */ KBDWindow120, NULL, SineWindow480, KBDWindow960 }, { /* 3/4 radix2 raster */ NULL, NULL, NULL, NULL } } }; const FIXP_WTP * FDKgetWindowSlope(int length, int shape) { const FIXP_WTP * w = NULL; int raster, ld2_length; /* Get ld2 of length - 2 + 1 -2: because first table entry is window of size 4 +1: because we already include +1 because of ceil(log2(length)) */ ld2_length = DFRACT_BITS-1-fNormz((FIXP_DBL)length) - 1; /* Extract sort of "eigenvalue" (the 4 left most bits) of length. */ switch ( (length) >> (ld2_length-2) ) { case 0x8: /* radix 2 */ raster = 0; ld2_length--; /* revert + 1 because of ceil(log2(length)) from above. */ break; case 0xf: /* 10 ms */ raster = 1; break; case 0xc: /* 3/4 of radix 2 */ raster = 2; break; default: raster = 0; break; } /* The table for sine windows (shape == 0) is 5 entries longer. */ if (shape == 1) { ld2_length-=5; } /* Look up table */ w = windowSlopes[shape&1][raster][ld2_length]; FDK_ASSERT(w != NULL); return w; } /* * QMF filter and twiddle tables */ #ifdef QMF_COEFF_16BIT #define QFC(x) FX_DBL2FXCONST_SGL(x) #define QTCFL(x) FL2FXCONST_SGL(x) #define QTC(x) FX_DBL2FXCONST_SGL(x) #else #define QFC(x) (x) #define QTCFL(x) FL2FXCONST_DBL(x) #define QTC(x) (x) #endif /* ARCH_PREFER_MULT_32x16 */ #ifndef LOW_POWER_SBR_ONLY /*! \name QMF-Twiddle \brief QMF twiddle factors L=32, gain=2.0, angle = 0.75 */ const FIXP_QTW qmf_phaseshift_cos32[32] = { QTCFL( 0.99932238458835f),QTCFL( 0.99390697000236f),QTCFL( 0.98310548743122f),QTCFL( 0.96697647104485f), QTCFL( 0.94560732538052f),QTCFL( 0.91911385169006f),QTCFL( 0.88763962040285f),QTCFL( 0.85135519310527f), QTCFL( 0.81045719825259f),QTCFL( 0.76516726562246f),QTCFL( 0.71573082528382f),QTCFL( 0.66241577759017f), QTCFL( 0.60551104140433f),QTCFL( 0.54532498842205f),QTCFL( 0.48218377207912f),QTCFL( 0.41642956009764f), QTCFL( 0.34841868024943f),QTCFL( 0.27851968938505f),QTCFL( 0.20711137619222f),QTCFL( 0.13458070850713f), QTCFL( 0.06132073630221f),QTCFL(-0.01227153828572f),QTCFL(-0.08579731234444f),QTCFL(-0.15885814333386f), QTCFL(-0.23105810828067f),QTCFL(-0.30200594931923f),QTCFL(-0.37131719395184f),QTCFL(-0.43861623853853f), QTCFL(-0.50353838372572f),QTCFL(-0.56573181078361f),QTCFL(-0.62485948814239f),QTCFL(-0.68060099779545f) }; const FIXP_QTW qmf_phaseshift_sin32[32] = { QTCFL( 0.03680722294136f),QTCFL( 0.11022220729388f),QTCFL( 0.18303988795514f),QTCFL( 0.25486565960451f), QTCFL( 0.32531029216226f),QTCFL( 0.39399204006105f),QTCFL( 0.46053871095824f),QTCFL( 0.52458968267847f), QTCFL( 0.58579785745644f),QTCFL( 0.64383154288979f),QTCFL( 0.69837624940897f),QTCFL( 0.74913639452346f), QTCFL( 0.79583690460888f),QTCFL( 0.83822470555484f),QTCFL( 0.87607009419541f),QTCFL( 0.90916798309052f), QTCFL( 0.93733901191257f),QTCFL( 0.96043051941557f),QTCFL( 0.97831737071963f),QTCFL( 0.99090263542778f), QTCFL( 0.99811811290015f),QTCFL( 0.99992470183914f),QTCFL( 0.99631261218278f),QTCFL( 0.98730141815786f), QTCFL( 0.97293995220556f),QTCFL( 0.95330604035419f),QTCFL( 0.92850608047322f),QTCFL( 0.89867446569395f), QTCFL( 0.86397285612159f),QTCFL( 0.82458930278503f),QTCFL( 0.78073722857209f),QTCFL( 0.73265427167241f) }; const FIXP_QTW qmf_phaseshift_cos64[64] = { QTC(0x7ff62181), QTC(0x7fa736b3), QTC(0x7f0991c3), QTC(0x7e1d93e9), QTC(0x7ce3ceb1), QTC(0x7b5d039d), QTC(0x798a23b0), QTC(0x776c4eda), QTC(0x7504d344), QTC(0x72552c84), QTC(0x6f5f02b1), QTC(0x6c24295f), QTC(0x68a69e80), QTC(0x64e88925), QTC(0x60ec382f), QTC(0x5cb420df), QTC(0x5842dd54), QTC(0x539b2aef), QTC(0x4ebfe8a4), QTC(0x49b41533), QTC(0x447acd50), QTC(0x3f1749b7), QTC(0x398cdd32), QTC(0x33def287), QTC(0x2e110a62), QTC(0x2826b928), QTC(0x2223a4c5), QTC(0x1c0b826a), QTC(0x15e21444), QTC(0x0fab272b), QTC(0x096a9049), QTC(0x03242abf), QTC(0xfcdbd541), QTC(0xf6956fb7), QTC(0xf054d8d5), QTC(0xea1debbc), QTC(0xe3f47d96), QTC(0xdddc5b3b), QTC(0xd7d946d8), QTC(0xd1eef59e), QTC(0xcc210d79), QTC(0xc67322ce), QTC(0xc0e8b649), QTC(0xbb8532b0), QTC(0xb64beacd), QTC(0xb140175c), QTC(0xac64d511), QTC(0xa7bd22ac), QTC(0xa34bdf21), QTC(0x9f13c7d1), QTC(0x9b1776db), QTC(0x97596180), QTC(0x93dbd6a1), QTC(0x90a0fd4f), QTC(0x8daad37c), QTC(0x8afb2cbc), QTC(0x8893b126), QTC(0x8675dc50), QTC(0x84a2fc63), QTC(0x831c314f), QTC(0x81e26c17), QTC(0x80f66e3d), QTC(0x8058c94d), QTC(0x8009de7f) }; const FIXP_QTW qmf_phaseshift_sin64[64] = { QTC(0x03242abf), QTC(0x096a9049), QTC(0x0fab272b), QTC(0x15e21444), QTC(0x1c0b826a), QTC(0x2223a4c5), QTC(0x2826b928), QTC(0x2e110a62), QTC(0x33def287), QTC(0x398cdd32), QTC(0x3f1749b7), QTC(0x447acd50), QTC(0x49b41533), QTC(0x4ebfe8a4), QTC(0x539b2aef), QTC(0x5842dd54), QTC(0x5cb420df), QTC(0x60ec382f), QTC(0x64e88925), QTC(0x68a69e80), QTC(0x6c24295f), QTC(0x6f5f02b1), QTC(0x72552c84), QTC(0x7504d344), QTC(0x776c4eda), QTC(0x798a23b0), QTC(0x7b5d039d), QTC(0x7ce3ceb1), QTC(0x7e1d93e9), QTC(0x7f0991c3), QTC(0x7fa736b3), QTC(0x7ff62181), QTC(0x7ff62181), QTC(0x7fa736b3), QTC(0x7f0991c3), QTC(0x7e1d93e9), QTC(0x7ce3ceb1), QTC(0x7b5d039d), QTC(0x798a23b0), QTC(0x776c4eda), QTC(0x7504d344), QTC(0x72552c84), QTC(0x6f5f02b1), QTC(0x6c24295f), QTC(0x68a69e80), QTC(0x64e88925), QTC(0x60ec382f), QTC(0x5cb420df), QTC(0x5842dd54), QTC(0x539b2aef), QTC(0x4ebfe8a4), QTC(0x49b41533), QTC(0x447acd50), QTC(0x3f1749b7), QTC(0x398cdd32), QTC(0x33def287), QTC(0x2e110a62), QTC(0x2826b928), QTC(0x2223a4c5), QTC(0x1c0b826a), QTC(0x15e21444), QTC(0x0fab272b), QTC(0x096a9049), QTC(0x03242abf) }; //@} #endif /* #ifdef LOW_POWER_SBR_ONLY */ /*! \name QMF \brief QMF-Table 64 channels, N = 640, optimized by PE 010516 The coeffs are rearranged compared with the reference in the following way, exploiting symmetry : sbr_qmf_64[5] = p_64_640_qmf[0]; sbr_qmf_64[6] = p_64_640_qmf[128]; sbr_qmf_64[7] = p_64_640_qmf[256]; sbr_qmf_64[8] = p_64_640_qmf[384]; sbr_qmf_64[9] = p_64_640_qmf[512]; sbr_qmf_64[10] = p_64_640_qmf[1]; sbr_qmf_64[11] = p_64_640_qmf[129]; sbr_qmf_64[12] = p_64_640_qmf[257]; sbr_qmf_64[13] = p_64_640_qmf[385]; sbr_qmf_64[14] = p_64_640_qmf[513]; . . . sbr_qmf_64_640_qmf[315] = p_64_640_qmf[62]; sbr_qmf_64_640_qmf[316] = p_64_640_qmf[190]; sbr_qmf_64_640_qmf[317] = p_64_640_qmf[318]; sbr_qmf_64_640_qmf[318] = p_64_640_qmf[446]; sbr_qmf_64_640_qmf[319] = p_64_640_qmf[574]; sbr_qmf_64_640_qmf[320] = p_64_640_qmf[63]; sbr_qmf_64_640_qmf[321] = p_64_640_qmf[191]; sbr_qmf_64_640_qmf[322] = p_64_640_qmf[319]; sbr_qmf_64_640_qmf[323] = p_64_640_qmf[447]; sbr_qmf_64_640_qmf[324] = p_64_640_qmf[575]; sbr_qmf_64_640_qmf[319] = p_64_640_qmf[64]; sbr_qmf_64_640_qmf[318] = p_64_640_qmf[192]; sbr_qmf_64_640_qmf[317] = p_64_640_qmf[320]; sbr_qmf_64_640_qmf[316] = p_64_640_qmf[448]; sbr_qmf_64_640_qmf[315] = p_64_640_qmf[576]; sbr_qmf_64_640_qmf[314] = p_64_640_qmf[65]; sbr_qmf_64_640_qmf[313] = p_64_640_qmf[193]; sbr_qmf_64_640_qmf[312] = p_64_640_qmf[321]; sbr_qmf_64_640_qmf[311] = p_64_640_qmf[449]; sbr_qmf_64_640_qmf[310] = p_64_640_qmf[577]; . . . sbr_qmf_64[9] = p_64_640_qmf[126] sbr_qmf_64[8] = p_64_640_qmf[254]; sbr_qmf_64[7] = p_64_640_qmf[382]; sbr_qmf_64[6] = p_64_640_qmf[510]; sbr_qmf_64[5] = p_64_640_qmf[638]; sbr_qmf_64[4] = p_64_640_qmf[127] sbr_qmf_64[3] = p_64_640_qmf[255]; sbr_qmf_64[2] = p_64_640_qmf[383]; sbr_qmf_64[1] = p_64_640_qmf[511]; sbr_qmf_64[0] = p_64_640_qmf[639]; Max sum of all FIR filter absolute coefficients is: 0x7FF5B201 thus, the filter output is not required to be scaled. \showinitializer */ //@{ #if QMF_NO_POLY==5 LNK_SECTION_CONSTDATA_L1 RAM_ALIGN const FIXP_PFT qmf_64[QMF640_PFT_TABLE_SIZE+QMF_NO_POLY] = { QFC(0x00000000), QFC(0x01b2e41d), QFC(0x2e3a7532), QFC(0xd1c58ace), QFC(0xfe4d1be3), QFC(0xffede50e), QFC(0x01d78bfc), QFC(0x2faa221c), QFC(0xd3337b3e), QFC(0xfe70b8d1), QFC(0xffed978a), QFC(0x01fd3ba0), QFC(0x311af3a4), QFC(0xd49fd55f), QFC(0xfe933dc0), QFC(0xffefc9b9), QFC(0x02244a24), QFC(0x328cc6f0), QFC(0xd60a46e6), QFC(0xfeb48d0d), QFC(0xfff0065d), QFC(0x024bf7a1), QFC(0x33ff670e), QFC(0xd7722f04), QFC(0xfed4bec3), QFC(0xffeff6ca), QFC(0x0274ba43), QFC(0x3572ec70), QFC(0xd8d7f220), QFC(0xfef3f6ab), QFC(0xffef7b8b), QFC(0x029e35b4), QFC(0x36e69691), QFC(0xda3b176a), QFC(0xff120d70), QFC(0xffeedfa4), QFC(0x02c89901), QFC(0x385a49c3), QFC(0xdb9b5b12), QFC(0xff2ef725), QFC(0xffee1650), QFC(0x02f3e48d), QFC(0x39ce0477), QFC(0xdcf898fb), QFC(0xff4aabc8), QFC(0xffed651d), QFC(0x03201116), QFC(0x3b415115), QFC(0xde529087), QFC(0xff6542d1), QFC(0xffecc31b), QFC(0x034d01f1), QFC(0x3cb41219), QFC(0xdfa93ab5), QFC(0xff7ee3f1), QFC(0xffebe77b), QFC(0x037ad438), QFC(0x3e25b17e), QFC(0xe0fc421e), QFC(0xff975c01), QFC(0xffeb50b2), QFC(0x03a966bb), QFC(0x3f962fb8), QFC(0xe24b8f67), QFC(0xffaea5d6), QFC(0xffea9192), QFC(0x03d8afe6), QFC(0x41058bc5), QFC(0xe396a45d), QFC(0xffc4e365), QFC(0xffe9ca76), QFC(0x04083fec), QFC(0x4272a385), QFC(0xe4de0cb0), QFC(0xffda17f2), QFC(0xffe940f4), QFC(0x043889c6), QFC(0x43de620a), QFC(0xe620c476), QFC(0xffee183b), QFC(0xffe88ba8), QFC(0x04694101), QFC(0x4547daea), QFC(0xe75f8bb8), QFC(0x0000e790), QFC(0xffe83a07), QFC(0x049aa82f), QFC(0x46aea856), QFC(0xe89971b7), QFC(0x00131c75), QFC(0xffe79e16), QFC(0x04cc2fcf), QFC(0x4812f848), QFC(0xe9cea84a), QFC(0x0023b989), QFC(0xffe7746e), QFC(0x04fe20be), QFC(0x4973fef1), QFC(0xeafee7f1), QFC(0x0033b927), QFC(0xffe6d466), QFC(0x05303f88), QFC(0x4ad237a2), QFC(0xec2a3f60), QFC(0x00426f36), QFC(0xffe6afed), QFC(0x05626209), QFC(0x4c2ca3df), QFC(0xed50a31d), QFC(0x00504f41), QFC(0xffe65416), QFC(0x05950122), QFC(0x4d83976c), QFC(0xee71b2fe), QFC(0x005d36df), QFC(0xffe681c6), QFC(0x05c76fed), QFC(0x4ed62be2), QFC(0xef8d4d7b), QFC(0x006928a0), QFC(0xffe66dd0), QFC(0x05f9c051), QFC(0x5024d70e), QFC(0xf0a3959f), QFC(0x007400b8), QFC(0xffe66fab), QFC(0x062bf5ec), QFC(0x516eefb8), QFC(0xf1b461ab), QFC(0x007e0393), QFC(0xffe69423), QFC(0x065dd56a), QFC(0x52b449dd), QFC(0xf2bf6ea4), QFC(0x00872c63), QFC(0xffe6fed4), QFC(0x068f8b44), QFC(0x53f495a9), QFC(0xf3c4e887), QFC(0x008f87aa), QFC(0xffe75361), QFC(0x06c0f0c0), QFC(0x552f8ff6), QFC(0xf4c473c6), QFC(0x0096dcc2), QFC(0xffe80414), QFC(0x06f1825d), QFC(0x56654bdc), QFC(0xf5be0fa9), QFC(0x009da526), QFC(0xffe85b4a), QFC(0x0721bf22), QFC(0x579505f4), QFC(0xf6b1f3c3), QFC(0x00a3508f), QFC(0xffe954d0), QFC(0x075112a2), QFC(0x58befacc), QFC(0xf79fa13a), QFC(0x00a85e94), QFC(0xffea353a), QFC(0x077fedb3), QFC(0x59e2f69e), QFC(0xf887507c), QFC(0x00acbd2f), QFC(0xffeb3849), QFC(0x07ad8c26), QFC(0x5b001db7), QFC(0xf96916f5), QFC(0x00b06b68), QFC(0xffec8409), QFC(0x07da2b7f), QFC(0x5c16d0ae), QFC(0xfa44a069), QFC(0x00b36acd), QFC(0xffedc418), QFC(0x08061671), QFC(0x5d26be9b), QFC(0xfb19b7bd), QFC(0x00b58c8d), QFC(0xffef2395), QFC(0x08303897), QFC(0x5e2f6366), QFC(0xfbe8f5bd), QFC(0x00b73ab0), QFC(0xfff0e7ef), QFC(0x08594887), QFC(0x5f30ff5e), QFC(0xfcb1d740), QFC(0x00b85f70), QFC(0xfff294c3), QFC(0x0880ffdd), QFC(0x602b0c7e), QFC(0xfd7475d8), QFC(0x00b8c6b0), QFC(0xfff48700), QFC(0x08a75da4), QFC(0x611d58a2), QFC(0xfe310657), QFC(0x00b8fe0d), QFC(0xfff681d6), QFC(0x08cb4e23), QFC(0x6207f21f), QFC(0xfee723c6), QFC(0x00b8394b), QFC(0xfff91fc9), QFC(0x08edfeaa), QFC(0x62ea6473), QFC(0xff96db8f), QFC(0x00b74c37), QFC(0xfffb42b0), QFC(0x090ec1fc), QFC(0x63c45243), QFC(0x0040c497), QFC(0x00b5c867), QFC(0xfffdfa24), QFC(0x092d7970), QFC(0x64964062), QFC(0x00e42fa2), QFC(0x00b3d15c), QFC(0x00007134), QFC(0x0949eaac), QFC(0x655f63f1), QFC(0x01816e06), QFC(0x00b1978d), QFC(0x00039609), QFC(0x0963ed46), QFC(0x661fd6b7), QFC(0x02186a92), QFC(0x00af374c), QFC(0x0006b1cf), QFC(0x097c1ee8), QFC(0x66d76724), QFC(0x02a99097), QFC(0x00abe79e), QFC(0x0009aa3f), QFC(0x099140a7), QFC(0x6785c24c), QFC(0x03343534), QFC(0x00a8739d), QFC(0x000d31b5), QFC(0x09a3e163), QFC(0x682b39a3), QFC(0x03b8f8dc), QFC(0x00a520bb), QFC(0x0010bc63), QFC(0x09b3d77f), QFC(0x68c7269b), QFC(0x0437fb0a), QFC(0x00a1039c), QFC(0x001471f8), QFC(0x09c0e59f), QFC(0x6959709c), QFC(0x04b0adcb), QFC(0x009d10bf), QFC(0x0018703f), QFC(0x09cab9f2), QFC(0x69e29783), QFC(0x05237f9d), QFC(0x0098b855), QFC(0x001c3549), QFC(0x09d19ca9), QFC(0x6a619c5e), QFC(0x0590a67d), QFC(0x009424c6), QFC(0x002064f8), QFC(0x09d52709), QFC(0x6ad73e8d), QFC(0x05f7fb90), QFC(0x008f4bfd), QFC(0x0024dd50), QFC(0x09d5560b), QFC(0x6b42a863), QFC(0x06593912), QFC(0x008a7dd7), QFC(0x00293718), QFC(0x09d1fa23), QFC(0x6ba4629e), QFC(0x06b559c3), QFC(0x0085c217), QFC(0x002d8e42), QFC(0x09caeb0f), QFC(0x6bfbdd97), QFC(0x070bbf58), QFC(0x00807994), QFC(0x00329ab6), QFC(0x09c018ce), QFC(0x6c492216), QFC(0x075ca90c), QFC(0x007b3875), QFC(0x003745f9), QFC(0x09b18a1d), QFC(0x6c8c4c79), QFC(0x07a8127d), QFC(0x0075fded), QFC(0x003c1fa4), QFC(0x099ec3dc), QFC(0x6cc59baa), QFC(0x07ee507c), QFC(0x0070c8a5), QFC(0x004103f5), QFC(0x09881dc5), QFC(0x6cf4073d), QFC(0x082f552e), QFC(0x006b47fa), QFC(0x00465348), QFC(0x096d0e21), QFC(0x6d18520d), QFC(0x086b1eec), QFC(0x0065fde5), QFC(0x004b6c46), QFC(0x094d7ec2), QFC(0x6d32730e), QFC(0x08a24899), QFC(0x006090c4), QFC(0x0050b177), QFC(0x09299ead), QFC(0x6d41d963), QFC(0x08d3e41b), QFC(0x005b5371), QFC(0x0055dba1), QFC(0x09015651), QFC(0x6d474e1d), QFC(0x09015651), QFC(0x0055dba1), QFC(0xfe4d1be3), QFC(0xd1c58ace), QFC(0x2e3a7532), QFC(0x01b2e41d), QFC(0x00000000), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_QTW qmf_phaseshift_cos_downsamp32[] = { QTC(0x7fd8878e), QTC(0x7e9d55fc), QTC(0x7c29fbee), QTC(0x78848414), QTC(0x73b5ebd1), QTC(0x6dca0d14), QTC(0x66cf8120), QTC(0x5ed77c8a), QTC(0x55f5a4d2), QTC(0x4c3fdff4), QTC(0x41ce1e65), QTC(0x36ba2014), QTC(0x2b1f34eb), QTC(0x1f19f97b), QTC(0x12c8106f), QTC(0x0647d97c), QTC(0xf9b82684), QTC(0xed37ef91), QTC(0xe0e60685), QTC(0xd4e0cb15), QTC(0xc945dfec), QTC(0xbe31e19b), QTC(0xb3c0200c), QTC(0xaa0a5b2e), QTC(0xa1288376), QTC(0x99307ee0), QTC(0x9235f2ec), QTC(0x8c4a142f), QTC(0x877b7bec), QTC(0x83d60412), QTC(0x8162aa04), QTC(0x80277872), }; RAM_ALIGN LNK_SECTION_CONSTDATA const FIXP_QTW qmf_phaseshift_sin_downsamp32[] = { QTC(0x0647d97c), QTC(0x12c8106f), QTC(0x1f19f97b), QTC(0x2b1f34eb), QTC(0x36ba2014), QTC(0x41ce1e65), QTC(0x4c3fdff4), QTC(0x55f5a4d2), QTC(0x5ed77c8a), QTC(0x66cf8120), QTC(0x6dca0d14), QTC(0x73b5ebd1), QTC(0x78848414), QTC(0x7c29fbee), QTC(0x7e9d55fc), QTC(0x7fd8878e), QTC(0x7fd8878e), QTC(0x7e9d55fc), QTC(0x7c29fbee), QTC(0x78848414), QTC(0x73b5ebd1), QTC(0x6dca0d14), QTC(0x66cf8120), QTC(0x5ed77c8a), QTC(0x55f5a4d2), QTC(0x4c3fdff4), QTC(0x41ce1e65), QTC(0x36ba2014), QTC(0x2b1f34eb), QTC(0x1f19f97b), QTC(0x12c8106f), QTC(0x0647d97c), }; #else /* QMF_NO_POLY == 5 */ #endif /* QMF_NO_POLY==5 */ /* * Low Delay QMF aka CLDFB */ #if defined(QMF_COEFF_16BIT) #define QTCFLLD(x) FL2FXCONST_SGL(x/(float)(1< 0x8005 x^16 + x^12 + x^5 + x^0 (1) 0001 0000 0010 0001 -> 0x1021 x^8 + x^4 + x^3 + x^2 + x^0 (1) 0001 1101 -> 0x001d */ hCrcInfo->crcLen = crcLen; hCrcInfo->crcPoly = crcPoly; hCrcInfo->startValue = crcStartValue; hCrcInfo->crcMask = (crcLen) ? (1<<(crcLen-1)) : 0; FDKcrcReset(hCrcInfo); hCrcInfo->pCrcLookup = 0; if (hCrcInfo->crcLen==16) { switch ( crcPoly ) { case 0x8005: hCrcInfo->pCrcLookup = crcLookup_16_15_2_0; break; case 0x1021: hCrcInfo->pCrcLookup = crcLookup_16_12_5_0; break; case 0x001d: default: /* no lookup table */ hCrcInfo->pCrcLookup = 0; } } } void FDKcrcReset(HANDLE_FDK_CRCINFO hCrcInfo) { int i; hCrcInfo->crcValue = hCrcInfo->startValue; for(i=0;icrcRegData[i].isActive = 0; } hCrcInfo->regStart = 0; hCrcInfo->regStop = 0; } INT FDKcrcStartReg( HANDLE_FDK_CRCINFO hCrcInfo, const HANDLE_FDK_BITSTREAM hBs, const INT mBits ) { int reg = hCrcInfo->regStart; FDK_ASSERT(hCrcInfo->crcRegData[reg].isActive==0); hCrcInfo->crcRegData[reg].isActive = 1; hCrcInfo->crcRegData[reg].maxBits = mBits; hCrcInfo->crcRegData[reg].validBits = FDKgetValidBits(hBs) ; hCrcInfo->crcRegData[reg].bitBufCntBits = 0; hCrcInfo->regStart = (hCrcInfo->regStart+1)%MAX_CRC_REGS; return (reg); } INT FDKcrcEndReg( HANDLE_FDK_CRCINFO hCrcInfo, const HANDLE_FDK_BITSTREAM hBs, const INT reg ) { FDK_ASSERT((reg==(INT)hCrcInfo->regStop)&&(hCrcInfo->crcRegData[reg].isActive==1)); if (hBs->ConfigCache==BS_WRITER) { hCrcInfo->crcRegData[reg].bitBufCntBits = FDKgetValidBits(hBs) - hCrcInfo->crcRegData[reg].validBits; } else { hCrcInfo->crcRegData[reg].bitBufCntBits = hCrcInfo->crcRegData[reg].validBits - FDKgetValidBits(hBs); } if (hCrcInfo->crcRegData[reg].maxBits == 0) { hCrcInfo->crcRegData[reg].maxBits = hCrcInfo->crcRegData[reg].bitBufCntBits; } crcCalc( hCrcInfo, hBs, reg); hCrcInfo->crcRegData[reg].isActive = 0; hCrcInfo->regStop = (hCrcInfo->regStop+1)%MAX_CRC_REGS; return 0; } USHORT FDKcrcGetCRC( const HANDLE_FDK_CRCINFO hCrcInfo ) { return ( hCrcInfo->crcValue & (((hCrcInfo->crcMask-1)<<1)+1) ); } /** * \brief Calculate crc bits. * * Calculate crc starting at current bitstream postion over nBits. * * \param pCrc Pointer to an outlying allocated crc info structure. * \param crcMask CrcMask in use. * \param crcPoly Crc polynom in use. * \param hBs Handle to current bit buffer structure. * \param nBits Number of processing bits. * * \return Number of processed bits. */ static inline INT calcCrc_Bits( USHORT * const pCrc, USHORT crcMask, USHORT crcPoly, HANDLE_FDK_BITSTREAM hBs, INT nBits ) { int i; USHORT crc = *pCrc; /* get crc value */ if (hBs!=NULL) { for (i = 0; (i < nBits); i++) { USHORT tmp = FDKreadBits(hBs,1); // process single bit tmp ^= ( (crc & crcMask) ? 1 : 0 ); tmp *= crcPoly; crc <<= 1; crc ^= tmp; } } else { for (i = 0; (i < nBits); i++) { USHORT tmp = 0; // process single bit tmp ^= ( (crc & crcMask) ? 1 : 0 ); tmp *= crcPoly; crc <<= 1; crc ^= tmp; } } *pCrc = crc; /* update crc value */ return nBits; } /** * \brief Calculate crc bytes. * * Calculate crc starting at current bitstream postion over nBytes. * * \param pCrc Pointer to an outlying allocated crc info structure. * \param pCrcLookup Pointer to lookup table used for fast crc calculation. * \param hBs Handle to current bit buffer structure. * \param nBits Number of processing bytes. * * \return Number of processed bits. */ static inline INT calcCrc_Bytes( USHORT * const pCrc, const USHORT * pCrcLookup, HANDLE_FDK_BITSTREAM hBs, INT nBytes ) { int i; USHORT crc = *pCrc; /* get crc value */ if (hBs!=NULL) { for (i=0; i>8)^((UCHAR)FDKreadBits(hBs,8)))&0xFF]; } } else { for (i=0; i>8)^((UCHAR)0))&0xFF]; } } *pCrc = crc; /* update crc value */ return (i); } /** * \brief Calculate crc. * * Calculate crc. Lenght depends on mBits parameter in FDKcrcStartReg() configuration. * * \param hCrcInfo Pointer to an outlying allocated crc info structure. * \param hBs Pointer to current bit buffer structure. * \param reg Crc region ID. * * \return Number of processed bits. */ static void crcCalc( HANDLE_FDK_CRCINFO hCrcInfo, HANDLE_FDK_BITSTREAM hBs, const INT reg ) { USHORT crc = hCrcInfo->crcValue; CCrcRegData *rD = &hCrcInfo->crcRegData[reg]; FDK_BITSTREAM bsReader; if (hBs->ConfigCache==BS_READER) { bsReader = *hBs; FDKpushBiDirectional(&bsReader, -(INT)(rD->validBits-FDKgetValidBits(&bsReader))); } else { FDKinitBitStream(&bsReader, hBs->hBitBuf.Buffer, hBs->hBitBuf.bufSize, hBs->hBitBuf.ValidBits, BS_READER); FDKpushBiDirectional(&bsReader, rD->validBits); } int bits, rBits; rBits = (rD->maxBits>=0) ? rD->maxBits : -rD->maxBits; /* ramaining bits */ if ((rD->maxBits>0) && (((INT)rD->bitBufCntBits>>3<<3)bitBufCntBits; } else { bits = rBits; } int words = bits >> 3; /* processing bytes */ int mBits = bits & 0x7; /* modulo bits */ if(hCrcInfo->pCrcLookup) { rBits -= (calcCrc_Bytes(&crc, hCrcInfo->pCrcLookup, &bsReader, words)<<3); } else { rBits -= calcCrc_Bits(&crc, hCrcInfo->crcMask, hCrcInfo->crcPoly, &bsReader, words<<3 ); } /* remaining valid bits*/ if(mBits!=0) { rBits -= calcCrc_Bits(&crc, hCrcInfo->crcMask, hCrcInfo->crcPoly, &bsReader, mBits ); } if (rBits!=0) { /* zero bytes */ if ( (hCrcInfo->pCrcLookup) && (rBits>8) ) { rBits -= (calcCrc_Bytes(&crc, hCrcInfo->pCrcLookup, NULL, rBits>>3)<<3); } /* remaining zero bits */ if (rBits!=0) { rBits -= calcCrc_Bits(&crc, hCrcInfo->crcMask, hCrcInfo->crcPoly, NULL, rBits ); } } hCrcInfo->crcValue = crc; } fdk-aac-0.1.3/libFDK/src/scale.cpp0000644000175000017500000003422312372261464017073 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: Scaling operations ******************************************************************************/ #include "common_fix.h" #include "genericStds.h" /************************************************** * Inline definitions **************************************************/ #define SCALE_INLINE inline #if defined(__mips__) /* cppp replaced: elif */ #include "mips/scale.cpp" #elif defined(__arm__) #include "arm/scale_arm.cpp" #endif #ifndef FUNCTION_scaleValues_SGL /*! * * \brief Multiply input vector by \f$ 2^{scalefactor} \f$ * \param len must be larger than 4 * \return void * */ #define FUNCTION_scaleValues_SGL SCALE_INLINE void scaleValues(FIXP_SGL *vector, /*!< Vector */ INT len, /*!< Length */ INT scalefactor /*!< Scalefactor */ ) { INT i; /* Return if scalefactor is Zero */ if (scalefactor==0) return; if(scalefactor > 0){ scalefactor = fixmin_I(scalefactor,(INT)(DFRACT_BITS-1)); for (i = len&3; i--; ) { *(vector++) <<= scalefactor; } for (i = len>>2; i--; ) { *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; } } else { INT negScalefactor = fixmin_I(-scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *(vector++) >>= negScalefactor; } for (i = len>>2; i--; ) { *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; } } } #endif #ifndef FUNCTION_scaleValues_DBL /*! * * \brief Multiply input vector by \f$ 2^{scalefactor} \f$ * \param len must be larger than 4 * \return void * */ #define FUNCTION_scaleValues_DBL SCALE_INLINE void scaleValues(FIXP_DBL *vector, /*!< Vector */ INT len, /*!< Length */ INT scalefactor /*!< Scalefactor */ ) { INT i; /* Return if scalefactor is Zero */ if (scalefactor==0) return; if(scalefactor > 0){ scalefactor = fixmin_I(scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *(vector++) <<= scalefactor; } for (i = len>>2; i--; ) { *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; *(vector++) <<= scalefactor; } } else { INT negScalefactor = fixmin_I(-scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *(vector++) >>= negScalefactor; } for (i = len>>2; i--; ) { *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; *(vector++) >>= negScalefactor; } } } #endif #ifndef FUNCTION_scaleValues_DBLDBL /*! * * \brief Multiply input vector src by \f$ 2^{scalefactor} \f$ * and place result into dst * \param dst detination buffer * \param src source buffer * \param len must be larger than 4 * \param scalefactor amount of left shifts to be applied * \return void * */ #define FUNCTION_scaleValues_DBLDBL SCALE_INLINE void scaleValues(FIXP_DBL *dst, /*!< dst Vector */ const FIXP_DBL *src, /*!< src Vector */ INT len, /*!< Length */ INT scalefactor /*!< Scalefactor */ ) { INT i; /* Return if scalefactor is Zero */ if (scalefactor==0) { if (dst != src) FDKmemmove(dst, src, len*sizeof(FIXP_DBL)); } else { if(scalefactor > 0){ scalefactor = fixmin_I(scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *(dst++) = *(src++) << scalefactor; } for (i = len>>2; i--; ) { *(dst++) = *(src++) << scalefactor; *(dst++) = *(src++) << scalefactor; *(dst++) = *(src++) << scalefactor; *(dst++) = *(src++) << scalefactor; } } else { INT negScalefactor = fixmin_I(-scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *(dst++) = *(src++) >> negScalefactor; } for (i = len>>2; i--; ) { *(dst++) = *(src++) >> negScalefactor; *(dst++) = *(src++) >> negScalefactor; *(dst++) = *(src++) >> negScalefactor; *(dst++) = *(src++) >> negScalefactor; } } } } #endif #ifndef FUNCTION_scaleValuesWithFactor_DBL /*! * * \brief Multiply input vector by \f$ 2^{scalefactor} \f$ * \param len must be larger than 4 * \return void * */ #define FUNCTION_scaleValuesWithFactor_DBL SCALE_INLINE void scaleValuesWithFactor( FIXP_DBL *vector, FIXP_DBL factor, INT len, INT scalefactor ) { INT i; /* Compensate fMultDiv2 */ scalefactor++; if(scalefactor > 0){ scalefactor = fixmin_I(scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *vector = fMultDiv2(*vector, factor) << scalefactor; vector++; } for (i = len>>2; i--; ) { *vector = fMultDiv2(*vector, factor) << scalefactor; vector++; *vector = fMultDiv2(*vector, factor) << scalefactor; vector++; *vector = fMultDiv2(*vector, factor) << scalefactor; vector++; *vector = fMultDiv2(*vector, factor) << scalefactor; vector++; } } else { INT negScalefactor = fixmin_I(-scalefactor,(INT)DFRACT_BITS-1); for (i = len&3; i--; ) { *vector = fMultDiv2(*vector, factor) >> negScalefactor; vector++; } for (i = len>>2; i--; ) { *vector = fMultDiv2(*vector, factor) >> negScalefactor; vector++; *vector = fMultDiv2(*vector, factor) >> negScalefactor; vector++; *vector = fMultDiv2(*vector, factor) >> negScalefactor; vector++; *vector = fMultDiv2(*vector, factor) >> negScalefactor; vector++; } } } #endif /* FUNCTION_scaleValuesWithFactor_DBL */ /******************************************* IMPORTANT NOTE for usage of getScalefactor() If the input array contains negative values too, then these functions may sometimes return the actual maximum value minus 1, due to the nature of the applied algorithm. So be careful with possible fractional -1 values that may lead to overflows when being fPow2()'ed. ********************************************/ #ifndef FUNCTION_getScalefactorShort /*! * * \brief Calculate max possible scale factor for input vector of shorts * * \return Maximum scale factor / possible left shift * */ #define FUNCTION_getScalefactorShort SCALE_INLINE INT getScalefactorShort(const SHORT *vector, /*!< Pointer to input vector */ INT len /*!< Length of input vector */ ) { INT i; SHORT temp, maxVal = 0; for(i=len;i!=0;i--){ temp = (SHORT)(*vector++); maxVal |= (temp^(temp>>(SHORT_BITS-1))); } return fixmax_I((INT)0,(INT)(fixnormz_D((INT)maxVal) - (INT)1 - (INT)(DFRACT_BITS - SHORT_BITS))); } #endif #ifndef FUNCTION_getScalefactorPCM /*! * * \brief Calculate max possible scale factor for input vector of shorts * * \return Maximum scale factor * */ #define FUNCTION_getScalefactorPCM SCALE_INLINE INT getScalefactorPCM(const INT_PCM *vector, /*!< Pointer to input vector */ INT len, /*!< Length of input vector */ INT stride ) { INT i; INT_PCM temp, maxVal = 0; for(i=len;i!=0;i--){ temp = (INT_PCM)(*vector); vector+=stride; maxVal |= (temp^(temp>>((sizeof(INT_PCM)*8)-1))); } return fixmax_I((INT)0,(INT)(fixnormz_D((INT)maxVal) - (INT)1 - (INT)(DFRACT_BITS - SAMPLE_BITS))); } #endif #ifndef FUNCTION_getScalefactorShort /*! * * \brief Calculate max possible scale factor for input vector of shorts * \param stride, item increment between vector members. * \return Maximum scale factor * */ #define FUNCTION_getScalefactorShort SCALE_INLINE INT getScalefactorShort(const SHORT *vector, /*!< Pointer to input vector */ INT len, /*!< Length of input vector */ INT stride ) { INT i; SHORT temp, maxVal = 0; for(i=len;i!=0;i--){ temp = (SHORT)(*vector); vector+=stride; maxVal |= (temp^(temp>>(SHORT_BITS-1))); } return fixmax_I((INT)0,(INT)(fixnormz_D((INT)maxVal) - (INT)1 - (INT)(DFRACT_BITS - SHORT_BITS))); } #endif #ifndef FUNCTION_getScalefactor_DBL /*! * * \brief Calculate max possible scale factor for input vector * * \return Maximum scale factor * * This function can constitute a significant amount of computational complexity - very much depending on the * bitrate. Since it is a rather small function, effective assembler optimization might be possible. * */ #define FUNCTION_getScalefactor_DBL SCALE_INLINE INT getScalefactor(const FIXP_DBL *vector, /*!< Pointer to input vector */ INT len) /*!< Length of input vector */ { INT i; FIXP_DBL temp, maxVal = (FIXP_DBL)0; for(i=len;i!=0;i--){ temp = (LONG)(*vector++); maxVal |= (FIXP_DBL)((LONG)temp^(LONG)(temp>>(DFRACT_BITS-1))); } return fixmax_I((INT)0,(INT)(fixnormz_D(maxVal) - 1)); } #endif #ifndef FUNCTION_getScalefactor_SGL #define FUNCTION_getScalefactor_SGL SCALE_INLINE INT getScalefactor(const FIXP_SGL *vector, /*!< Pointer to input vector */ INT len) /*!< Length of input vector */ { INT i; SHORT temp, maxVal = (FIXP_SGL)0; for(i=len;i!=0;i--){ temp = (SHORT)(*vector++); maxVal |= (temp^(temp>>(FRACT_BITS-1))); } return fixmax_I((INT)0,(INT)(fixnormz_D(FX_SGL2FX_DBL((FIXP_SGL)maxVal)) - 1)); } #endif fdk-aac-0.1.3/libFDK/src/FDK_trigFcts.cpp0000644000175000017500000003051312372261464020253 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Haricharan Lakshman, Manuel Jander Description: Trigonometric functions fixed point fractional implementation. ******************************************************************************/ #include "FDK_trigFcts.h" #include "fixpoint_math.h" #define IMPROVE_ATAN2_ACCURACY 1 // 0 --> 59 dB SNR 1 --> 65 dB SNR #define MINSFTAB 7 #define MAXSFTAB 25 #if IMPROVE_ATAN2_ACCURACY static const FIXP_DBL f_atan_expand_range[MAXSFTAB-(MINSFTAB-1)] = { /***************************************************************************** * * Table holds fixp_atan() output values which are outside of input range * of fixp_atan() to improve SNR of fixp_atan2(). * * This Table might also be used in fixp_atan() [todo] so there a wider input * range can be covered, too. * * Matlab (generate table): * for scl = 7:25 % MINSFTAB .. MAXSFTAB * at=atan(0.5 *(2^scl)); % 0.5 because get in 'middle' area of current scale level 'scl' * at/2 % div at by ATO_SCALE * end * * Table divided by 2=ATO_SCALE <-- SF=ATO_SF *****************************************************************************/ FL2FXCONST_DBL(7.775862990872099e-001), FL2FXCONST_DBL(7.814919928673978e-001), FL2FXCONST_DBL(7.834450483314648e-001), FL2FXCONST_DBL(7.844216021392089e-001), FL2FXCONST_DBL(7.849098823026687e-001), FL2FXCONST_DBL(7.851540227918509e-001), FL2FXCONST_DBL(7.852760930873737e-001), FL2FXCONST_DBL(7.853371282415015e-001), FL2FXCONST_DBL(7.853676458193612e-001), FL2FXCONST_DBL(7.853829046083906e-001), FL2FXCONST_DBL(7.853905340029177e-001), FL2FXCONST_DBL(7.853943487001828e-001), FL2FXCONST_DBL(7.853962560488155e-001), FL2FXCONST_DBL(7.853972097231319e-001), FL2FXCONST_DBL(7.853976865602901e-001), FL2FXCONST_DBL(7.853979249788692e-001), FL2FXCONST_DBL(7.853980441881587e-001), FL2FXCONST_DBL(7.853981037928035e-001), FL2FXCONST_DBL(7.853981335951259e-001) // pi/4 = 0.785398163397448 = pi/2/ATO_SCALE }; #endif FIXP_DBL fixp_atan2(FIXP_DBL y, FIXP_DBL x) { FIXP_DBL q; FIXP_DBL at; // atan out FIXP_DBL at2; // atan2 out FIXP_DBL ret = FL2FXCONST_DBL(-1.0f); INT sf,sfo,stf; // --- division if (y > FL2FXCONST_DBL(0.0f)) { if (x > FL2FXCONST_DBL(0.0f)) { q = fDivNormHighPrec( y, x, &sf); // both pos. } else if (x < FL2FXCONST_DBL(0.0f)) { q = -fDivNormHighPrec( y,-x, &sf); // x neg. } else {//(x ==FL2FXCONST_DBL(0.0f)) q = FL2FXCONST_DBL(+1.0f); // y/x = pos/zero = +Inf sf = 0; } } else if (y < FL2FXCONST_DBL(0.0f)) { if (x > FL2FXCONST_DBL(0.0f)) { q = -fDivNormHighPrec(-y, x, &sf); // y neg. } else if (x < FL2FXCONST_DBL(0.0f)) { q = fDivNormHighPrec(-y,-x, &sf); // both neg. } else {//(x ==FL2FXCONST_DBL(0.0f)) q = FL2FXCONST_DBL(-1.0f); // y/x = neg/zero = -Inf sf = 0; } } else { // (y ==FL2FXCONST_DBL(0.0f)) q = FL2FXCONST_DBL(0.0f); sf = 0; } sfo = sf; // --- atan() if ( sfo > ATI_SF ) { // --- could not calc fixp_atan() here bec of input data out of range // ==> therefore give back boundary values #if IMPROVE_ATAN2_ACCURACY if (sfo > MAXSFTAB) sfo = MAXSFTAB; #endif if ( q > FL2FXCONST_DBL(0.0f) ) { #if IMPROVE_ATAN2_ACCURACY at = +f_atan_expand_range[sfo-ATI_SF-1]; #else at = FL2FXCONST_DBL( +M_PI/2 / ATO_SCALE); #endif } else if ( q < FL2FXCONST_DBL(0.0f) ) { #if IMPROVE_ATAN2_ACCURACY at = -f_atan_expand_range[sfo-ATI_SF-1]; #else at = FL2FXCONST_DBL( -M_PI/2 / ATO_SCALE); #endif } else { // q== FL2FXCONST_DBL(0.0f) at = FL2FXCONST_DBL( 0.0f ); } }else{ // --- calc of fixp_atan() is possible; input data within range // ==> set q on fixed scale level as desired from fixp_atan() stf = sfo - ATI_SF; if (stf > 0) q = q << (INT)fMin( stf,DFRACT_BITS-1); else q = q >> (INT)fMin(-stf,DFRACT_BITS-1); at = fixp_atan(q); // ATO_SF } // --- atan2() at2 = at >> (AT2O_SF - ATO_SF); // now AT2O_SF for atan2 if ( x > FL2FXCONST_DBL(0.0f) ) { ret = at2; } else if ( x < FL2FXCONST_DBL(0.0f) ) { if ( y >= FL2FXCONST_DBL(0.0f) ) { ret = at2 + FL2FXCONST_DBL( M_PI / AT2O_SCALE); } else { ret = at2 - FL2FXCONST_DBL( M_PI / AT2O_SCALE); } } else { // x == 0 if ( y > FL2FXCONST_DBL(0.0f) ) { ret = FL2FXCONST_DBL( +M_PI/2 / AT2O_SCALE); } else if ( y < FL2FXCONST_DBL(0.0f) ) { ret = FL2FXCONST_DBL( -M_PI/2 / AT2O_SCALE); } else if ( y == FL2FXCONST_DBL(0.0f) ) { ret = FL2FXCONST_DBL(0.0f); } } return ret; } FIXP_DBL fixp_atan(FIXP_DBL x) { INT sign; FIXP_DBL result, temp; // SNR of fixp_atan() = 56 dB FIXP_DBL ONEBY3P56 = (FIXP_DBL)0x26800000; // 1.0/3.56 in q31 FIXP_DBL P281 = (FIXP_DBL)0x00013000; // 0.281 in q18 FIXP_DBL ONEP571 = (FIXP_DBL)0x6487ef00; // 1.571 in q30 if (x < FIXP_DBL(0)) { sign = 1; x = - x ; } else { sign = 0; } /* calc of arctan */ if(x < ( Q(Q_ATANINP)-FL2FXCONST_DBL(0.00395)) ) { INT res_e; temp = fPow2(x); // q25 * q25 - (DFRACT_BITS-1) = q19 temp = fMult(temp, ONEBY3P56); // q19 * q31 - (DFRACT_BITS-1) = q19 temp = temp + Q(19); // q19 + q19 = q19 result = fDivNorm(x, temp, &res_e); result = scaleValue(result, (Q_ATANOUT-Q_ATANINP+19-DFRACT_BITS+1) + res_e ); } else if( x < FL2FXCONST_DBL(1.28/64.0) ) { FIXP_DBL delta_fix; FIXP_DBL PI_BY_4 = FL2FXCONST_DBL(3.1415926/4.0) >> 1; /* pi/4 in q30 */ delta_fix = (x - FL2FXCONST_DBL(1.0/64.0)) << 5; /* q30 */ result = PI_BY_4 + (delta_fix >> 1) - (fPow2Div2(delta_fix)); } else { INT res_e; temp = fPow2Div2(x); // q25 * q25 - (DFRACT_BITS-1) - 1 = q18 temp = temp + P281; // q18 + q18 = q18 result = fDivNorm(x, temp, &res_e); result = scaleValue(result, (Q_ATANOUT-Q_ATANINP+18-DFRACT_BITS+1) + res_e ); result = ONEP571 - result; // q30 + q30 = q30 } if (sign) { result = -result; } return(result); } #include "FDK_tools_rom.h" FIXP_DBL fixp_cos(FIXP_DBL x, int scale) { FIXP_DBL residual, error, sine, cosine; residual = fixp_sin_cos_residual_inline(x, scale, &sine, &cosine); error = fMult(sine, residual); return cosine - error; } FIXP_DBL fixp_sin(FIXP_DBL x, int scale) { FIXP_DBL residual, error, sine, cosine; residual = fixp_sin_cos_residual_inline(x, scale, &sine, &cosine); error = fMult(cosine, residual); return sine + error; } void fixp_cos_sin (FIXP_DBL x, int scale, FIXP_DBL *cos, FIXP_DBL *sin) { FIXP_DBL residual, error0, error1, sine, cosine; residual = fixp_sin_cos_residual_inline(x, scale, &sine, &cosine); error0 = fMult(sine, residual); error1 = fMult(cosine, residual); *cos = cosine - error0; *sin = sine + error1; } fdk-aac-0.1.3/libFDK/src/arm/0000755000175000017500000000000012372262446016054 5ustar00tootstoots00000000000000fdk-aac-0.1.3/libFDK/src/arm/fft_rad2_arm.cpp0000644000175000017500000002532112372261464021110 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Description: dit_fft ARM assembler replacements. ******************************************************************************/ /* NEON optimized FFT currently builds only with RVCT toolchain */ #ifndef FUNCTION_dit_fft /* If dit_fft was not yet defined by ARM-Cortex ... */ #if defined(SINETABLE_16BIT) #define FUNCTION_dit_fft /***************************************************************************** date: 28.07.2005 srl Contents/description: dit-tukey-FFT-algorithm ******************************************************************************/ #if defined(FUNCTION_dit_fft) void dit_fft(FIXP_DBL *x, const INT ldn, const FIXP_STP *trigdata, const INT trigDataSize) { const INT n=1<>1; /* Re A + Re B */ a10 = (x[i + 4] + x[i + 6])>>1; /* Re C + Re D */ a20 = (x[i + 1] + x[i + 3])>>1; /* Im A + Im B */ a30 = (x[i + 5] + x[i + 7])>>1; /* Im C + Im D */ x[i + 0] = a00 + a10; /* Re A' = Re A + Re B + Re C + Re D */ x[i + 4] = a00 - a10; /* Re C' = Re A + Re B - Re C - Re D */ x[i + 1] = a20 + a30; /* Im A' = Im A + Im B + Im C + Im D */ x[i + 5] = a20 - a30; /* Im C' = Im A + Im B - Im C - Im D */ a00 = a00 - x[i + 2]; /* Re A - Re B */ a10 = a10 - x[i + 6]; /* Re C - Re D */ a20 = a20 - x[i + 3]; /* Im A - Im B */ a30 = a30 - x[i + 7]; /* Im C - Im D */ x[i + 2] = a00 + a30; /* Re B' = Re A - Re B + Im C - Im D */ x[i + 6] = a00 - a30; /* Re D' = Re A - Re B - Im C + Im D */ x[i + 3] = a20 - a10; /* Im B' = Im A - Im B - Re C + Re D */ x[i + 7] = a20 + a10; /* Im D' = Im A - Im B + Re C - Re D */ } INT mh = 1 << 1; INT ldm = ldn - 2; INT trigstep = trigDataSize; do { const FIXP_STP *pTrigData = trigdata; INT j; mh <<= 1; trigstep >>= 1; FDK_ASSERT(trigstep > 0); /* Do first iteration with c=1.0 and s=0.0 separately to avoid loosing to much precision. Beware: The impact on the overal FFT precision is rather large. */ { FIXP_DBL *xt1 = x; int r = n; do { FIXP_DBL *xt2 = xt1 + (mh<<1); /* FIXP_DBL *xt1 = x+ ((r)<<1); FIXP_DBL *xt2 = xt1 + (mh<<1); */ FIXP_DBL vr,vi,ur,ui; //cplxMultDiv2(&vi, &vr, x[t2+1], x[t2], (FIXP_SGL)1.0, (FIXP_SGL)0.0); vi = xt2[1]>>1; vr = xt2[0]>>1; ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui+vi; xt2[0] = ur-vr; xt2[1] = ui-vi; xt1 += mh; xt2 += mh; //cplxMultDiv2(&vr, &vi, x[t2+1], x[t2], (FIXP_SGL)1.0, (FIXP_SGL)0.0); vr = xt2[1]>>1; vi = xt2[0]>>1; ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui-vi; xt2[0] = ur-vr; xt2[1] = ui+vi; xt1 = xt2 + mh; } while ((r=r-(mh<<1)) != 0); } for(j=4; j>1); FIXP_SPK cs; int r = n; pTrigData += trigstep; cs = *pTrigData; do { FIXP_DBL *xt2 = xt1 + (mh<<1); FIXP_DBL vr,vi,ur,ui; cplxMultDiv2(&vi, &vr, xt2[1], xt2[0], cs); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui+vi; xt2[0] = ur-vr; xt2[1] = ui-vi; xt1 += mh; xt2 += mh; cplxMultDiv2(&vr, &vi, xt2[1], xt2[0], cs); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui-vi; xt2[0] = ur-vr; xt2[1] = ui+vi; /* Same as above but for t1,t2 with j>mh/4 and thus cs swapped */ xt1 = xt1 - (j); xt2 = xt1 + (mh<<1); cplxMultDiv2(&vi, &vr, xt2[0], xt2[1], cs); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui-vi; xt2[0] = ur-vr; xt2[1] = ui+vi; xt1 += mh; xt2 += mh; cplxMultDiv2(&vr, &vi, xt2[0], xt2[1], cs); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur-vr; xt1[1] = ui-vi; xt2[0] = ur+vr; xt2[1] = ui+vi; xt1 = xt2 + (j); } while ((r=r-(mh<<1)) != 0); } { FIXP_DBL *xt1 = x + (mh>>1); int r = n; do { FIXP_DBL *xt2 = xt1 + (mh<<1); FIXP_DBL vr,vi,ur,ui; cplxMultDiv2(&vi, &vr, xt2[1], xt2[0], STC(0x5a82799a), STC(0x5a82799a)); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui+vi; xt2[0] = ur-vr; xt2[1] = ui-vi; xt1 += mh; xt2 += mh; cplxMultDiv2(&vr, &vi, xt2[1], xt2[0], STC(0x5a82799a), STC(0x5a82799a)); ur = xt1[0]>>1; ui = xt1[1]>>1; xt1[0] = ur+vr; xt1[1] = ui-vi; xt2[0] = ur-vr; xt2[1] = ui+vi; xt1 = xt2 + mh; } while ((r=r-(mh<<1)) != 0); } } while (--ldm != 0); } #endif /* if defined(FUNCTION_dit_fft) */ #endif /* if defined(SINETABLE_16BIT) */ #endif /* ifndef FUNCTION_dit_fft */ fdk-aac-0.1.3/libFDK/src/arm/autocorr2nd.cpp0000644000175000017500000001117712372261464021030 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*! * * \brief Calculate second order autocorrelation * */ fdk-aac-0.1.3/libFDK/src/arm/dct_arm.cpp0000644000175000017500000004257212372261464020202 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #ifdef FUNCTION_dct_IV_func1 /* Note: This assembler routine is here, because the ARM926 compiler does not encode the inline assembler with optimal speed. With this version, we save 2 cycles per loop iteration. */ __asm void dct_IV_func1( int i, const FIXP_SPK *twiddle, FIXP_DBL *RESTRICT pDat_0, FIXP_DBL *RESTRICT pDat_1) { /* Register map: r0 i r1 twiddle r2 pDat_0 r3 pDat_1 r4 accu1 r5 accu2 r6 accu3 r7 accu4 r8 val_tw r9 accuX */ PUSH {r4-r9} /* 44 cycles for 2 iterations = 22 cycles/iteration */ dct_IV_loop1_start /* First iteration */ LDR r8, [r1], #4 // val_tw = *twiddle++; LDR r5, [r2, #0] // accu2 = pDat_0[0] LDR r4, [r3, #0] // accu1 = pDat_1[0] SMULWT r9, r5, r8 // accuX = accu2*val_tw.l SMULWB r5, r5, r8 // accu2 = accu2*val_tw.h RSB r9, r9, #0 // accuX =-accu2*val_tw.l SMLAWT r5, r4, r8, r5 // accu2 = accu2*val_tw.h + accu1*val_tw.l SMLAWB r4, r4, r8, r9 // accu1 = accu1*val_tw.h - accu2*val_tw.l LDR r8, [r1], #4 // val_tw = *twiddle++; LDR r7, [r3, #-4] // accu4 = pDat_1[-1] LDR r6, [r2, #4] // accu3 = pDat_0[1] SMULWB r9, r7, r8 // accuX = accu4*val_tw.h SMULWT r7, r7, r8 // accu4 = accu4*val_tw.l RSB r9, r9, #0 // accuX =-accu4*val_tw.h SMLAWB r7, r6, r8, r7 // accu4 = accu4*val_tw.l+accu3*val_tw.h SMLAWT r6, r6, r8, r9 // accu3 = accu3*val_tw.l-accu4*val_tw.h STR r5, [r2], #4 // *pDat_0++ = accu2 STR r4, [r2], #4 // *pDat_0++ = accu1 STR r6, [r3], #-4 // *pDat_1-- = accu3 STR r7, [r3], #-4 // *pDat_1-- = accu4 /* Second iteration */ LDR r8, [r1], #4 // val_tw = *twiddle++; LDR r5, [r2, #0] // accu2 = pDat_0[0] LDR r4, [r3, #0] // accu1 = pDat_1[0] SMULWT r9, r5, r8 // accuX = accu2*val_tw.l SMULWB r5, r5, r8 // accu2 = accu2*val_tw.h RSB r9, r9, #0 // accuX =-accu2*val_tw.l SMLAWT r5, r4, r8, r5 // accu2 = accu2*val_tw.h + accu1*val_tw.l SMLAWB r4, r4, r8, r9 // accu1 = accu1*val_tw.h - accu2*val_tw.l LDR r8, [r1], #4 // val_tw = *twiddle++; LDR r7, [r3, #-4] // accu4 = pDat_1[-1] LDR r6, [r2, #4] // accu3 = pDat_0[1] SMULWB r9, r7, r8 // accuX = accu4*val_tw.h SMULWT r7, r7, r8 // accu4 = accu4*val_tw.l RSB r9, r9, #0 // accuX =-accu4*val_tw.h SMLAWB r7, r6, r8, r7 // accu4 = accu4*val_tw.l+accu3*val_tw.h SMLAWT r6, r6, r8, r9 // accu3 = accu3*val_tw.l-accu4*val_tw.h STR r5, [r2], #4 // *pDat_0++ = accu2 STR r4, [r2], #4 // *pDat_0++ = accu1 STR r6, [r3], #-4 // *pDat_1-- = accu3 STR r7, [r3], #-4 // *pDat_1-- = accu4 SUBS r0, r0, #1 BNE dct_IV_loop1_start POP {r4-r9} BX lr } #endif /* FUNCTION_dct_IV_func1 */ #ifdef FUNCTION_dct_IV_func2 FDK_INLINE /* __attribute__((noinline)) */ static void dct_IV_func2( int i, const FIXP_SPK *twiddle, FIXP_DBL *pDat_0, FIXP_DBL *pDat_1, int inc) { FIXP_DBL accu1, accu2, accu3, accu4, accuX; LONG val_tw; accu1 = pDat_1[-2]; accu2 = pDat_1[-1]; *--pDat_1 = -(pDat_0[1]>>1); *pDat_0++ = (pDat_0[0]>>1); twiddle += inc; __asm { LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc B dct_IV_loop2_2nd_part /* 42 cycles for 2 iterations = 21 cycles/iteration */ dct_IV_loop2: SMULWT accuX, accu2, val_tw SMULWB accu2, accu2, val_tw RSB accuX, accuX, #0 SMLAWB accuX, accu1, val_tw, accuX SMLAWT accu2, accu1, val_tw, accu2 STR accuX, [pDat_0], #4 STR accu2, [pDat_1, #-4] ! LDR accu4, [pDat_0, #4] LDR accu3, [pDat_0] SMULWB accuX, accu4, val_tw SMULWT accu4, accu4, val_tw RSB accuX, accuX, #0 SMLAWT accuX, accu3, val_tw, accuX SMLAWB accu4, accu3, val_tw, accu4 LDR accu1, [pDat_1, #-8] LDR accu2, [pDat_1, #-4] LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc STR accuX, [pDat_1, #-4] ! STR accu4, [pDat_0], #4 dct_IV_loop2_2nd_part: SMULWT accuX, accu2, val_tw SMULWB accu2, accu2, val_tw RSB accuX, accuX, #0 SMLAWB accuX, accu1, val_tw, accuX SMLAWT accu2, accu1, val_tw, accu2 STR accuX, [pDat_0], #4 STR accu2, [pDat_1, #-4] ! LDR accu4, [pDat_0, #4] LDR accu3, [pDat_0] SMULWB accuX, accu4, val_tw SMULWT accu4, accu4, val_tw RSB accuX, accuX, #0 SMLAWT accuX, accu3, val_tw, accuX SMLAWB accu4, accu3, val_tw, accu4 LDR accu1, [pDat_1, #-8] LDR accu2, [pDat_1, #-4] STR accuX, [pDat_1, #-4] ! STR accu4, [pDat_0], #4 LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc SUBS i, i, #1 BNE dct_IV_loop2 } /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(accu2, WTC(0x5a82799a)); *--pDat_1 = accu1 + accu2; *pDat_0++ = accu1 - accu2; } #endif /* FUNCTION_dct_IV_func2 */ #ifdef FUNCTION_dst_IV_func1 __asm void dst_IV_func1( int i, const FIXP_SPK *twiddle, FIXP_DBL *pDat_0, FIXP_DBL *pDat_1) { /* Register map: r0 i r1 twiddle r2 pDat_0 r3 pDat_1 r4 accu1 r5 accu2 r6 accu3 r7 accu4 r8 val_tw r9 accuX */ PUSH {r4-r9} dst_IV_loop1 LDR r8, [r1], #4 // val_tw = *twiddle++ LDR r5, [r2] // accu2 = pDat_0[0] LDR r6, [r2, #4] // accu3 = pDat_0[1] RSB r5, r5, #0 // accu2 = -accu2 SMULWT r9, r5, r8 // accuX = (-accu2)*val_tw.l LDR r4, [r3, #-4] // accu1 = pDat_1[-1] RSB r9, r9, #0 // accuX = -(-accu2)*val_tw.l SMLAWB r9, r4, r8, r9 // accuX = accu1*val_tw.h-(-accu2)*val_tw.l SMULWT r4, r4, r8 // accu1 = accu1*val_tw.l LDR r7, [r3, #-8] // accu4 = pDat_1[-2] SMLAWB r5, r5, r8, r4 // accu2 = (-accu2)*val_tw.t+accu1*val_tw.l LDR r8, [r1], #4 // val_tw = *twiddle++ STR r5, [r2], #4 // *pDat_0++ = accu2 STR r9, [r2], #4 // *pDat_0++ = accu1 (accuX) RSB r7, r7, #0 // accu4 = -accu4 SMULWB r5, r7, r8 // accu2 = (-accu4)*val_tw.h SMULWB r4, r6, r8 // accu1 = (-accu4)*val_tw.l RSB r5, r5, #0 // accu2 = -(-accu4)*val_tw.h SMLAWT r6, r6, r8, r5 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h SMLAWT r7, r7, r8, r4 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h STR r6, [r3, #-4] ! // *--pDat_1 = accu3 STR r7, [r3, #-4] ! // *--pDat_1 = accu4 LDR r8, [r1], #4 // val_tw = *twiddle++ LDR r5, [r2] // accu2 = pDat_0[0] LDR r6, [r2, #4] // accu3 = pDat_0[1] RSB r5, r5, #0 // accu2 = -accu2 SMULWT r9, r5, r8 // accuX = (-accu2)*val_tw.l LDR r4, [r3, #-4] // accu1 = pDat_1[-1] RSB r9, r9, #0 // accuX = -(-accu2)*val_tw.l SMLAWB r9, r4, r8, r9 // accuX = accu1*val_tw.h-(-accu2)*val_tw.l SMULWT r4, r4, r8 // accu1 = accu1*val_tw.l LDR r7, [r3, #-8] // accu4 = pDat_1[-2] SMLAWB r5, r5, r8, r4 // accu2 = (-accu2)*val_tw.t+accu1*val_tw.l LDR r8, [r1], #4 // val_tw = *twiddle++ STR r5, [r2], #4 // *pDat_0++ = accu2 STR r9, [r2], #4 // *pDat_0++ = accu1 (accuX) RSB r7, r7, #0 // accu4 = -accu4 SMULWB r5, r7, r8 // accu2 = (-accu4)*val_tw.h SMULWB r4, r6, r8 // accu1 = (-accu4)*val_tw.l RSB r5, r5, #0 // accu2 = -(-accu4)*val_tw.h SMLAWT r6, r6, r8, r5 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h SMLAWT r7, r7, r8, r4 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h STR r6, [r3, #-4] ! // *--pDat_1 = accu3 STR r7, [r3, #-4] ! // *--pDat_1 = accu4 SUBS r0, r0, #4 // i-= 4 BNE dst_IV_loop1 POP {r4-r9} BX lr } #endif /* FUNCTION_dst_IV_func1 */ #ifdef FUNCTION_dst_IV_func2 FDK_INLINE /* __attribute__((noinline)) */ static void dst_IV_func2( int i, const FIXP_SPK *twiddle, FIXP_DBL *RESTRICT pDat_0, FIXP_DBL *RESTRICT pDat_1, int inc) { FIXP_DBL accu1,accu2,accu3,accu4; LONG val_tw; accu4 = pDat_0[0]; accu3 = pDat_0[1]; accu4 >>= 1; accu3 >>= 1; accu4 = -accu4; accu1 = pDat_1[-1]; accu2 = pDat_1[0]; *pDat_0++ = accu3; *pDat_1-- = accu4; __asm { B dst_IV_loop2_2nd_part /* 50 cycles for 2 iterations = 25 cycles/iteration */ dst_IV_loop2: LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc RSB accu2, accu2, #0 // accu2 = -accu2 RSB accu1, accu1, #0 // accu1 = -accu1 SMULWT accu3, accu2, val_tw // accu3 = (-accu2)*val_tw.l SMULWT accu4, accu1, val_tw // accu4 = (-accu1)*val_tw.l RSB accu3, accu3, #0 // accu3 = -accu2*val_tw.l SMLAWB accu1, accu1, val_tw, accu3 // accu1 = -accu1*val_tw.h-(-accu2)*val_tw.l SMLAWB accu2, accu2, val_tw, accu4 // accu2 = (-accu1)*val_tw.l+(-accu2)*val_tw.h STR accu1, [pDat_1], #-4 // *pDat_1-- = accu1 STR accu2, [pDat_0], #4 // *pDat_0++ = accu2 LDR accu4, [pDat_0] // accu4 = pDat_0[0] LDR accu3, [pDat_0, #4] // accu3 = pDat_0[1] RSB accu4, accu4, #0 // accu4 = -accu4 RSB accu3, accu3, #0 // accu3 = -accu3 SMULWB accu1, accu3, val_tw // accu1 = (-accu3)*val_tw.h SMULWT accu2, accu3, val_tw // accu2 = (-accu3)*val_tw.l RSB accu1, accu1, #0 // accu1 = -(-accu3)*val_tw.h SMLAWT accu3, accu4, val_tw, accu1 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h SMLAWB accu4, accu4, val_tw, accu2 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h LDR accu1, [pDat_1, #-4] // accu1 = pDat_1[-1] LDR accu2, [pDat_1] // accu2 = pDat_1[0] STR accu3, [pDat_0], #4 // *pDat_0++ = accu3 STR accu4, [pDat_1], #-4 // *pDat_1-- = accu4 dst_IV_loop2_2nd_part: LDR val_tw, [twiddle], inc, LSL #2 // val_tw = *twiddle; twiddle += inc RSB accu2, accu2, #0 // accu2 = -accu2 RSB accu1, accu1, #0 // accu1 = -accu1 SMULWT accu3, accu2, val_tw // accu3 = (-accu2)*val_tw.l SMULWT accu4, accu1, val_tw // accu4 = (-accu1)*val_tw.l RSB accu3, accu3, #0 // accu3 = -accu2*val_tw.l SMLAWB accu1, accu1, val_tw, accu3 // accu1 = -accu1*val_tw.h-(-accu2)*val_tw.l SMLAWB accu2, accu2, val_tw, accu4 // accu2 = (-accu1)*val_tw.l+(-accu2)*val_tw.h STR accu1, [pDat_1], #-4 // *pDat_1-- = accu1 STR accu2, [pDat_0], #4 // *pDat_0++ = accu2 LDR accu4, [pDat_0] // accu4 = pDat_0[0] LDR accu3, [pDat_0, #4] // accu3 = pDat_0[1] RSB accu4, accu4, #0 // accu4 = -accu4 RSB accu3, accu3, #0 // accu3 = -accu3 SMULWB accu1, accu3, val_tw // accu1 = (-accu3)*val_tw.h SMULWT accu2, accu3, val_tw // accu2 = (-accu3)*val_tw.l RSB accu1, accu1, #0 // accu1 = -(-accu3)*val_tw.h SMLAWT accu3, accu4, val_tw, accu1 // accu3 = (-accu4)*val_tw.l-(-accu3)*val_tw.h SMLAWB accu4, accu4, val_tw, accu2 // accu4 = (-accu3)*val_tw.l+(-accu4)*val_tw.h LDR accu1, [pDat_1, #-4] // accu1 = pDat_1[-1] LDR accu2, [pDat_1] // accu2 = pDat_1[0] STR accu3, [pDat_0], #4 // *pDat_0++ = accu3 STR accu4, [pDat_1], #-4 // *pDat_1-- = accu4 SUBS i, i, #1 BNE dst_IV_loop2 } /* Last Sin and Cos value pair are the same */ accu1 = fMultDiv2(-accu1, WTC(0x5a82799a)); accu2 = fMultDiv2(-accu2, WTC(0x5a82799a)); *pDat_0 = accu1 + accu2; *pDat_1 = accu1 - accu2; } #endif /* FUNCTION_dst_IV_func2 */ fdk-aac-0.1.3/libFDK/src/arm/scale_arm.cpp0000644000175000017500000001536412372261464020516 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ /*************************** Fraunhofer IIS FDK Tools ********************** Author(s): Arthur Tritthart Description: Scaling operations for ARM ******************************************************************************/ /* prevent multiple inclusion with re-definitions */ #ifndef __INCLUDE_SCALE_ARM__ #define __INCLUDE_SCALE_ARM__ #define FUNCTION_scaleValuesWithFactor_DBL SCALE_INLINE void scaleValuesWithFactor( FIXP_DBL *vector, FIXP_DBL factor, INT len, INT scalefactor ) { /* This code combines the fMult with the scaling */ /* It performs a fMultDiv2 and increments shift by 1 */ int shift = scalefactor + 1; FIXP_DBL *mySpec = vector; shift = fixmin_I(shift,(INT)DFRACT_BITS-1); if (shift >= 0) { for (int i=0; i<(len>>2); i++) { FIXP_DBL tmp0 = mySpec[0]; FIXP_DBL tmp1 = mySpec[1]; FIXP_DBL tmp2 = mySpec[2]; FIXP_DBL tmp3 = mySpec[3]; tmp0 = fMultDiv2(tmp0, factor); tmp1 = fMultDiv2(tmp1, factor); tmp2 = fMultDiv2(tmp2, factor); tmp3 = fMultDiv2(tmp3, factor); tmp0 <<= shift; tmp1 <<= shift; tmp2 <<= shift; tmp3 <<= shift; *mySpec++ = tmp0; *mySpec++ = tmp1; *mySpec++ = tmp2; *mySpec++ = tmp3; } for (int i=len&3; i--;) { FIXP_DBL tmp0 = mySpec[0]; tmp0 = fMultDiv2(tmp0, factor); tmp0 <<= shift; *mySpec++ = tmp0; } } else { shift = -shift; for (int i=0; i<(len>>2); i++) { FIXP_DBL tmp0 = mySpec[0]; FIXP_DBL tmp1 = mySpec[1]; FIXP_DBL tmp2 = mySpec[2]; FIXP_DBL tmp3 = mySpec[3]; tmp0 = fMultDiv2(tmp0, factor); tmp1 = fMultDiv2(tmp1, factor); tmp2 = fMultDiv2(tmp2, factor); tmp3 = fMultDiv2(tmp3, factor); tmp0 >>= shift; tmp1 >>= shift; tmp2 >>= shift; tmp3 >>= shift; *mySpec++ = tmp0; *mySpec++ = tmp1; *mySpec++ = tmp2; *mySpec++ = tmp3; } for (int i=len&3; i--;) { FIXP_DBL tmp0 = mySpec[0]; tmp0 = fMultDiv2(tmp0, factor); tmp0 >>= shift; *mySpec++ = tmp0; } } } #endif /* #ifndef __INCLUDE_SCALE_ARM__ */ fdk-aac-0.1.3/libFDK/src/arm/qmf_arm.cpp0000644000175000017500000006426112372261464020212 0ustar00tootstoots00000000000000 /* ----------------------------------------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android © Copyright 1995 - 2013 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. This FDK AAC Codec software is intended to be used on a wide variety of Android devices. AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part of the MPEG specifications. Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners individually for the purpose of encoding or decoding bit streams in products that are compliant with the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec software may already be covered under those patent licenses when it is used for those licensed purposes only. Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional applications information and documentation. 2. COPYRIGHT LICENSE Redistribution and use in source and binary forms, with or without modification, are permitted without payment of copyright license fees provided that you satisfy the following conditions: You must retain the complete text of this software license in redistributions of the FDK AAC Codec or your modifications thereto in source code form. You must retain the complete text of this software license in the documentation and/or other materials provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. You must make available free of charge copies of the complete source code of the FDK AAC Codec and your modifications thereto to recipients of copies in binary form. The name of Fraunhofer may not be used to endorse or promote products derived from this library without prior written permission. You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec software or your modifications thereto. Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software and the date of any change. For modified versions of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 3. NO PATENT LICENSE NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with respect to this software. You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized by appropriate patent licenses. 4. DISCLAIMER This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, including but not limited to procurement of substitute goods or services; loss of use, data, or profits, or business interruption, however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence), arising in any way out of the use of this software, even if advised of the possibility of such damage. 5. CONTACT INFORMATION Fraunhofer Institute for Integrated Circuits IIS Attention: Audio and Multimedia Departments - FDK AAC LL Am Wolfsmantel 33 91058 Erlangen, Germany www.iis.fraunhofer.de/amm amm-info@iis.fraunhofer.de ----------------------------------------------------------------------------------------------------------- */ #if (QMF_NO_POLY==5) #define FUNCTION_qmfForwardModulationLP_odd #ifdef FUNCTION_qmfForwardModulationLP_odd static void qmfForwardModulationLP_odd( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ const FIXP_QMF *timeIn, /*!< Time Signal */ FIXP_QMF *rSubband ) /*!< Real Output */ { int i; int L = anaQmf->no_channels; int M = L>>1; int shift = (anaQmf->no_channels>>6) + 1; int rSubband_e = 0; FIXP_QMF *rSubbandPtr0 = &rSubband[M+0]; /* runs with increment */ FIXP_QMF *rSubbandPtr1 = &rSubband[M-1]; /* runs with decrement */ FIXP_QMF *timeIn0 = (FIXP_DBL *) &timeIn[0]; /* runs with increment */ FIXP_QMF *timeIn1 = (FIXP_DBL *) &timeIn[L]; /* runs with increment */ FIXP_QMF *timeIn2 = (FIXP_DBL *) &timeIn[L-1]; /* runs with decrement */ FIXP_QMF *timeIn3 = (FIXP_DBL *) &timeIn[2*L-1]; /* runs with decrement */ for (i = 0; i < M; i++) { *rSubbandPtr0++ = (*timeIn2-- >> 1) - (*timeIn0++ >> shift); *rSubbandPtr1-- = (*timeIn1++ >> 1) + (*timeIn3-- >> shift); } dct_IV(rSubband,L, &rSubband_e); } #endif /* FUNCTION_qmfForwardModulationLP_odd */ /* NEON optimized QMF currently builts only with RVCT toolchain */ #if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_5TE__) #if (SAMPLE_BITS == 16) #define FUNCTION_qmfAnaPrototypeFirSlot #endif #ifdef FUNCTION_qmfAnaPrototypeFirSlot #if defined(__GNUC__) /* cppp replaced: elif */ inline INT SMULBB (const SHORT a, const LONG b) { INT result ; __asm__ ("smulbb %0, %1, %2" : "=r" (result) : "r" (a), "r" (b)) ; return result ; } inline INT SMULBT (const SHORT a, const LONG b) { INT result ; __asm__ ("smulbt %0, %1, %2" : "=r" (result) : "r" (a), "r" (b)) ; return result ; } inline INT SMLABB(const LONG accu, const SHORT a, const LONG b) { INT result ; __asm__ ("smlabb %0, %1, %2,%3" : "=r" (result) : "r" (a), "r" (b), "r" (accu)) ; return result; } inline INT SMLABT(const LONG accu, const SHORT a, const LONG b) { INT result ; __asm__ ("smlabt %0, %1, %2,%3" : "=r" (result) : "r" (a), "r" (b), "r" (accu)) ; return result; } #endif /* compiler selection */ void qmfAnaPrototypeFirSlot( FIXP_QMF *analysisBuffer, int no_channels, /*!< Number channels of analysis filter */ const FIXP_PFT *p_filter, int p_stride, /*!< Stide of analysis filter */ FIXP_QAS *RESTRICT pFilterStates ) { LONG *p_flt = (LONG *) p_filter; LONG flt; FIXP_QMF *RESTRICT pData_0 = analysisBuffer + 2*no_channels - 1; FIXP_QMF *RESTRICT pData_1 = analysisBuffer; FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates; FIXP_QAS *RESTRICT sta_1 = (FIXP_QAS *)pFilterStates + (2*QMF_NO_POLY*no_channels) - 1; FIXP_DBL accu0, accu1; FIXP_QAS sta0, sta1; int staStep1 = no_channels<<1; int staStep2 = (no_channels<<3) - 1; /* Rewind one less */ if (p_stride == 1) { /* FIR filter 0 */ flt = *p_flt++; sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMULBB( sta1, flt); sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABB( accu1, sta1, flt); sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta1 = *sta_1; sta_1 += staStep2; accu1 = SMLABB( accu1, sta1, flt); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); /* FIR filters 1..63 127..65 or 1..31 63..33 */ no_channels >>= 1; for (; --no_channels; ) { sta0 = *sta_0; sta_0 += staStep1; /* 1,3,5, ... 29/61 */ sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMULBT( sta0, flt); accu1 = SMULBT( sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 -= staStep2; sta1 = *sta_1; sta_1 += staStep2; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); /* Same sequence as above, but mix B=bottom with T=Top */ flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; /* 2,4,6, ... 30/62 */ sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMULBB( sta0, flt); accu1 = SMULBB( sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 -= staStep2; sta1 = *sta_1; sta_1 += staStep2; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); } /* FIR filter 31/63 and 33/65 */ sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMULBT( sta0, flt); accu1 = SMULBT( sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 -= staStep2; sta1 = *sta_1; sta_1 += staStep2; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); /* FIR filter 32/64 */ flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMULBB( sta0, flt); accu1 = SMULBB( sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt++; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = *p_flt; sta0 = *sta_0; sta1 = *sta_1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); } else { int pfltStep = QMF_NO_POLY * (p_stride-1); flt = p_flt[0]; sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMULBB( sta1, flt); sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABT( accu1, sta1, flt); flt = p_flt[1]; sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABB( accu1, sta1, flt); sta1 = *sta_1; sta_1 -= staStep1; accu1 = SMLABT( accu1, sta1, flt); flt = p_flt[2]; p_flt += pfltStep; sta1 = *sta_1; sta_1 += staStep2; accu1 = SMLABB( accu1, sta1, flt); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); /* FIR filters 1..63 127..65 or 1..31 63..33 */ for (; --no_channels; ) { flt = p_flt[0]; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMULBB( sta0, flt); accu1 = SMULBB( sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = p_flt[1]; sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); sta0 = *sta_0; sta_0 += staStep1; sta1 = *sta_1; sta_1 -= staStep1; accu0 = SMLABT( accu0, sta0, flt); accu1 = SMLABT( accu1, sta1, flt); flt = p_flt[2]; p_flt += pfltStep; sta0 = *sta_0; sta_0 -= staStep2; sta1 = *sta_1; sta_1 += staStep2; accu0 = SMLABB( accu0, sta0, flt); accu1 = SMLABB( accu1, sta1, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); *pData_1++ = FX_DBL2FX_QMF(accu1<<1); } /* FIR filter 32/64 */ flt = p_flt[0]; sta0 = *sta_0; sta_0 += staStep1; accu0 = SMULBB( sta0, flt); sta0 = *sta_0; sta_0 += staStep1; accu0 = SMLABT( accu0, sta0, flt); flt = p_flt[1]; sta0 = *sta_0; sta_0 += staStep1; accu0 = SMLABB( accu0, sta0, flt); sta0 = *sta_0; sta_0 += staStep1; accu0 = SMLABT( accu0, sta0, flt); flt = p_flt[2]; sta0 = *sta_0; accu0 = SMLABB( accu0, sta0, flt); *pData_0-- = FX_DBL2FX_QMF(accu0<<1); } } #endif /* FUNCTION_qmfAnaPrototypeFirSlot */ #endif /* #if defined(__CC_ARM) && defined(__ARM_ARCH_6__) */ #if ( defined(__ARM_ARCH_5TE__) && (SAMPLE_BITS == 16) ) && !defined(QMF_TABLE_FULL) #define FUNCTION_qmfSynPrototypeFirSlot #if defined(FUNCTION_qmfSynPrototypeFirSlot) #if defined(__GNUC__) /* cppp replaced: elif */ inline INT SMULWB (const LONG a, const LONG b) { INT result ; __asm__ ("smulwb %0, %1, %2" : "=r" (result) : "r" (a), "r" (b)) ; return result ; } inline INT SMULWT (const LONG a, const LONG b) { INT result ; __asm__ ("smulwt %0, %1, %2" : "=r" (result) : "r" (a), "r" (b)) ; return result ; } inline INT SMLAWB(const LONG accu, const LONG a, const LONG b) { INT result; asm("smlawb %0, %1, %2, %3 " : "=r" (result) : "r" (a), "r" (b), "r" (accu) ); return result ; } inline INT SMLAWT(const LONG accu, const LONG a, const LONG b) { INT result; asm("smlawt %0, %1, %2, %3 " : "=r" (result) : "r" (a), "r" (b), "r" (accu) ); return result ; } #endif /* ARM compiler selector */ static void qmfSynPrototypeFirSlot1_filter(FIXP_QMF *RESTRICT realSlot, FIXP_QMF *RESTRICT imagSlot, const FIXP_DBL *RESTRICT p_flt, FIXP_QSS *RESTRICT sta, FIXP_DBL *pMyTimeOut, int no_channels) { /* This code was the base for the above listed assembler sequence */ /* It can be used for debugging purpose or further optimizations */ const FIXP_DBL *RESTRICT p_fltm = p_flt + 155; do { FIXP_DBL result; FIXP_DBL A, B, real, imag, sta0; real = *--realSlot; imag = *--imagSlot; B = p_flt[4]; /* Bottom=[8] Top=[9] */ A = p_fltm[3]; /* Bottom=[316] Top=[317] */ sta0 = sta[0]; /* save state[0] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=9...........319 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=316...........6 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=8,18, ...318 */ B = p_flt[3]; /* Bottom=[6] Top=[7] */ *sta++ = SMLAWT( sta[1], real, A ); /* index=317...........7 */ A = p_fltm[4]; /* Bottom=[318] Top=[319] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=7...........317 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=318...........8 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=6...........316 */ B = p_flt[2]; /* Bottom=[X] Top=[5] */ *sta++ = SMLAWT( sta[1], real, A ); /* index=9...........319 */ A = p_fltm[2]; /* Bottom=[X] Top=[315] */ *sta++ = SMULWT( imag, B ); /* index=5,15, ... 315 */ result = SMLAWT( sta0, real, A ); /* index=315...........5 */ *pMyTimeOut++ = result; real = *--realSlot; imag = *--imagSlot; A = p_fltm[0]; /* Bottom=[310] Top=[311] */ B = p_flt[7]; /* Bottom=[14] Top=[15] */ result = SMLAWB( sta[0], real, A ); /* index=310...........0 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=14..........324 */ *pMyTimeOut++ = result; B = p_flt[6]; /* Bottom=[12] Top=[13] */ *sta++ = SMLAWT( sta[1], real, A ); /* index=311...........1 */ A = p_fltm[1]; /* Bottom=[312] Top=[313] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=13..........323 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=312...........2 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=12..........322 */ *sta++ = SMLAWT( sta[1], real, A ); /* index=313...........3 */ A = p_fltm[2]; /* Bottom=[314] Top=[315] */ B = p_flt[5]; /* Bottom=[10] Top=[11] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=11..........321 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=314...........4 */ *sta++ = SMULWB( imag, B ); /* index=10..........320 */ p_flt += 5; p_fltm -= 5; } while ((--no_channels) != 0); } INT qmfSynPrototypeFirSlot2( HANDLE_QMF_FILTER_BANK qmf, FIXP_QMF *RESTRICT realSlot, /*!< Input: Pointer to real Slot */ FIXP_QMF *RESTRICT imagSlot, /*!< Input: Pointer to imag Slot */ INT_PCM *RESTRICT timeOut, /*!< Time domain data */ INT stride /*!< Time output buffer stride factor*/ ) { FIXP_QSS *RESTRICT sta = (FIXP_QSS*)qmf->FilterStates; int no_channels = qmf->no_channels; int scale = ((DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor); /* We map an arry of 16-bit values upon an array of 2*16-bit values to read 2 values in one shot */ const FIXP_DBL *RESTRICT p_flt = (FIXP_DBL *) qmf->p_filter; /* low=[0], high=[1] */ const FIXP_DBL *RESTRICT p_fltm = (FIXP_DBL *) qmf->p_filter + 155; /* low=[310], high=[311] */ FDK_ASSERT(SAMPLE_BITS-1-qmf->outScalefactor >= 0); // (DFRACT_BITS-SAMPLE_BITS)-1-qmf->outScalefactor >= 0); FDK_ASSERT(qmf->p_stride==2 && qmf->no_channels == 32); FDK_ASSERT((no_channels&3) == 0); /* should be a multiple of 4 */ realSlot += no_channels-1; // ~~"~~ imagSlot += no_channels-1; // no_channels-1 .. 0 FIXP_DBL MyTimeOut[32]; FIXP_DBL *pMyTimeOut = &MyTimeOut[0]; for (no_channels = no_channels; no_channels--;) { FIXP_DBL result; FIXP_DBL A, B, real, imag; real = *realSlot--; imag = *imagSlot--; A = p_fltm[0]; /* Bottom=[310] Top=[311] */ B = p_flt[7]; /* Bottom=[14] Top=[15] */ result = SMLAWB( sta[0], real, A ); /* index=310...........0 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=14..........324 */ B = p_flt[6]; /* Bottom=[12] Top=[13] */ *sta++ = SMLAWT( sta[1], real, A ); /* index=311...........1 */ A = p_fltm[1]; /* Bottom=[312] Top=[313] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=13..........323 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=312...........2 */ *sta++ = SMLAWB( sta[1], imag, B ); /* index=12..........322 */ *sta++ = SMLAWT( sta[1], real, A ); /* index=313...........3 */ A = p_fltm[2]; /* Bottom=[314] Top=[315] */ B = p_flt[5]; /* Bottom=[10] Top=[11] */ *sta++ = SMLAWT( sta[1], imag, B ); /* index=11..........321 */ *sta++ = SMLAWB( sta[1], real, A ); /* index=314...........4 */ *sta++ = SMULWB( imag, B ); /* index=10..........320 */ *pMyTimeOut++ = result; p_fltm -= 5; p_flt += 5; } pMyTimeOut = &MyTimeOut[0]; #if (SAMPLE_BITS == 16) const FIXP_DBL max_pos = (FIXP_DBL) 0x00007FFF << scale; const FIXP_DBL max_neg = (FIXP_DBL) 0xFFFF8001 << scale; #else scale = -scale; const FIXP_DBL max_pos = (FIXP_DBL) 0x7FFFFFFF >> scale; const FIXP_DBL max_neg = (FIXP_DBL) 0x80000001 >> scale; #endif const FIXP_DBL add_neg = (1 << scale) - 1; no_channels = qmf->no_channels; timeOut += no_channels*stride; FDK_ASSERT(scale >= 0); if (qmf->outGain != 0x80000000) { FIXP_DBL gain = qmf->outGain; for (no_channels>>=2; no_channels--;) { FIXP_DBL result1, result2; result1 = *pMyTimeOut++; result2 = *pMyTimeOut++; result1 = fMult(result1,gain); timeOut -= stride; if (result1 < 0) result1 += add_neg; if (result1 < max_neg) result1 = max_neg; if (result1 > max_pos) result1 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result1 >> scale; #else timeOut[0] = result1 << scale; #endif result2 = fMult(result2,gain); timeOut -= stride; if (result2 < 0) result2 += add_neg; if (result2 < max_neg) result2 = max_neg; if (result2 > max_pos) result2 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result2 >> scale; #else timeOut[0] = result2 << scale; #endif result1 = *pMyTimeOut++; result2 = *pMyTimeOut++; result1 = fMult(result1,gain); timeOut -= stride; if (result1 < 0) result1 += add_neg; if (result1 < max_neg) result1 = max_neg; if (result1 > max_pos) result1 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result1 >> scale; #else timeOut[0] = result1 << scale; #endif result2 = fMult(result2,gain); timeOut -= stride; if (result2 < 0) result2 += add_neg; if (result2 < max_neg) result2 = max_neg; if (result2 > max_pos) result2 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result2 >> scale; #else timeOut[0] = result2 << scale; #endif } } else { for (no_channels>>=2; no_channels--;) { FIXP_DBL result1, result2; result1 = *pMyTimeOut++; result2 = *pMyTimeOut++; timeOut -= stride; if (result1 < 0) result1 += add_neg; if (result1 < max_neg) result1 = max_neg; if (result1 > max_pos) result1 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result1 >> scale; #else timeOut[0] = result1 << scale; #endif timeOut -= stride; if (result2 < 0) result2 += add_neg; if (result2 < max_neg) result2 = max_neg; if (result2 > max_pos) result2 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result2 >> scale; #else timeOut[0] = result2 << scale; #endif result1 = *pMyTimeOut++; result2 = *pMyTimeOut++; timeOut -= stride; if (result1 < 0) result1 += add_neg; if (result1 < max_neg) result1 = max_neg; if (result1 > max_pos) result1 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result1 >> scale; #else timeOut[0] = result1 << scale; #endif timeOut -= stride; if (result2 < 0) result2 += add_neg; if (result2 < max_neg) result2 = max_neg; if (result2 > max_pos) result2 = max_pos; #if (SAMPLE_BITS == 16) timeOut[0] = result2 >> scale; #else timeOut[0] = result2 << scale; #endif } } return 0; } static void qmfSynPrototypeFirSlot_fallback( HANDLE_QMF_FILTER_BANK qmf, FIXP_DBL *realSlot, /*!< Input: Pointer to real Slot */ FIXP_DBL *imagSlot, /*!< Input: Pointer to imag Slot */ INT_PCM *timeOut, /*!< Time domain data */ const int stride ); /*! \brief Perform Synthesis Prototype Filtering on a single slot of input data. The filter takes 2 * #MAX_SYNTHESIS_CHANNELS of input data and generates #MAX_SYNTHESIS_CHANNELS time domain output samples. */ static void qmfSynPrototypeFirSlot( HANDLE_QMF_FILTER_BANK qmf, FIXP_DBL *realSlot, /*!< Input: Pointer to real Slot */ FIXP_DBL *imagSlot, /*!< Input: Pointer to imag Slot */ INT_PCM *timeOut, /*!< Time domain data */ const int stride ) { INT err = -1; switch (qmf->p_stride) { case 2: err = qmfSynPrototypeFirSlot2(qmf, realSlot, imagSlot, timeOut, stride); break; default: err = -1; } /* fallback if configuration not available or failed */ if(err!=0) { qmfSynPrototypeFirSlot_fallback(qmf, realSlot, imagSlot, timeOut, stride); } } #endif /* FUNCTION_qmfSynPrototypeFirSlot */ #endif /* ( defined(__CC_ARM) && defined(__ARM_ARCH_5TE__) && (SAMPLE_BITS == 16) ) && !defined(QMF_TABLE_FULL) */ /* #####################################################################################*/ #endif /* (QMF_NO_POLY==5) */